From 32788b0555d2616d092740bde318145673b95b4d Mon Sep 17 00:00:00 2001 From: d34d Date: Tue, 8 Mar 2016 18:27:29 -0800 Subject: [PATCH] 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 --- .../externalviews/KeyguardExternalView.java | 48 +++++++++++++------ 1 file 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; } };