Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7a380f3d authored by Garfield Tan's avatar Garfield Tan
Browse files

Ask user to reboot when enabling freeform and desktop mode

The introduction of FreeformTaskListener in WM shell requires a reboot
after enabling freeform support fully. Let's add a dialog explaining the
requirement and ask user to reboot the device.

Enabling desktop mode also requires a reboot to take effect, so this CL
also adds the support to it.

There is also a cancel button to dismiss the dialog without a reboot,
just in case users need to hold off the reboot for any reason.

Bug: 215437867
Test: Pressing OK reboots the device. Pressing Cancel dismisses the
dialog.
Test: atest SettingsRoboTests:FreeformWindowsPreferenceControllerTest
Test: atest SettingsRoboTests:DesktopModePreferenceControllerTest

Change-Id: I553237a29751f73afa9fd4066241a19740872f6f
parent 01288373
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -13810,4 +13810,17 @@
    <string name="dream_preview_button_title">Preview screensaver</string>
    <!-- Button to customize the screensaver [CHAR LIMIT=20] -->
    <string name="customize_button_title">Customize</string>
    <!-- Dialog body text used to explain a reboot is required after enabling freeform support for
    it to work [CHAR LIMIT=none] -->
    <string name="reboot_dialog_enable_freeform_support">A reboot is required to enable freeform
    support.</string>
    <!-- Dialog body text used to explain a reboot is required after forcing desktop mode on
    secondary dislays. [CHAR LIMIT=none] -->
    <string name="reboot_dialog_force_desktop_mode">A reboot is required to force desktop mode on
    secondary displays.</string>
    <!-- Text on the dialog button to reboot the device now [CHAR LIMIT=50] -->
    <string name="reboot_dialog_reboot_now">Reboot now</string>
    <!-- Text on the dialog button to reboot the device later [CHAR LIMIT=50] -->
    <string name="reboot_dialog_reboot_later">Reboot later</string>
</resources>
+19 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.settings.development;
import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS;

import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.provider.Settings;

@@ -26,11 +27,13 @@ import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;

import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;

public class DesktopModePreferenceController extends DeveloperOptionsPreferenceController
        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin,
        RebootConfirmationDialogHost {

    private static final String FORCE_DESKTOP_MODE_KEY = "force_desktop_mode_on_external_displays";

@@ -39,8 +42,12 @@ public class DesktopModePreferenceController extends DeveloperOptionsPreferenceC
    @VisibleForTesting
    static final int SETTING_VALUE_ON = 1;

    public DesktopModePreferenceController(Context context) {
    private final DevelopmentSettingsDashboardFragment mFragment;

    public DesktopModePreferenceController(
            Context context, DevelopmentSettingsDashboardFragment fragment) {
        super(context);
        mFragment = fragment;
    }

    @Override
@@ -54,6 +61,10 @@ public class DesktopModePreferenceController extends DeveloperOptionsPreferenceC
        Settings.Global.putInt(mContext.getContentResolver(),
                DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS,
                isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
        if (isEnabled) {
            RebootConfirmationDialogFragment.show(
                    mFragment, R.string.reboot_dialog_force_desktop_mode, this);
        }
        return true;
    }

@@ -72,6 +83,12 @@ public class DesktopModePreferenceController extends DeveloperOptionsPreferenceC
        ((SwitchPreference) mPreference).setChecked(false);
    }

    @Override
    public void onRebootConfirmed() {
        final Intent intent = new Intent(Intent.ACTION_REBOOT);
        mContext.startActivity(intent);
    }

    @VisibleForTesting
    String getBuildType() {
        return Build.TYPE;
+2 −2
Original line number Diff line number Diff line
@@ -553,8 +553,8 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
        controllers.add(new NotificationChannelWarningsPreferenceController(context));
        controllers.add(new AllowAppsOnExternalPreferenceController(context));
        controllers.add(new ResizableActivityPreferenceController(context));
        controllers.add(new FreeformWindowsPreferenceController(context));
        controllers.add(new DesktopModePreferenceController(context));
        controllers.add(new FreeformWindowsPreferenceController(context, fragment));
        controllers.add(new DesktopModePreferenceController(context, fragment));
        controllers.add(new NonResizableMultiWindowPreferenceController(context));
        controllers.add(new ShortcutManagerThrottlingPreferenceController(context));
        controllers.add(new EnableGnssRawMeasFullTrackingPreferenceController(context));
+19 −2
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.settings.development;

import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.provider.Settings;

@@ -24,11 +25,13 @@ import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;

import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;

public class FreeformWindowsPreferenceController extends DeveloperOptionsPreferenceController
        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin,
        RebootConfirmationDialogHost {

    private static final String ENABLE_FREEFORM_SUPPORT_KEY = "enable_freeform_support";

@@ -37,8 +40,12 @@ public class FreeformWindowsPreferenceController extends DeveloperOptionsPrefere
    @VisibleForTesting
    static final int SETTING_VALUE_ON = 1;

    public FreeformWindowsPreferenceController(Context context) {
    private final DevelopmentSettingsDashboardFragment mFragment;

    public FreeformWindowsPreferenceController(
            Context context, DevelopmentSettingsDashboardFragment fragment) {
        super(context);
        mFragment = fragment;
    }

    @Override
@@ -52,6 +59,10 @@ public class FreeformWindowsPreferenceController extends DeveloperOptionsPrefere
        Settings.Global.putInt(mContext.getContentResolver(),
                Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT,
                isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
        if (isEnabled) {
            RebootConfirmationDialogFragment.show(
                    mFragment, R.string.reboot_dialog_enable_freeform_support, this);
        }
        return true;
    }

@@ -70,6 +81,12 @@ public class FreeformWindowsPreferenceController extends DeveloperOptionsPrefere
        ((SwitchPreference) mPreference).setChecked(false);
    }

    @Override
    public void onRebootConfirmed() {
        final Intent intent = new Intent(Intent.ACTION_REBOOT);
        mContext.startActivity(intent);
    }

    @VisibleForTesting
    String getBuildType() {
        return Build.TYPE;
+77 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.development;

import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.DialogInterface;
import android.os.Bundle;

import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;

/**
 * Dialog fragment for reboot confirmation when enabling certain features.
 */
public class RebootConfirmationDialogFragment extends InstrumentedDialogFragment
        implements DialogInterface.OnClickListener {

    private static final String TAG = "FreeformPrefRebootDlg";

    private final int mMessageId;
    private final RebootConfirmationDialogHost mHost;

    /**
     * Show an instance of this dialog.
     */
    public static void show(Fragment fragment, int messageId, RebootConfirmationDialogHost host) {
        final FragmentManager manager = fragment.getActivity().getSupportFragmentManager();
        if (manager.findFragmentByTag(TAG) == null) {
            final RebootConfirmationDialogFragment dialog =
                    new RebootConfirmationDialogFragment(messageId, host);
            dialog.show(manager, TAG);
        }
    }

    private RebootConfirmationDialogFragment(int messageId, RebootConfirmationDialogHost host) {
        mMessageId = messageId;
        mHost = host;
    }

    @Override
    public int getMetricsCategory() {
        return SettingsEnums.REBOOT_CONFIRMATION_DIALOG;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstances) {
        return new AlertDialog.Builder(getActivity())
                .setMessage(mMessageId)
                .setPositiveButton(R.string.reboot_dialog_reboot_now, this)
                .setNegativeButton(R.string.reboot_dialog_reboot_later, null)
                .create();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        mHost.onRebootConfirmed();
    }
}
Loading