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

Commit 26ff6626 authored by Kenny Root's avatar Kenny Root
Browse files

Delay AccountManagerService initialization

Since applications can have Account providers, they need to be delayed
until after PackageManagerService says everything is mounted.
Otherwise the accounts associated with that provider will be removed
immediately when startup happens.

Bug: 6820670
Change-Id: Iba81765260421649f706624d0605a40ebc1347b1
parent 47db02ba
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -220,8 +220,6 @@ public class AccountManagerService

        sThis.set(this);

        UserAccounts accounts = initUser(0);

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        intentFilter.addDataScheme("package");
@@ -242,6 +240,11 @@ public class AccountManagerService
        }, userFilter);
    }

    public void systemReady() {
        mAuthenticatorCache.generateServicesMap();
        initUser(0);
    }

    private UserAccounts initUser(int userId) {
        synchronized (mUsers) {
            UserAccounts accounts = mUsers.get(userId);
+5 −0
Original line number Diff line number Diff line
@@ -60,4 +60,9 @@ public interface IAccountAuthenticatorCache {
     */
    void setListener(RegisteredServicesCacheListener<AuthenticatorDescription> listener,
            Handler handler);

    /**
     * Refreshes the authenticator cache.
     */
    void generateServicesMap();
}
 No newline at end of file
+4 −1
Original line number Diff line number Diff line
@@ -132,6 +132,9 @@ public final class ContentService extends IContentService.Stub {
    /*package*/ ContentService(Context context, boolean factoryTest) {
        mContext = context;
        mFactoryTest = factoryTest;
    }

    public void systemReady() {
        getSyncManager();
    }

@@ -524,7 +527,7 @@ public final class ContentService extends IContentService.Stub {
        }
    }

    public static IContentService main(Context context, boolean factoryTest) {
    public static ContentService main(Context context, boolean factoryTest) {
        ContentService service = new ContentService(context, factoryTest);
        ServiceManager.addService(ContentResolver.CONTENT_SERVICE_NAME, service);
        return service;
+1 −1
Original line number Diff line number Diff line
@@ -251,7 +251,7 @@ public abstract class RegisteredServicesCache<V> {
        return false;
    }

    void generateServicesMap() {
    public void generateServicesMap() {
        PackageManager pm = mContext.getPackageManager();
        ArrayList<ServiceInfo<V>> serviceInfos = new ArrayList<ServiceInfo<V>>();
        List<ResolveInfo> resolveInfos = pm.queryIntentServices(new Intent(mInterfaceName),
+19 −3
Original line number Diff line number Diff line
@@ -114,6 +114,8 @@ class ServerThread extends Thread {
                : Integer.parseInt(factoryTestStr);
        final boolean headless = "1".equals(SystemProperties.get("ro.config.headless", "0"));

        AccountManagerService accountManager = null;
        ContentService contentService = null;
        LightsService lights = null;
        PowerManagerService power = null;
        BatteryService battery = null;
@@ -190,14 +192,14 @@ class ServerThread extends Thread {
            // The AccountManager must come before the ContentService
            try {
                Slog.i(TAG, "Account Manager");
                ServiceManager.addService(Context.ACCOUNT_SERVICE,
                        new AccountManagerService(context));
                accountManager = new AccountManagerService(context);
                ServiceManager.addService(Context.ACCOUNT_SERVICE, accountManager);
            } catch (Throwable e) {
                Slog.e(TAG, "Failure starting Account Manager", e);
            }

            Slog.i(TAG, "Content Manager");
            ContentService.main(context,
            contentService = ContentService.main(context,
                    factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL);

            Slog.i(TAG, "System Content Providers");
@@ -465,6 +467,20 @@ class ServerThread extends Thread {
                mountService.waitForAsecScan();
            }

            try {
                if (accountManager != null)
                    accountManager.systemReady();
            } catch (Throwable e) {
                reportWtf("making Account Manager Service ready", e);
            }

            try {
                if (contentService != null)
                    contentService.systemReady();
            } catch (Throwable e) {
                reportWtf("making Content Service ready", e);
            }

            try {
                Slog.i(TAG, "Notification Manager");
                notification = new NotificationManagerService(context, statusBar, lights);