From 679b1bca7a578dae0b205eb2eab1e38266c815ad Mon Sep 17 00:00:00 2001 From: aseik Date: Fri, 6 May 2016 16:39:25 +0200 Subject: [PATCH] Added negative duration option --- .../betterpickers/hmspicker/HmsPicker.java | 50 ++++++++++++++++--- .../hmspicker/HmsPickerBuilder.java | 18 ++++++- .../hmspicker/HmsPickerDialogFragment.java | 28 ++++++++++- .../betterpickers/hmspicker/HmsView.java | 15 ++++++ .../src/main/res/layout/hms_picker_view.xml | 9 ++++ sample/src/main/AndroidManifest.xml | 8 +++ .../SampleHmsBasicNegativeDurationUsage.java | 47 +++++++++++++++++ 7 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 sample/src/main/java/com/codetroopers/betterpickers/sample/activity/hmspicker/SampleHmsBasicNegativeDurationUsage.java diff --git a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPicker.java b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPicker.java index ad2a3dcf..544b2e41 100644 --- a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPicker.java +++ b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPicker.java @@ -2,6 +2,7 @@ import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.Resources; import android.content.res.TypedArray; import android.os.Bundle; import android.os.Parcel; @@ -40,6 +41,10 @@ public class HmsPicker extends LinearLayout implements Button.OnClickListener, B private int mDeleteDrawableSrcResId; private int mTheme = -1; + private int mSign; + public static final int SIGN_POSITIVE = 0; + public static final int SIGN_NEGATIVE = 1; + /** * Instantiates an HmsPicker object * @@ -125,6 +130,10 @@ private void restyleViews() { if (mEnteredHms != null) { mEnteredHms.setTheme(mTheme); } + if(mLeft != null){ + mLeft.setTextColor(mTextColor); + mLeft.setBackgroundResource(mKeyBackgroundResId); + } } @Override @@ -155,7 +164,7 @@ protected void onFinishInflate() { mLeft = (Button) v4.findViewById(R.id.key_left); mNumbers[0] = (Button) v4.findViewById(R.id.key_middle); mRight = (Button) v4.findViewById(R.id.key_right); - setLeftRightEnabled(false); + setRightEnabled(false); for (int i = 0; i < 10; i++) { mNumbers[i].setOnClickListener(this); @@ -164,6 +173,12 @@ protected void onFinishInflate() { } updateHms(); + Resources res = mContext.getResources(); + mLeft.setText(res.getString(R.string.number_picker_plus_minus)); + mLeft.setOnClickListener(this); +// mLabel = (TextView) findViewById(R.id.label); +// mSign = SIGN_POSITIVE; + mHoursLabel = (TextView) findViewById(R.id.hours_label); mMinutesLabel = (TextView) findViewById(R.id.minutes_label); mSecondsLabel = (TextView) findViewById(R.id.seconds_label); @@ -203,10 +218,20 @@ protected void doOnClick(View v) { mInput[mInputPointer] = 0; mInputPointer--; } + } else if(v == mLeft){ + onLeftClicked(); } updateKeypad(); } + private void onLeftClicked() { + if (mSign == SIGN_POSITIVE) { + mSign = SIGN_NEGATIVE; + } else { + mSign = SIGN_POSITIVE; + } + } + @Override public boolean onLongClick(View v) { v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); @@ -249,7 +274,7 @@ private void updateKeypad() { * Hide digit by passing -2 (for highest hours digit only); */ protected void updateHms() { - mEnteredHms.setTime(mInput[4], mInput[3], mInput[2], mInput[1], mInput[0]); + mEnteredHms.setTime(mSign == SIGN_NEGATIVE, mInput[4], mInput[3], mInput[2], mInput[1], mInput[0]); } private void addClickedNumber(int val) { @@ -317,6 +342,17 @@ public int getSeconds() { return mInput[1] * 10 + mInput[0]; } + /** + * Using View.GONE, View.VISIBILE, or View.INVISIBLE, set the visibility of the plus/minus indicator + * + * @param visibility an int using Android's View.* convention + */ + public void setPlusMinusVisibility(int visibility) { + if (mLeft != null) { + mLeft.setVisibility(visibility); + } + } + /** * Set the current hours, minutes, and seconds on the picker. * @@ -342,7 +378,7 @@ public void setTime(int hours, int minutes, int seconds) { } - @Override + @Override public Parcelable onSaveInstanceState() { final Parcelable parcel = super.onSaveInstanceState(); final SavedState state = new SavedState(parcel); @@ -433,12 +469,14 @@ public void restoreEntryState(Bundle inState, String key) { } } - protected void setLeftRightEnabled(boolean enabled) { - mLeft.setEnabled(enabled); + protected void setRightEnabled(boolean enabled) { mRight.setEnabled(enabled); if (!enabled) { - mLeft.setContentDescription(null); mRight.setContentDescription(null); } } + + public boolean isNegative(){ + return mSign == SIGN_NEGATIVE; + } } diff --git a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerBuilder.java b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerBuilder.java index 769261f8..0c081c7b 100644 --- a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerBuilder.java +++ b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerBuilder.java @@ -22,6 +22,22 @@ public class HmsPickerBuilder { private int mHours; private int mMinutes; private int mSeconds; + private Integer plusMinusVisibility; + + /** + * Set the visibility of the +/- button. This takes an int corresponding to Android's View.VISIBLE, View.INVISIBLE, + * or View.GONE. When using View.INVISIBLE, the +/- button will still be present in the layout but be + * non-clickable. When set to View.GONE, the +/- button will disappear entirely, and the "0" button will occupy its + * space. + * + * @param plusMinusVisibility an int corresponding to View.VISIBLE, View.INVISIBLE, or View.GONE + * @return the current Builder object + */ + public HmsPickerBuilder setPlusMinusVisibility(int plusMinusVisibility) { + this.plusMinusVisibility = plusMinusVisibility; + return this; + } + /** * Attach a FragmentManager. This is required for creation of the Fragment. @@ -147,7 +163,7 @@ public void show() { } ft.addToBackStack(null); - final HmsPickerDialogFragment fragment = HmsPickerDialogFragment.newInstance(mReference, styleResId); + final HmsPickerDialogFragment fragment = HmsPickerDialogFragment.newInstance(mReference, styleResId, plusMinusVisibility); if (targetFragment != null) { fragment.setTargetFragment(targetFragment, 0); } diff --git a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerDialogFragment.java b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerDialogFragment.java index c64452d8..2cdcaf5f 100644 --- a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerDialogFragment.java +++ b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerDialogFragment.java @@ -22,6 +22,7 @@ public class HmsPickerDialogFragment extends DialogFragment { private static final String REFERENCE_KEY = "HmsPickerDialogFragment_ReferenceKey"; private static final String THEME_RES_ID_KEY = "HmsPickerDialogFragment_ThemeResIdKey"; + private static final String PLUS_MINUS_VISIBILITY_KEY = "HmsPickerDialogFragment_PlusMinusVisibilityKey"; private HmsPicker mPicker; @@ -33,6 +34,7 @@ public class HmsPickerDialogFragment extends DialogFragment { private int mHours; private int mMinutes; private int mSeconds; + private int mPlusMinusVisibility = View.INVISIBLE; /** * Create an instance of the Picker (used internally) @@ -41,11 +43,14 @@ public class HmsPickerDialogFragment extends DialogFragment { * @param themeResId the style resource ID for theming * @return a Picker! */ - public static HmsPickerDialogFragment newInstance(int reference, int themeResId) { + public static HmsPickerDialogFragment newInstance(int reference, int themeResId, Integer plusMinusVisibility) { final HmsPickerDialogFragment frag = new HmsPickerDialogFragment(); Bundle args = new Bundle(); args.putInt(REFERENCE_KEY, reference); args.putInt(THEME_RES_ID_KEY, themeResId); + if (plusMinusVisibility != null) { + args.putInt(PLUS_MINUS_VISIBILITY_KEY, plusMinusVisibility); + } frag.setArguments(args); return frag; } @@ -66,6 +71,9 @@ public void onCreate(Bundle savedInstanceState) { if (args != null && args.containsKey(THEME_RES_ID_KEY)) { mTheme = args.getInt(THEME_RES_ID_KEY); } + if (args != null && args.containsKey(PLUS_MINUS_VISIBILITY_KEY)) { + mPlusMinusVisibility = args.getInt(PLUS_MINUS_VISIBILITY_KEY); + } setStyle(DialogFragment.STYLE_NO_TITLE, 0); @@ -106,6 +114,7 @@ public void onClick(View view) { } final Activity activity = getActivity(); final Fragment fragment = getTargetFragment(); + if (activity instanceof HmsPickerDialogHandler) { final HmsPickerDialogHandler act = (HmsPickerDialogHandler) activity; @@ -115,6 +124,17 @@ public void onClick(View view) { (HmsPickerDialogHandler) fragment; frag.onDialogHmsSet(mReference, mPicker.getHours(), mPicker.getMinutes(), mPicker.getSeconds()); } + + if (activity instanceof HmsPickerDialogHandlerV2) { + final HmsPickerDialogHandlerV2 act = + (HmsPickerDialogHandlerV2) activity; + act.onDialogHmsSet(mReference, mPicker.isNegative(), mPicker.getHours(), mPicker.getMinutes(), mPicker.getSeconds()); + } else if (fragment instanceof HmsPickerDialogHandlerV2) { + final HmsPickerDialogHandlerV2 frag = + (HmsPickerDialogHandlerV2) fragment; + frag.onDialogHmsSet(mReference, mPicker.isNegative(), mPicker.getHours(), mPicker.getMinutes(), mPicker.getSeconds()); + } + dismiss(); } }); @@ -123,12 +143,18 @@ public void onClick(View view) { mPicker.setSetButton(doneButton); mPicker.setTime(mHours, mMinutes, mSeconds); mPicker.setTheme(mTheme); + mPicker.setPlusMinusVisibility(mPlusMinusVisibility); getDialog().getWindow().setBackgroundDrawableResource(mDialogBackgroundResId); return view; } + public interface HmsPickerDialogHandlerV2 { + + void onDialogHmsSet(int reference, boolean isNegative, int hours, int minutes, int seconds); + } + /** * This interface allows objects to register for the Picker's set action. */ diff --git a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsView.java b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsView.java index bed74f8d..79c652df 100644 --- a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsView.java +++ b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsView.java @@ -5,6 +5,7 @@ import android.content.res.TypedArray; import android.graphics.Typeface; import android.util.AttributeSet; +import android.view.View; import android.widget.LinearLayout; import com.codetroopers.betterpickers.R; @@ -17,6 +18,7 @@ public class HmsView extends LinearLayout { private ZeroTopPaddingTextView mSecondsOnes, mSecondsTens; private final Typeface mAndroidClockMonoThin; private Typeface mOriginalHoursTypeface; + private ZeroTopPaddingTextView mMinusLabel; private ColorStateList mTextColor; @@ -76,6 +78,9 @@ private void restyleViews() { if (mSecondsTens != null) { mSecondsTens.setTextColor(mTextColor); } + if (mMinusLabel != null) { + mMinusLabel.setTextColor(mTextColor); + } } @Override @@ -87,6 +92,8 @@ protected void onFinishInflate() { mMinutesOnes = (ZeroTopPaddingTextView) findViewById(R.id.minutes_ones); mSecondsTens = (ZeroTopPaddingTextView) findViewById(R.id.seconds_tens); mSecondsOnes = (ZeroTopPaddingTextView) findViewById(R.id.seconds_ones); + mMinusLabel = (ZeroTopPaddingTextView) findViewById(R.id.minus_label); + if (mHoursOnes != null) { mOriginalHoursTypeface = mHoursOnes.getTypeface(); mHoursOnes.updatePaddingForBoldDate(); @@ -118,7 +125,15 @@ protected void onFinishInflate() { * @param secondsOnesDigit the ones digit of the seconds TextView */ public void setTime(int hoursOnesDigit, int minutesTensDigit, int minutesOnesDigit, int secondsTensDigit, + int secondsOnesDigit) { + setTime(false, hoursOnesDigit, minutesTensDigit, minutesOnesDigit, secondsTensDigit, secondsOnesDigit); + } + + public void setTime(boolean isNegative, int hoursOnesDigit, int minutesTensDigit, int minutesOnesDigit, int secondsTensDigit, int secondsOnesDigit) { + + mMinusLabel.setVisibility(isNegative ? View.VISIBLE : View.GONE); + if (mHoursOnes != null) { mHoursOnes.setText(String.format("%d", hoursOnesDigit)); } diff --git a/library/src/main/res/layout/hms_picker_view.xml b/library/src/main/res/layout/hms_picker_view.xml index 0f3afe08..ec4963ea 100644 --- a/library/src/main/res/layout/hms_picker_view.xml +++ b/library/src/main/res/layout/hms_picker_view.xml @@ -81,6 +81,15 @@ style="@style/label" android:gravity="top" android:text="@string/hms_picker_seconds_label"/> + + + + + + + diff --git a/sample/src/main/java/com/codetroopers/betterpickers/sample/activity/hmspicker/SampleHmsBasicNegativeDurationUsage.java b/sample/src/main/java/com/codetroopers/betterpickers/sample/activity/hmspicker/SampleHmsBasicNegativeDurationUsage.java new file mode 100644 index 00000000..5030d545 --- /dev/null +++ b/sample/src/main/java/com/codetroopers/betterpickers/sample/activity/hmspicker/SampleHmsBasicNegativeDurationUsage.java @@ -0,0 +1,47 @@ +package com.codetroopers.betterpickers.sample.activity.hmspicker; + +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import com.codetroopers.betterpickers.hmspicker.HmsPickerBuilder; +import com.codetroopers.betterpickers.hmspicker.HmsPickerDialogFragment; +import com.codetroopers.betterpickers.sample.R; +import com.codetroopers.betterpickers.sample.activity.BaseSampleActivity; + +/** + * User: derek Date: 3/17/13 Time: 3:59 PM + */ +public class SampleHmsBasicNegativeDurationUsage extends BaseSampleActivity implements HmsPickerDialogFragment.HmsPickerDialogHandlerV2 { + + private TextView mResultTextView; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.text_and_button); + + mResultTextView = (TextView) findViewById(R.id.text); + Button button = (Button) findViewById(R.id.button); + + mResultTextView.setText(R.string.no_value); + button.setText(R.string.hms_picker_set); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + HmsPickerBuilder hpb = new HmsPickerBuilder() + .setPlusMinusVisibility(View.VISIBLE) + .setFragmentManager(getSupportFragmentManager()) + .setStyleResId(R.style.BetterPickersDialogFragment); + hpb.show(); + } + }); + } + + @Override + public void onDialogHmsSet(int reference, boolean isNegative, int hours, int minutes, int seconds) { + mResultTextView.setText(getString(R.string.hms_picker_result_value_multiline, (isNegative ? -1 : 1) * hours, (isNegative ? -1 : 1) * minutes, (isNegative ? -1 : 1) * seconds)); + } + +}