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

Commit a7baceff authored by Ashok Mutyala's avatar Ashok Mutyala Committed by Ale Nijamkin
Browse files

Fix User Switch Timeout Issue

While Switching between Users, UserTracker Callbacks are taking more time which is more than 5 secs (set by AOSP) due to some usertracker callbacks are getting executed on Main Thread which is not guaranteed to execute on time. As we have a synchronization mechanism with CountDownLatch, we can safely execute on Bg Executors

Bug: 319352292
Test: Boot and Check User Switch timeout

Change-Id: I0d83bb51b63d49e0a69a143c834572c4192c9f24
Merged-In: I0d83bb51b63d49e0a69a143c834572c4192c9f24
parent 05955e38
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.UserInfo;
import android.os.HandlerExecutor;
import android.os.HandlerThread;
import android.os.UserHandle;

import androidx.annotation.NonNull;
@@ -57,6 +59,7 @@ public class GuestResumeSessionReceiver {
    private final SecureSettings mSecureSettings;
    private final ResetSessionDialog.Factory mResetSessionDialogFactory;
    private final GuestSessionNotification mGuestSessionNotification;
    private final HandlerThread mHandlerThread;

    @VisibleForTesting
    public final UserTracker.Callback mUserChangedCallback =
@@ -107,13 +110,16 @@ public class GuestResumeSessionReceiver {
        mSecureSettings = secureSettings;
        mGuestSessionNotification = guestSessionNotification;
        mResetSessionDialogFactory = resetSessionDialogFactory;
        mHandlerThread = new HandlerThread("GuestResumeSessionReceiver");
        mHandlerThread.start();
    }

    /**
     * Register this receiver with the {@link BroadcastDispatcher}
     */
    public void register() {
        mUserTracker.addCallback(mUserChangedCallback, mMainExecutor);
        mUserTracker.addCallback(mUserChangedCallback,
                  new HandlerExecutor(mHandlerThread.getThreadHandler()));
    }

    private void cancelDialog() {
+1 −1
Original line number Diff line number Diff line
@@ -146,7 +146,7 @@ constructor(
                null,
                UserHandle.ALL
            )
            userTracker.addCallback(userTrackerCallback, mainExecutor)
            userTracker.addCallback(userTrackerCallback, backgroundExecutor)
            loadSavedComponents()
        }
    }
+7 −1
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import android.content.res.Configuration;
import android.database.ContentObserver;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.HandlerThread;
import android.os.IThermalEventListener;
import android.os.IThermalService;
import android.os.PowerManager;
@@ -92,6 +94,7 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks {
    private Future mLastShowWarningTask;
    private boolean mEnableSkinTemperatureWarning;
    private boolean mEnableUsbTemperatureAlarm;
    private final HandlerThread mHandlerThread;

    private int mLowBatteryAlertCloseLevel;
    private final int[] mLowBatteryReminderLevels = new int[2];
@@ -150,6 +153,8 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks {
        mPowerManager = powerManager;
        mWakefulnessLifecycle = wakefulnessLifecycle;
        mUserTracker = userTracker;
        mHandlerThread = new HandlerThread("PowerUI");
        mHandlerThread.start();
    }

    public void start() {
@@ -168,7 +173,8 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks {
                false, obs, UserHandle.USER_ALL);
        updateBatteryWarningLevels();
        mReceiver.init();
        mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor());
        mUserTracker.addCallback(mUserChangedCallback,
                    new HandlerExecutor(mHandlerThread.getThreadHandler()));
        mWakefulnessLifecycle.addObserver(mWakefulnessObserver);

        // Check to see if we need to let the user know that the phone previously shut down due
+1 −1
Original line number Diff line number Diff line
@@ -348,7 +348,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
        // AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it
        updateAirplaneMode(true /* force callback */);
        mUserTracker = userTracker;
        mUserTracker.addCallback(mUserChangedCallback, new HandlerExecutor(mMainHandler));
        mUserTracker.addCallback(mUserChangedCallback, mBgExecutor);

        deviceProvisionedController.addCallback(new DeviceProvisionedListener() {
            @Override
+5 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ import android.database.ContentObserver
import android.net.Uri
import android.os.Handler
import android.os.HandlerExecutor
import android.os.HandlerThread
import android.os.UserHandle
import android.provider.Settings
import com.android.keyguard.KeyguardUpdateMonitor
@@ -84,6 +85,7 @@ class KeyguardNotificationVisibilityProviderImpl @Inject constructor(
            secureSettings.getUriFor(Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS)
    private val onStateChangedListeners = ListenerSet<Consumer<String>>()
    private var hideSilentNotificationsOnLockscreen: Boolean = false
    private val handlerThread: HandlerThread = HandlerThread("KeyguardNotificationVis")

    private val userTrackerCallback = object : UserTracker.Callback {
        override fun onUserChanged(newUser: Int, userContext: Context) {
@@ -151,7 +153,9 @@ class KeyguardNotificationVisibilityProviderImpl @Inject constructor(
                notifyStateChanged("onStatusBarUpcomingStateChanged")
            }
        })
        userTracker.addCallback(userTrackerCallback, HandlerExecutor(handler))
        handlerThread.start()
        userTracker.addCallback(userTrackerCallback,
                   HandlerExecutor(handlerThread.getThreadHandler()))
    }

    override fun addOnStateChangedListener(listener: Consumer<String>) {
Loading