am 07d1b289: Merge "Launch ASSIST intent on the current user" into jb-mr1-dev

* commit '07d1b289041c67d42e1ad3fc9343833d8a781998':
  Launch ASSIST intent on the current user
This commit is contained in:
Amith Yamasani
2012-08-14 16:37:02 -07:00
committed by Android Git Automerger
6 changed files with 101 additions and 18 deletions

View File

@@ -30,4 +30,5 @@ interface ISearchManager {
List<ResolveInfo> getGlobalSearchActivities();
ComponentName getGlobalSearchActivity();
ComponentName getWebSearchActivity();
ComponentName getAssistIntent(int userHandle);
}

View File

@@ -31,6 +31,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserId;
import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;
@@ -845,14 +846,28 @@ public class SearchManager
*
* @hide
*/
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);
public Intent getAssistIntent(Context context) {
return getAssistIntent(context, UserId.myUserId());
}
/**
* Gets an intent for launching installed assistant activity, or null if not available.
* @return The assist intent.
*
* @hide
*/
public Intent getAssistIntent(Context context, int userHandle) {
try {
ComponentName comp = mService.getAssistIntent(userHandle);
if (comp == null) {
return null;
}
Intent intent = new Intent(Intent.ACTION_ASSIST);
intent.setComponent(comp);
return intent;
} catch (RemoteException re) {
Log.e(TAG, "getAssistIntent() failed: " + re);
return null;
}
return null;
}
}

View File

@@ -18,6 +18,9 @@ package android.server.search;
import com.android.internal.content.PackageMonitor;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.AppGlobals;
import android.app.ISearchManager;
import android.app.SearchManager;
import android.app.SearchableInfo;
@@ -27,14 +30,18 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.ContentObserver;
import android.os.Binder;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserId;
import android.os.UserManager;
import android.provider.Settings;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import java.util.List;
@@ -207,4 +214,48 @@ public class SearchManagerService extends ISearchManager.Stub {
return getSearchables(UserId.getCallingUserId()).getWebSearchActivity();
}
@Override
public ComponentName getAssistIntent(int userHandle) {
try {
if (userHandle != UserId.getCallingUserId()) {
// Requesting a different user, make sure that they have the permission
if (ActivityManager.checkComponentPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
Binder.getCallingUid(), -1, true)
== PackageManager.PERMISSION_GRANTED) {
// Translate to the current user id, if caller wasn't aware
if (userHandle == UserId.USER_CURRENT) {
long identity = Binder.clearCallingIdentity();
userHandle = ActivityManagerNative.getDefault().getCurrentUser().id;
Binder.restoreCallingIdentity(identity);
}
} else {
String msg = "Permission Denial: "
+ "Request to getAssistIntent for " + userHandle
+ " but is calling from user " + UserId.getCallingUserId()
+ "; this requires "
+ android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
Slog.w(TAG, msg);
return null;
}
}
IPackageManager pm = AppGlobals.getPackageManager();
Intent assistIntent = new Intent(Intent.ACTION_ASSIST);
ResolveInfo info =
pm.resolveIntent(assistIntent,
assistIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
PackageManager.MATCH_DEFAULT_ONLY, userHandle);
if (info != null) {
return new ComponentName(
info.activityInfo.applicationInfo.packageName,
info.activityInfo.name);
}
} catch (RemoteException re) {
// Local call
Log.e(TAG, "RemoteException in getAssistIntent: " + re);
} catch (Exception e) {
Log.e(TAG, "Exception in getAssistIntent: " + e);
}
return null;
}
}

View File

@@ -24,6 +24,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.os.UserId;
import android.os.Vibrator;
import android.provider.Settings;
import android.util.AttributeSet;
@@ -73,14 +74,15 @@ public class SearchPanelView extends FrameLayout implements
// Close Recent Apps if needed
mBar.animateCollapse(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL);
// Launch Assist
Intent intent = SearchManager.getAssistIntent(mContext);
Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
.getAssistIntent(mContext, UserId.USER_CURRENT);
if (intent == null) return;
try {
ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext,
R.anim.search_launch_enter, R.anim.search_launch_exit,
getHandler(), this);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent, opts.toBundle());
mContext.startActivityAsUser(intent, opts.toBundle(), UserId.USER_CURRENT);
} catch (ActivityNotFoundException e) {
Slog.w(TAG, "Activity not found for " + intent.getAction());
onAnimationStarted();
@@ -140,7 +142,8 @@ public class SearchPanelView extends FrameLayout implements
}
private void maybeSwapSearchIcon() {
Intent intent = SearchManager.getAssistIntent(mContext);
Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
.getAssistIntent(mContext, UserId.USER_CURRENT);
if (intent != null) {
ComponentName component = intent.getComponent();
if (component == null || !mGlowPadView.replaceTargetDrawablesIfPresent(component,
@@ -277,6 +280,7 @@ public class SearchPanelView extends FrameLayout implements
}
public boolean isAssistantAvailable() {
return SearchManager.getAssistIntent(mContext) != null;
return ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
.getAssistIntent(mContext, UserId.USER_CURRENT) != null;
}
}

View File

@@ -32,6 +32,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.UserId;
import android.os.Vibrator;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -275,7 +276,8 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
// Update the search icon with drawable from the search .apk
if (!mSearchDisabled) {
Intent intent = SearchManager.getAssistIntent(mContext);
Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
.getAssistIntent(mContext, UserId.USER_CURRENT);
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
@@ -309,7 +311,9 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
final int resId = mGlowPadView.getResourceIdForTarget(target);
switch (resId) {
case com.android.internal.R.drawable.ic_action_assist_generic:
Intent assistIntent = SearchManager.getAssistIntent(mContext);
Intent assistIntent =
((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
.getAssistIntent(mContext, UserId.USER_CURRENT);
if (assistIntent != null) {
launchActivity(assistIntent);
} else {
@@ -335,6 +339,10 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
}
}
/**
* Launches the said intent for the current foreground user.
* @param intent
*/
private void launchActivity(Intent intent) {
intent.setFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
@@ -346,7 +354,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
Log.w(TAG, "can't dismiss keyguard on launch");
}
try {
mContext.startActivity(intent);
mContext.startActivityAsUser(intent, UserId.USER_CURRENT);
} catch (ActivityNotFoundException e) {
Log.w(TAG, "Activity not found for intent + " + intent.getAction());
}
@@ -522,7 +530,9 @@ class LockScreen extends LinearLayout implements KeyguardScreen {
} else if (disabledBySimState) {
Log.v(TAG, "Camera disabled by Sim State");
}
boolean searchActionAvailable = SearchManager.getAssistIntent(mContext) != null;
boolean searchActionAvailable =
((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
.getAssistIntent(mContext, UserId.USER_CURRENT) != null;
mCameraDisabled = disabledByAdmin || disabledBySimState || !cameraTargetPresent;
mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent;
mUnlockWidgetMethods.updateResources();

View File

@@ -55,6 +55,7 @@ import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UEventObserver;
import android.os.UserId;
import android.os.Vibrator;
import android.provider.Settings;
@@ -2110,7 +2111,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (searchManager != null) {
searchManager.stopSearch();
}
mContext.startActivity(intent);
mContext.startActivityAsUser(intent, UserId.USER_CURRENT);
} catch (ActivityNotFoundException e) {
Slog.w(TAG, "No activity to handle assist long press action.", e);
}
@@ -2118,13 +2119,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private void launchAssistAction() {
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST);
Intent intent = SearchManager.getAssistIntent(mContext);
Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
.getAssistIntent(mContext, UserId.USER_CURRENT);
if (intent != null) {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
try {
mContext.startActivity(intent);
mContext.startActivityAsUser(intent, UserId.USER_CURRENT);
} catch (ActivityNotFoundException e) {
Slog.w(TAG, "No activity to handle assist action.", e);
}