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));
+ }
+
+}