在 CM 13.0 的代码中,有一些很有意思的简中翻译。

res/values-zh-rCN/cm_strings.xml

对 power_menu_expanded_desktop 字符串的翻译是“扩展桌面”。可惜的是,在 Android 7.0,即 CM 14.0 的代码中,博主再没有找到这一字符串。

那是否意味着 Android 7.0 抛弃了扩展桌面这一功能呢?显然不是。

博主在 AOSP 7.0 的 android_frameworks_base 中找到了以下文件:

services/core/java/com/android/server/policy/PolicyControl.java

其中包含了系统获取扩展桌面设置的函数:

public static void reloadFromSetting(Context context) {
    if (DEBUG) Slog.d(TAG, "reloadFromSetting()");
    String value = null;
    try {
        value = Settings.Global.getStringForUser(context.getContentResolver(),
                Settings.Global.POLICY_CONTROL,
                UserHandle.USER_CURRENT);
        if (sSettingValue != null && sSettingValue.equals(value)) return;
        setFilters(value);
        sSettingValue = value;
    } catch (Throwable t) {
        Slog.w(TAG, "Error loading policy control, value=" + value, t);
    }
}

不难理解系统实际上是从 Settings.Global.POLICY_CONTROL 获取每个应用程序的详细参数的。

private static final String NAME_IMMERSIVE_FULL = "immersive.full";
private static final String NAME_IMMERSIVE_STATUS = "immersive.status";
private static final String NAME_IMMERSIVE_NAVIGATION = "immersive.navigation";
private static final String NAME_IMMERSIVE_PRECONFIRMATIONS = "immersive.preconfirms";

真正起作用的是前三项,分别为同时隐藏、隐藏状态栏和隐藏导航栏。非常有意思的是,CM 13.0 的 android_packages_apps_Settings 中

src/com/android/settings/applications/ExpandedDesktopExtraPrefs.java

提供了以下函数,以及注释:

private void updateExpandedDesktopStyle() {
    if (mExpandedDesktopStylePref == null) {
        return;
    }
    mExpandedDesktopStyle = getExpandedDesktopStyle();
    mExpandedDesktopStylePref.setValueIndex(mExpandedDesktopStyle);
    mExpandedDesktopStylePref.setSummary(getDesktopSummary(mExpandedDesktopStyle));
    // We need to visually show the change
    // TODO: This is hacky, but it works
    writeValue("");
    writeValue("immersive.full=*");
}

因此,可以执行以下命令立即启用扩展桌面:

 settings put global policy_control immersive.full=*

上述命令理论上对 Android 4.4+ 的设备全部有效,前提条件是需要有 root 权限或者在 adb shell 中执行。