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

Commit 2b9e4b65 authored by Shawn Lin's avatar Shawn Lin
Browse files

Add multi-user support for kids mode

Listener to ACTION_USER_SWITCH intent and update the settings key when
user switched.

Bug: 231575466
Test: 1. set different settings keys for different user.
      2. switch between users and see if the setting value is correct.
Change-Id: Ia1afcb6121b296b293bef0ba7d0a0be25b857554
parent c9daa032
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -16,13 +16,18 @@

package com.android.internal.policy;

import android.annotation.NonNull;
import android.app.ActivityManager;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.provider.Settings;

import java.util.Collection;

/**
 * A ContentObserver for listening {@link Settings.Secure#NAV_BAR_FORCE_VISIBLE} setting key.
 *
@@ -59,7 +64,11 @@ public class ForceShowNavBarSettingsObserver extends ContentObserver {
    }

    @Override
    public void onChange(boolean selfChange) {
    public void onChange(boolean selfChange, @NonNull Collection<Uri> uris, int flags, int userId) {
        if (userId != ActivityManager.getCurrentUser()) {
            return;
        }

        if (mOnChangeRunnable != null) {
            mOnChangeRunnable.run();
        }
+10 −1
Original line number Diff line number Diff line
@@ -16,13 +16,18 @@

package com.android.wm.shell.kidsmode;

import android.annotation.NonNull;
import android.app.ActivityManager;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.provider.Settings;

import java.util.Collection;

/**
 * A ContentObserver for listening kids mode relative setting keys:
 *  - {@link Settings.Secure#NAVIGATION_MODE}
@@ -64,7 +69,11 @@ public class KidsModeSettingsObserver extends ContentObserver {
    }

    @Override
    public void onChange(boolean selfChange) {
    public void onChange(boolean selfChange, @NonNull Collection<Uri> uris, int flags, int userId) {
        if (userId != ActivityManager.getCurrentUser()) {
            return;
        }

        if (mOnChangeRunnable != null) {
            mOnChangeRunnable.run();
        }
+15 −2
Original line number Diff line number Diff line
@@ -23,7 +23,10 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.view.Display.DEFAULT_DISPLAY;

import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Binder;
@@ -87,6 +90,13 @@ public class KidsModeTaskOrganizer extends ShellTaskOrganizer {
    private KidsModeSettingsObserver mKidsModeSettingsObserver;
    private boolean mEnabled;

    private final BroadcastReceiver mUserSwitchIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            updateKidsModeState();
        }
    };

    DisplayController.OnDisplaysChangedListener mOnDisplaysChangedListener =
            new DisplayController.OnDisplaysChangedListener() {
        @Override
@@ -169,12 +179,15 @@ public class KidsModeTaskOrganizer extends ShellTaskOrganizer {
    public void initialize(StartingWindowController startingWindowController) {
        initStartingWindow(startingWindowController);
        if (mKidsModeSettingsObserver == null) {
            mKidsModeSettingsObserver = new KidsModeSettingsObserver(
                    mMainHandler, mContext);
            mKidsModeSettingsObserver = new KidsModeSettingsObserver(mMainHandler, mContext);
        }
        mKidsModeSettingsObserver.setOnChangeRunnable(() -> updateKidsModeState());
        updateKidsModeState();
        mKidsModeSettingsObserver.register();

        final IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_USER_SWITCHED);
        mContext.registerReceiverForAllUsers(mUserSwitchIntentReceiver, filter, null, mMainHandler);
    }

    @Override
+10 −7
Original line number Diff line number Diff line
@@ -651,15 +651,17 @@ public class DisplayPolicy {

        mForceShowNavBarSettingsObserver = new ForceShowNavBarSettingsObserver(
                mHandler, mContext);
        mForceShowNavBarSettingsObserver.setOnChangeRunnable(() -> {
        mForceShowNavBarSettingsObserver.setOnChangeRunnable(this::updateForceShowNavBarSettings);
        mForceShowNavigationBarEnabled = mForceShowNavBarSettingsObserver.isEnabled();
        mHandler.post(mForceShowNavBarSettingsObserver::register);
    }

    private void updateForceShowNavBarSettings() {
        synchronized (mLock) {
            mForceShowNavigationBarEnabled =
                    mForceShowNavBarSettingsObserver.isEnabled();
            updateSystemBarAttributes();
        }
        });
        mForceShowNavigationBarEnabled = mForceShowNavBarSettingsObserver.isEnabled();
        mHandler.post(mForceShowNavBarSettingsObserver::register);
    }

    /**
@@ -1801,6 +1803,7 @@ public class DisplayPolicy {
     */
    public void switchUser() {
        updateCurrentUserResources();
        updateForceShowNavBarSettings();
    }

    /**