Merge "Update QS custom tile icons when they change" into nyc-dev

This commit is contained in:
Jason Monk
2016-05-02 16:49:43 +00:00
committed by Android (Google) Code Review
3 changed files with 77 additions and 16 deletions

View File

@@ -40,9 +40,11 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.qs.QSTile; import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
import com.android.systemui.statusbar.phone.QSTileHost; import com.android.systemui.statusbar.phone.QSTileHost;
import libcore.util.Objects;
public class CustomTile extends QSTile<QSTile.State> { public class CustomTile extends QSTile<QSTile.State> implements TileChangeListener {
public static final String PREFIX = "custom("; public static final String PREFIX = "custom(";
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
@@ -58,7 +60,7 @@ public class CustomTile extends QSTile<QSTile.State> {
private final IQSTileService mService; private final IQSTileService mService;
private final TileServiceManager mServiceManager; private final TileServiceManager mServiceManager;
private final int mUser; private final int mUser;
private final android.graphics.drawable.Icon mDefaultIcon; private android.graphics.drawable.Icon mDefaultIcon;
private boolean mListening; private boolean mListening;
private boolean mBound; private boolean mBound;
@@ -71,21 +73,10 @@ public class CustomTile extends QSTile<QSTile.State> {
mComponent = ComponentName.unflattenFromString(action); mComponent = ComponentName.unflattenFromString(action);
mServiceManager = host.getTileServices().getTileWrapper(this); mServiceManager = host.getTileServices().getTileWrapper(this);
mService = mServiceManager.getTileService(); mService = mServiceManager.getTileService();
mServiceManager.setTileChangeListener(this);
mTile = new Tile(mComponent); mTile = new Tile(mComponent);
mUser = ActivityManager.getCurrentUser(); mUser = ActivityManager.getCurrentUser();
android.graphics.drawable.Icon defaultIcon; setTileIcon();
try {
PackageManager pm = mContext.getPackageManager();
ServiceInfo info = pm.getServiceInfo(mComponent,
PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE);
defaultIcon = info.icon != 0 ? android.graphics.drawable.Icon
.createWithResource(mComponent.getPackageName(), info.icon) : null;
mTile.setIcon(defaultIcon);
mTile.setLabel(info.loadLabel(pm));
} catch (Exception e) {
defaultIcon = null;
}
mDefaultIcon = defaultIcon;
try { try {
mService.setQSTile(mTile); mService.setQSTile(mTile);
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -93,6 +84,57 @@ public class CustomTile extends QSTile<QSTile.State> {
} }
} }
private void setTileIcon() {
try {
PackageManager pm = mContext.getPackageManager();
ServiceInfo info = pm.getServiceInfo(mComponent,
PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE);
// Update the icon if its not set or is the default icon.
boolean updateIcon = mTile.getIcon() == null
|| iconEquals(mTile.getIcon(), mDefaultIcon);
mDefaultIcon = info.icon != 0 ? android.graphics.drawable.Icon
.createWithResource(mComponent.getPackageName(), info.icon) : null;
if (updateIcon) {
mTile.setIcon(mDefaultIcon);
}
// Update the label if there is no label.
if (mTile.getLabel() == null) {
mTile.setLabel(info.loadLabel(pm));
}
} catch (Exception e) {
mDefaultIcon = null;
}
}
/**
* Compare two icons, only works for resources.
*/
private boolean iconEquals(android.graphics.drawable.Icon icon1,
android.graphics.drawable.Icon icon2) {
if (icon1 == icon2) {
return true;
}
if (icon1 == null || icon2 == null) {
return false;
}
if (icon1.getType() != android.graphics.drawable.Icon.TYPE_RESOURCE
|| icon2.getType() != android.graphics.drawable.Icon.TYPE_RESOURCE) {
return false;
}
if (icon1.getResId() != icon2.getResId()) {
return false;
}
if (!Objects.equal(icon1.getResPackage(), icon2.getResPackage())) {
return false;
}
return true;
}
@Override
public void onTileChanged(ComponentName tile) {
setTileIcon();
}
@Override @Override
public boolean isAvailable() { public boolean isAvailable() {
return mDefaultIcon != null; return mDefaultIcon != null;
@@ -136,6 +178,8 @@ public class CustomTile extends QSTile<QSTile.State> {
mListening = listening; mListening = listening;
try { try {
if (listening) { if (listening) {
setTileIcon();
refreshState();
if (!mServiceManager.isActiveTile()) { if (!mServiceManager.isActiveTile()) {
mServiceManager.setBindRequested(true); mServiceManager.setBindRequested(true);
mService.onStartListening(); mService.onStartListening();

View File

@@ -80,6 +80,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements
boolean mReceiverRegistered; boolean mReceiverRegistered;
private IQSService mService; private IQSService mService;
private boolean mUnbindImmediate; private boolean mUnbindImmediate;
private TileChangeListener mChangeListener;
public TileLifecycleManager(Handler handler, Context context, Intent intent, UserHandle user) { public TileLifecycleManager(Handler handler, Context context, Intent intent, UserHandle user) {
mContext = context; mContext = context;
@@ -168,7 +169,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements
@Override @Override
public void onServiceDisconnected(ComponentName name) { public void onServiceDisconnected(ComponentName name) {
if (DEBUG) Log.d(TAG, "onServiceDisconnected " + name); if (DEBUG) Log.d(TAG, "onServiceDisconnected " + name);
mWrapper = null; handleDeath();
} }
private void handlePendingMessages() { private void handlePendingMessages() {
@@ -279,6 +280,10 @@ public class TileLifecycleManager extends BroadcastReceiver implements
mReceiverRegistered = false; mReceiverRegistered = false;
} }
public void setTileChangeListener(TileChangeListener changeListener) {
mChangeListener = changeListener;
}
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (DEBUG) Log.d(TAG, "onReceive: " + intent); if (DEBUG) Log.d(TAG, "onReceive: " + intent);
@@ -289,6 +294,9 @@ public class TileLifecycleManager extends BroadcastReceiver implements
return; return;
} }
} }
if (Intent.ACTION_PACKAGE_CHANGED.equals(intent.getAction()) && mChangeListener != null) {
mChangeListener.onTileChanged(mIntent.getComponent());
}
stopPackageListening(); stopPackageListening();
if (mBound) { if (mBound) {
// Trying to bind again will check the state of the package before bothering to bind. // Trying to bind again will check the state of the package before bothering to bind.
@@ -401,4 +409,8 @@ public class TileLifecycleManager extends BroadcastReceiver implements
if (DEBUG) Log.d(TAG, "binderDeath"); if (DEBUG) Log.d(TAG, "binderDeath");
handleDeath(); handleDeath();
} }
public interface TileChangeListener {
void onTileChanged(ComponentName tile);
}
} }

View File

@@ -27,6 +27,7 @@ import android.os.UserHandle;
import android.service.quicksettings.IQSTileService; import android.service.quicksettings.IQSTileService;
import android.support.annotation.VisibleForTesting; import android.support.annotation.VisibleForTesting;
import android.util.Log; import android.util.Log;
import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
import libcore.util.Objects; import libcore.util.Objects;
/** /**
@@ -81,6 +82,10 @@ public class TileServiceManager {
new UserHandle(ActivityManager.getCurrentUser()), filter, null, mHandler); new UserHandle(ActivityManager.getCurrentUser()), filter, null, mHandler);
} }
public void setTileChangeListener(TileChangeListener changeListener) {
mStateManager.setTileChangeListener(changeListener);
}
public boolean isActiveTile() { public boolean isActiveTile() {
return mStateManager.isActiveTile(); return mStateManager.isActiveTile();
} }