From 91a58862ce3fd5d919356b20b7c792b220a2574d Mon Sep 17 00:00:00 2001 From: Agustin Tomas Larghi Date: Tue, 24 Oct 2017 11:45:40 -0300 Subject: [PATCH] Adding #setOnlyHourMinutes() new method, to hide/show the seconds section. --- .../betterpickers/hmspicker/HmsPicker.java | 67 +++++++++++++++---- .../hmspicker/HmsPickerBuilder.java | 13 +++- .../hmspicker/HmsPickerDialogFragment.java | 12 +++- .../betterpickers/hmspicker/HmsView.java | 61 +++++++++++++++-- .../src/main/res/layout/hms_picker_view.xml | 8 +++ sample/src/main/AndroidManifest.xml | 8 +++ .../SampleHmsHourMinutesOnlyUsage.java | 48 +++++++++++++ 7 files changed, 195 insertions(+), 22 deletions(-) create mode 100644 sample/src/main/java/com/codetroopers/betterpickers/sample/activity/hmspicker/SampleHmsHourMinutesOnlyUsage.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 1c5f6397..c574bf2e 100644 --- a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPicker.java +++ b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPicker.java @@ -45,6 +45,8 @@ public class HmsPicker extends LinearLayout implements Button.OnClickListener, B public static final int SIGN_POSITIVE = 0; public static final int SIGN_NEGATIVE = 1; + private boolean mHourMinutesOnly; + /** * Instantiates an HmsPicker object * @@ -119,7 +121,7 @@ private void restyleViews() { mMinutesLabel.setTextColor(mTextColor); mMinutesLabel.setBackgroundResource(mKeyBackgroundResId); } - if (mSecondsLabel != null) { + if (mSecondsLabel != null && !mHourMinutesOnly) { mSecondsLabel.setTextColor(mTextColor); mSecondsLabel.setBackgroundResource(mKeyBackgroundResId); } @@ -129,6 +131,10 @@ private void restyleViews() { } if (mEnteredHms != null) { mEnteredHms.setTheme(mTheme); + + if(mHourMinutesOnly) { + mEnteredHms.setHourMinutesOnly(true); + } } if (mLeft != null) { mLeft.setTextColor(mTextColor); @@ -272,7 +278,11 @@ private void updateKeypad() { * Hide digit by passing -2 (for highest hours digit only); */ protected void updateHms() { - mEnteredHms.setTime(isNegative(), mInput[4], mInput[3], mInput[2], mInput[1], mInput[0]); + if(mHourMinutesOnly) { + mEnteredHms.setTime(isNegative(), mInput[3], mInput[2], mInput[1], mInput[0]); + } else { + mEnteredHms.setTime(isNegative(), mInput[4], mInput[3], mInput[2], mInput[1], mInput[0]); + } } private void addClickedNumber(int val) { @@ -318,8 +328,11 @@ public void setSetButton(Button b) { * @return the inputted hours */ public int getHours() { - int hours = mInput[4]; - return hours; + if(mHourMinutesOnly){ + return mInput[3] * 10 + mInput[2]; + } else { + return mInput[4]; + } } /** @@ -328,7 +341,11 @@ public int getHours() { * @return the inputted minutes */ public int getMinutes() { - return mInput[3] * 10 + mInput[2]; + if(mHourMinutesOnly){ + return mInput[1] * 10 + mInput[0]; + } else { + return mInput[3] * 10 + mInput[2]; + } } /** @@ -337,7 +354,11 @@ public int getMinutes() { * @return the inputted seconds */ public int getSeconds() { - return mInput[1] * 10 + mInput[0]; + if(mHourMinutesOnly){ + return 0; + } else { + return mInput[1] * 10 + mInput[0]; + } } /** @@ -359,13 +380,20 @@ public void setPlusMinusVisibility(int visibility) { * @param seconds the input seconds value */ public void setTime(int hours, int minutes, int seconds) { - mInput[4] = hours; - mInput[3] = minutes / 10; - mInput[2] = minutes % 10; - mInput[1] = seconds / 10; - mInput[0] = seconds % 10; + if(mHourMinutesOnly) { + mInput[3] = hours / 10; + mInput[2] = hours % 10; + mInput[1] = minutes / 10; + mInput[0] = minutes % 10; + } else { + mInput[4] = hours; + mInput[3] = minutes / 10; + mInput[2] = minutes % 10; + mInput[1] = seconds / 10; + mInput[0] = seconds % 10; + } - for (int i = 4; i >= 0; i--) { + for (int i=mInputSize - 1; i>=0; i--) { if (mInput[i] > 0) { mInputPointer = i; break; @@ -447,12 +475,25 @@ public SavedState[] newArray(int size) { * @return an int representing the time in seconds */ public int getTime() { - return mInput[4] * 3600 + mInput[3] * 600 + mInput[2] * 60 + mInput[1] * 10 + mInput[0]; + if(mHourMinutesOnly) { + return mInput[3] * 36_000 + mInput[2] * 3600 + mInput[1] * 600 + mInput[0] * 60; + } else { + return mInput[4] * 3600 + mInput[3] * 600 + mInput[2] * 60 + mInput[1] * 10 + mInput[0]; + } } public void saveEntryState(Bundle outState, String key) { outState.putIntArray(key, mInput); } + + public void setHourMinutesOnly(boolean mHourMinutesOnly) { + this.mHourMinutesOnly = mHourMinutesOnly; + if(mHourMinutesOnly) { + mInputSize = 4; + mInput = new int[mInputSize]; + restyleViews(); + } + } public void restoreEntryState(Bundle inState, String key) { int[] input = inState.getIntArray(key); 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 581cf9bf..9e68c7b4 100644 --- a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerBuilder.java +++ b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerBuilder.java @@ -25,6 +25,8 @@ public class HmsPickerBuilder { private Integer plusMinusVisibility; private OnDialogDismissListener mOnDismissListener; + private Boolean mHourMinutesOnly; + /** * 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 @@ -39,6 +41,14 @@ public HmsPickerBuilder setPlusMinusVisibility(int plusMinusVisibility) { return this; } + /** + * Shows only the hours and minutes. + * @param hourMinutesOnly if True shows only hours and minutes. False by default. + */ + public HmsPickerBuilder setHourMinutesOnly(boolean hourMinutesOnly){ + this.mHourMinutesOnly = hourMinutesOnly; + return this; + } /** * Attach a FragmentManager. This is required for creation of the Fragment. @@ -165,7 +175,8 @@ public void show() { } ft.addToBackStack(null); - final HmsPickerDialogFragment fragment = HmsPickerDialogFragment.newInstance(mReference, styleResId, plusMinusVisibility); + final HmsPickerDialogFragment fragment = HmsPickerDialogFragment.newInstance(mReference, styleResId, plusMinusVisibility, + mHourMinutesOnly); 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 0ab44032..15c992fe 100644 --- a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerDialogFragment.java +++ b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsPickerDialogFragment.java @@ -25,6 +25,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 static final String HOUR_MINUTES_ONLY_KEY = "HmsPickerDialogFragment_HourMinutesOnly"; private HmsPicker mPicker; @@ -36,6 +37,7 @@ public class HmsPickerDialogFragment extends DialogFragment { private int mHours; private int mMinutes; private int mSeconds; + private boolean mHourMinutesOnly = false; private int mPlusMinusVisibility = View.INVISIBLE; private OnDialogDismissListener mDismissCallback; @@ -46,7 +48,8 @@ public class HmsPickerDialogFragment extends DialogFragment { * @param themeResId the style resource ID for theming * @return a Picker! */ - public static HmsPickerDialogFragment newInstance(int reference, int themeResId, Integer plusMinusVisibility) { + public static HmsPickerDialogFragment newInstance(int reference, int themeResId, Integer plusMinusVisibility, + Boolean hourMinutesOnly) { final HmsPickerDialogFragment frag = new HmsPickerDialogFragment(); Bundle args = new Bundle(); args.putInt(REFERENCE_KEY, reference); @@ -54,6 +57,9 @@ public static HmsPickerDialogFragment newInstance(int reference, int themeResId, if (plusMinusVisibility != null) { args.putInt(PLUS_MINUS_VISIBILITY_KEY, plusMinusVisibility); } + if(hourMinutesOnly != null){ + args.putBoolean(HOUR_MINUTES_ONLY_KEY, hourMinutesOnly); + } frag.setArguments(args); return frag; } @@ -77,6 +83,9 @@ public void onCreate(Bundle savedInstanceState) { if (args != null && args.containsKey(PLUS_MINUS_VISIBILITY_KEY)) { mPlusMinusVisibility = args.getInt(PLUS_MINUS_VISIBILITY_KEY); } + if(args != null && args.containsKey(HOUR_MINUTES_ONLY_KEY)){ + mHourMinutesOnly = args.getBoolean(HOUR_MINUTES_ONLY_KEY); + } setStyle(DialogFragment.STYLE_NO_TITLE, 0); @@ -138,6 +147,7 @@ public void onClick(View view) { mPicker.setTime(mHours, mMinutes, mSeconds); mPicker.setTheme(mTheme); mPicker.setPlusMinusVisibility(mPlusMinusVisibility); + mPicker.setHourMinutesOnly(mHourMinutesOnly); getDialog().getWindow().setBackgroundDrawableResource(mDialogBackgroundResId); 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 79c652df..628a0a04 100644 --- a/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsView.java +++ b/library/src/main/java/com/codetroopers/betterpickers/hmspicker/HmsView.java @@ -13,12 +13,13 @@ public class HmsView extends LinearLayout { - private ZeroTopPaddingTextView mHoursOnes; + private ZeroTopPaddingTextView mHoursOnes, mHoursTens; private ZeroTopPaddingTextView mMinutesOnes, mMinutesTens; - private ZeroTopPaddingTextView mSecondsOnes, mSecondsTens; + private ZeroTopPaddingTextView mSecondsOnes, mSecondsTens, mSecondsLabel; private final Typeface mAndroidClockMonoThin; private Typeface mOriginalHoursTypeface; private ZeroTopPaddingTextView mMinusLabel; + private boolean hourMinutesOnly = false; private ColorStateList mTextColor; @@ -63,6 +64,9 @@ public void setTheme(int themeResId) { } private void restyleViews() { + if (mHoursTens != null) { + mHoursTens.setTextColor(mTextColor); + } if (mHoursOnes != null) { mHoursOnes.setTextColor(mTextColor); } @@ -87,32 +91,62 @@ private void restyleViews() { protected void onFinishInflate() { super.onFinishInflate(); + mHoursTens = (ZeroTopPaddingTextView) findViewById(R.id.hours_tens); mHoursOnes = (ZeroTopPaddingTextView) findViewById(R.id.hours_ones); mMinutesTens = (ZeroTopPaddingTextView) findViewById(R.id.minutes_tens); 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); + mSecondsLabel = (ZeroTopPaddingTextView) findViewById(R.id.seconds_label); + + onUpdateViewsVisibility(); + } + private void onUpdateViewsVisibility() { + if (mHoursTens != null && !hourMinutesOnly) { + mHoursTens.setVisibility(GONE); + } if (mHoursOnes != null) { mOriginalHoursTypeface = mHoursOnes.getTypeface(); mHoursOnes.updatePaddingForBoldDate(); } - if (mMinutesTens != null) { + if (mMinutesTens != null && !hourMinutesOnly) { mMinutesTens.updatePaddingForBoldDate(); } - if (mMinutesOnes != null) { + if (mMinutesOnes != null && !hourMinutesOnly) { mMinutesOnes.updatePaddingForBoldDate(); } // Set the lowest time unit with thin font (excluding hundredths) - if (mSecondsTens != null) { + if (mSecondsTens != null && !hourMinutesOnly) { mSecondsTens.setTypeface(mAndroidClockMonoThin); mSecondsTens.updatePadding(); } - if (mSecondsOnes != null) { + if (mSecondsOnes != null && !hourMinutesOnly) { mSecondsOnes.setTypeface(mAndroidClockMonoThin); mSecondsOnes.updatePadding(); } + if (mHoursTens != null && hourMinutesOnly) { + mHoursTens.updatePaddingForBoldDate(); + mHoursTens.setVisibility(VISIBLE); + } + if (mMinutesTens != null && hourMinutesOnly) { + mMinutesTens.setTypeface(mAndroidClockMonoThin); + mMinutesTens.updatePadding(); + } + if (mMinutesOnes != null && hourMinutesOnly) { + mMinutesOnes.setTypeface(mAndroidClockMonoThin); + mMinutesOnes.updatePadding(); + } + if (mSecondsTens != null && hourMinutesOnly) { + mSecondsTens.setVisibility(GONE); + } + if (mSecondsOnes != null && hourMinutesOnly) { + mSecondsOnes.setVisibility(GONE); + } + if(mSecondsLabel != null && hourMinutesOnly){ + mSecondsLabel.setVisibility(GONE); + } } /** @@ -129,7 +163,20 @@ public void setTime(int hoursOnesDigit, int minutesTensDigit, int minutesOnesDig setTime(false, hoursOnesDigit, minutesTensDigit, minutesOnesDigit, secondsTensDigit, secondsOnesDigit); } - public void setTime(boolean isNegative, int hoursOnesDigit, int minutesTensDigit, int minutesOnesDigit, int secondsTensDigit, + public void setTime(boolean isNegative, int hoursTensDigit, int hoursOnesDigit, int minutesTensDigit, + int minutesOnesDigit) { + if (mHoursTens != null){ + mHoursTens.setText(String.format("%d", hoursTensDigit)); + } + setTime(isNegative, hoursOnesDigit, minutesTensDigit, minutesOnesDigit, 0, 0); + } + + public void setHourMinutesOnly(boolean hourMinutesOnly) { + this.hourMinutesOnly = hourMinutesOnly; + onUpdateViewsVisibility(); + } + + public void setTime(boolean isNegative, int hoursOnesDigit, int minutesTensDigit, int minutesOnesDigit, int secondsTensDigit, int secondsOnesDigit) { mMinusLabel.setVisibility(isNegative ? View.VISIBLE : View.GONE); diff --git a/library/src/main/res/layout/hms_picker_view.xml b/library/src/main/res/layout/hms_picker_view.xml index 0ddfda79..84951a02 100644 --- a/library/src/main/res/layout/hms_picker_view.xml +++ b/library/src/main/res/layout/hms_picker_view.xml @@ -19,6 +19,14 @@ android:layout_gravity="center" android:baselineAligned="false" android:gravity="top"> + + + + + + + diff --git a/sample/src/main/java/com/codetroopers/betterpickers/sample/activity/hmspicker/SampleHmsHourMinutesOnlyUsage.java b/sample/src/main/java/com/codetroopers/betterpickers/sample/activity/hmspicker/SampleHmsHourMinutesOnlyUsage.java new file mode 100644 index 00000000..a19b9c26 --- /dev/null +++ b/sample/src/main/java/com/codetroopers/betterpickers/sample/activity/hmspicker/SampleHmsHourMinutesOnlyUsage.java @@ -0,0 +1,48 @@ +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 SampleHmsHourMinutesOnlyUsage 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() + .setHourMinutesOnly(true) + .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, String.valueOf(hours), + String.valueOf(minutes), String.valueOf(seconds), isNegative)); + } + +}