Merge "Fix 6592932: add means to replace assist icon from given package" into jb-dev

This commit is contained in:
Jim Miller
2012-06-01 20:34:43 -07:00
committed by Android (Google) Code Review
5 changed files with 109 additions and 4 deletions

View File

@ -23,12 +23,16 @@ import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Vibrator;
import android.text.TextUtils;
import android.util.AttributeSet;
@ -1233,4 +1237,62 @@ public class MultiWaveView extends View {
}
return -1;
}
private boolean replaceTargetDrawables(Resources res, int existingResourceId,
int newResourceId) {
if (existingResourceId == 0 || newResourceId == 0) {
return false;
}
boolean result = false;
final ArrayList<TargetDrawable> drawables = mTargetDrawables;
final int size = drawables.size();
for (int i = 0; i < size; i++) {
final TargetDrawable target = drawables.get(i);
if (target != null && target.getResourceId() == existingResourceId) {
target.setDrawable(res, newResourceId);
result = true;
}
}
if (result) {
requestLayout(); // in case any given drawable's size changes
}
return result;
}
/**
* Searches the given package for a resource to use to replace the Drawable on the
* target with the given resource id
* @param component of the .apk that contains the resource
* @param name of the metadata in the .apk
* @param existingResId the resource id of the target to search for
* @return true if found in the given package and replaced at least one target Drawables
*/
public boolean replaceTargetDrawablesIfPresent(ComponentName component, String name,
int existingResId) {
if (existingResId == 0) return false;
try {
PackageManager packageManager = mContext.getPackageManager();
// Look for the search icon specified in the activity meta-data
Bundle metaData = packageManager.getActivityInfo(
component, PackageManager.GET_META_DATA).metaData;
if (metaData != null) {
int iconResId = metaData.getInt(name);
if (iconResId != 0) {
Resources res = packageManager.getResourcesForActivity(component);
return replaceTargetDrawables(res, existingResId, iconResId);
}
}
} catch (NameNotFoundException e) {
Log.w(TAG, "Failed to swap drawable; "
+ component.flattenToShortString() + " not found", e);
} catch (Resources.NotFoundException nfe) {
Log.w(TAG, "Failed to swap drawable from "
+ component.flattenToShortString(), nfe);
}
return false;
}
}

View File

@ -44,7 +44,7 @@ public class TargetDrawable {
private float mAlpha = 1.0f;
private Drawable mDrawable;
private boolean mEnabled = true;
private int mResourceId;
private final int mResourceId;
/* package */ static class DrawableWithAlpha extends Drawable {
private float mAlpha = 1.0f;
@ -78,6 +78,12 @@ public class TargetDrawable {
public TargetDrawable(Resources res, int resId) {
mResourceId = resId;
setDrawable(res, resId);
}
public void setDrawable(Resources res, int resId) {
// Note we explicitly don't set mResourceId to resId since we allow the drawable to be
// swapped at runtime and want to re-use the existing resource id for identification.
Drawable drawable = resId == 0 ? null : res.getDrawable(resId);
// Mutate the drawable so we can animate shared drawable properties.
mDrawable = drawable != null ? drawable.mutate() : null;

View File

@ -31,6 +31,6 @@
android:state_enabled="true"
android:state_active="false"
android:state_focused="true"
android:drawable="@drawable/ic_lockscreen_google_activated" />
android:drawable="@drawable/ic_lockscreen_google_focused" />
</selector>

View File

@ -50,6 +50,8 @@ public class SearchPanelView extends FrameLayout implements
private static final int SEARCH_PANEL_HOLD_DURATION = 500;
static final String TAG = "SearchPanelView";
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
private static final String ASSIST_ICON_METADATA_NAME =
"com.android.systemui.action_assist_icon";
private final Context mContext;
private BaseStatusBar mBar;
private StatusBarTouchProxy mStatusBarTouchProxy;
@ -168,6 +170,21 @@ public class SearchPanelView extends FrameLayout implements
// TODO: fetch views
mMultiWaveView = (MultiWaveView) findViewById(R.id.multi_wave_view);
mMultiWaveView.setOnTriggerListener(mMultiWaveViewListener);
SearchManager searchManager = getSearchManager();
if (searchManager != null) {
ComponentName component = searchManager.getGlobalSearchActivity();
if (component != null) {
if (!mMultiWaveView.replaceTargetDrawablesIfPresent(component,
ASSIST_ICON_METADATA_NAME,
com.android.internal.R.drawable.ic_lockscreen_search)) {
Slog.w(TAG, "Couldn't grab icon from component " + component);
}
} else {
Slog.w(TAG, "No search icon specified in component " + component);
}
} else {
Slog.w(TAG, "No SearchManager");
}
}
private boolean pointInside(int x, int y, View v) {

View File

@ -62,6 +62,8 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
private static final String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key";
private static final int WAIT_FOR_ANIMATION_TIMEOUT = 0;
private static final int STAY_ON_WHILE_GRABBED_TIMEOUT = 30000;
private static final String ASSIST_ICON_METADATA_NAME =
"com.android.systemui.action_assist_icon";
private LockPatternUtils mLockPatternUtils;
private KeyguardUpdateMonitor mUpdateMonitor;
@ -290,8 +292,6 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
MultiWaveViewMethods(MultiWaveView multiWaveView) {
mMultiWaveView = multiWaveView;
// TODO: get search icon. See Launcher.updateGlobalSearchIcon()
}
public boolean isTargetPresent(int resId) {
@ -310,6 +310,26 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
if (mMultiWaveView.getTargetResourceId() != resId) {
mMultiWaveView.setTargetResources(resId);
}
// Update the search icon with drawable from the search .apk
if (!mSearchDisabled) {
SearchManager searchManager = getSearchManager();
if (searchManager != null) {
ComponentName component = searchManager.getGlobalSearchActivity();
if (component != null) {
if (!mMultiWaveView.replaceTargetDrawablesIfPresent(component,
ASSIST_ICON_METADATA_NAME,
com.android.internal.R.drawable.ic_lockscreen_search)) {
Slog.w(TAG, "Couldn't grab icon from package " + component);
}
} else {
Slog.w(TAG, "No search icon specified in package " + component);
}
} else {
Slog.w(TAG, "No SearchManager");
}
}
setEnabled(com.android.internal.R.drawable.ic_lockscreen_camera, !mCameraDisabled);
setEnabled(com.android.internal.R.drawable.ic_lockscreen_search, !mSearchDisabled);
}