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.system;
18 
19 import android.car.drivingstate.CarUxRestrictions;
20 import android.content.Context;
21 import android.os.Build;
22 import android.os.UserManager;
23 import android.widget.Toast;
24 
25 import androidx.preference.Preference;
26 
27 import com.android.car.settings.R;
28 import com.android.car.settings.common.FragmentController;
29 import com.android.car.settings.common.PreferenceController;
30 import com.android.car.settings.development.DevelopmentSettingsUtil;
31 import com.android.settingslib.utils.StringUtil;
32 
33 /** Updates the build number entry summary with the build number. */
34 public class BuildNumberPreferenceController extends PreferenceController<Preference> {
35 
36     private UserManager mUserManager;
37     private Toast mDevHitToast;
38     private int mDevHitCountdown;
39 
BuildNumberPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions)40     public BuildNumberPreferenceController(Context context, String preferenceKey,
41             FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
42         super(context, preferenceKey, fragmentController, uxRestrictions);
43         mUserManager = UserManager.get(context);
44     }
45 
46     @Override
getPreferenceType()47     protected Class<Preference> getPreferenceType() {
48         return Preference.class;
49     }
50 
51     /**
52      * Reset the toast and counter which tracks how many more clicks until development settings is
53      * enabled.
54      */
55     @Override
onResumeInternal()56     protected void onResumeInternal() {
57         mDevHitToast = null;
58         mDevHitCountdown =
59                 DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(), mUserManager)
60                         ? -1 : getTapsToBecomeDeveloper();
61     }
62 
63     @Override
updateState(Preference preference)64     protected void updateState(Preference preference) {
65         preference.setSummary(Build.DISPLAY);
66     }
67 
68     @Override
handlePreferenceClicked(Preference preference)69     protected boolean handlePreferenceClicked(Preference preference) {
70         if (!mUserManager.isAdminUser()) {
71             return false;
72         }
73 
74         if (!DevelopmentSettingsUtil.isDeviceProvisioned(getContext())) {
75             return false;
76         }
77 
78         if (mDevHitCountdown > 0) {
79             mDevHitCountdown--;
80             if (mDevHitCountdown == 0) {
81                 DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), true);
82                 showToast(getContext().getString(R.string.show_dev_on), Toast.LENGTH_LONG);
83             } else if (mDevHitCountdown <= getTapsToBecomeDeveloper() - getTapsToShowToast()) {
84                 showToast(StringUtil.getIcuPluralsString(getContext(), mDevHitCountdown,
85                         R.string.show_dev_countdown), Toast.LENGTH_SHORT);
86             }
87         } else if (mDevHitCountdown < 0) {
88             showToast(getContext().getString(R.string.show_dev_already), Toast.LENGTH_LONG);
89         }
90         return true;
91     }
92 
showToast(String text, @Toast.Duration int duration)93     private void showToast(String text, @Toast.Duration int duration) {
94         if (mDevHitToast != null) {
95             mDevHitToast.cancel();
96         }
97         mDevHitToast = Toast.makeText(getContext(), text, duration);
98         mDevHitToast.show();
99     }
100 
getTapsToBecomeDeveloper()101     private int getTapsToBecomeDeveloper() {
102         return getContext().getResources().getInteger(
103                 R.integer.enable_developer_settings_click_count);
104     }
105 
getTapsToShowToast()106     private int getTapsToShowToast() {
107         return getContext().getResources().getInteger(
108                 R.integer.enable_developer_settings_clicks_to_show_toast_count);
109     }
110 }
111