Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51278d6a authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add customs accessibility actions to snooze, allow it to be focused" into oc-dr1-dev

parents 22ec7b0c 920fd89a
Loading
Loading
Loading
Loading
+13 −14
Original line number Original line Diff line number Diff line
@@ -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)
@@ -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;
        }
    }
    }
}
}
+2 −1
Original line number Original line Diff line number Diff line
@@ -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
+8 −0
Original line number Original line Diff line number Diff line
@@ -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>
+147 −21
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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();
    }
    }
@@ -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
@@ -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() {
@@ -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);
        }
        }
@@ -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
@@ -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];
@@ -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() {
@@ -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;
        }

    }
}
}
+4 −3
Original line number Original line Diff line number Diff line
@@ -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);
        }
        }
    }
    }