Use vibrate toggle button

This commit is contained in:
Phillip Hsu 2016-09-26 20:05:59 -07:00
parent a3d204e4c1
commit 3d873fa6c2
7 changed files with 87 additions and 14 deletions

View File

@ -1,26 +1,28 @@
package com.philliphsu.clock2.alarms.ui;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Vibrator;
import android.support.annotation.IdRes;
import android.support.design.widget.CheckableImageButton;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ToggleButton;
import com.philliphsu.clock2.list.OnListItemInteractionListener;
import com.philliphsu.clock2.R;
import com.philliphsu.clock2.alarms.Alarm;
import com.philliphsu.clock2.alarms.misc.AlarmController;
import com.philliphsu.clock2.alarms.misc.DaysOfWeek;
import com.philliphsu.clock2.dialogs.RingtonePickerDialog;
import com.philliphsu.clock2.timepickers.Utils;
import com.philliphsu.clock2.dialogs.RingtonePickerDialogController;
import com.philliphsu.clock2.list.OnListItemInteractionListener;
import com.philliphsu.clock2.timepickers.Utils;
import com.philliphsu.clock2.util.FragmentTagUtils;
import butterknife.Bind;
@ -35,11 +37,12 @@ public class ExpandedAlarmViewHolder extends BaseAlarmViewHolder {
@Bind(R.id.ok) Button mOk;
@Bind(R.id.delete) Button mDelete;
@Bind(R.id.ringtone) Button mRingtone;
@Bind(R.id.vibrate) CheckBox mVibrate;
@Bind(R.id.vibrate) CheckableImageButton mVibrate;
@Bind({R.id.day0, R.id.day1, R.id.day2, R.id.day3, R.id.day4, R.id.day5, R.id.day6})
ToggleButton[] mDays;
private final ColorStateList mDayToggleColors;
private final ColorStateList mVibrateColors;
private final RingtonePickerDialogController mRingtonePickerController;
public ExpandedAlarmViewHolder(ViewGroup parent, final OnListItemInteractionListener<Alarm> listener,
@ -83,11 +86,16 @@ public class ExpandedAlarmViewHolder extends BaseAlarmViewHolder {
};
// TODO: Phase out Utils.getColorFromThemeAttr because it doesn't work for text colors.
// WHereas getTextColorFromThemeAttr works for both regular colors and text colors.
int[] colors = {
int[] dayToggleColors = {
/*item 1*/Utils.getTextColorFromThemeAttr(getContext(), R.attr.colorAccent),
/*item 2*/Utils.getTextColorFromThemeAttr(getContext(), android.R.attr.textColorHint)
};
mDayToggleColors = new ColorStateList(states, colors);
int[] vibrateColors = {
/*item 1*/Utils.getTextColorFromThemeAttr(getContext(), R.attr.colorAccent),
/*item 2*/Utils.getTextColorFromThemeAttr(getContext(), R.attr.themedIconTint)
};
mDayToggleColors = new ColorStateList(states, dayToggleColors);
mVibrateColors = new ColorStateList(states, vibrateColors);
mRingtonePickerController = new RingtonePickerDialogController(mFragmentManager,
new RingtonePickerDialog.OnRingtoneSelectedListener() {
@ -149,9 +157,14 @@ public class ExpandedAlarmViewHolder extends BaseAlarmViewHolder {
@OnClick(R.id.vibrate)
void onVibrateToggled() {
final boolean checked = mVibrate.isChecked();
if (checked) {
Vibrator vibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(300);
}
final Alarm oldAlarm = getAlarm();
Alarm newAlarm = oldAlarm.toBuilder()
.vibrates(mVibrate.isChecked())
.vibrates(checked)
.build();
oldAlarm.copyMutableFieldsTo(newAlarm);
persistUpdatedAlarm(newAlarm, false);
@ -198,6 +211,7 @@ public class ExpandedAlarmViewHolder extends BaseAlarmViewHolder {
}
private void bindVibrate(boolean vibrates) {
Utils.setTintList(mVibrate, mVibrate.getDrawable(), mVibrateColors);
mVibrate.setChecked(vibrates);
}

View File

@ -0,0 +1,39 @@
package com.philliphsu.clock2.alarms.ui;
import android.content.Context;
import android.support.design.widget.CheckableImageButton;
import android.util.AttributeSet;
import android.view.SoundEffectConstants;
/**
* Created by Phillip Hsu on 9/26/2016.
*
* Temporary fix for design support library's CheckableImageButton that toggles itself when clicked.
*/
public class TempCheckableImageButton extends CheckableImageButton {
public TempCheckableImageButton(Context context) {
super(context);
}
public TempCheckableImageButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TempCheckableImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override // borrowed from CompoundButton#performClick()
public boolean performClick() {
toggle();
final boolean handled = super.performClick();
if (!handled) {
// View only makes a sound effect if the onClickListener was
// called, so we'll need to make one here instead.
playSoundEffect(SoundEffectConstants.CLICK);
}
return handled;
}
}

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M0,15h2L2,9L0,9v6zM3,17h2L5,7L3,7v10zM22,9v6h2L24,9h-2zM19,17h2L21,7h-2v10zM16.5,3h-9C6.67,3 6,3.67 6,4.5v15c0,0.83 0.67,1.5 1.5,1.5h9c0.83,0 1.5,-0.67 1.5,-1.5v-15c0,-0.83 -0.67,-1.5 -1.5,-1.5zM16,19L8,19L8,5h8v14z"/>
</vector>

View File

@ -103,12 +103,9 @@
android:drawableStart="@drawable/ic_ringtone_24dp"
android:drawablePadding="@dimen/text_compound_drawable_padding"/>
<!--TODO: See CheckableImageButton-->
<CheckBox
<com.philliphsu.clock2.alarms.ui.TempCheckableImageButton
android:id="@+id/vibrate"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="Vibrate"/>
style="@style/AlarmVibrateToggle"/>
</LinearLayout>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="BaseAlarmToggleButton">
<item name="android:background">?selectableItemBackgroundBorderless</item>
</style>
</resources>

View File

@ -63,6 +63,7 @@
<!--ExpandedAlarmViewHolder-->
<dimen name="expanded_alarm_elevation">2dp</dimen> <!--TODO: Increase for v21-->
<dimen name="label_height">48dp</dimen>
<dimen name="vibrate_toggle_size">48dp</dimen>
<!--EditTimerActivity-->
<dimen name="field_end_margin">8dp</dimen>

View File

@ -1,10 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AlarmDayToggle">
<style name="BaseAlarmToggleButton">
<item name="android:background">?selectableItemBackground</item>
</style>
<style name="AlarmDayToggle" parent="BaseAlarmToggleButton">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">match_parent</item>
<item name="android:layout_weight">1</item>
<item name="android:textAllCaps">true</item>
<item name="android:background">?selectableItemBackground</item>
</style>
<style name="AlarmVibrateToggle" parent="BaseAlarmToggleButton">
<item name="android:layout_width">@dimen/vibrate_toggle_size</item>
<item name="android:layout_height">match_parent</item>
<item name="srcCompat">@drawable/ic_vibrate_24dp</item>
</style>
</resources>