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

Commit 4c059ae2 authored by Neil Fuller's avatar Neil Fuller
Browse files

Listen for policy change that affect time/tz

Listen for policy change that could affect time/tz rights for the
current user.

The current policy restrictions for a user can change. This adds
listener registration that ensures that the cached configuration for the
current user is updated when this happens without the device also being
rebooted.

Bug: 333737037
Test: Manual, see b/333737037
Test: Treehugger
Change-Id: I3383707d2243b9bc20b9e0bdf41064d19c03065f
parent db03730b
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
@@ -39,6 +39,9 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.os.IUserRestrictionsListener;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -136,9 +139,11 @@ final class ServiceConfigAccessorImpl implements ServiceConfigAccessor {
            }
        }, filter, null, null /* main thread */);

        Handler mainThreadHandler = mContext.getMainThreadHandler();

        // Add async callbacks for global settings being changed.
        ContentResolver contentResolver = mContext.getContentResolver();
        ContentObserver contentObserver = new ContentObserver(mContext.getMainThreadHandler()) {
        ContentObserver contentObserver = new ContentObserver(mainThreadHandler) {
            @Override
            public void onChange(boolean selfChange) {
                handleConfigurationInternalChangeOnMainThread();
@@ -150,6 +155,20 @@ final class ServiceConfigAccessorImpl implements ServiceConfigAccessor {
        // Watch server flags.
        mServerFlags.addListener(this::handleConfigurationInternalChangeOnMainThread,
                SERVER_FLAGS_KEYS_TO_WATCH);

        // Watch for policy changes that affect what the user is permitted to do.
        mUserManager.addUserRestrictionsListener(
                new IUserRestrictionsListener.Stub() {
                    @Override
                    public void onUserRestrictionsChanged(
                            int userId, Bundle newRestrictions, Bundle prevRestrictions) {
                        // This callback currently delivered on main thread, but this post() is
                        // defensive and doesn't rely on that in case it changes.
                        mainThreadHandler.post(
                                () -> handleUserRestrictionsChangeOnMainThread(
                                        userId, newRestrictions, prevRestrictions));
                    }
                });
    }

    /** Returns the singleton instance. */
@@ -174,6 +193,13 @@ final class ServiceConfigAccessorImpl implements ServiceConfigAccessor {
        }
    }

    private void handleUserRestrictionsChangeOnMainThread(
            int userId, Bundle newRestrictions, Bundle prevRestrictions) {
        // No attempt at optimisation here. If the policy changes in any way for any user, just
        // notify.
        handleConfigurationInternalChangeOnMainThread();
    }

    @Override
    public synchronized void addConfigurationInternalChangeListener(
            @NonNull StateChangeListener listener) {
+27 −1
Original line number Diff line number Diff line
@@ -32,6 +32,9 @@ import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IUserRestrictionsListener;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -175,9 +178,11 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor {
            }
        }, filter, null, null /* main thread */);

        Handler mainThreadHandler = mContext.getMainThreadHandler();

        // Add async callbacks for changes to global settings that influence behavior.
        ContentResolver contentResolver = mContext.getContentResolver();
        ContentObserver contentObserver = new ContentObserver(mContext.getMainThreadHandler()) {
        ContentObserver contentObserver = new ContentObserver(mainThreadHandler) {
            @Override
            public void onChange(boolean selfChange) {
                handleConfigurationInternalChangeOnMainThread();
@@ -197,6 +202,20 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor {
        // Watch server flags.
        mServerFlags.addListener(this::handleConfigurationInternalChangeOnMainThread,
                CONFIGURATION_INTERNAL_SERVER_FLAGS_KEYS_TO_WATCH);

        // Watch for policy changes that affect what the user is permitted to do.
        mUserManager.addUserRestrictionsListener(
                new IUserRestrictionsListener.Stub() {
                    @Override
                    public void onUserRestrictionsChanged(
                            int userId, Bundle newRestrictions, Bundle prevRestrictions) {
                        // This callback currently delivered on main thread, but this post() is
                        // defensive and doesn't rely on that in case it changes.
                        mainThreadHandler.post(
                                () -> handleUserRestrictionsChangeOnMainThread(
                                        userId, newRestrictions, prevRestrictions));
                    }
                });
    }

    /** Returns the singleton instance. */
@@ -221,6 +240,13 @@ public final class ServiceConfigAccessorImpl implements ServiceConfigAccessor {
        }
    }

    private void handleUserRestrictionsChangeOnMainThread(
            int userId, Bundle newRestrictions, Bundle prevRestrictions) {
        // No attempt at optimisation here. If the policy changes in any way for any user, just
        // notify.
        handleConfigurationInternalChangeOnMainThread();
    }

    @Override
    public synchronized void addConfigurationInternalChangeListener(
            @NonNull StateChangeListener listener) {