Merge "Handle onBindingDied in notification manager" into oc-mr1-dev

This commit is contained in:
TreeHugger Robot
2018-02-08 00:18:26 +00:00
committed by Android (Google) Code Review

View File

@@ -39,8 +39,10 @@ import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.os.Binder; import android.os.Binder;
import android.os.Build; import android.os.Build;
import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.IInterface; import android.os.IInterface;
import android.os.Looper;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
@@ -82,6 +84,7 @@ abstract public class ManagedServices {
protected final String TAG = getClass().getSimpleName(); protected final String TAG = getClass().getSimpleName();
protected final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); protected final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final int ON_BINDING_DIED_REBIND_DELAY_MS = 10000;
protected static final String ENABLED_SERVICES_SEPARATOR = ":"; protected static final String ENABLED_SERVICES_SEPARATOR = ":";
/** /**
@@ -101,12 +104,15 @@ abstract public class ManagedServices {
private final IPackageManager mPm; private final IPackageManager mPm;
private final UserManager mUm; private final UserManager mUm;
private final Config mConfig; private final Config mConfig;
private final Handler mHandler = new Handler(Looper.getMainLooper());
// contains connections to all connected services, including app services // contains connections to all connected services, including app services
// and system services // and system services
private final ArrayList<ManagedServiceInfo> mServices = new ArrayList<>(); private final ArrayList<ManagedServiceInfo> mServices = new ArrayList<>();
// things that will be put into mServices as soon as they're ready // things that will be put into mServices as soon as they're ready
private final ArrayList<String> mServicesBinding = new ArrayList<>(); private final ArrayList<String> mServicesBinding = new ArrayList<>();
private final ArraySet<String> mServicesRebinding = new ArraySet<>();
// lists the component names of all enabled (and therefore potentially connected) // lists the component names of all enabled (and therefore potentially connected)
// app services for current profiles. // app services for current profiles.
private ArraySet<ComponentName> mEnabledServicesForCurrentProfiles private ArraySet<ComponentName> mEnabledServicesForCurrentProfiles
@@ -823,6 +829,7 @@ abstract public class ManagedServices {
final String servicesBindingTag = name.toString() + "/" + userid; final String servicesBindingTag = name.toString() + "/" + userid;
if (mServicesBinding.contains(servicesBindingTag)) { if (mServicesBinding.contains(servicesBindingTag)) {
Slog.v(TAG, "Not registering " + name + " as bind is already in progress");
// stop registering this thing already! we're working on it // stop registering this thing already! we're working on it
return; return;
} }
@@ -871,6 +878,7 @@ abstract public class ManagedServices {
boolean added = false; boolean added = false;
ManagedServiceInfo info = null; ManagedServiceInfo info = null;
synchronized (mMutex) { synchronized (mMutex) {
mServicesRebinding.remove(servicesBindingTag);
mServicesBinding.remove(servicesBindingTag); mServicesBinding.remove(servicesBindingTag);
try { try {
mService = asInterface(binder); mService = asInterface(binder);
@@ -892,6 +900,27 @@ abstract public class ManagedServices {
mServicesBinding.remove(servicesBindingTag); mServicesBinding.remove(servicesBindingTag);
Slog.v(TAG, getCaption() + " connection lost: " + name); Slog.v(TAG, getCaption() + " connection lost: " + name);
} }
@Override
public void onBindingDied(ComponentName name) {
Slog.w(TAG, getCaption() + " binding died: " + name);
synchronized (mMutex) {
mServicesBinding.remove(servicesBindingTag);
mContext.unbindService(this);
if (!mServicesRebinding.contains(servicesBindingTag)) {
mServicesRebinding.add(servicesBindingTag);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
registerService(name, userid);
}
}, ON_BINDING_DIED_REBIND_DELAY_MS);
} else {
Slog.v(TAG, getCaption() + " not rebinding as "
+ "a previous rebind attempt was made: " + name);
}
}
}
}; };
if (!mContext.bindServiceAsUser(intent, if (!mContext.bindServiceAsUser(intent,
serviceConnection, serviceConnection,