Merge "Fix 6592932: add means to replace assist icon from given package" into jb-dev
This commit is contained in:
@ -23,12 +23,16 @@ import android.animation.ObjectAnimator;
|
|||||||
import android.animation.TimeInterpolator;
|
import android.animation.TimeInterpolator;
|
||||||
import android.animation.ValueAnimator;
|
import android.animation.ValueAnimator;
|
||||||
import android.animation.ValueAnimator.AnimatorUpdateListener;
|
import android.animation.ValueAnimator.AnimatorUpdateListener;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.os.Bundle;
|
||||||
import android.os.Vibrator;
|
import android.os.Vibrator;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
@ -1233,4 +1237,62 @@ public class MultiWaveView extends View {
|
|||||||
}
|
}
|
||||||
return -1;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ public class TargetDrawable {
|
|||||||
private float mAlpha = 1.0f;
|
private float mAlpha = 1.0f;
|
||||||
private Drawable mDrawable;
|
private Drawable mDrawable;
|
||||||
private boolean mEnabled = true;
|
private boolean mEnabled = true;
|
||||||
private int mResourceId;
|
private final int mResourceId;
|
||||||
|
|
||||||
/* package */ static class DrawableWithAlpha extends Drawable {
|
/* package */ static class DrawableWithAlpha extends Drawable {
|
||||||
private float mAlpha = 1.0f;
|
private float mAlpha = 1.0f;
|
||||||
@ -78,6 +78,12 @@ public class TargetDrawable {
|
|||||||
|
|
||||||
public TargetDrawable(Resources res, int resId) {
|
public TargetDrawable(Resources res, int resId) {
|
||||||
mResourceId = 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);
|
Drawable drawable = resId == 0 ? null : res.getDrawable(resId);
|
||||||
// Mutate the drawable so we can animate shared drawable properties.
|
// Mutate the drawable so we can animate shared drawable properties.
|
||||||
mDrawable = drawable != null ? drawable.mutate() : null;
|
mDrawable = drawable != null ? drawable.mutate() : null;
|
||||||
|
@ -31,6 +31,6 @@
|
|||||||
android:state_enabled="true"
|
android:state_enabled="true"
|
||||||
android:state_active="false"
|
android:state_active="false"
|
||||||
android:state_focused="true"
|
android:state_focused="true"
|
||||||
android:drawable="@drawable/ic_lockscreen_google_activated" />
|
android:drawable="@drawable/ic_lockscreen_google_focused" />
|
||||||
|
|
||||||
</selector>
|
</selector>
|
||||||
|
@ -50,6 +50,8 @@ public class SearchPanelView extends FrameLayout implements
|
|||||||
private static final int SEARCH_PANEL_HOLD_DURATION = 500;
|
private static final int SEARCH_PANEL_HOLD_DURATION = 500;
|
||||||
static final String TAG = "SearchPanelView";
|
static final String TAG = "SearchPanelView";
|
||||||
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
|
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 final Context mContext;
|
||||||
private BaseStatusBar mBar;
|
private BaseStatusBar mBar;
|
||||||
private StatusBarTouchProxy mStatusBarTouchProxy;
|
private StatusBarTouchProxy mStatusBarTouchProxy;
|
||||||
@ -168,6 +170,21 @@ public class SearchPanelView extends FrameLayout implements
|
|||||||
// TODO: fetch views
|
// TODO: fetch views
|
||||||
mMultiWaveView = (MultiWaveView) findViewById(R.id.multi_wave_view);
|
mMultiWaveView = (MultiWaveView) findViewById(R.id.multi_wave_view);
|
||||||
mMultiWaveView.setOnTriggerListener(mMultiWaveViewListener);
|
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) {
|
private boolean pointInside(int x, int y, View v) {
|
||||||
|
@ -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 String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key";
|
||||||
private static final int WAIT_FOR_ANIMATION_TIMEOUT = 0;
|
private static final int WAIT_FOR_ANIMATION_TIMEOUT = 0;
|
||||||
private static final int STAY_ON_WHILE_GRABBED_TIMEOUT = 30000;
|
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 LockPatternUtils mLockPatternUtils;
|
||||||
private KeyguardUpdateMonitor mUpdateMonitor;
|
private KeyguardUpdateMonitor mUpdateMonitor;
|
||||||
@ -290,8 +292,6 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
|
|||||||
|
|
||||||
MultiWaveViewMethods(MultiWaveView multiWaveView) {
|
MultiWaveViewMethods(MultiWaveView multiWaveView) {
|
||||||
mMultiWaveView = multiWaveView;
|
mMultiWaveView = multiWaveView;
|
||||||
|
|
||||||
// TODO: get search icon. See Launcher.updateGlobalSearchIcon()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isTargetPresent(int resId) {
|
public boolean isTargetPresent(int resId) {
|
||||||
@ -310,6 +310,26 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
|
|||||||
if (mMultiWaveView.getTargetResourceId() != resId) {
|
if (mMultiWaveView.getTargetResourceId() != resId) {
|
||||||
mMultiWaveView.setTargetResources(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_camera, !mCameraDisabled);
|
||||||
setEnabled(com.android.internal.R.drawable.ic_lockscreen_search, !mSearchDisabled);
|
setEnabled(com.android.internal.R.drawable.ic_lockscreen_search, !mSearchDisabled);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user