diff options
author | Matt Walliser <mattwalliser@google.com> | 2023-09-15 02:09:35 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-09-15 02:09:35 +0000 |
commit | c492366caf383a9373749d4cbd10a6d265e92403 (patch) | |
tree | e455010da55794ad9193b017f6afd8397b0c04ab /wifi | |
parent | 95172d76dff3d2de75fc0e38fa0df161ca53b1b7 (diff) | |
parent | bd46b6253fc4a95ca5e139b00eb13de77248daed (diff) | |
download | base-c492366caf383a9373749d4cbd10a6d265e92403.tar.gz |
Merge "Retry bind to SharedConnectivityService for manager created before login." into udc-qpr-dev am: bd46b6253f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24681235
Change-Id: I5be7cbd443699159bddb07807ba7b019b8bdcdab
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'wifi')
-rw-r--r-- | wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java index d41c0197addc..bc41829f16d2 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java @@ -23,9 +23,11 @@ import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.TestApi; +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.content.res.Resources; import android.net.wifi.sharedconnectivity.service.ISharedConnectivityCallback; @@ -35,6 +37,7 @@ import android.os.Binder; import android.os.IBinder; import android.os.IInterface; import android.os.RemoteException; +import android.os.UserManager; import android.text.TextUtils; import android.util.Log; @@ -67,7 +70,7 @@ import java.util.concurrent.Executor; @SystemApi public class SharedConnectivityManager { private static final String TAG = SharedConnectivityManager.class.getSimpleName(); - private static final boolean DEBUG = true; + private static final boolean DEBUG = false; private static final class SharedConnectivityCallbackProxy extends ISharedConnectivityCallback.Stub { @@ -172,6 +175,7 @@ public class SharedConnectivityManager { private final String mServicePackageName; private final String mIntentAction; private ServiceConnection mServiceConnection; + private UserManager mUserManager; /** * Creates a new instance of {@link SharedConnectivityManager}. @@ -217,12 +221,14 @@ public class SharedConnectivityManager { mContext = context; mServicePackageName = servicePackageName; mIntentAction = serviceIntentAction; + mUserManager = context.getSystemService(UserManager.class); } private void bind() { mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { + if (DEBUG) Log.i(TAG, "onServiceConnected"); mService = ISharedConnectivityService.Stub.asInterface(service); synchronized (mProxyDataLock) { if (!mCallbackProxyCache.isEmpty()) { @@ -253,9 +259,45 @@ public class SharedConnectivityManager { } }; - mContext.bindService( + boolean result = mContext.bindService( new Intent().setPackage(mServicePackageName).setAction(mIntentAction), mServiceConnection, Context.BIND_AUTO_CREATE); + if (!result) { + if (DEBUG) Log.i(TAG, "bindService failed"); + mServiceConnection = null; + if (mUserManager != null && !mUserManager.isUserUnlocked()) { // In direct boot mode + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Intent.ACTION_USER_UNLOCKED); + mContext.registerReceiver(mBroadcastReceiver, intentFilter); + } else { + synchronized (mProxyDataLock) { + if (!mCallbackProxyCache.isEmpty()) { + mCallbackProxyCache.keySet().forEach( + callback -> callback.onRegisterCallbackFailed( + new IllegalStateException( + "Failed to bind after user unlock"))); + mCallbackProxyCache.clear(); + } + } + } + } + } + + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + context.unregisterReceiver(mBroadcastReceiver); + bind(); + } + }; + + /** + * @hide + */ + @TestApi + @NonNull + public BroadcastReceiver getBroadcastReceiver() { + return mBroadcastReceiver; } private void registerCallbackInternal(SharedConnectivityClientCallback callback, @@ -357,6 +399,13 @@ public class SharedConnectivityManager { return false; } + // Try to unregister the broadcast receiver to guard against memory leaks. + try { + mContext.unregisterReceiver(mBroadcastReceiver); + } catch (IllegalArgumentException e) { + // This is fine, it means the receiver was never registered or was already unregistered. + } + if (mService == null) { boolean shouldUnbind; synchronized (mProxyDataLock) { |