diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java index e8bd54645da..d1d51310d6f 100644 --- a/core/java/android/app/SearchManager.java +++ b/core/java/android/app/SearchManager.java @@ -840,29 +840,17 @@ public List getSearchablesInGlobalSearch() { } /** - * Returns true if the global assist activity is available. - * @return True if the assistant is available. - * - * @hide - */ - public final boolean isAssistantAvailable() { - Intent intent = getAssistIntent(); - return intent != null - && mContext.getPackageManager().queryIntentActivities(intent, - PackageManager.MATCH_DEFAULT_ONLY).size() > 0; - } - - /** - * Gets an intent to launch the global assist activity, or null if not available. + * Gets an intent for launching installed assistant activity, or null if not available. * @return The assist intent. * * @hide */ - public final Intent getAssistIntent() { - ComponentName globalSearchActivity = getGlobalSearchActivity(); - if (globalSearchActivity != null) { - Intent intent = new Intent(Intent.ACTION_ASSIST); - intent.setPackage(globalSearchActivity.getPackageName()); + public static final Intent getAssistIntent(Context context) { + PackageManager pm = context.getPackageManager(); + Intent intent = new Intent(Intent.ACTION_ASSIST); + ComponentName component = intent.resolveActivity(pm); + if (component != null) { + intent.setComponent(component); return intent; } return null; diff --git a/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java b/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java index adea5864297..fc448782d7a 100644 --- a/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java +++ b/core/java/com/android/internal/widget/multiwaveview/GlowPadView.java @@ -29,7 +29,6 @@ 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; @@ -1209,25 +1208,32 @@ public boolean replaceTargetDrawablesIfPresent(ComponentName component, String n 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); + boolean replaced = false; + if (component != null) { + 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); + replaced = 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); } - } 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; + if (!replaced) { + // Restore the original drawable + replaceTargetDrawables(mContext.getResources(), existingResId, existingResId); + } + return replaced; } } diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java index acab41ea3c6..475fb6d2021 100644 --- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java @@ -53,7 +53,6 @@ public class SearchPanelView extends FrameLayout implements private static final String ASSIST_ICON_METADATA_NAME = "com.android.systemui.action_assist_icon"; private final Context mContext; - private final SearchManager mSearchManager; private BaseStatusBar mBar; private StatusBarTouchProxy mStatusBarTouchProxy; @@ -68,25 +67,13 @@ public SearchPanelView(Context context, AttributeSet attrs) { public SearchPanelView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; - mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); - if (mSearchManager == null) { - Slog.w(TAG, "Search manager not available"); - } - } - - public boolean isAssistantAvailable() { - return mSearchManager != null && mSearchManager.isAssistantAvailable(); - } - - private Intent getAssistIntent() { - return mSearchManager != null ? mSearchManager.getAssistIntent() : null; } private void startAssistActivity() { // Close Recent Apps if needed mBar.animateCollapse(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL); // Launch Assist - Intent intent = getAssistIntent(); + Intent intent = SearchManager.getAssistIntent(mContext); if (intent == null) return; try { ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, @@ -150,19 +137,17 @@ protected void onFinishInflate() { // TODO: fetch views mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view); mGlowPadView.setOnTriggerListener(mGlowPadViewListener); - if (mSearchManager != null) { - ComponentName component = mSearchManager.getGlobalSearchActivity(); - if (component != null) { - if (!mGlowPadView.replaceTargetDrawablesIfPresent(component, - ASSIST_ICON_METADATA_NAME, - com.android.internal.R.drawable.ic_action_assist_generic)) { - Slog.w(TAG, "Couldn't grab icon from component " + component); - } - } else { - Slog.w(TAG, "No search icon specified in component " + component); + } + + private void maybeSwapSearchIcon() { + Intent intent = SearchManager.getAssistIntent(mContext); + if (intent != null) { + ComponentName component = intent.getComponent(); + if (component == null || !mGlowPadView.replaceTargetDrawablesIfPresent(component, + ASSIST_ICON_METADATA_NAME, + com.android.internal.R.drawable.ic_action_assist_generic)) { + if (DEBUG) Slog.v(TAG, "Couldn't grab icon for component " + component); } - } else { - Slog.w(TAG, "No SearchManager"); } } @@ -210,6 +195,7 @@ public void show(final boolean show, boolean animate) { } mShowing = show; if (show) { + maybeSwapSearchIcon(); if (getVisibility() != View.VISIBLE) { setVisibility(View.VISIBLE); // Don't start the animation until we've created the layer, which is done @@ -289,4 +275,8 @@ private LayoutTransition createLayoutTransitioner() { transitioner.setAnimator(LayoutTransition.DISAPPEARING, null); return transitioner; } + + public boolean isAssistantAvailable() { + return SearchManager.getAssistIntent(mContext) != null; + } } diff --git a/policy/src/com/android/internal/policy/impl/LockScreen.java b/policy/src/com/android/internal/policy/impl/LockScreen.java index 33dda099863..ec954fefbb7 100644 --- a/policy/src/com/android/internal/policy/impl/LockScreen.java +++ b/policy/src/com/android/internal/policy/impl/LockScreen.java @@ -83,7 +83,6 @@ class LockScreen extends LinearLayout implements KeyguardScreen { private View mUnlockWidget; private boolean mCameraDisabled; private boolean mSearchDisabled; - private SearchManager mSearchManager; // Is there a vibrator private final boolean mHasVibrator; @@ -253,23 +252,6 @@ public void cleanUp() { } } - private boolean isAssistantAvailable() { - SearchManager searchManager = getSearchManager(); - return searchManager != null && searchManager.isAssistantAvailable(); - } - - private Intent getAssistIntent() { - SearchManager searchManager = getSearchManager(); - return searchManager != null ? searchManager.getAssistIntent() : null; - } - - private SearchManager getSearchManager() { - if (mSearchManager == null) { - mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); - } - return mSearchManager; - } - class GlowPadViewMethods implements GlowPadView.OnTriggerListener, UnlockWidgetCommonMethods { private final GlowPadView mGlowPadView; @@ -297,27 +279,21 @@ public void updateResources() { // 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) { - // XXX Hack. We need to substitute the icon here but haven't formalized - // the public API. The "_google" metadata will be going away, so - // DON'T USE IT! - boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component, - ASSIST_ICON_METADATA_NAME + "_google", - com.android.internal.R.drawable.ic_action_assist_generic); - - if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component, - ASSIST_ICON_METADATA_NAME, - com.android.internal.R.drawable.ic_action_assist_generic)) { - Slog.w(TAG, "Couldn't grab icon from package " + component); - } - } else { - Slog.w(TAG, "No search icon specified in package " + component); + Intent intent = SearchManager.getAssistIntent(mContext); + if (intent != null) { + // XXX Hack. We need to substitute the icon here but haven't formalized + // the public API. The "_google" metadata will be going away, so + // DON'T USE IT! + ComponentName component = intent.getComponent(); + boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component, + ASSIST_ICON_METADATA_NAME + "_google", + com.android.internal.R.drawable.ic_action_assist_generic); + + if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component, + ASSIST_ICON_METADATA_NAME, + com.android.internal.R.drawable.ic_action_assist_generic)) { + Slog.w(TAG, "Couldn't grab icon from package " + component); } - } else { - Slog.w(TAG, "No SearchManager"); } } @@ -337,7 +313,7 @@ public void onTrigger(View v, int target) { final int resId = mGlowPadView.getResourceIdForTarget(target); switch (resId) { case com.android.internal.R.drawable.ic_action_assist_generic: - Intent assistIntent = getAssistIntent(); + Intent assistIntent = SearchManager.getAssistIntent(mContext); if (assistIntent != null) { launchActivity(assistIntent); } else { @@ -550,7 +526,7 @@ private void updateTargets() { } else if (disabledBySimState) { Log.v(TAG, "Camera disabled by Sim State"); } - boolean searchActionAvailable = isAssistantAvailable(); + boolean searchActionAvailable = SearchManager.getAssistIntent(mContext) != null; mCameraDisabled = disabledByAdmin || disabledBySimState || !cameraTargetPresent; mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent; mUnlockWidgetMethods.updateResources(); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 35f71ec3865..4785abd07c8 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -2081,6 +2081,8 @@ private void launchAssistLongPressAction() { Intent intent = new Intent(Intent.ACTION_SEARCH_LONG_PRESS); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { + // TODO: This only stops the factory-installed search manager. + // Need to formalize an API to handle others SearchManager searchManager = getSearchManager(); if (searchManager != null) { searchManager.stopSearch(); @@ -2093,19 +2095,15 @@ private void launchAssistLongPressAction() { private void launchAssistAction() { sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST); - - SearchManager searchManager = getSearchManager(); - if (searchManager != null) { - Intent intent = searchManager.getAssistIntent(); - if (intent != null) { - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_SINGLE_TOP - | Intent.FLAG_ACTIVITY_CLEAR_TOP); - try { - mContext.startActivity(intent); - } catch (ActivityNotFoundException e) { - Slog.w(TAG, "No activity to handle assist action.", e); - } + Intent intent = SearchManager.getAssistIntent(mContext); + if (intent != null) { + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_SINGLE_TOP + | Intent.FLAG_ACTIVITY_CLEAR_TOP); + try { + mContext.startActivity(intent); + } catch (ActivityNotFoundException e) { + Slog.w(TAG, "No activity to handle assist action.", e); } } } diff --git a/tests/Assistant/Android.mk b/tests/Assistant/Android.mk new file mode 100644 index 00000000000..bf8cc29e11e --- /dev/null +++ b/tests/Assistant/Android.mk @@ -0,0 +1,11 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_PACKAGE_NAME := Assistant + +LOCAL_MODULE_TAGS := tests +LOCAL_CERTIFICATE := platform + +include $(BUILD_PACKAGE) diff --git a/tests/Assistant/AndroidManifest.xml b/tests/Assistant/AndroidManifest.xml new file mode 100644 index 00000000000..b5d4d513060 --- /dev/null +++ b/tests/Assistant/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/Assistant/res/drawable-hdpi/ic_action_assist_activated.png b/tests/Assistant/res/drawable-hdpi/ic_action_assist_activated.png new file mode 100644 index 00000000000..cea8ac4e277 Binary files /dev/null and b/tests/Assistant/res/drawable-hdpi/ic_action_assist_activated.png differ diff --git a/tests/Assistant/res/drawable-hdpi/ic_action_assist_normal.png b/tests/Assistant/res/drawable-hdpi/ic_action_assist_normal.png new file mode 100644 index 00000000000..bb7702dca63 Binary files /dev/null and b/tests/Assistant/res/drawable-hdpi/ic_action_assist_normal.png differ diff --git a/tests/Assistant/res/drawable-mdpi/ic_action_assist_activated.png b/tests/Assistant/res/drawable-mdpi/ic_action_assist_activated.png new file mode 100644 index 00000000000..5841d82b22a Binary files /dev/null and b/tests/Assistant/res/drawable-mdpi/ic_action_assist_activated.png differ diff --git a/tests/Assistant/res/drawable-mdpi/ic_action_assist_normal.png b/tests/Assistant/res/drawable-mdpi/ic_action_assist_normal.png new file mode 100644 index 00000000000..3851f03f840 Binary files /dev/null and b/tests/Assistant/res/drawable-mdpi/ic_action_assist_normal.png differ diff --git a/tests/Assistant/res/drawable-xhdpi/ic_action_assist_activated.png b/tests/Assistant/res/drawable-xhdpi/ic_action_assist_activated.png new file mode 100644 index 00000000000..778db195a86 Binary files /dev/null and b/tests/Assistant/res/drawable-xhdpi/ic_action_assist_activated.png differ diff --git a/tests/Assistant/res/drawable-xhdpi/ic_action_assist_normal.png b/tests/Assistant/res/drawable-xhdpi/ic_action_assist_normal.png new file mode 100644 index 00000000000..ad49125879a Binary files /dev/null and b/tests/Assistant/res/drawable-xhdpi/ic_action_assist_normal.png differ diff --git a/tests/Assistant/res/drawable/ic_action_assist.xml b/tests/Assistant/res/drawable/ic_action_assist.xml new file mode 100644 index 00000000000..05c4bf5796d --- /dev/null +++ b/tests/Assistant/res/drawable/ic_action_assist.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/tests/Assistant/res/layout/assist_intent_activity.xml b/tests/Assistant/res/layout/assist_intent_activity.xml new file mode 100644 index 00000000000..49785bc78a2 --- /dev/null +++ b/tests/Assistant/res/layout/assist_intent_activity.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + diff --git a/tests/Assistant/res/values/strings.xml b/tests/Assistant/res/values/strings.xml new file mode 100644 index 00000000000..a59c1ef74c6 --- /dev/null +++ b/tests/Assistant/res/values/strings.xml @@ -0,0 +1,20 @@ + + + + + Assistant + Orilla Search Engine + diff --git a/tests/Assistant/src/com/google/android/test/assistant/AssistActivity.java b/tests/Assistant/src/com/google/android/test/assistant/AssistActivity.java new file mode 100644 index 00000000000..51894a15efd --- /dev/null +++ b/tests/Assistant/src/com/google/android/test/assistant/AssistActivity.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.test.assistant; + +import android.app.Activity; +import android.os.Bundle; +import com.google.android.test.assistant.R; + +public class AssistActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.assist_intent_activity); + } + +}