aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authord34d <clark@cyngn.com>2016-03-08 18:27:29 -0800
committerGerrit Code Review <gerrit@cyanogenmod.org>2016-03-10 11:47:00 -0800
commit32788b0555d2616d092740bde318145673b95b4d (patch)
tree18e5e34c7cd515602d72b4fa66a8029b48bf8b2d
parent2f2d432495704d0bd03b1406a7f93f9044682a73 (diff)
downloadvendor_cmsdk-32788b0555d2616d092740bde318145673b95b4d.zip
vendor_cmsdk-32788b0555d2616d092740bde318145673b95b4d.tar.gz
vendor_cmsdk-32788b0555d2616d092740bde318145673b95b4d.tar.bz2
ExtViews: Guard against bad LLS providers
Add checks in onServiceConnected to make sure the provider was created correctly and if not, log it and move on without imploding the universe. Change-Id: I6929a02631685636e2c52c2d6d13883f0c3a13c4 TICKET: CNYNGOS-2217
-rw-r--r--src/java/cyanogenmod/externalviews/KeyguardExternalView.java48
1 files changed, 33 insertions, 15 deletions
diff --git a/src/java/cyanogenmod/externalviews/KeyguardExternalView.java b/src/java/cyanogenmod/externalviews/KeyguardExternalView.java
index f6ddfde..cf7b279 100644
--- a/src/java/cyanogenmod/externalviews/KeyguardExternalView.java
+++ b/src/java/cyanogenmod/externalviews/KeyguardExternalView.java
@@ -28,6 +28,7 @@ import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
@@ -43,6 +44,7 @@ import java.util.LinkedList;
*/
public class KeyguardExternalView extends View implements ViewTreeObserver.OnPreDrawListener,
IBinder.DeathRecipient {
+ private static final String TAG = KeyguardExternalView.class.getSimpleName();
/**
* An extra passed via an intent that provides a list of permissions that should be requested
@@ -107,29 +109,45 @@ public class KeyguardExternalView extends View implements ViewTreeObserver.OnPre
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
try {
- mExternalViewProvider = IKeyguardExternalViewProvider.Stub.asInterface(
- IExternalViewProviderFactory.Stub.asInterface(service).
- createExternalView(null));
- mExternalViewProvider.registerCallback(
- KeyguardExternalView.this.mKeyguardExternalViewCallbacks);
- mService = service;
- mService.linkToDeath(KeyguardExternalView.this, 0);
- executeQueue();
+ IExternalViewProviderFactory factory = IExternalViewProviderFactory.Stub.asInterface(service);
+ if (factory != null) {
+ mExternalViewProvider = IKeyguardExternalViewProvider.Stub.asInterface(
+ factory.createExternalView(null));
+ if (mExternalViewProvider != null) {
+ mExternalViewProvider.registerCallback(
+ KeyguardExternalView.this.mKeyguardExternalViewCallbacks);
+ mService = service;
+ mService.linkToDeath(KeyguardExternalView.this, 0);
+ executeQueue();
+ } else {
+ Log.e(TAG, "Unable to get external view provider");
+ }
+ } else {
+ Log.e(TAG, "Unable to get external view provider factory");
+ }
} catch (RemoteException e) {
e.printStackTrace();
}
+ // We should unbind the service if we failed to connect to the provider
+ if (mService != service && service != null) {
+ mContext.unbindService(mServiceConnection);
+ }
}
@Override
public void onServiceDisconnected(ComponentName name) {
- try {
- mExternalViewProvider.unregisterCallback(
- KeyguardExternalView.this.mKeyguardExternalViewCallbacks);
- } catch (RemoteException e) {
+ if (mExternalViewProvider != null) {
+ try {
+ mExternalViewProvider.unregisterCallback(
+ KeyguardExternalView.this.mKeyguardExternalViewCallbacks);
+ } catch (RemoteException e) {
+ }
+ mExternalViewProvider = null;
+ }
+ if (mService != null) {
+ mService.unlinkToDeath(KeyguardExternalView.this, 0);
+ mService = null;
}
- mExternalViewProvider = null;
- mService.unlinkToDeath(KeyguardExternalView.this, 0);
- mService = null;
}
};