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

Commit 38bb4443 authored by Kyrylo Mikos's avatar Kyrylo Mikos Committed by Adnan Begovic
Browse files

frameworks/base: Bringup expanded desktop and implement per-user configuration.

Change-Id: I27b2a4174f544f3437a5c918581ae599e4c3369b
parent 88b8fb27
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -7473,11 +7473,12 @@ public final class Settings {
        /**
         * Defines global runtime overrides to window policy.
         *
         * See {@link com.android.internal.policy.impl.PolicyControl} for value format.
         * See {@link android.view.WindowManagerPolicyControl} for value format.
         *
         * @hide
         */
        public static final String POLICY_CONTROL = "policy_control";
        public static final String POLICY_CONTROL_SELECTED = "policy_control_selected";

        /**
         * Defines global zen mode.  ZEN_MODE_OFF, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+16 −0
Original line number Diff line number Diff line
@@ -1119,6 +1119,22 @@ public interface WindowManager extends ViewManager {
         * {@hide} */
        public static final int PRIVATE_FLAG_FULLY_TRANSPARENT = 0x10000000;


        /**
         * {@hide}
         */
        public static final int PRIVATE_FLAG_STATUS_HIDE_FORCED = 0x00000800;
        /**
         * {@hide}
         */
        public static final int PRIVATE_FLAG_NAV_HIDE_FORCED = 0x00001000;
        /**
         * The window had not set FULLSCREEN flag so don't handle it as fullscreen in layoutWindowLw
         *
         * {@hide}
         */
        public static final int PRIVATE_FLAG_WAS_NOT_FULLSCREEN = 0x00002000;

        /**
         * Control flags that are private to the platform.
         * @hide
+2 −0
Original line number Diff line number Diff line
@@ -426,6 +426,8 @@ public interface WindowManagerPolicy {

        /** Unregister a system listener for touch events */
        void unregisterPointerEventListener(PointerEventListener listener);

        void addSystemUIVisibilityFlag(int flags);
    }

    public interface PointerEventListener {
+135 −5
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

package com.android.internal.policy.impl;
package android.view;

import android.app.ActivityManager;
import android.content.Context;
@@ -22,13 +22,12 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.util.ArraySet;
import android.util.Slog;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.WindowManagerPolicy.WindowState;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Iterator;

/**
 * Runtime adjustments applied to the global window policy.
@@ -47,8 +46,10 @@ import java.io.StringWriter;
 *
 * Separate multiple name-value pairs with ':'
 *   e.g. "immersive.status=apps:immersive.preconfirms=*"
 *
 *   @hide
 */
public class PolicyControl {
public class WindowManagerPolicyControl {
    private static String TAG = "PolicyControl";
    private static boolean DEBUG = false;

@@ -96,6 +97,32 @@ public class PolicyControl {
        return flags;
    }

    public static int getPrivateWindowFlags(WindowState win, LayoutParams attrs) {
        attrs = attrs != null ? attrs : win.getAttrs();
        int privateFlags = attrs.privateFlags;
        if (sImmersiveStatusFilter != null && sImmersiveStatusFilter.matches(attrs)) {
            if ((attrs.flags & LayoutParams.FLAG_FULLSCREEN) == 0) {
                privateFlags |= LayoutParams.PRIVATE_FLAG_WAS_NOT_FULLSCREEN;
            }
            privateFlags |= LayoutParams.PRIVATE_FLAG_STATUS_HIDE_FORCED;
        }

        if (sImmersiveNavigationFilter != null && sImmersiveNavigationFilter.matches(attrs)) {
            privateFlags |= LayoutParams.PRIVATE_FLAG_NAV_HIDE_FORCED;
        }

        return privateFlags;
    }

    public static boolean immersiveStatusFilterMatches(String packageName) {
        return sImmersiveStatusFilter != null && sImmersiveStatusFilter.matches(packageName);
    }

    public static boolean immersiveNavigationFilterMatches(String packageName) {
        return sImmersiveNavigationFilter != null
                && sImmersiveNavigationFilter.matches(packageName);
    }

    public static int adjustClearableFlags(WindowState win, int clearableFlags) {
        final LayoutParams attrs = win != null ? win.getAttrs() : null;
        if (sImmersiveStatusFilter != null && sImmersiveStatusFilter.matches(attrs)) {
@@ -111,11 +138,15 @@ public class PolicyControl {
    }

    public static void reloadFromSetting(Context context) {
        reloadFromSetting(context, Settings.Global.POLICY_CONTROL);
    }

    public static void reloadFromSetting(Context context, String key) {
        if (DEBUG) Slog.d(TAG, "reloadFromSetting()");
        String value = null;
        try {
            value = Settings.Global.getStringForUser(context.getContentResolver(),
                    Settings.Global.POLICY_CONTROL,
                    key,
                    UserHandle.USER_CURRENT);
            if (sSettingValue != null && sSettingValue.equals(value)) return;
            setFilters(value);
@@ -125,6 +156,105 @@ public class PolicyControl {
        }
    }

    public static void saveToSettings(Context context) {
        saveToSettings(context, Settings.Global.POLICY_CONTROL);
    }

    public static void saveToSettings(Context context, String key) {
        StringBuilder value = new StringBuilder();
        boolean needSemicolon = false;
        if (sImmersiveStatusFilter != null) {
            writeFilter(NAME_IMMERSIVE_STATUS, sImmersiveStatusFilter, value);
            needSemicolon = true;
        }
        if (sImmersiveNavigationFilter != null) {
            if (needSemicolon) {
                value.append(":");
            }
            writeFilter(NAME_IMMERSIVE_NAVIGATION, sImmersiveNavigationFilter, value);
        }

        Settings.Global.putString(context.getContentResolver(), key, value.toString());
    }

    public static void addToStatusWhiteList(String packageName) {
        if (sImmersiveStatusFilter == null) {
            sImmersiveStatusFilter = new Filter(new ArraySet<String>(), new ArraySet<String>());
        }

        if (!sImmersiveStatusFilter.mWhitelist.contains(packageName)) {
            sImmersiveStatusFilter.mWhitelist.add(packageName);
        }
    }

    public static void addToNavigationWhiteList(String packageName) {
        if (sImmersiveNavigationFilter == null) {
            sImmersiveNavigationFilter = new Filter(new ArraySet<String>(), new ArraySet<String>());
        }

        if (!sImmersiveNavigationFilter.mWhitelist.contains(packageName)) {
            sImmersiveNavigationFilter.mWhitelist.add(packageName);
        }
    }

    public static void removeFromWhiteLists(String packageName) {
        if (sImmersiveStatusFilter != null) {
            sImmersiveStatusFilter.mWhitelist.remove(packageName);
        }
        if (sImmersiveNavigationFilter != null) {
            sImmersiveNavigationFilter.mWhitelist.remove(packageName);
        }
    }

    public static ArraySet<String> getWhiteLists() {
        ArraySet<String> result = new ArraySet<>();

        if (sImmersiveStatusFilter != null) {
            result.addAll(sImmersiveStatusFilter.mWhitelist);
        }
        if (sImmersiveNavigationFilter != null
                && sImmersiveNavigationFilter != sImmersiveStatusFilter) {
            result.addAll(sImmersiveNavigationFilter.mWhitelist);
        }

        return result;
    }

    private static void writeFilter(String name, Filter filter, StringBuilder stringBuilder) {
        if (filter.mWhitelist.isEmpty() && filter.mBlacklist.isEmpty()) {
            return;
        }
        stringBuilder.append(name);
        stringBuilder.append("=");

        boolean needComma = false;
        if (!filter.mWhitelist.isEmpty()) {
            writePackages(filter.mWhitelist, stringBuilder, false);
            needComma = true;
        }
        if (!filter.mBlacklist.isEmpty()) {
            if (needComma) {
                stringBuilder.append(",");
            }
            writePackages(filter.mBlacklist, stringBuilder, true);
        }
    }

    private static void writePackages(ArraySet<String> set, StringBuilder stringBuilder,
                                      boolean isBlackList) {
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            if (isBlackList) {
                stringBuilder.append("-");
            }
            String name = iterator.next();
            stringBuilder.append(name);
            if (iterator.hasNext()) {
                stringBuilder.append(",");
            }
        }
    }

    public static boolean isImmersiveFiltersActive() {
        return sImmersiveStatusFilter != null || sImmersiveNavigationFilter != null;
    }
+2 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.view.View;
import android.view.WindowManager;
import android.view.WindowManagerPolicy.WindowState;

import android.view.WindowManagerPolicyControl;
import com.android.internal.statusbar.IStatusBarService;

import java.io.PrintWriter;
@@ -108,7 +109,7 @@ public class BarController {
        if (mWin != null) {
            if (win != null && (win.getAttrs().privateFlags
                    & WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR) == 0) {
                int fl = PolicyControl.getWindowFlags(win, null);
                int fl = WindowManagerPolicyControl.getWindowFlags(win, null);
                if ((fl & mTranslucentWmFlag) != 0) {
                    vis |= mTranslucentFlag;
                } else {
Loading