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

Commit 2696d999 authored by Justin Klaassen's avatar Justin Klaassen
Browse files

Don't activate Night display until user setup is complete

Bug: 30042357
Change-Id: I575c5e44b4109816ae14cc139ff171f141e6088f
parent 8b072fbd
Loading
Loading
Loading
Loading
+63 −33
Original line number Original line Diff line number Diff line
@@ -22,6 +22,8 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Handler;
import android.os.Looper;
import android.os.Looper;
import android.os.UserHandle;
import android.os.UserHandle;
@@ -56,7 +58,10 @@ public final class NightDisplayService extends SystemService
        0,      0,      0, 1
        0,      0,      0, 1
    };
    };


    private final Handler mHandler;

    private int mCurrentUser = UserHandle.USER_NULL;
    private int mCurrentUser = UserHandle.USER_NULL;
    private ContentObserver mUserSetupObserver;
    private boolean mBootCompleted;
    private boolean mBootCompleted;


    private NightDisplayController mController;
    private NightDisplayController mController;
@@ -65,6 +70,7 @@ public final class NightDisplayService extends SystemService


    public NightDisplayService(Context context) {
    public NightDisplayService(Context context) {
        super(context);
        super(context);
        mHandler = new Handler(Looper.getMainLooper());
    }
    }


    @Override
    @Override
@@ -72,16 +78,24 @@ public final class NightDisplayService extends SystemService
        // Nothing to publish.
        // Nothing to publish.
    }
    }


    @Override
    public void onBootPhase(int phase) {
        if (phase == PHASE_BOOT_COMPLETED) {
            mBootCompleted = true;

            // Register listeners now that boot is complete.
            if (mCurrentUser != UserHandle.USER_NULL && mUserSetupObserver == null) {
                setUp();
            }
        }
    }

    @Override
    @Override
    public void onStartUser(int userHandle) {
    public void onStartUser(int userHandle) {
        super.onStartUser(userHandle);
        super.onStartUser(userHandle);


        // Register listeners for the new user.
        if (mCurrentUser == UserHandle.USER_NULL) {
        if (mCurrentUser == UserHandle.USER_NULL) {
            mCurrentUser = userHandle;
            onUserChanged(userHandle);
            if (mBootCompleted) {
                setUpNightMode();
            }
        }
        }
    }
    }


@@ -89,44 +103,60 @@ public final class NightDisplayService extends SystemService
    public void onSwitchUser(int userHandle) {
    public void onSwitchUser(int userHandle) {
        super.onSwitchUser(userHandle);
        super.onSwitchUser(userHandle);


        // Unregister listeners for the old user.
        onUserChanged(userHandle);
        if (mBootCompleted && mCurrentUser != UserHandle.USER_NULL) {
            tearDownNightMode();
        }

        // Register listeners for the new user.
        mCurrentUser = userHandle;
        if (mBootCompleted) {
            setUpNightMode();
        }
    }
    }


    @Override
    @Override
    public void onStopUser(int userHandle) {
    public void onStopUser(int userHandle) {
        super.onStopUser(userHandle);
        super.onStopUser(userHandle);


        // Unregister listeners for the old user.
        if (mCurrentUser == userHandle) {
        if (mCurrentUser == userHandle) {
            if (mBootCompleted) {
            onUserChanged(UserHandle.USER_NULL);
                tearDownNightMode();
        }
    }
    }
            mCurrentUser = UserHandle.USER_NULL;

    private void onUserChanged(int userHandle) {
        final ContentResolver cr = getContext().getContentResolver();

        if (mCurrentUser != UserHandle.USER_NULL) {
            if (mUserSetupObserver != null) {
                cr.unregisterContentObserver(mUserSetupObserver);
                mUserSetupObserver = null;
            } else if (mBootCompleted) {
                tearDown();
            }
            }
        }
        }


    @Override
        mCurrentUser = userHandle;
    public void onBootPhase(int phase) {
        if (phase == PHASE_BOOT_COMPLETED) {
            mBootCompleted = true;


            // Register listeners now that boot is complete.
        if (mCurrentUser != UserHandle.USER_NULL) {
        if (mCurrentUser != UserHandle.USER_NULL) {
                setUpNightMode();
            if (!isUserSetupCompleted(cr, mCurrentUser)) {
                mUserSetupObserver = new ContentObserver(mHandler) {
                    @Override
                    public void onChange(boolean selfChange, Uri uri) {
                        if (isUserSetupCompleted(cr, mCurrentUser)) {
                            cr.unregisterContentObserver(this);
                            mUserSetupObserver = null;

                            if (mBootCompleted) {
                                setUp();
                            }
                            }
                        }
                        }
                    }
                    }
                };
                cr.registerContentObserver(Secure.getUriFor(Secure.USER_SETUP_COMPLETE),
                        false /* notifyForDescendents */, mUserSetupObserver, mCurrentUser);
            } else if (mBootCompleted) {
                setUp();
            }
        }
    }

    private static boolean isUserSetupCompleted(ContentResolver cr, int userHandle) {
        return Secure.getIntForUser(cr, Secure.USER_SETUP_COMPLETE, 0, userHandle) == 1;
    }


    private void setUpNightMode() {
    private void setUp() {
        // Create a new controller for the current user and start listening for changes.
        // Create a new controller for the current user and start listening for changes.
        mController = new NightDisplayController(getContext(), mCurrentUser);
        mController = new NightDisplayController(getContext(), mCurrentUser);
        mController.setListener(this);
        mController.setListener(this);
@@ -140,8 +170,11 @@ public final class NightDisplayService extends SystemService
        }
        }
    }
    }


    private void tearDownNightMode() {
    private void tearDown() {
        if (mController != null) {
            mController.setListener(null);
            mController.setListener(null);
            mController = null;
        }


        if (mAutoMode != null) {
        if (mAutoMode != null) {
            mAutoMode.onStop();
            mAutoMode.onStop();
@@ -149,7 +182,6 @@ public final class NightDisplayService extends SystemService
        }
        }


        mIsActivated = null;
        mIsActivated = null;
        mController = null;
    }
    }


    @Override
    @Override
@@ -324,13 +356,11 @@ public final class NightDisplayService extends SystemService
    private class TwilightAutoMode extends AutoMode implements TwilightListener {
    private class TwilightAutoMode extends AutoMode implements TwilightListener {


        private final TwilightManager mTwilightManager;
        private final TwilightManager mTwilightManager;
        private final Handler mHandler;


        private boolean mIsNight;
        private boolean mIsNight;


        public TwilightAutoMode() {
        public TwilightAutoMode() {
            mTwilightManager = getLocalService(TwilightManager.class);
            mTwilightManager = getLocalService(TwilightManager.class);
            mHandler = new Handler(Looper.getMainLooper());
        }
        }


        private void updateActivated() {
        private void updateActivated() {