104d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorpackage com.android.systemui.statusbar;
204d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor/*
304d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor * Copyright (C) 2017 The Android Open Source Project
404d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor *
504d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor * Licensed under the Apache License, Version 2.0 (the "License");
604d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor * you may not use this file except in compliance with the License.
704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor * You may obtain a copy of the License at
804d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor *
904d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor *      http://www.apache.org/licenses/LICENSE-2.0
1004d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor *
1104d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor * Unless required by applicable law or agreed to in writing, software
1204d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor * distributed under the License is distributed on an "AS IS" BASIS,
1304d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1404d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor * See the License for the specific language governing permissions and
1504d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor * limitations under the License
1604d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor */
1704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
1804d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorimport java.util.ArrayList;
19754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellorimport java.util.List;
2004d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
2195d743c38c919dd500d9dcacf9f998500d403d9eMady Mellorimport com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
2295d743c38c919dd500d9dcacf9f998500d403d9eMady Mellorimport com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption;
2304d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
24e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellorimport android.animation.AnimatorSet;
25e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellorimport android.animation.ObjectAnimator;
2604d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorimport android.content.Context;
2704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorimport android.content.res.Resources;
28e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellorimport android.graphics.Typeface;
29754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellorimport android.service.notification.SnoozeCriterion;
3004d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorimport android.service.notification.StatusBarNotification;
31e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellorimport android.text.SpannableString;
32e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellorimport android.text.style.StyleSpan;
3304d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorimport android.util.AttributeSet;
34754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellorimport android.util.Log;
35e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellorimport android.view.LayoutInflater;
3604d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorimport android.view.View;
3704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorimport android.view.ViewGroup;
38e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellorimport android.widget.ImageView;
3904d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorimport android.widget.LinearLayout;
4004d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorimport android.widget.TextView;
41e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor
42e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellorimport com.android.systemui.Interpolators;
4304d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorimport com.android.systemui.R;
4404d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
4504d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellorpublic class NotificationSnooze extends LinearLayout
4695d743c38c919dd500d9dcacf9f998500d403d9eMady Mellor        implements NotificationGuts.GutsContent, View.OnClickListener {
4704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
48e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    private static final int MAX_ASSISTANT_SUGGESTIONS = 1;
4995d743c38c919dd500d9dcacf9f998500d403d9eMady Mellor    private NotificationGuts mGutsContainer;
5095d743c38c919dd500d9dcacf9f998500d403d9eMady Mellor    private NotificationSwipeActionHelper mSnoozeListener;
5104d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    private StatusBarNotification mSbn;
5204d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
53754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    private TextView mSelectedOptionText;
54754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    private TextView mUndoButton;
55e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    private ImageView mExpandButton;
56e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    private View mDivider;
57e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    private ViewGroup mSnoozeOptionContainer;
58754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    private List<SnoozeOption> mSnoozeOptions;
59e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    private int mCollapsedHeight;
60651fbdec08a2b6f7987b7060eba67c629d2745d9Mady Mellor    private SnoozeOption mDefaultOption;
61754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    private SnoozeOption mSelectedOption;
62e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    private boolean mSnoozing;
63e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    private boolean mExpanded;
64e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    private AnimatorSet mExpandAnimation;
6504d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
6604d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    public NotificationSnooze(Context context, AttributeSet attrs) {
6704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        super(context, attrs);
6804d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    }
6904d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
7004d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    @Override
7104d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    protected void onFinishInflate() {
7204d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        super.onFinishInflate();
73e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mCollapsedHeight = getResources().getDimensionPixelSize(R.dimen.snooze_snackbar_min_height);
74e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        findViewById(R.id.notification_snooze).setOnClickListener(this);
75e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mSelectedOptionText = (TextView) findViewById(R.id.snooze_option_default);
76e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mUndoButton = (TextView) findViewById(R.id.undo);
77e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mUndoButton.setOnClickListener(this);
78e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mExpandButton = (ImageView) findViewById(R.id.expand_button);
79e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mDivider = findViewById(R.id.divider);
80e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mDivider.setAlpha(0f);
81e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mSnoozeOptionContainer = (ViewGroup) findViewById(R.id.snooze_options);
82e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mSnoozeOptionContainer.setAlpha(0f);
83e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor
8404d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        // Create the different options based on list
85754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        mSnoozeOptions = getDefaultSnoozeOptions();
8604d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        createOptionViews();
8704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
8804d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        // Default to first option in list
89651fbdec08a2b6f7987b7060eba67c629d2745d9Mady Mellor        setSelected(mDefaultOption);
90754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    }
91754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor
92754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    public void setSnoozeOptions(final List<SnoozeCriterion> snoozeList) {
93754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        if (snoozeList == null) {
94754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor            return;
95754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        }
96754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        mSnoozeOptions.clear();
97754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        mSnoozeOptions = getDefaultSnoozeOptions();
98754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        final int count = Math.min(MAX_ASSISTANT_SUGGESTIONS, snoozeList.size());
99754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        for (int i = 0; i < count; i++) {
100754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor            SnoozeCriterion sc = snoozeList.get(i);
101754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor            mSnoozeOptions.add(new SnoozeOption(sc, 0, sc.getExplanation(), sc.getConfirmation()));
102754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        }
103754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        createOptionViews();
104754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    }
105754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor
106c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor    public boolean isExpanded() {
107c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor        return mExpanded;
108c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor    }
109c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor
110c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor    public void setSnoozeListener(NotificationSwipeActionHelper listener) {
111c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor        mSnoozeListener = listener;
112c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor    }
113c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor
114c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor    public void setStatusBarNotification(StatusBarNotification sbn) {
115c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor        mSbn = sbn;
116c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor    }
117c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor
118754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    private ArrayList<SnoozeOption> getDefaultSnoozeOptions() {
119754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        ArrayList<SnoozeOption> options = new ArrayList<>();
120754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        options.add(createOption(R.string.snooze_option_15_min, 15));
121754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        options.add(createOption(R.string.snooze_option_30_min, 30));
122651fbdec08a2b6f7987b7060eba67c629d2745d9Mady Mellor        mDefaultOption = createOption(R.string.snooze_option_1_hour, 60);
123651fbdec08a2b6f7987b7060eba67c629d2745d9Mady Mellor        options.add(mDefaultOption);
124651fbdec08a2b6f7987b7060eba67c629d2745d9Mady Mellor        options.add(createOption(R.string.snooze_option_2_hour, 60 * 2));
125754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        return options;
126754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    }
127754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor
128754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    private SnoozeOption createOption(int descriptionResId, int minutes) {
129754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        Resources res = getResources();
130e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        final String description = res.getString(descriptionResId);
131e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        String resultText = String.format(res.getString(R.string.snoozed_for_time), description);
132e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        SpannableString string = new SpannableString(resultText);
133e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        string.setSpan(new StyleSpan(Typeface.BOLD),
134e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor                resultText.length() - description.length(), resultText.length(), 0 /* flags */);
135e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        return new SnoozeOption(null, minutes, res.getString(descriptionResId), string);
13604d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    }
13704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
13804d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    private void createOptionViews() {
139e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mSnoozeOptionContainer.removeAllViews();
140e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
141e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor                Context.LAYOUT_INFLATER_SERVICE);
142754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        for (int i = 0; i < mSnoozeOptions.size(); i++) {
143754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor            SnoozeOption option = mSnoozeOptions.get(i);
144e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            TextView tv = (TextView) inflater.inflate(R.layout.notification_snooze_option,
145e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor                    mSnoozeOptionContainer, false);
146e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            mSnoozeOptionContainer.addView(tv);
147754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor            tv.setText(option.description);
148754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor            tv.setTag(option);
14904d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor            tv.setOnClickListener(this);
15004d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        }
151e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    }
152754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor
153e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    private void hideSelectedOption() {
154e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        final int childCount = mSnoozeOptionContainer.getChildCount();
155e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        for (int i = 0; i < childCount; i++) {
156e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            final View child = mSnoozeOptionContainer.getChildAt(i);
157e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            child.setVisibility(child.getTag() == mSelectedOption ? View.GONE : View.VISIBLE);
158e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        }
15904d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    }
16004d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
16104d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    private void showSnoozeOptions(boolean show) {
162e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        int drawableId = show ? com.android.internal.R.drawable.ic_collapse_notification
163e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor                : com.android.internal.R.drawable.ic_expand_notification;
164e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mExpandButton.setImageResource(drawableId);
165e8ea7f610d30b903e393e92776677f489b3cc8b4Selim Cinek        if (mExpanded != show) {
166e8ea7f610d30b903e393e92776677f489b3cc8b4Selim Cinek            mExpanded = show;
167e8ea7f610d30b903e393e92776677f489b3cc8b4Selim Cinek            animateSnoozeOptions(show);
168e8ea7f610d30b903e393e92776677f489b3cc8b4Selim Cinek            if (mGutsContainer != null) {
169e8ea7f610d30b903e393e92776677f489b3cc8b4Selim Cinek                mGutsContainer.onHeightChanged();
170e8ea7f610d30b903e393e92776677f489b3cc8b4Selim Cinek            }
171e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        }
172e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    }
173e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor
174e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    private void animateSnoozeOptions(boolean show) {
175e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        if (mExpandAnimation != null) {
176e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            mExpandAnimation.cancel();
177e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        }
178e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        ObjectAnimator dividerAnim = ObjectAnimator.ofFloat(mDivider, View.ALPHA,
179e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor                mDivider.getAlpha(), show ? 1f : 0f);
180e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        ObjectAnimator optionAnim = ObjectAnimator.ofFloat(mSnoozeOptionContainer, View.ALPHA,
181e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor                mSnoozeOptionContainer.getAlpha(), show ? 1f : 0f);
182e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mExpandAnimation = new AnimatorSet();
183e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mExpandAnimation.playTogether(dividerAnim, optionAnim);
184e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mExpandAnimation.setDuration(150);
185e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mExpandAnimation.setInterpolator(show ? Interpolators.ALPHA_IN : Interpolators.ALPHA_OUT);
186e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        mExpandAnimation.start();
18704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    }
18804d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
189754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    private void setSelected(SnoozeOption option) {
190754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        mSelectedOption = option;
191754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        mSelectedOptionText.setText(option.confirmation);
19204d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        showSnoozeOptions(false);
193e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        hideSelectedOption();
19404d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    }
19504d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
19604d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    @Override
19704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    public void onClick(View v) {
19895d743c38c919dd500d9dcacf9f998500d403d9eMady Mellor        if (mGutsContainer != null) {
19995d743c38c919dd500d9dcacf9f998500d403d9eMady Mellor            mGutsContainer.resetFalsingCheck();
20004d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        }
20104d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        final int id = v.getId();
202754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        final SnoozeOption tag = (SnoozeOption) v.getTag();
20304d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        if (tag != null) {
204754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor            setSelected(tag);
205e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        } else if (id == R.id.notification_snooze) {
206e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            // Toggle snooze options
207e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            showSnoozeOptions(!mExpanded);
208754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor        } else {
209e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            // Undo snooze was selected
210e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            mSelectedOption = null;
211e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            int[] parentLoc = new int[2];
212e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            int[] targetLoc = new int[2];
213e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            mGutsContainer.getLocationOnScreen(parentLoc);
214e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            v.getLocationOnScreen(targetLoc);
215e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            final int centerX = v.getWidth() / 2;
216e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            final int centerY = v.getHeight() / 2;
217e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            final int x = targetLoc[0] - parentLoc[0] + centerX;
218e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            final int y = targetLoc[1] - parentLoc[1] + centerY;
219e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor            showSnoozeOptions(false);
220c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor            mGutsContainer.closeControls(x, y, false /* save */, false /* force */);
22104d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        }
22204d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    }
22304d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
224e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    @Override
225e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor    public int getActualHeight() {
226e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        return mExpanded ? getHeight() : mCollapsedHeight;
227754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor    }
228754d8226c9f775fa53610c1cb38fed0d33b7ec79Mady Mellor
22904d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    @Override
230434180ce5155f0c405080698031f05e9eab3dd4cMady Mellor    public boolean willBeRemoved() {
231434180ce5155f0c405080698031f05e9eab3dd4cMady Mellor        return mSnoozing;
232434180ce5155f0c405080698031f05e9eab3dd4cMady Mellor    }
233434180ce5155f0c405080698031f05e9eab3dd4cMady Mellor
234434180ce5155f0c405080698031f05e9eab3dd4cMady Mellor    @Override
23504d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    public View getContentView() {
236e09fb7029ac29f337b8d3b9e564e5b994a9ed927Mady Mellor        // Reset the view before use
237651fbdec08a2b6f7987b7060eba67c629d2745d9Mady Mellor        setSelected(mDefaultOption);
23804d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        return this;
23904d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    }
24004d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
24104d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    @Override
24295d743c38c919dd500d9dcacf9f998500d403d9eMady Mellor    public void setGutsParent(NotificationGuts guts) {
24395d743c38c919dd500d9dcacf9f998500d403d9eMady Mellor        mGutsContainer = guts;
24404d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    }
24504d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor
24604d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    @Override
247c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor    public boolean handleCloseControls(boolean save, boolean force) {
248c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor        if (mExpanded && !force) {
249c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor            // Collapse expanded state on outside touch
250c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor            showSnoozeOptions(false);
251c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor            return true;
252c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor        } else if (mSnoozeListener != null && mSelectedOption != null) {
253c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor            // Snooze option selected so commit it
254434180ce5155f0c405080698031f05e9eab3dd4cMady Mellor            mSnoozing = true;
25595d743c38c919dd500d9dcacf9f998500d403d9eMady Mellor            mSnoozeListener.snooze(mSbn, mSelectedOption);
25604d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor            return true;
257c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor        } else {
258c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor            // The view should actually be closed
259c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor            setSelected(mSnoozeOptions.get(0));
260c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor            return false; // Return false here so that guts handles closing the view
26104d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor        }
262c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor    }
263c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor
264c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor    @Override
265c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor    public boolean isLeavebehind() {
266c2dbe49bdcd487cb18bc97f5d4942224f64e8540Mady Mellor        return true;
26704d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor    }
26804d7a0fca0c2d7c1bb08fbcc0301fcf0cdc7838fMady Mellor}
269