1 /*
2  * Copyright (C) 2016 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.gestures;
18 
19 import android.content.Context;
20 import android.content.SharedPreferences;
21 import android.content.res.Resources;
22 import android.hardware.Sensor;
23 import android.hardware.SensorManager;
24 import android.os.UserHandle;
25 import android.os.UserManager;
26 import android.provider.Settings;
27 import android.text.TextUtils;
28 
29 import androidx.annotation.VisibleForTesting;
30 
31 import com.android.settings.R;
32 import com.android.settings.Utils;
33 
34 public class DoubleTwistPreferenceController extends GesturePreferenceController {
35 
36     private final int ON = 1;
37     private final int OFF = 0;
38 
39     private static final String PREF_KEY_VIDEO = "gesture_double_twist_video";
40     private final String mDoubleTwistPrefKey;
41     private final UserManager mUserManager;
42 
DoubleTwistPreferenceController(Context context, String key)43     public DoubleTwistPreferenceController(Context context, String key) {
44         super(context, key);
45         mDoubleTwistPrefKey = key;
46         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
47     }
48 
isSuggestionComplete(Context context, SharedPreferences prefs)49     public static boolean isSuggestionComplete(Context context, SharedPreferences prefs) {
50         return !isGestureAvailable(context)
51                 || prefs.getBoolean(DoubleTwistGestureSettings.PREF_KEY_SUGGESTION_COMPLETE, false);
52     }
53 
isGestureAvailable(Context context)54     public static boolean isGestureAvailable(Context context) {
55         final Resources resources = context.getResources();
56         final String name = resources.getString(R.string.gesture_double_twist_sensor_name);
57         final String vendor = resources.getString(R.string.gesture_double_twist_sensor_vendor);
58         if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(vendor)) {
59             final SensorManager sensorManager =
60                     (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
61             for (Sensor s : sensorManager.getSensorList(Sensor.TYPE_ALL)) {
62                 if (name.equals(s.getName()) && vendor.equals(s.getVendor())) {
63                     return true;
64                 }
65             }
66         }
67         return false;
68     }
69 
70     @Override
getAvailabilityStatus()71     public int getAvailabilityStatus() {
72         return isGestureAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
73     }
74 
75     @Override
isSliceable()76     public boolean isSliceable() {
77         return TextUtils.equals(getPreferenceKey(), "gesture_double_twist");
78     }
79 
80     @Override
isPublicSlice()81     public boolean isPublicSlice() {
82         return true;
83     }
84 
85     @Override
getVideoPrefKey()86     protected String getVideoPrefKey() {
87         return PREF_KEY_VIDEO;
88     }
89 
90     @Override
getPreferenceKey()91     public String getPreferenceKey() {
92         return mDoubleTwistPrefKey;
93     }
94 
95     @Override
setChecked(boolean isChecked)96     public boolean setChecked(boolean isChecked) {
97         setDoubleTwistPreference(mContext, mUserManager, isChecked ? ON : OFF);
98         return true;
99     }
100 
setDoubleTwistPreference(Context context, UserManager userManager, int enabled)101     public static void setDoubleTwistPreference(Context context, UserManager userManager,
102             int enabled) {
103         Settings.Secure.putInt(context.getContentResolver(),
104                 Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, enabled);
105         final int managedProfileUserId = getManagedProfileId(userManager);
106         if (managedProfileUserId != UserHandle.USER_NULL) {
107             Settings.Secure.putIntForUser(context.getContentResolver(),
108                     Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, enabled,
109                     managedProfileUserId);
110         }
111     }
112 
113     @Override
isChecked()114     public boolean isChecked() {
115         final int doubleTwistEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
116                 Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, ON);
117         return doubleTwistEnabled != 0;
118     }
119 
120     @VisibleForTesting
getManagedProfileId(UserManager userManager)121     public static int getManagedProfileId(UserManager userManager) {
122         return Utils.getManagedProfileId(userManager, UserHandle.myUserId());
123     }
124 }
125