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