diff options
| author | 2016-06-17 12:42:59 -0400 | |
|---|---|---|
| committer | 2016-06-17 13:04:05 -0400 | |
| commit | a3453b8bd9af44566c6a31fd0156cc76e6028f6d (patch) | |
| tree | a347e6c50c31803de1a4b2c5deacb5d4c4fafd82 | |
| parent | 02435d24199648ea82b2c0972c5d90d5edc477ff (diff) | |
QS API: Fix mService and mTile being null once and for all
Change-Id: Idd82e4c2f6cfc2b30432e15e23963c1d7a959e43
Fixes: 29121793
10 files changed, 49 insertions, 114 deletions
diff --git a/core/java/android/service/quicksettings/IQSTileService.aidl b/core/java/android/service/quicksettings/IQSTileService.aidl index bfde8702338a..b6c830cf9840 100644 --- a/core/java/android/service/quicksettings/IQSTileService.aidl +++ b/core/java/android/service/quicksettings/IQSTileService.aidl @@ -15,15 +15,10 @@ */ package android.service.quicksettings; -import android.service.quicksettings.Tile; -import android.service.quicksettings.IQSService; - /** * @hide */ oneway interface IQSTileService { - void setQSService(in IQSService service); - void setQSTile(in Tile tile); void onTileAdded(); void onTileRemoved(); void onStartListening(); diff --git a/core/java/android/service/quicksettings/TileService.java b/core/java/android/service/quicksettings/TileService.java index 4e9a0751f2e3..67793fd041c6 100644 --- a/core/java/android/service/quicksettings/TileService.java +++ b/core/java/android/service/quicksettings/TileService.java @@ -118,6 +118,16 @@ public class TileService extends Service { /** * @hide */ + public static final String EXTRA_SERVICE = "service"; + + /** + * @hide + */ + public static final String EXTRA_TILE = "tile"; + + /** + * @hide + */ public static final String EXTRA_COMPONENT = "android.service.quicksettings.extra.COMPONENT"; private final H mHandler = new H(Looper.getMainLooper()); @@ -305,18 +315,11 @@ 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); return new IQSTileService.Stub() { @Override - public void setQSService(IQSService service) throws RemoteException { - mHandler.obtainMessage(H.MSG_SET_SERVICE, service).sendToTarget(); - } - - @Override - public void setQSTile(Tile tile) throws RemoteException { - mHandler.obtainMessage(H.MSG_SET_TILE, tile).sendToTarget(); - } - - @Override public void onTileRemoved() throws RemoteException { mHandler.sendEmptyMessage(H.MSG_TILE_REMOVED); } @@ -349,14 +352,12 @@ public class TileService extends Service { } private class H extends Handler { - private static final int MSG_SET_TILE = 1; - private static final int MSG_START_LISTENING = 2; - private static final int MSG_STOP_LISTENING = 3; - private static final int MSG_TILE_ADDED = 4; - private static final int MSG_TILE_REMOVED = 5; - private static final int MSG_TILE_CLICKED = 6; - private static final int MSG_SET_SERVICE = 7; - private static final int MSG_UNLOCK_COMPLETE = 8; + private static final int MSG_START_LISTENING = 1; + private static final int MSG_STOP_LISTENING = 2; + private static final int MSG_TILE_ADDED = 3; + private static final int MSG_TILE_REMOVED = 4; + private static final int MSG_TILE_CLICKED = 5; + private static final int MSG_UNLOCK_COMPLETE = 6; public H(Looper looper) { super(looper); @@ -365,18 +366,6 @@ public class TileService extends Service { @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_SET_SERVICE: - mService = (IQSService) msg.obj; - if (mTile != null) { - mTile.setService(mService); - } - break; - case MSG_SET_TILE: - mTile = (Tile) msg.obj; - if (mService != null && mTile != null) { - mTile.setService(mService); - } - break; case MSG_TILE_ADDED: TileService.this.onTileAdded(); break; diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java index 23a3ca128de2..46e7277e36d4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java @@ -71,17 +71,12 @@ public class CustomTile extends QSTile<QSTile.State> implements TileChangeListen super(host); mWindowManager = WindowManagerGlobal.getWindowManagerService(); mComponent = ComponentName.unflattenFromString(action); + mTile = new Tile(mComponent); + setTileIcon(); mServiceManager = host.getTileServices().getTileWrapper(this); mService = mServiceManager.getTileService(); mServiceManager.setTileChangeListener(this); - mTile = new Tile(mComponent); mUser = ActivityManager.getCurrentUser(); - setTileIcon(); - try { - mService.setQSTile(mTile); - } catch (RemoteException e) { - // Called through wrapper, won't happen here. - } } private void setTileIcon() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/QSTileServiceWrapper.java b/packages/SystemUI/src/com/android/systemui/qs/external/QSTileServiceWrapper.java index 3830ac50c60b..407453c6e3b2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/QSTileServiceWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/QSTileServiceWrapper.java @@ -35,16 +35,6 @@ public class QSTileServiceWrapper { return mService.asBinder(); } - public boolean setQSTile(Tile tile) { - try { - mService.setQSTile(tile); - return true; - } catch (Exception e) { - Log.d(TAG, "Caught exception from TileService", e); - return false; - } - } - public boolean onTileAdded() { try { mService.onTileAdded(); @@ -95,16 +85,6 @@ public class QSTileServiceWrapper { } } - public boolean setQSService(IQSService service) { - try { - mService.setQSService(service); - return true; - } catch (Exception e) { - Log.d(TAG, "Caught exception from TileService", e); - return false; - } - } - public boolean onUnlockComplete() { try { mService.onUnlockComplete(); 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 87d6307ffce2..dd467793d671 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java @@ -71,23 +71,24 @@ public class TileLifecycleManager extends BroadcastReceiver implements private Set<Integer> mQueuedMessages = new ArraySet<>(); private QSTileServiceWrapper mWrapper; private boolean mListening; - private Tile mTile; private IBinder mClickBinder; private int mBindTryCount; private boolean mBound; @VisibleForTesting boolean mReceiverRegistered; - private IQSService mService; private boolean mUnbindImmediate; private TileChangeListener mChangeListener; // Return value from bindServiceAsUser, determines whether safe to call unbind. private boolean mIsBound; - public TileLifecycleManager(Handler handler, Context context, Intent intent, UserHandle user) { + public TileLifecycleManager(Handler handler, Context context, IQSService service, + Tile tile, Intent intent, UserHandle user) { mContext = context; 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); } @@ -164,14 +165,6 @@ public class TileLifecycleManager extends BroadcastReceiver implements service.linkToDeath(this, 0); } catch (RemoteException e) { } - if (!wrapper.setQSService(mService)) { - handleDeath(); - return; - } - if (!wrapper.setQSTile(mTile)) { - handleDeath(); - return; - } mWrapper = wrapper; handlePendingMessages(); } @@ -255,15 +248,6 @@ public class TileLifecycleManager extends BroadcastReceiver implements } } - @Override - public void setQSTile(Tile tile) { - if (DEBUG) Log.d(TAG, "setQSTile " + tile); - mTile = tile; - if (mWrapper != null && !mWrapper.setQSTile(tile)) { - handleDeath(); - } - } - private boolean checkComponentState() { PackageManager pm = mContext.getPackageManager(); if (!isPackageAvailable(pm) || !isComponentAvailable(pm)) { @@ -347,14 +331,6 @@ public class TileLifecycleManager extends BroadcastReceiver implements } @Override - public void setQSService(IQSService service) { - mService = service; - if (mWrapper == null || !mWrapper.setQSService(service)) { - handleDeath(); - } - } - - @Override public void onTileAdded() { if (DEBUG) Log.d(TAG, "onTileAdded"); if (mWrapper == null || !mWrapper.onTileAdded()) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java index ce9bbf42679a..3d030f977fbc 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java @@ -27,6 +27,7 @@ import android.net.Uri; import android.os.Handler; import android.os.UserHandle; import android.service.quicksettings.IQSTileService; +import android.service.quicksettings.Tile; import android.service.quicksettings.TileService; import android.support.annotation.VisibleForTesting; import android.util.Log; @@ -68,9 +69,10 @@ public class TileServiceManager { // This defaults to true to ensure tiles start out unavailable. private boolean mPendingBind = true; - TileServiceManager(TileServices tileServices, Handler handler, ComponentName component) { + TileServiceManager(TileServices tileServices, Handler handler, ComponentName component, + Tile tile) { this(tileServices, handler, new TileLifecycleManager(handler, - tileServices.getContext(), new Intent().setComponent(component), + tileServices.getContext(), tileServices, tile, new Intent().setComponent(component), new UserHandle(ActivityManager.getCurrentUser()))); } @@ -80,7 +82,6 @@ public class TileServiceManager { mServices = tileServices; mHandler = handler; mStateManager = tileLifecycleManager; - mStateManager.setQSService(tileServices); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 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 2ab6b5fc98e9..f84c5d0bd717 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java @@ -78,7 +78,7 @@ public class TileServices extends IQSService.Stub { public TileServiceManager getTileWrapper(CustomTile tile) { ComponentName component = tile.getComponent(); - TileServiceManager service = onCreateTileService(component); + TileServiceManager service = onCreateTileService(component, tile.getQsTile()); synchronized (mServices) { mServices.put(tile, service); mTiles.put(component, tile); @@ -86,8 +86,8 @@ public class TileServices extends IQSService.Stub { return service; } - protected TileServiceManager onCreateTileService(ComponentName component) { - return new TileServiceManager(this, mHandler, component); + protected TileServiceManager onCreateTileService(ComponentName component, Tile tile) { + return new TileServiceManager(this, mHandler, component, tile); } public void freeService(CustomTile tile, TileServiceManager service) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java index 68e5d0b5bdd3..fa5777570b5d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -29,6 +29,7 @@ import android.os.Process; import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.Secure; +import android.service.quicksettings.Tile; import android.text.TextUtils; import android.util.Log; import android.view.View; @@ -399,10 +400,11 @@ public class QSTileHost implements QSTile.Host, Tunable { String tileSpec = previousTiles.get(i); if (!tileSpec.startsWith(CustomTile.PREFIX)) continue; if (!newTiles.contains(tileSpec)) { - Intent intent = new Intent().setComponent( - CustomTile.getComponentFromSpec(tileSpec)); + ComponentName component = CustomTile.getComponentFromSpec(tileSpec); + Intent intent = new Intent().setComponent(component); TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(), - mContext, intent, new UserHandle(ActivityManager.getCurrentUser())); + mContext, mServices, new Tile(component), intent, + new UserHandle(ActivityManager.getCurrentUser())); lifecycleManager.onStopListening(); lifecycleManager.onTileRemoved(); lifecycleManager.flushMessagesAndUnbind(); @@ -412,10 +414,11 @@ public class QSTileHost implements QSTile.Host, Tunable { String tileSpec = newTiles.get(i); if (!tileSpec.startsWith(CustomTile.PREFIX)) continue; if (!previousTiles.contains(tileSpec)) { - Intent intent = new Intent().setComponent( - CustomTile.getComponentFromSpec(tileSpec)); + ComponentName component = CustomTile.getComponentFromSpec(tileSpec); + Intent intent = new Intent().setComponent(component); TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(), - mContext, intent, new UserHandle(ActivityManager.getCurrentUser())); + mContext, mServices, new Tile(component), intent, + new UserHandle(ActivityManager.getCurrentUser())); lifecycleManager.onTileAdded(); lifecycleManager.flushMessagesAndUnbind(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTests.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTests.java index a30f50775f77..c93377a68f5d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTests.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTests.java @@ -36,6 +36,8 @@ import android.test.suitebuilder.annotation.SmallTest; import android.util.ArraySet; import android.util.Log; +import org.mockito.Mockito; + @SmallTest public class TileLifecycleManagerTests extends AndroidTestCase { public static final String TILE_UPDATE_BROADCAST = "com.android.systemui.tests.TILE_UPDATE"; @@ -54,8 +56,11 @@ public class TileLifecycleManagerTests extends AndroidTestCase { mThread = new HandlerThread("TestThread"); mThread.start(); mHandler = new Handler(mThread.getLooper()); + ComponentName component = new ComponentName(mContext, FakeTileService.class); mStateManager = new TileLifecycleManager(mHandler, getContext(), - new Intent(mContext, FakeTileService.class), new UserHandle(UserHandle.myUserId())); + Mockito.mock(IQSService.class), new Tile(component), + new Intent().setComponent(component), + new UserHandle(UserHandle.myUserId())); mCallbacks.clear(); getContext().registerReceiver(mReceiver, new IntentFilter(TILE_UPDATE_BROADCAST)); } @@ -251,16 +256,6 @@ public class TileLifecycleManagerTests extends AndroidTestCase { @Override public IBinder onBind(Intent intent) { return new IQSTileService.Stub() { - - @Override - public void setQSService(IQSService service) { - - } - - @Override - public void setQSTile(Tile tile) throws RemoteException { - } - @Override public void onTileAdded() throws RemoteException { sendCallback("onTileAdded"); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTests.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTests.java index 94c98d6c5b9a..de3864dc1fef 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTests.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTests.java @@ -17,6 +17,7 @@ package com.android.systemui.qs.external; import android.content.ComponentName; import android.os.Looper; +import android.service.quicksettings.Tile; import android.test.suitebuilder.annotation.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.phone.QSTileHost; @@ -109,7 +110,7 @@ public class TileServicesTests extends SysuiTestCase { } @Override - protected TileServiceManager onCreateTileService(ComponentName component) { + protected TileServiceManager onCreateTileService(ComponentName component, Tile qsTile) { TileServiceManager manager = Mockito.mock(TileServiceManager.class); mManagers.add(manager); return manager; |