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

Commit d98371fb authored by Ashok Mutyala's avatar Ashok Mutyala Committed by Alejandro Nijamkin
Browse files

Fix User Switch Timeout Issue

[This is a manual cherrypick of aosp/2898333]

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
Flag: NONE

Change-Id: I0d83bb51b63d49e0a69a143c834572c4192c9f24
parent 417fc153
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -20,11 +20,12 @@ 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;

import com.android.systemui.res.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.GuestResetOrExitSessionReceiver.ResetSessionDialogFactory;
@@ -32,6 +33,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.qs.QSUserSwitcherEvent;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.UserSwitcherController;
@@ -61,6 +63,7 @@ public class GuestResumeSessionReceiver {
    private final SecureSettings mSecureSettings;
    private final ResetSessionDialogFactory mResetSessionDialogFactory;
    private final GuestSessionNotification mGuestSessionNotification;
    private final HandlerThread mHandlerThread;

    @VisibleForTesting
    public final UserTracker.Callback mUserChangedCallback =
@@ -111,13 +114,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;
@@ -95,6 +97,7 @@ public class PowerUI implements
    private Future mLastShowWarningTask;
    private boolean mEnableSkinTemperatureWarning;
    private boolean mEnableUsbTemperatureAlarm;
    private final HandlerThread mHandlerThread;

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

    public void start() {
@@ -185,7 +190,8 @@ public class PowerUI implements
                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
+4 −5
Original line number Diff line number Diff line
@@ -35,7 +35,6 @@ import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.Looper;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
@@ -61,7 +60,6 @@ import com.android.settingslib.mobile.MobileStatusTracker.SubscriptionDefaults;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.net.DataUsageController;
import com.android.systemui.Dumpable;
import com.android.systemui.res.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
@@ -73,6 +71,7 @@ import com.android.systemui.log.LogBuffer;
import com.android.systemui.log.core.LogLevel;
import com.android.systemui.log.dagger.StatusBarNetworkControllerLog;
import com.android.systemui.qs.tiles.dialog.InternetDialogFactory;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -85,6 +84,8 @@ import com.android.systemui.util.CarrierConfigTracker;

import dalvik.annotation.optimization.NeverCompile;

import kotlin.Unit;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -99,8 +100,6 @@ import java.util.stream.Collectors;

import javax.inject.Inject;

import kotlin.Unit;

/** Platform implementation of the network controller. **/
@SysUISingleton
public class NetworkControllerImpl extends BroadcastReceiver
@@ -350,7 +349,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
@@ -6,6 +6,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
@@ -87,6 +88,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) {
@@ -154,7 +156,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