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

Commit 30c0a020 authored by Matthew Ng's avatar Matthew Ng
Browse files

Listen for launcher package added to connect to it faster

When launcher is reinstalled, it may take time for it to get ready and
to reconnect to. If not available immediately it would try to connect it
later after a timeout. Instead of waiting, receive a broadcast when it
gets installed to connect immediately.

Test: manual - reinstall launcher
Bug: 67957962
Change-Id: I1e531db9646d11a1eae99abe46d5e6f852c5eeda
parent fac87831
Loading
Loading
Loading
Loading
+26 −8
Original line number Diff line number Diff line
@@ -16,16 +16,21 @@

package com.android.systemui;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.PatternMatcher;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Log;
@@ -51,6 +56,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
    private final Context mContext;
    private final Handler mHandler;
    private final Runnable mConnectionRunnable = this::internalConnectToCurrentUser;
    private final ComponentName mLauncherComponentName;
    private final DeviceProvisionedController mDeviceProvisionedController
            = Dependency.get(DeviceProvisionedController.class);
    private final List<OverviewProxyListener> mConnectionCallbacks = new ArrayList<>();
@@ -71,6 +77,14 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
        }
    };

    private final BroadcastReceiver mLauncherAddedReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Reconnect immediately, instead of waiting for resume to arrive.
            startConnectionToCurrentUser();
        }
    };

    private final ServiceConnection mOverviewServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
@@ -115,18 +129,23 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
        };

    // This is the death handler for the binder from the launcher service
    private final IBinder.DeathRecipient mOverviewServiceDeathRcpt = new IBinder.DeathRecipient() {
        @Override
        public void binderDied() {
            startConnectionToCurrentUser();
        }
    };
    private final IBinder.DeathRecipient mOverviewServiceDeathRcpt
            = this::startConnectionToCurrentUser;

    public OverviewProxyService(Context context) {
        mContext = context;
        mHandler = new Handler();
        mConnectionBackoffAttempts = 0;
        mLauncherComponentName = ComponentName
                .unflattenFromString(context.getString(R.string.config_overviewServiceComponent));
        mDeviceProvisionedController.addCallback(mDeviceProvisionedCallback);

        // Listen for the package update changes.
        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
        filter.addDataScheme("package");
        filter.addDataSchemeSpecificPart(mLauncherComponentName.getPackageName(),
                PatternMatcher.PATTERN_LITERAL);
        mContext.registerReceiver(mLauncherAddedReceiver, filter);
    }

    public void startConnectionToCurrentUser() {
@@ -146,8 +165,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
        }
        mHandler.removeCallbacks(mConnectionRunnable);
        Intent launcherServiceIntent = new Intent();
        launcherServiceIntent.setComponent(ComponentName.unflattenFromString(
                mContext.getString(R.string.config_overviewServiceComponent)));
        launcherServiceIntent.setComponent(mLauncherComponentName);
        boolean bound = mContext.bindServiceAsUser(launcherServiceIntent,
                mOverviewServiceConnection, Context.BIND_AUTO_CREATE,
                UserHandle.getUserHandleForUid(mDeviceProvisionedController.getCurrentUser()));