Loading packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java +13 −14 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.service.notification.SnoozeCriterion; import android.service.notification.StatusBarNotification; import android.service.notification.StatusBarNotification; import android.view.MotionEvent; import android.view.MotionEvent; import android.view.View; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; @ProvidesInterface(version = NotificationSwipeActionHelper.VERSION) @ProvidesInterface(version = NotificationSwipeActionHelper.VERSION) @DependsOn(target = SnoozeOption.class) @DependsOn(target = SnoozeOption.class) Loading Loading @@ -56,19 +57,17 @@ public interface NotificationSwipeActionHelper { public boolean swipedFastEnough(float translation, float velocity); public boolean swipedFastEnough(float translation, float velocity); @ProvidesInterface(version = SnoozeOption.VERSION) @ProvidesInterface(version = SnoozeOption.VERSION) public static class SnoozeOption { public interface SnoozeOption { public static final int VERSION = 1; public static final int VERSION = 2; public int snoozeForMinutes; public SnoozeCriterion criterion; public SnoozeCriterion getSnoozeCriterion(); public CharSequence description; public CharSequence confirmation; public CharSequence getDescription(); public SnoozeOption(SnoozeCriterion crit, int minsToSnoozeFor, CharSequence desc, public CharSequence getConfirmation(); CharSequence confirm) { criterion = crit; public int getMinutesToSnoozeFor(); snoozeForMinutes = minsToSnoozeFor; description = desc; public AccessibilityAction getAccessibilityAction(); confirmation = confirm; } } } } } packages/SystemUI/res/layout/notification_snooze.xml +2 −1 Original line number Original line Diff line number Diff line Loading @@ -20,12 +20,13 @@ android:layout_width="match_parent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:orientation="vertical" android:clickable="true" android:background="@color/notification_guts_bg_color" android:background="@color/notification_guts_bg_color" android:theme="@*android:style/Theme.DeviceDefault.Light"> android:theme="@*android:style/Theme.DeviceDefault.Light"> <RelativeLayout <RelativeLayout android:layout_width="match_parent" android:id="@+id/notification_snooze" android:id="@+id/notification_snooze" android:layout_width="match_parent" android:layout_height="@dimen/snooze_snackbar_min_height"> android:layout_height="@dimen/snooze_snackbar_min_height"> <TextView <TextView Loading packages/SystemUI/res/values/ids.xml +8 −0 Original line number Original line Diff line number Diff line Loading @@ -78,5 +78,13 @@ <item type="id" name="action_move_tl_50" /> <item type="id" name="action_move_tl_50" /> <item type="id" name="action_move_tl_30" /> <item type="id" name="action_move_tl_30" /> <item type="id" name="action_move_rb_full" /> <item type="id" name="action_move_rb_full" /> <!-- Accessibility actions for the notification menu --> <item type="id" name="action_snooze_undo"/> <item type="id" name="action_snooze_15_min"/> <item type="id" name="action_snooze_30_min"/> <item type="id" name="action_snooze_1_hour"/> <item type="id" name="action_snooze_2_hours"/> <item type="id" name="action_snooze_assistant_suggestion_1"/> </resources> </resources> packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java +147 −21 Original line number Original line Diff line number Diff line Loading @@ -21,11 +21,14 @@ import java.util.List; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ObjectAnimator; import android.content.Context; import android.content.Context; import android.content.res.Resources; import android.content.res.Resources; import android.graphics.Typeface; import android.graphics.Typeface; import android.os.Bundle; import android.service.notification.SnoozeCriterion; import android.service.notification.SnoozeCriterion; import android.service.notification.StatusBarNotification; import android.service.notification.StatusBarNotification; import android.text.SpannableString; import android.text.SpannableString; Loading @@ -35,6 +38,9 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.View; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.widget.ImageView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.TextView; Loading @@ -45,6 +51,10 @@ import com.android.systemui.R; public class NotificationSnooze extends LinearLayout public class NotificationSnooze extends LinearLayout implements NotificationGuts.GutsContent, View.OnClickListener { implements NotificationGuts.GutsContent, View.OnClickListener { /** * If this changes more number increases, more assistant action resId's should be defined for * accessibility purposes, see {@link #setSnoozeOptions(List)} */ private static final int MAX_ASSISTANT_SUGGESTIONS = 1; private static final int MAX_ASSISTANT_SUGGESTIONS = 1; private NotificationGuts mGutsContainer; private NotificationGuts mGutsContainer; private NotificationSwipeActionHelper mSnoozeListener; private NotificationSwipeActionHelper mSnoozeListener; Loading Loading @@ -79,16 +89,60 @@ public class NotificationSnooze extends LinearLayout mDivider = findViewById(R.id.divider); mDivider = findViewById(R.id.divider); mDivider.setAlpha(0f); mDivider.setAlpha(0f); mSnoozeOptionContainer = (ViewGroup) findViewById(R.id.snooze_options); mSnoozeOptionContainer = (ViewGroup) findViewById(R.id.snooze_options); mSnoozeOptionContainer.setVisibility(View.INVISIBLE); mSnoozeOptionContainer.setAlpha(0f); mSnoozeOptionContainer.setAlpha(0f); // Create the different options based on list // Create the different options based on list mSnoozeOptions = getDefaultSnoozeOptions(); mSnoozeOptions = getDefaultSnoozeOptions(); createOptionViews(); createOptionViews(); // Default to first option in list setSelected(mDefaultOption); setSelected(mDefaultOption); } } @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); if (mGutsContainer != null && mGutsContainer.isExposed()) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { event.getText().add(mSelectedOptionText.getText()); } } } @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.addAction(new AccessibilityAction(R.id.action_snooze_undo, getResources().getString(R.string.snooze_undo))); int count = mSnoozeOptions.size(); for (int i = 0; i < count; i++) { AccessibilityAction action = mSnoozeOptions.get(i).getAccessibilityAction(); if (action != null) { info.addAction(action); } } } @Override public boolean performAccessibilityActionInternal(int action, Bundle arguments) { if (super.performAccessibilityActionInternal(action, arguments)) { return true; } if (action == R.id.action_snooze_undo) { undoSnooze(mUndoButton); return true; } for (int i = 0; i < mSnoozeOptions.size(); i++) { SnoozeOption so = mSnoozeOptions.get(i); if (so.getAccessibilityAction() != null && so.getAccessibilityAction().getId() == action) { setSelected(so); return true; } } return false; } public void setSnoozeOptions(final List<SnoozeCriterion> snoozeList) { public void setSnoozeOptions(final List<SnoozeCriterion> snoozeList) { if (snoozeList == null) { if (snoozeList == null) { return; return; Loading @@ -98,7 +152,10 @@ public class NotificationSnooze extends LinearLayout final int count = Math.min(MAX_ASSISTANT_SUGGESTIONS, snoozeList.size()); final int count = Math.min(MAX_ASSISTANT_SUGGESTIONS, snoozeList.size()); for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { SnoozeCriterion sc = snoozeList.get(i); SnoozeCriterion sc = snoozeList.get(i); mSnoozeOptions.add(new SnoozeOption(sc, 0, sc.getExplanation(), sc.getConfirmation())); AccessibilityAction action = new AccessibilityAction( R.id.action_snooze_assistant_suggestion_1, sc.getExplanation()); mSnoozeOptions.add(new NotificationSnoozeOption(sc, 0, sc.getExplanation(), sc.getConfirmation(), action)); } } createOptionViews(); createOptionViews(); } } Loading @@ -117,15 +174,16 @@ public class NotificationSnooze extends LinearLayout private ArrayList<SnoozeOption> getDefaultSnoozeOptions() { private ArrayList<SnoozeOption> getDefaultSnoozeOptions() { ArrayList<SnoozeOption> options = new ArrayList<>(); ArrayList<SnoozeOption> options = new ArrayList<>(); options.add(createOption(15 /* minutes */)); options.add(createOption(30 /* minutes */)); options.add(createOption(15 /* minutes */, R.id.action_snooze_15_min)); mDefaultOption = createOption(60 /* minutes */); options.add(createOption(30 /* minutes */, R.id.action_snooze_30_min)); mDefaultOption = createOption(60 /* minutes */, R.id.action_snooze_1_hour); options.add(mDefaultOption); options.add(mDefaultOption); options.add(createOption(60 * 2 /* minutes */)); options.add(createOption(60 * 2 /* minutes */, R.id.action_snooze_2_hours)); return options; return options; } } private SnoozeOption createOption(int minutes) { private SnoozeOption createOption(int minutes, int accessibilityActionId) { Resources res = getResources(); Resources res = getResources(); boolean showInHours = minutes >= 60; boolean showInHours = minutes >= 60; int pluralResId = showInHours int pluralResId = showInHours Loading @@ -137,7 +195,9 @@ public class NotificationSnooze extends LinearLayout SpannableString string = new SpannableString(resultText); SpannableString string = new SpannableString(resultText); string.setSpan(new StyleSpan(Typeface.BOLD), string.setSpan(new StyleSpan(Typeface.BOLD), resultText.length() - description.length(), resultText.length(), 0 /* flags */); resultText.length() - description.length(), resultText.length(), 0 /* flags */); return new SnoozeOption(null, minutes, description, string); AccessibilityAction action = new AccessibilityAction(accessibilityActionId, description); return new NotificationSnoozeOption(null, minutes, description, string, action); } } private void createOptionViews() { private void createOptionViews() { Loading @@ -149,7 +209,7 @@ public class NotificationSnooze extends LinearLayout TextView tv = (TextView) inflater.inflate(R.layout.notification_snooze_option, TextView tv = (TextView) inflater.inflate(R.layout.notification_snooze_option, mSnoozeOptionContainer, false); mSnoozeOptionContainer, false); mSnoozeOptionContainer.addView(tv); mSnoozeOptionContainer.addView(tv); tv.setText(option.description); tv.setText(option.getDescription()); tv.setTag(option); tv.setTag(option); tv.setOnClickListener(this); tv.setOnClickListener(this); } } Loading Loading @@ -184,18 +244,36 @@ public class NotificationSnooze extends LinearLayout mDivider.getAlpha(), show ? 1f : 0f); mDivider.getAlpha(), show ? 1f : 0f); ObjectAnimator optionAnim = ObjectAnimator.ofFloat(mSnoozeOptionContainer, View.ALPHA, ObjectAnimator optionAnim = ObjectAnimator.ofFloat(mSnoozeOptionContainer, View.ALPHA, mSnoozeOptionContainer.getAlpha(), show ? 1f : 0f); mSnoozeOptionContainer.getAlpha(), show ? 1f : 0f); mSnoozeOptionContainer.setVisibility(View.VISIBLE); mExpandAnimation = new AnimatorSet(); mExpandAnimation = new AnimatorSet(); mExpandAnimation.playTogether(dividerAnim, optionAnim); mExpandAnimation.playTogether(dividerAnim, optionAnim); mExpandAnimation.setDuration(150); mExpandAnimation.setDuration(150); mExpandAnimation.setInterpolator(show ? Interpolators.ALPHA_IN : Interpolators.ALPHA_OUT); mExpandAnimation.setInterpolator(show ? Interpolators.ALPHA_IN : Interpolators.ALPHA_OUT); mExpandAnimation.addListener(new AnimatorListenerAdapter() { boolean cancelled = false; @Override public void onAnimationCancel(Animator animation) { cancelled = true; } @Override public void onAnimationEnd(Animator animation) { if (!show && !cancelled) { mSnoozeOptionContainer.setVisibility(View.INVISIBLE); mSnoozeOptionContainer.setAlpha(0f); } } }); mExpandAnimation.start(); mExpandAnimation.start(); } } private void setSelected(SnoozeOption option) { private void setSelected(SnoozeOption option) { mSelectedOption = option; mSelectedOption = option; mSelectedOptionText.setText(option.confirmation); mSelectedOptionText.setText(option.getConfirmation()); showSnoozeOptions(false); showSnoozeOptions(false); hideSelectedOption(); hideSelectedOption(); sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } } @Override @Override Loading @@ -212,6 +290,11 @@ public class NotificationSnooze extends LinearLayout showSnoozeOptions(!mExpanded); showSnoozeOptions(!mExpanded); } else { } else { // Undo snooze was selected // Undo snooze was selected undoSnooze(v); } } private void undoSnooze(View v) { mSelectedOption = null; mSelectedOption = null; int[] parentLoc = new int[2]; int[] parentLoc = new int[2]; int[] targetLoc = new int[2]; int[] targetLoc = new int[2]; Loading @@ -224,7 +307,6 @@ public class NotificationSnooze extends LinearLayout showSnoozeOptions(false); showSnoozeOptions(false); mGutsContainer.closeControls(x, y, false /* save */, false /* force */); mGutsContainer.closeControls(x, y, false /* save */, false /* force */); } } } @Override @Override public int getActualHeight() { public int getActualHeight() { Loading Loading @@ -270,4 +352,48 @@ public class NotificationSnooze extends LinearLayout public boolean isLeavebehind() { public boolean isLeavebehind() { return true; return true; } } public class NotificationSnoozeOption implements SnoozeOption { private SnoozeCriterion mCriterion; private int mMinutesToSnoozeFor; private CharSequence mDescription; private CharSequence mConfirmation; private AccessibilityAction mAction; public NotificationSnoozeOption(SnoozeCriterion sc, int minToSnoozeFor, CharSequence description, CharSequence confirmation, AccessibilityAction action) { mCriterion = sc; mMinutesToSnoozeFor = minToSnoozeFor; mDescription = description; mConfirmation = confirmation; mAction = action; } @Override public SnoozeCriterion getSnoozeCriterion() { return mCriterion; } @Override public CharSequence getDescription() { return mDescription; } @Override public CharSequence getConfirmation() { return mConfirmation; } @Override public int getMinutesToSnoozeFor() { return mMinutesToSnoozeFor; } @Override public AccessibilityAction getAccessibilityAction() { return mAction; } } } } packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +4 −3 Original line number Original line Diff line number Diff line Loading @@ -6071,11 +6071,12 @@ public class StatusBar extends SystemUI implements DemoMode, } } public void setNotificationSnoozed(StatusBarNotification sbn, SnoozeOption snoozeOption) { public void setNotificationSnoozed(StatusBarNotification sbn, SnoozeOption snoozeOption) { if (snoozeOption.criterion != null) { if (snoozeOption.getSnoozeCriterion() != null) { mNotificationListener.snoozeNotification(sbn.getKey(), snoozeOption.criterion.getId()); mNotificationListener.snoozeNotification(sbn.getKey(), snoozeOption.getSnoozeCriterion().getId()); } else { } else { mNotificationListener.snoozeNotification(sbn.getKey(), mNotificationListener.snoozeNotification(sbn.getKey(), snoozeOption.snoozeForMinutes * 60 * 1000); snoozeOption.getMinutesToSnoozeFor() * 60 * 1000); } } } } Loading Loading
packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java +13 −14 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.service.notification.SnoozeCriterion; import android.service.notification.StatusBarNotification; import android.service.notification.StatusBarNotification; import android.view.MotionEvent; import android.view.MotionEvent; import android.view.View; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; @ProvidesInterface(version = NotificationSwipeActionHelper.VERSION) @ProvidesInterface(version = NotificationSwipeActionHelper.VERSION) @DependsOn(target = SnoozeOption.class) @DependsOn(target = SnoozeOption.class) Loading Loading @@ -56,19 +57,17 @@ public interface NotificationSwipeActionHelper { public boolean swipedFastEnough(float translation, float velocity); public boolean swipedFastEnough(float translation, float velocity); @ProvidesInterface(version = SnoozeOption.VERSION) @ProvidesInterface(version = SnoozeOption.VERSION) public static class SnoozeOption { public interface SnoozeOption { public static final int VERSION = 1; public static final int VERSION = 2; public int snoozeForMinutes; public SnoozeCriterion criterion; public SnoozeCriterion getSnoozeCriterion(); public CharSequence description; public CharSequence confirmation; public CharSequence getDescription(); public SnoozeOption(SnoozeCriterion crit, int minsToSnoozeFor, CharSequence desc, public CharSequence getConfirmation(); CharSequence confirm) { criterion = crit; public int getMinutesToSnoozeFor(); snoozeForMinutes = minsToSnoozeFor; description = desc; public AccessibilityAction getAccessibilityAction(); confirmation = confirm; } } } } }
packages/SystemUI/res/layout/notification_snooze.xml +2 −1 Original line number Original line Diff line number Diff line Loading @@ -20,12 +20,13 @@ android:layout_width="match_parent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:orientation="vertical" android:clickable="true" android:background="@color/notification_guts_bg_color" android:background="@color/notification_guts_bg_color" android:theme="@*android:style/Theme.DeviceDefault.Light"> android:theme="@*android:style/Theme.DeviceDefault.Light"> <RelativeLayout <RelativeLayout android:layout_width="match_parent" android:id="@+id/notification_snooze" android:id="@+id/notification_snooze" android:layout_width="match_parent" android:layout_height="@dimen/snooze_snackbar_min_height"> android:layout_height="@dimen/snooze_snackbar_min_height"> <TextView <TextView Loading
packages/SystemUI/res/values/ids.xml +8 −0 Original line number Original line Diff line number Diff line Loading @@ -78,5 +78,13 @@ <item type="id" name="action_move_tl_50" /> <item type="id" name="action_move_tl_50" /> <item type="id" name="action_move_tl_30" /> <item type="id" name="action_move_tl_30" /> <item type="id" name="action_move_rb_full" /> <item type="id" name="action_move_rb_full" /> <!-- Accessibility actions for the notification menu --> <item type="id" name="action_snooze_undo"/> <item type="id" name="action_snooze_15_min"/> <item type="id" name="action_snooze_30_min"/> <item type="id" name="action_snooze_1_hour"/> <item type="id" name="action_snooze_2_hours"/> <item type="id" name="action_snooze_assistant_suggestion_1"/> </resources> </resources>
packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java +147 −21 Original line number Original line Diff line number Diff line Loading @@ -21,11 +21,14 @@ import java.util.List; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ObjectAnimator; import android.content.Context; import android.content.Context; import android.content.res.Resources; import android.content.res.Resources; import android.graphics.Typeface; import android.graphics.Typeface; import android.os.Bundle; import android.service.notification.SnoozeCriterion; import android.service.notification.SnoozeCriterion; import android.service.notification.StatusBarNotification; import android.service.notification.StatusBarNotification; import android.text.SpannableString; import android.text.SpannableString; Loading @@ -35,6 +38,9 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.View; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.widget.ImageView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.TextView; Loading @@ -45,6 +51,10 @@ import com.android.systemui.R; public class NotificationSnooze extends LinearLayout public class NotificationSnooze extends LinearLayout implements NotificationGuts.GutsContent, View.OnClickListener { implements NotificationGuts.GutsContent, View.OnClickListener { /** * If this changes more number increases, more assistant action resId's should be defined for * accessibility purposes, see {@link #setSnoozeOptions(List)} */ private static final int MAX_ASSISTANT_SUGGESTIONS = 1; private static final int MAX_ASSISTANT_SUGGESTIONS = 1; private NotificationGuts mGutsContainer; private NotificationGuts mGutsContainer; private NotificationSwipeActionHelper mSnoozeListener; private NotificationSwipeActionHelper mSnoozeListener; Loading Loading @@ -79,16 +89,60 @@ public class NotificationSnooze extends LinearLayout mDivider = findViewById(R.id.divider); mDivider = findViewById(R.id.divider); mDivider.setAlpha(0f); mDivider.setAlpha(0f); mSnoozeOptionContainer = (ViewGroup) findViewById(R.id.snooze_options); mSnoozeOptionContainer = (ViewGroup) findViewById(R.id.snooze_options); mSnoozeOptionContainer.setVisibility(View.INVISIBLE); mSnoozeOptionContainer.setAlpha(0f); mSnoozeOptionContainer.setAlpha(0f); // Create the different options based on list // Create the different options based on list mSnoozeOptions = getDefaultSnoozeOptions(); mSnoozeOptions = getDefaultSnoozeOptions(); createOptionViews(); createOptionViews(); // Default to first option in list setSelected(mDefaultOption); setSelected(mDefaultOption); } } @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); if (mGutsContainer != null && mGutsContainer.isExposed()) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { event.getText().add(mSelectedOptionText.getText()); } } } @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.addAction(new AccessibilityAction(R.id.action_snooze_undo, getResources().getString(R.string.snooze_undo))); int count = mSnoozeOptions.size(); for (int i = 0; i < count; i++) { AccessibilityAction action = mSnoozeOptions.get(i).getAccessibilityAction(); if (action != null) { info.addAction(action); } } } @Override public boolean performAccessibilityActionInternal(int action, Bundle arguments) { if (super.performAccessibilityActionInternal(action, arguments)) { return true; } if (action == R.id.action_snooze_undo) { undoSnooze(mUndoButton); return true; } for (int i = 0; i < mSnoozeOptions.size(); i++) { SnoozeOption so = mSnoozeOptions.get(i); if (so.getAccessibilityAction() != null && so.getAccessibilityAction().getId() == action) { setSelected(so); return true; } } return false; } public void setSnoozeOptions(final List<SnoozeCriterion> snoozeList) { public void setSnoozeOptions(final List<SnoozeCriterion> snoozeList) { if (snoozeList == null) { if (snoozeList == null) { return; return; Loading @@ -98,7 +152,10 @@ public class NotificationSnooze extends LinearLayout final int count = Math.min(MAX_ASSISTANT_SUGGESTIONS, snoozeList.size()); final int count = Math.min(MAX_ASSISTANT_SUGGESTIONS, snoozeList.size()); for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { SnoozeCriterion sc = snoozeList.get(i); SnoozeCriterion sc = snoozeList.get(i); mSnoozeOptions.add(new SnoozeOption(sc, 0, sc.getExplanation(), sc.getConfirmation())); AccessibilityAction action = new AccessibilityAction( R.id.action_snooze_assistant_suggestion_1, sc.getExplanation()); mSnoozeOptions.add(new NotificationSnoozeOption(sc, 0, sc.getExplanation(), sc.getConfirmation(), action)); } } createOptionViews(); createOptionViews(); } } Loading @@ -117,15 +174,16 @@ public class NotificationSnooze extends LinearLayout private ArrayList<SnoozeOption> getDefaultSnoozeOptions() { private ArrayList<SnoozeOption> getDefaultSnoozeOptions() { ArrayList<SnoozeOption> options = new ArrayList<>(); ArrayList<SnoozeOption> options = new ArrayList<>(); options.add(createOption(15 /* minutes */)); options.add(createOption(30 /* minutes */)); options.add(createOption(15 /* minutes */, R.id.action_snooze_15_min)); mDefaultOption = createOption(60 /* minutes */); options.add(createOption(30 /* minutes */, R.id.action_snooze_30_min)); mDefaultOption = createOption(60 /* minutes */, R.id.action_snooze_1_hour); options.add(mDefaultOption); options.add(mDefaultOption); options.add(createOption(60 * 2 /* minutes */)); options.add(createOption(60 * 2 /* minutes */, R.id.action_snooze_2_hours)); return options; return options; } } private SnoozeOption createOption(int minutes) { private SnoozeOption createOption(int minutes, int accessibilityActionId) { Resources res = getResources(); Resources res = getResources(); boolean showInHours = minutes >= 60; boolean showInHours = minutes >= 60; int pluralResId = showInHours int pluralResId = showInHours Loading @@ -137,7 +195,9 @@ public class NotificationSnooze extends LinearLayout SpannableString string = new SpannableString(resultText); SpannableString string = new SpannableString(resultText); string.setSpan(new StyleSpan(Typeface.BOLD), string.setSpan(new StyleSpan(Typeface.BOLD), resultText.length() - description.length(), resultText.length(), 0 /* flags */); resultText.length() - description.length(), resultText.length(), 0 /* flags */); return new SnoozeOption(null, minutes, description, string); AccessibilityAction action = new AccessibilityAction(accessibilityActionId, description); return new NotificationSnoozeOption(null, minutes, description, string, action); } } private void createOptionViews() { private void createOptionViews() { Loading @@ -149,7 +209,7 @@ public class NotificationSnooze extends LinearLayout TextView tv = (TextView) inflater.inflate(R.layout.notification_snooze_option, TextView tv = (TextView) inflater.inflate(R.layout.notification_snooze_option, mSnoozeOptionContainer, false); mSnoozeOptionContainer, false); mSnoozeOptionContainer.addView(tv); mSnoozeOptionContainer.addView(tv); tv.setText(option.description); tv.setText(option.getDescription()); tv.setTag(option); tv.setTag(option); tv.setOnClickListener(this); tv.setOnClickListener(this); } } Loading Loading @@ -184,18 +244,36 @@ public class NotificationSnooze extends LinearLayout mDivider.getAlpha(), show ? 1f : 0f); mDivider.getAlpha(), show ? 1f : 0f); ObjectAnimator optionAnim = ObjectAnimator.ofFloat(mSnoozeOptionContainer, View.ALPHA, ObjectAnimator optionAnim = ObjectAnimator.ofFloat(mSnoozeOptionContainer, View.ALPHA, mSnoozeOptionContainer.getAlpha(), show ? 1f : 0f); mSnoozeOptionContainer.getAlpha(), show ? 1f : 0f); mSnoozeOptionContainer.setVisibility(View.VISIBLE); mExpandAnimation = new AnimatorSet(); mExpandAnimation = new AnimatorSet(); mExpandAnimation.playTogether(dividerAnim, optionAnim); mExpandAnimation.playTogether(dividerAnim, optionAnim); mExpandAnimation.setDuration(150); mExpandAnimation.setDuration(150); mExpandAnimation.setInterpolator(show ? Interpolators.ALPHA_IN : Interpolators.ALPHA_OUT); mExpandAnimation.setInterpolator(show ? Interpolators.ALPHA_IN : Interpolators.ALPHA_OUT); mExpandAnimation.addListener(new AnimatorListenerAdapter() { boolean cancelled = false; @Override public void onAnimationCancel(Animator animation) { cancelled = true; } @Override public void onAnimationEnd(Animator animation) { if (!show && !cancelled) { mSnoozeOptionContainer.setVisibility(View.INVISIBLE); mSnoozeOptionContainer.setAlpha(0f); } } }); mExpandAnimation.start(); mExpandAnimation.start(); } } private void setSelected(SnoozeOption option) { private void setSelected(SnoozeOption option) { mSelectedOption = option; mSelectedOption = option; mSelectedOptionText.setText(option.confirmation); mSelectedOptionText.setText(option.getConfirmation()); showSnoozeOptions(false); showSnoozeOptions(false); hideSelectedOption(); hideSelectedOption(); sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } } @Override @Override Loading @@ -212,6 +290,11 @@ public class NotificationSnooze extends LinearLayout showSnoozeOptions(!mExpanded); showSnoozeOptions(!mExpanded); } else { } else { // Undo snooze was selected // Undo snooze was selected undoSnooze(v); } } private void undoSnooze(View v) { mSelectedOption = null; mSelectedOption = null; int[] parentLoc = new int[2]; int[] parentLoc = new int[2]; int[] targetLoc = new int[2]; int[] targetLoc = new int[2]; Loading @@ -224,7 +307,6 @@ public class NotificationSnooze extends LinearLayout showSnoozeOptions(false); showSnoozeOptions(false); mGutsContainer.closeControls(x, y, false /* save */, false /* force */); mGutsContainer.closeControls(x, y, false /* save */, false /* force */); } } } @Override @Override public int getActualHeight() { public int getActualHeight() { Loading Loading @@ -270,4 +352,48 @@ public class NotificationSnooze extends LinearLayout public boolean isLeavebehind() { public boolean isLeavebehind() { return true; return true; } } public class NotificationSnoozeOption implements SnoozeOption { private SnoozeCriterion mCriterion; private int mMinutesToSnoozeFor; private CharSequence mDescription; private CharSequence mConfirmation; private AccessibilityAction mAction; public NotificationSnoozeOption(SnoozeCriterion sc, int minToSnoozeFor, CharSequence description, CharSequence confirmation, AccessibilityAction action) { mCriterion = sc; mMinutesToSnoozeFor = minToSnoozeFor; mDescription = description; mConfirmation = confirmation; mAction = action; } @Override public SnoozeCriterion getSnoozeCriterion() { return mCriterion; } @Override public CharSequence getDescription() { return mDescription; } @Override public CharSequence getConfirmation() { return mConfirmation; } @Override public int getMinutesToSnoozeFor() { return mMinutesToSnoozeFor; } @Override public AccessibilityAction getAccessibilityAction() { return mAction; } } } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +4 −3 Original line number Original line Diff line number Diff line Loading @@ -6071,11 +6071,12 @@ public class StatusBar extends SystemUI implements DemoMode, } } public void setNotificationSnoozed(StatusBarNotification sbn, SnoozeOption snoozeOption) { public void setNotificationSnoozed(StatusBarNotification sbn, SnoozeOption snoozeOption) { if (snoozeOption.criterion != null) { if (snoozeOption.getSnoozeCriterion() != null) { mNotificationListener.snoozeNotification(sbn.getKey(), snoozeOption.criterion.getId()); mNotificationListener.snoozeNotification(sbn.getKey(), snoozeOption.getSnoozeCriterion().getId()); } else { } else { mNotificationListener.snoozeNotification(sbn.getKey(), mNotificationListener.snoozeNotification(sbn.getKey(), snoozeOption.snoozeForMinutes * 60 * 1000); snoozeOption.getMinutesToSnoozeFor() * 60 * 1000); } } } } Loading