1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 package com.android.settings.display; 15 16 import android.app.settings.SettingsEnums; 17 import android.content.Context; 18 import android.text.TextUtils; 19 20 import androidx.preference.Preference; 21 22 import com.android.internal.view.RotationPolicy; 23 import com.android.settings.R; 24 import com.android.settings.core.PreferenceControllerMixin; 25 import com.android.settings.core.TogglePreferenceController; 26 import com.android.settings.overlay.FeatureFactory; 27 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; 28 import com.android.settingslib.core.lifecycle.LifecycleObserver; 29 import com.android.settingslib.core.lifecycle.events.OnPause; 30 import com.android.settingslib.core.lifecycle.events.OnResume; 31 32 public class AutoRotatePreferenceController extends TogglePreferenceController implements 33 PreferenceControllerMixin, Preference.OnPreferenceChangeListener, LifecycleObserver, 34 OnResume, OnPause { 35 36 private final MetricsFeatureProvider mMetricsFeatureProvider; 37 private Preference mPreference; 38 private RotationPolicy.RotationPolicyListener mRotationPolicyListener; 39 AutoRotatePreferenceController(Context context, String key)40 public AutoRotatePreferenceController(Context context, String key) { 41 super(context, key); 42 mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); 43 } 44 45 @Override updateState(Preference preference)46 public void updateState(Preference preference) { 47 mPreference = preference; 48 super.updateState(preference); 49 } 50 51 @Override onResume()52 public void onResume() { 53 if (mRotationPolicyListener == null) { 54 mRotationPolicyListener = new RotationPolicy.RotationPolicyListener() { 55 @Override 56 public void onChange() { 57 if (mPreference != null) { 58 updateState(mPreference); 59 } 60 } 61 }; 62 } 63 RotationPolicy.registerRotationPolicyListener(mContext, 64 mRotationPolicyListener); 65 } 66 67 @Override onPause()68 public void onPause() { 69 if (mRotationPolicyListener != null) { 70 RotationPolicy.unregisterRotationPolicyListener(mContext, mRotationPolicyListener); 71 } 72 } 73 74 @Override getAvailabilityStatus()75 public int getAvailabilityStatus() { 76 return RotationPolicy.isRotationLockToggleVisible(mContext) 77 ? AVAILABLE : UNSUPPORTED_ON_DEVICE; 78 } 79 80 @Override isSliceable()81 public boolean isSliceable() { 82 return TextUtils.equals(getPreferenceKey(), "auto_rotate"); 83 } 84 85 @Override isPublicSlice()86 public boolean isPublicSlice() { 87 return true; 88 } 89 90 @Override getSliceHighlightMenuRes()91 public int getSliceHighlightMenuRes() { 92 return R.string.menu_key_display; 93 } 94 95 @Override isChecked()96 public boolean isChecked() { 97 return !RotationPolicy.isRotationLocked(mContext); 98 } 99 100 @Override setChecked(boolean isChecked)101 public boolean setChecked(boolean isChecked) { 102 final boolean isLocked = !isChecked; 103 mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_ROTATION_LOCK, 104 isLocked); 105 RotationPolicy.setRotationLock(mContext, isLocked); 106 return true; 107 } 108 } 109