1 /* 2 * Copyright (C) 2018 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.car.settings.suggestions; 18 19 import android.content.Context; 20 import android.service.settings.suggestions.Suggestion; 21 import android.view.View; 22 23 import androidx.preference.PreferenceViewHolder; 24 25 import com.android.car.settings.R; 26 import com.android.car.ui.preference.CarUiPreference; 27 28 import java.util.Objects; 29 30 /** 31 * Custom preference for Suggestions. 32 */ 33 public class SuggestionPreference extends CarUiPreference { 34 35 public static final String SUGGESTION_PREFERENCE_KEY = "suggestion_pref_key"; 36 37 /** 38 * Callback for actions performed on a suggestion preference. 39 */ 40 public interface Callback { 41 /** Called when the suggestion should be launched. */ launchSuggestion(SuggestionPreference preference)42 void launchSuggestion(SuggestionPreference preference); 43 44 /** Called when the suggestion should be dismissed. */ dismissSuggestion(SuggestionPreference preference)45 void dismissSuggestion(SuggestionPreference preference); 46 } 47 48 private final Callback mCallback; 49 private Suggestion mSuggestion; 50 SuggestionPreference(Context context, Suggestion suggestion, Callback callback)51 public SuggestionPreference(Context context, Suggestion suggestion, Callback callback) { 52 super(context); 53 setLayoutResource(R.layout.suggestion_preference); 54 mCallback = callback; 55 setKey(SUGGESTION_PREFERENCE_KEY + suggestion.getId()); 56 updateSuggestion(suggestion); 57 } 58 59 /** 60 * Returns the {@link Suggestion} represented by this preference. 61 */ getSuggestion()62 public Suggestion getSuggestion() { 63 return mSuggestion; 64 } 65 66 /** 67 * Updates the icon, title, and summary of the preference with those of the given 68 * {@link Suggestion}. 69 * 70 * @param suggestion the updated suggestion to represent 71 * @throws IllegalArgumentException if the given suggestion has a different id than the 72 * suggestion passed to the constructor 73 */ updateSuggestion(Suggestion suggestion)74 public void updateSuggestion(Suggestion suggestion) { 75 if (mSuggestion != null && !Objects.equals(mSuggestion.getId(), suggestion.getId())) { 76 throw new IllegalArgumentException( 77 "Suggestion preference update must have a matching id"); 78 } 79 mSuggestion = suggestion; 80 setIcon((suggestion.getIcon() != null) ? suggestion.getIcon().loadDrawable(getContext()) 81 : null); 82 setTitle(suggestion.getTitle()); 83 setSummary(suggestion.getSummary()); 84 } 85 86 @Override onBindViewHolder(final PreferenceViewHolder holder)87 public void onBindViewHolder(final PreferenceViewHolder holder) { 88 super.onBindViewHolder(holder); 89 90 holder.itemView.setOnClickListener(v -> mCallback.launchSuggestion(this)); 91 92 View dismissButton = holder.findViewById(R.id.dismiss_button); 93 dismissButton.setOnClickListener(v -> mCallback.dismissSuggestion(this)); 94 } 95 } 96