From 8753e184f967d1db91de34cb66aae0a977259a60 Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Tue, 21 Jun 2016 18:23:13 -0400 Subject: [PATCH] QS Tiles: Fix some problems with connecting through intent - Don't send Tile through intent, it can cause crashes - Clean up other issues surrounding this Change-Id: I08c626cf39b36d349592c1e0b81627b9bc7eeeb3 Fixes: 29519485 --- .../service/quicksettings/IQSService.aidl | 1 + .../service/quicksettings/TileService.java | 23 +++++++++++++------ .../qs/external/TileLifecycleManager.java | 1 - .../systemui/qs/external/TileServices.java | 10 ++++++++ 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/core/java/android/service/quicksettings/IQSService.aidl b/core/java/android/service/quicksettings/IQSService.aidl index 747f18531d3b9..bf963570b040e 100644 --- a/core/java/android/service/quicksettings/IQSService.aidl +++ b/core/java/android/service/quicksettings/IQSService.aidl @@ -23,6 +23,7 @@ import android.service.quicksettings.Tile; * @hide */ interface IQSService { + Tile getTile(in ComponentName component); void updateQsTile(in Tile tile); void updateStatusIcon(in Tile tile, in Icon icon, String contentDescription); diff --git a/core/java/android/service/quicksettings/TileService.java b/core/java/android/service/quicksettings/TileService.java index 67793fd041c69..55cfb49fe14e8 100644 --- a/core/java/android/service/quicksettings/TileService.java +++ b/core/java/android/service/quicksettings/TileService.java @@ -120,11 +120,6 @@ public class TileService extends Service { */ public static final String EXTRA_SERVICE = "service"; - /** - * @hide - */ - public static final String EXTRA_TILE = "tile"; - /** * @hide */ @@ -315,9 +310,16 @@ public class TileService extends Service { @Override public IBinder onBind(Intent intent) { - mTile = intent.getParcelableExtra(EXTRA_TILE); mService = IQSService.Stub.asInterface(intent.getIBinderExtra(EXTRA_SERVICE)); - mTile.setService(mService); + try { + mTile = mService.getTile(new ComponentName(getPackageName(), getClass().getName())); + } catch (RemoteException e) { + throw new RuntimeException("Unable to reach IQSService", e); + } + if (mTile != null) { + mTile.setService(mService); + mHandler.sendEmptyMessage(H.MSG_START_SUCCESS); + } return new IQSTileService.Stub() { @Override public void onTileRemoved() throws RemoteException { @@ -358,6 +360,7 @@ public class TileService extends Service { private static final int MSG_TILE_REMOVED = 4; private static final int MSG_TILE_CLICKED = 5; private static final int MSG_UNLOCK_COMPLETE = 6; + private static final int MSG_START_SUCCESS = 7; public H(Looper looper) { super(looper); @@ -397,6 +400,12 @@ public class TileService extends Service { mUnlockRunnable.run(); } break; + case MSG_START_SUCCESS: + try { + mService.onStartSuccessful(mTile); + } catch (RemoteException e) { + } + break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java index dd467793d6717..d68502ee956ea 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java @@ -88,7 +88,6 @@ public class TileLifecycleManager extends BroadcastReceiver implements mHandler = handler; mIntent = intent; mIntent.putExtra(TileService.EXTRA_SERVICE, service.asBinder()); - mIntent.putExtra(TileService.EXTRA_TILE, tile); mUser = user; if (DEBUG) Log.d(TAG, "Creating " + mIntent + " " + mUser); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java index f84c5d0bd7171..6f0bed2f5445e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java @@ -262,6 +262,16 @@ public class TileServices extends IQSService.Stub { } } + @Override + public Tile getTile(ComponentName componentName) { + verifyCaller(componentName.getPackageName()); + CustomTile customTile = getTileForComponent(componentName); + if (customTile != null) { + return customTile.getQsTile(); + } + return null; + } + @Override public void startUnlockAndRun(Tile tile) { ComponentName componentName = tile.getComponentName();