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.settings.development.desktopexperience; 18 19 import static android.provider.Settings.Global.DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES; 20 import static android.window.DesktopModeFlags.ToggleOverride.fromSetting; 21 import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_OFF; 22 import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_ON; 23 import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_UNSET; 24 25 import android.content.Context; 26 import android.provider.Settings; 27 import android.window.DesktopModeFlags.ToggleOverride; 28 29 import androidx.annotation.NonNull; 30 import androidx.annotation.Nullable; 31 import androidx.preference.Preference; 32 import androidx.preference.TwoStatePreference; 33 34 import com.android.settings.R; 35 import com.android.settings.core.PreferenceControllerMixin; 36 import com.android.settings.development.DevelopmentSettingsDashboardFragment; 37 import com.android.settings.development.RebootConfirmationDialogFragment; 38 import com.android.settings.development.RebootConfirmationDialogHost; 39 import com.android.settingslib.development.DeveloperOptionsPreferenceController; 40 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; 41 42 /** 43 * Preference controller to control Desktop mode features 44 */ 45 public class DesktopModePreferenceController extends DeveloperOptionsPreferenceController 46 implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin, 47 RebootConfirmationDialogHost { 48 49 private static final String OVERRIDE_DESKTOP_MODE_FEATURES_KEY = 50 "override_desktop_mode_features"; 51 52 @Nullable 53 private final DevelopmentSettingsDashboardFragment mFragment; 54 DesktopModePreferenceController( Context context, @Nullable DevelopmentSettingsDashboardFragment fragment)55 public DesktopModePreferenceController( 56 Context context, @Nullable DevelopmentSettingsDashboardFragment fragment) { 57 super(context); 58 mFragment = fragment; 59 } 60 61 @Override isAvailable()62 public boolean isAvailable() { 63 return DesktopModeStatus.canShowDesktopModeDevOption(mContext) 64 && !DesktopModeStatus.canShowDesktopExperienceDevOption(mContext); 65 } 66 67 @Override getPreferenceKey()68 public String getPreferenceKey() { 69 return OVERRIDE_DESKTOP_MODE_FEATURES_KEY; 70 } 71 72 @Override onPreferenceChange(@onNull Preference preference, Object newValue)73 public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) { 74 final boolean isEnabled = (Boolean) newValue; 75 Settings.Global.putInt(mContext.getContentResolver(), 76 DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, 77 isEnabled ? OVERRIDE_ON.getSetting() : OVERRIDE_OFF.getSetting()); 78 if (mFragment != null) { 79 RebootConfirmationDialogFragment.show( 80 mFragment, R.string.reboot_dialog_override_desktop_mode, this); 81 } 82 return true; 83 } 84 85 @Override updateState(Preference preference)86 public void updateState(Preference preference) { 87 // Use overridden state, if not present, then use default state 88 final int overrideInt = Settings.Global.getInt(mContext.getContentResolver(), 89 DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, OVERRIDE_UNSET.getSetting()); 90 final ToggleOverride toggleOverride = fromSetting(overrideInt, 91 OVERRIDE_UNSET); 92 final boolean shouldDevOptionBeEnabled = switch (toggleOverride) { 93 case OVERRIDE_OFF -> false; 94 case OVERRIDE_ON -> true; 95 case OVERRIDE_UNSET -> DesktopModeStatus.shouldDevOptionBeEnabledByDefault(mContext); 96 }; 97 ((TwoStatePreference) mPreference).setChecked(shouldDevOptionBeEnabled); 98 } 99 100 @Override onDeveloperOptionsSwitchDisabled()101 protected void onDeveloperOptionsSwitchDisabled() { 102 super.onDeveloperOptionsSwitchDisabled(); 103 Settings.Global.putInt(mContext.getContentResolver(), 104 DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES, OVERRIDE_UNSET.getSetting()); 105 } 106 } 107