• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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.settings.accessibility;
18 
19 import android.content.ComponentName;
20 import android.content.Context;
21 import android.os.Bundle;
22 import android.os.Handler;
23 
24 import androidx.preference.PreferenceScreen;
25 
26 import com.android.settings.R;
27 import com.android.settings.core.TogglePreferenceController;
28 import com.android.settingslib.PrimarySwitchPreference;
29 import com.android.settingslib.core.lifecycle.LifecycleObserver;
30 import com.android.settingslib.core.lifecycle.events.OnCreate;
31 import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
32 
33 /** PrimarySwitchPreferenceController that shows quick settings tooltip on first use. */
34 public abstract class AccessibilityQuickSettingsPrimarySwitchPreferenceController
35         extends TogglePreferenceController
36         implements LifecycleObserver, OnCreate, OnSaveInstanceState {
37     private static final String KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow";
38     private final Handler mHandler;
39     private PrimarySwitchPreference mPreference;
40     private AccessibilityQuickSettingsTooltipWindow mTooltipWindow;
41     private boolean mNeedsQSTooltipReshow = false;
42 
43     /** Returns the accessibility tile component name. */
getTileComponentName()44     abstract ComponentName getTileComponentName();
45 
46     /** Returns the accessibility tile tooltip content. */
getTileTooltipContent()47     abstract CharSequence getTileTooltipContent();
48 
AccessibilityQuickSettingsPrimarySwitchPreferenceController(Context context, String preferenceKey)49     public AccessibilityQuickSettingsPrimarySwitchPreferenceController(Context context,
50             String preferenceKey) {
51         super(context, preferenceKey);
52         mHandler = new Handler(context.getMainLooper());
53     }
54 
55     @Override
onCreate(Bundle savedInstanceState)56     public void onCreate(Bundle savedInstanceState) {
57         // Restore the tooltip.
58         if (savedInstanceState != null) {
59             if (savedInstanceState.containsKey(KEY_SAVED_QS_TOOLTIP_RESHOW)) {
60                 mNeedsQSTooltipReshow = savedInstanceState.getBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW);
61             }
62         }
63     }
64 
65     @Override
onSaveInstanceState(Bundle outState)66     public void onSaveInstanceState(Bundle outState) {
67         if (mTooltipWindow != null) {
68             outState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, mTooltipWindow.isShowing());
69         }
70     }
71 
72     @Override
displayPreference(PreferenceScreen screen)73     public void displayPreference(PreferenceScreen screen) {
74         super.displayPreference(screen);
75         mPreference = screen.findPreference(getPreferenceKey());
76         if (mNeedsQSTooltipReshow) {
77             mHandler.post(this::showQuickSettingsTooltipIfNeeded);
78         }
79     }
80 
81     @Override
setChecked(boolean isChecked)82     public boolean setChecked(boolean isChecked) {
83         if (isChecked) {
84             showQuickSettingsTooltipIfNeeded();
85         }
86         return isChecked;
87     }
88 
89     @Override
isChecked()90     public boolean isChecked() {
91         return false;
92     }
93 
94     @Override
getAvailabilityStatus()95     public int getAvailabilityStatus() {
96         return AVAILABLE;
97     }
98 
99     @Override
getSliceHighlightMenuRes()100     public int getSliceHighlightMenuRes() {
101         return R.string.menu_key_accessibility;
102     }
103 
showQuickSettingsTooltipIfNeeded()104     private void showQuickSettingsTooltipIfNeeded() {
105         if (mPreference == null) {
106             // Returns if no preference found by slice highlight menu.
107             return;
108         }
109 
110         final ComponentName tileComponentName = getTileComponentName();
111         if (tileComponentName == null) {
112             // Returns if no tile service assigned.
113             return;
114         }
115 
116         if (!mNeedsQSTooltipReshow && AccessibilityQuickSettingUtils.hasValueInSharedPreferences(
117                 mContext, tileComponentName)) {
118             // Returns if quick settings tooltip only show once.
119             return;
120         }
121 
122         mTooltipWindow = new AccessibilityQuickSettingsTooltipWindow(mContext);
123         mTooltipWindow.setup(getTileTooltipContent(),
124                 R.drawable.accessibility_auto_added_qs_tooltip_illustration);
125         mTooltipWindow.showAtTopCenter(mPreference.getSwitch());
126         AccessibilityQuickSettingUtils.optInValueToSharedPreferences(mContext, tileComponentName);
127         mNeedsQSTooltipReshow = false;
128     }
129 }
130