diff options
3 files changed, 44 insertions, 42 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java index 28f111fce4eb..364e884e816e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java @@ -31,7 +31,6 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.PixelFormat; @@ -247,7 +246,7 @@ class NavigationBarApps extends LinearLayout ComponentName appComponentName = appInfo.getComponentName(); if (!appComponentName.getPackageName().equals(packageName)) continue; - if (sAppsModel.buildAppLaunchIntent(appInfo) != null) { + if (sAppsModel.resolveApp(appInfo) != null) { continue; } @@ -309,15 +308,9 @@ class NavigationBarApps extends LinearLayout } private void addAppButton(AppButtonData appButtonData) { - ImageView button = createAppButton(appButtonData); + ImageView button = createAppButton(); + updateApp(button, appButtonData); addView(button); - - AppInfo app = appButtonData.appInfo; - CharSequence appLabel = getAppLabel(mPackageManager, app.getComponentName()); - button.setContentDescription(appLabel); - - // Load the icon asynchronously. - new GetActivityIconTask(mPackageManager, button).execute(appButtonData); } private List<AppInfo> getPinnedApps() { @@ -359,7 +352,7 @@ class NavigationBarApps extends LinearLayout /** * Creates a new ImageView for an app, inflated from R.layout.navigation_bar_app_item. */ - private ImageView createAppButton(AppButtonData appButtonData) { + private ImageView createAppButton() { ImageView button = (ImageView) mLayoutInflater.inflate( R.layout.navigation_bar_app_item, this, false /* attachToRoot */); button.setOnHoverListener(new AppHoverListener()); @@ -368,7 +361,6 @@ class NavigationBarApps extends LinearLayout // TODO: Ripple effect. Use either KeyButtonRipple or the default ripple background. button.setOnLongClickListener(new AppLongClickListener()); button.setOnDragListener(new AppIconDragListener()); - button.setTag(appButtonData); return button; } @@ -387,17 +379,12 @@ class NavigationBarApps extends LinearLayout * TODO: Cache the labels, perhaps in an LruCache. */ @Nullable - static CharSequence getAppLabel(PackageManager packageManager, - ComponentName activityName) { - String packageName = activityName.getPackageName(); - ApplicationInfo info; - try { - info = packageManager.getApplicationInfo(packageName, 0x0 /* flags */); - } catch (PackageManager.NameNotFoundException e) { - Slog.w(TAG, "Package not found " + packageName); - return null; - } - return packageManager.getApplicationLabel(info); + private CharSequence getAppLabel(AppInfo appInfo) { + NavigationBarAppsModel.ResolvedApp resolvedApp = sAppsModel.resolveApp(appInfo); + if (resolvedApp == null) return null; + + CharSequence unbadgedLabel = resolvedApp.ri.loadLabel(mPackageManager); + return mUserManager.getBadgedLabelForUser(unbadgedLabel, appInfo.getUser()); } /** Helper function to start dragging an app icon (either pinned or recent). */ @@ -484,7 +471,7 @@ class NavigationBarApps extends LinearLayout * Creates a blank icon-sized View to create an empty space during a drag. */ private ImageView createPlaceholderDragView(int index) { - ImageView button = createAppButton(null); + ImageView button = createAppButton(); addView(button, index); return button; } @@ -637,7 +624,7 @@ class NavigationBarApps extends LinearLayout return null; } AppInfo appInfo = new AppInfo(componentName, appUser); - if (sAppsModel.buildAppLaunchIntent(appInfo) == null) { + if (sAppsModel.resolveApp(appInfo) == null) { return null; } return appInfo; @@ -645,6 +632,9 @@ class NavigationBarApps extends LinearLayout /** Updates the app at a given view index. */ private void updateApp(ImageView button, AppButtonData appButtonData) { + CharSequence appLabel = getAppLabel(appButtonData.appInfo); + button.setContentDescription(appLabel); + button.setTag(appButtonData); new GetActivityIconTask(mPackageManager, button).execute(appButtonData); } @@ -829,13 +819,15 @@ class NavigationBarApps extends LinearLayout */ private class AppClickListener implements View.OnClickListener { private void launchApp(AppInfo appInfo, View anchor) { - Intent launchIntent = sAppsModel.buildAppLaunchIntent(appInfo); - if (launchIntent == null) { + NavigationBarAppsModel.ResolvedApp resolvedApp = sAppsModel.resolveApp(appInfo); + if (resolvedApp == null) { Toast.makeText( getContext(), R.string.activity_not_found, Toast.LENGTH_SHORT).show(); return; } + Intent launchIntent = resolvedApp.launchIntent; + // Play a scale-up animation while launching the activity. // TODO: Consider playing a different animation, or no animation, if the activity is // already open in a visible window. In that case we should move the task to front @@ -1078,7 +1070,7 @@ class NavigationBarApps extends LinearLayout UserHandle taskUser = new UserHandle(task.userId); AppInfo appInfo = new AppInfo(componentName, taskUser); - if (sAppsModel.buildAppLaunchIntent(appInfo) == null) { + if (sAppsModel.resolveApp(appInfo) == null) { // If task's activity is not launcheable, fall back to a launch component of the // task's package. ComponentName component = getLaunchComponentForPackage( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java index badb846694c0..d527f29cc557 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java @@ -48,6 +48,11 @@ class NavigationBarAppsModel { void onPinnedAppsChanged(); } + public class ResolvedApp { + Intent launchIntent; + ResolveInfo ri; + } + private final static String TAG = "NavigationBarAppsModel"; // Default number of apps to load initially. @@ -112,8 +117,8 @@ class NavigationBarAppsModel { return AppGlobals.getPackageManager(); } - // Returns a launch intent for a given app info, or null if the app info is unlauncheable. - public Intent buildAppLaunchIntent(AppInfo appInfo) { + // Returns a resolved app info for a given app info, or null if the app info is unlauncheable. + public ResolvedApp resolveApp(AppInfo appInfo) { ComponentName component = appInfo.getComponentName(); int appUserId = appInfo.getUser().getIdentifier(); @@ -160,13 +165,17 @@ class NavigationBarAppsModel { 0 /* flags */, appUserId); final int size = apps.size(); for (int i = 0; i < size; ++i) { - ActivityInfo activityInfo = apps.get(i).activityInfo; + ResolveInfo ri = apps.get(i); + ActivityInfo activityInfo = ri.activityInfo; if (activityInfo.packageName.equals(component.getPackageName()) && activityInfo.name.equals(component.getClassName())) { // Found an activity with category launcher that matches // this component so ok to launch. launchIntent.setComponent(component); - return launchIntent; + ResolvedApp resolvedApp = new ResolvedApp(); + resolvedApp.launchIntent = launchIntent; + resolvedApp.ri = ri; + return resolvedApp; } } @@ -300,7 +309,7 @@ class NavigationBarAppsModel { return null; } AppInfo appInfo = new AppInfo(componentName, appUser); - if (buildAppLaunchIntent(appInfo) == null) { + if (resolveApp(appInfo) == null) { return null; } return appInfo; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java index 0ae0cf674644..f51e8ff8f02e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java @@ -44,7 +44,6 @@ import java.util.Arrays; import java.util.ArrayList; import java.util.List; import java.util.HashMap; -import java.util.List; import java.util.Map; /** Tests for the data model for the navigation bar app icons. */ @@ -109,8 +108,8 @@ public class NavigationBarAppsModelTest extends AndroidTestCase { }; } - /** Tests buildAppLaunchIntent(). */ - public void testBuildAppLaunchIntent() { + /** Tests resolveApp(). */ + public void testResolveApp() { ActivityInfo mockNonExportedActivityInfo = new ActivityInfo(); mockNonExportedActivityInfo.exported = false; ActivityInfo mockExportedActivityInfo = new ActivityInfo(); @@ -149,25 +148,27 @@ public class NavigationBarAppsModelTest extends AndroidTestCase { mModel.setCurrentUser(3); // Unlauncheable (for various reasons) apps. - assertEquals(null, mModel.buildAppLaunchIntent( + assertEquals(null, mModel.resolveApp( new AppInfo(new ComponentName("package0", "class0"), new UserHandle(3)))); mModel.setCurrentUser(4); - assertEquals(null, mModel.buildAppLaunchIntent( + assertEquals(null, mModel.resolveApp( new AppInfo(new ComponentName("package1", "class1"), new UserHandle(4)))); mModel.setCurrentUser(5); - assertEquals(null, mModel.buildAppLaunchIntent( + assertEquals(null, mModel.resolveApp( new AppInfo(new ComponentName("package2", "class2"), new UserHandle(5)))); mModel.setCurrentUser(6); - assertEquals(null, mModel.buildAppLaunchIntent( + assertEquals(null, mModel.resolveApp( new AppInfo(new ComponentName("package3", "class3"), new UserHandle(6)))); // A launcheable app. mModel.setCurrentUser(7); - Intent intent = mModel.buildAppLaunchIntent( + NavigationBarAppsModel.ResolvedApp resolvedApp = mModel.resolveApp( new AppInfo(new ComponentName("package4", "class4"), new UserHandle(7))); - assertNotNull(intent); + assertNotNull(resolvedApp); + Intent intent = resolvedApp.launchIntent; assertEquals(new ComponentName("package4", "class4"), intent.getComponent()); assertEquals("package4", intent.getPackage()); + assertEquals(ri1, resolvedApp.ri); } /** Initializes the model from SharedPreferences for a few app activites. */ |