1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.tv.settings.suggestions; 18 19 import android.app.PendingIntent; 20 import android.content.Context; 21 import android.service.settings.suggestions.Suggestion; 22 import android.support.v7.preference.Preference; 23 import android.support.v7.preference.PreferenceViewHolder; 24 import android.util.Log; 25 import android.view.View; 26 27 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 28 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; 29 import com.android.settingslib.suggestions.SuggestionControllerMixin; 30 import com.android.tv.settings.R; 31 32 /** 33 * Custom preference for Suggestions. 34 */ 35 public class SuggestionPreference extends Preference { 36 public static final String SUGGESTION_PREFERENCE_KEY = "suggestion_pref_key"; 37 private static final String TAG = "SuggestionPreference"; 38 private final MetricsFeatureProvider mMetricsFeatureProvider = 39 new MetricsFeatureProvider(); 40 41 private final Suggestion mSuggestion; 42 private final SuggestionControllerMixin mSuggestionControllerMixin; 43 private String mId; 44 private Callback mCallback; 45 46 public SuggestionPreference(Suggestion suggestion, Context context, 47 SuggestionControllerMixin suggestionControllerMixin, Callback callback) { 48 super(context); 49 setLayoutResource(R.layout.suggestion_item); 50 this.mSuggestionControllerMixin = suggestionControllerMixin; 51 this.mSuggestion = suggestion; 52 this.mId = suggestion.getId(); 53 this.mCallback = callback; 54 setKey(SUGGESTION_PREFERENCE_KEY + mId); 55 } 56 57 public String getId() { 58 return mId; 59 } 60 61 @Override 62 public void onBindViewHolder(final PreferenceViewHolder holder) { 63 super.onBindViewHolder(holder); 64 65 View containerView = holder.itemView.findViewById(R.id.main_container); 66 containerView.setOnClickListener(v -> launchSuggestion()); 67 68 // In accessibility mode, item_container get focused instead of main_container, 69 // so we need to add the same listener to item_container. 70 View itemContainerView = holder.itemView.findViewById(R.id.item_container); 71 itemContainerView.setOnClickListener(v -> launchSuggestion()); 72 73 View dismissButton = holder.itemView.findViewById(R.id.dismiss_button); 74 dismissButton.setOnClickListener(v -> { 75 mSuggestionControllerMixin.dismissSuggestion(mSuggestion); 76 if (mCallback != null) { 77 mCallback.onSuggestionClosed(SuggestionPreference.this); 78 } 79 }); 80 81 mMetricsFeatureProvider.action(getContext(), MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, 82 mId); 83 } 84 85 private void launchSuggestion() { 86 try { 87 mSuggestion.getPendingIntent().send(); 88 mSuggestionControllerMixin.launchSuggestion(mSuggestion); 89 mMetricsFeatureProvider.action(getContext(), 90 MetricsEvent.ACTION_SETTINGS_SUGGESTION, mId); 91 } catch (PendingIntent.CanceledException e) { 92 Log.w(TAG, "Failed to start suggestion " + mSuggestion.getTitle()); 93 } 94 } 95 96 public interface Callback { 97 /** Called when the dismiss button is clicked **/ 98 void onSuggestionClosed(Preference preference); 99 } 100 } 101