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.systemui.R;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
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(";
private static final boolean DEBUG = false;
@@ -58,7 +60,7 @@ public class CustomTile extends QSTile<QSTile.State> {
private final IQSTileService mService;
private final TileServiceManager mServiceManager;
private final int mUser;
private final android.graphics.drawable.Icon mDefaultIcon;
private android.graphics.drawable.Icon mDefaultIcon;
private boolean mListening;
private boolean mBound;
@@ -71,21 +73,10 @@ public class CustomTile extends QSTile<QSTile.State> {
mComponent = ComponentName.unflattenFromString(action);
mServiceManager = host.getTileServices().getTileWrapper(this);
mService = mServiceManager.getTileService();
mServiceManager.setTileChangeListener(this);
mTile = new Tile(mComponent);
mUser = ActivityManager.getCurrentUser();
android.graphics.drawable.Icon defaultIcon;
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;
setTileIcon();
try {
mService.setQSTile(mTile);
} 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
public boolean isAvailable() {
return mDefaultIcon != null;
@@ -136,6 +178,8 @@ public class CustomTile extends QSTile<QSTile.State> {
mListening = listening;
try {
if (listening) {
setTileIcon();
refreshState();
if (!mServiceManager.isActiveTile()) {
mServiceManager.setBindRequested(true);
mService.onStartListening();

View File

@@ -80,6 +80,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements
boolean mReceiverRegistered;
private IQSService mService;
private boolean mUnbindImmediate;
private TileChangeListener mChangeListener;
public TileLifecycleManager(Handler handler, Context context, Intent intent, UserHandle user) {
mContext = context;
@@ -168,7 +169,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements
@Override
public void onServiceDisconnected(ComponentName name) {
if (DEBUG) Log.d(TAG, "onServiceDisconnected " + name);
mWrapper = null;
handleDeath();
}
private void handlePendingMessages() {
@@ -279,6 +280,10 @@ public class TileLifecycleManager extends BroadcastReceiver implements
mReceiverRegistered = false;
}
public void setTileChangeListener(TileChangeListener changeListener) {
mChangeListener = changeListener;
}
@Override
public void onReceive(Context context, Intent intent) {
if (DEBUG) Log.d(TAG, "onReceive: " + intent);
@@ -289,6 +294,9 @@ public class TileLifecycleManager extends BroadcastReceiver implements
return;
}
}
if (Intent.ACTION_PACKAGE_CHANGED.equals(intent.getAction()) && mChangeListener != null) {
mChangeListener.onTileChanged(mIntent.getComponent());
}
stopPackageListening();
if (mBound) {
// 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");
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.support.annotation.VisibleForTesting;
import android.util.Log;
import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
import libcore.util.Objects;
/**
@@ -81,6 +82,10 @@ public class TileServiceManager {
new UserHandle(ActivityManager.getCurrentUser()), filter, null, mHandler);
}
public void setTileChangeListener(TileChangeListener changeListener) {
mStateManager.setTileChangeListener(changeListener);
}
public boolean isActiveTile() {
return mStateManager.isActiveTile();
}