Merge "Asynchronously bind/unbind service" into tm-dev am: f4dbcd621f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17188342

Change-Id: Iafdc1b7b860930c68a86dde988d6bd7d4631367a
This commit is contained in:
Lucas Dupin
2022-03-23 17:29:34 +00:00
committed by Automerger Merge Worker
6 changed files with 31 additions and 8 deletions

View File

@@ -42,7 +42,19 @@ public interface QuickAccessWalletClient extends Closeable {
*/ */
@NonNull @NonNull
static QuickAccessWalletClient create(@NonNull Context context) { static QuickAccessWalletClient create(@NonNull Context context) {
return new QuickAccessWalletClientImpl(context); return create(context, null /* bgExecutor */);
}
/**
* Create a client for accessing wallet cards from the {@link QuickAccessWalletService}. If the
* service is unavailable, {@link #isWalletServiceAvailable()} will return false.
* @param context Context.
* @param bgExecutor A background {@link Executor} for service registration.
* @hide
*/
@NonNull
static QuickAccessWalletClient create(@NonNull Context context, @Nullable Executor bgExecutor) {
return new QuickAccessWalletClientImpl(context, bgExecutor);
} }
/** /**

View File

@@ -67,6 +67,7 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
private final Context mContext; private final Context mContext;
private final Queue<ApiCaller> mRequestQueue; private final Queue<ApiCaller> mRequestQueue;
private final Map<WalletServiceEventListener, String> mEventListeners; private final Map<WalletServiceEventListener, String> mEventListeners;
private final Executor mLifecycleExecutor;
private boolean mIsConnected; private boolean mIsConnected;
/** Timeout for active service connections (1 minute) */ /** Timeout for active service connections (1 minute) */
private static final long SERVICE_CONNECTION_TIMEOUT_MS = 60 * 1000; private static final long SERVICE_CONNECTION_TIMEOUT_MS = 60 * 1000;
@@ -79,10 +80,11 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
private static final int MSG_TIMEOUT_SERVICE = 5; private static final int MSG_TIMEOUT_SERVICE = 5;
QuickAccessWalletClientImpl(@NonNull Context context) { QuickAccessWalletClientImpl(@NonNull Context context, @Nullable Executor bgExecutor) {
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
mServiceInfo = QuickAccessWalletServiceInfo.tryCreate(context); mServiceInfo = QuickAccessWalletServiceInfo.tryCreate(context);
mHandler = new Handler(Looper.getMainLooper()); mHandler = new Handler(Looper.getMainLooper());
mLifecycleExecutor = (bgExecutor == null) ? Runnable::run : bgExecutor;
mRequestQueue = new LinkedList<>(); mRequestQueue = new LinkedList<>();
mEventListeners = new HashMap<>(1); mEventListeners = new HashMap<>(1);
} }
@@ -369,7 +371,7 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
Intent intent = new Intent(SERVICE_INTERFACE); Intent intent = new Intent(SERVICE_INTERFACE);
intent.setComponent(mServiceInfo.getComponentName()); intent.setComponent(mServiceInfo.getComponentName());
int flags = Context.BIND_AUTO_CREATE | Context.BIND_WAIVE_PRIORITY; int flags = Context.BIND_AUTO_CREATE | Context.BIND_WAIVE_PRIORITY;
mContext.bindService(intent, this, flags); mLifecycleExecutor.execute(() -> mContext.bindService(intent, this, flags));
resetServiceConnectionTimeout(); resetServiceConnectionTimeout();
} }
@@ -411,7 +413,7 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
return; return;
} }
mIsConnected = false; mIsConnected = false;
mContext.unbindService(/*conn=*/ this); mLifecycleExecutor.execute(() -> mContext.unbindService(/*conn=*/ this));
mService = null; mService = null;
mEventListeners.clear(); mEventListeners.clear();
mRequestQueue.clear(); mRequestQueue.clear();

View File

@@ -33,6 +33,7 @@ import android.util.Log;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.util.settings.SecureSettings;
@@ -64,6 +65,7 @@ public class QuickAccessWalletController {
private final Context mContext; private final Context mContext;
private final Executor mExecutor; private final Executor mExecutor;
private final Executor mCallbackExecutor; private final Executor mCallbackExecutor;
private final Executor mBgExecutor;
private final SecureSettings mSecureSettings; private final SecureSettings mSecureSettings;
private final SystemClock mClock; private final SystemClock mClock;
@@ -80,12 +82,14 @@ public class QuickAccessWalletController {
Context context, Context context,
@Main Executor executor, @Main Executor executor,
@CallbackExecutor Executor callbackExecutor, @CallbackExecutor Executor callbackExecutor,
@Background Executor bgExecutor,
SecureSettings secureSettings, SecureSettings secureSettings,
QuickAccessWalletClient quickAccessWalletClient, QuickAccessWalletClient quickAccessWalletClient,
SystemClock clock) { SystemClock clock) {
mContext = context; mContext = context;
mExecutor = executor; mExecutor = executor;
mCallbackExecutor = callbackExecutor; mCallbackExecutor = callbackExecutor;
mBgExecutor = bgExecutor;
mSecureSettings = secureSettings; mSecureSettings = secureSettings;
mQuickAccessWalletClient = quickAccessWalletClient; mQuickAccessWalletClient = quickAccessWalletClient;
mClock = clock; mClock = clock;
@@ -182,7 +186,7 @@ public class QuickAccessWalletController {
* Re-create the {@link QuickAccessWalletClient} of the controller. * Re-create the {@link QuickAccessWalletClient} of the controller.
*/ */
public void reCreateWalletClient() { public void reCreateWalletClient() {
mQuickAccessWalletClient = QuickAccessWalletClient.create(mContext); mQuickAccessWalletClient = QuickAccessWalletClient.create(mContext, mBgExecutor);
mQawClientCreatedTimeMillis = mClock.elapsedRealtime(); mQawClientCreatedTimeMillis = mClock.elapsedRealtime();
} }

View File

@@ -21,8 +21,11 @@ import android.content.Context;
import android.service.quickaccesswallet.QuickAccessWalletClient; import android.service.quickaccesswallet.QuickAccessWalletClient;
import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.wallet.ui.WalletActivity; import com.android.systemui.wallet.ui.WalletActivity;
import java.util.concurrent.Executor;
import dagger.Binds; import dagger.Binds;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
@@ -45,7 +48,8 @@ public abstract class WalletModule {
/** */ /** */
@SysUISingleton @SysUISingleton
@Provides @Provides
public static QuickAccessWalletClient provideQuickAccessWalletClient(Context context) { public static QuickAccessWalletClient provideQuickAccessWalletClient(Context context,
return QuickAccessWalletClient.create(context); @Background Executor bgExecutor) {
return QuickAccessWalletClient.create(context, bgExecutor);
} }
} }

View File

@@ -122,7 +122,7 @@ public class WalletActivity extends LifecycleActivity implements
getActionBar().setHomeActionContentDescription(R.string.accessibility_desc_close); getActionBar().setHomeActionContentDescription(R.string.accessibility_desc_close);
WalletView walletView = requireViewById(R.id.wallet_view); WalletView walletView = requireViewById(R.id.wallet_view);
mWalletClient = QuickAccessWalletClient.create(this); mWalletClient = QuickAccessWalletClient.create(this, mExecutor);
mWalletScreenController = new WalletScreenController( mWalletScreenController = new WalletScreenController(
this, this,
walletView, walletView,

View File

@@ -100,6 +100,7 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
mContext, mContext,
MoreExecutors.directExecutor(), MoreExecutors.directExecutor(),
MoreExecutors.directExecutor(), MoreExecutors.directExecutor(),
MoreExecutors.directExecutor(),
mSecureSettings, mSecureSettings,
mQuickAccessWalletClient, mQuickAccessWalletClient,
mClock); mClock);