diff options
author | Daniel Sandler <dsandler@android.com> | 2010-04-28 13:46:30 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-04-28 13:46:30 -0700 |
commit | 848de496ac5676bfb7523274cd84dae5a38fcc76 (patch) | |
tree | 19ea8b3c5e2aa9bcdc92e6541efaa1f21ff5e6af /src/com/android/launcher2 | |
parent | b1b4953a7dea2dc718959ae417a9c930f05a822f (diff) | |
parent | 0554b74917e847088e031aa1a9a34463fc3d1ebf (diff) | |
download | android_packages_apps_Trebuchet-848de496ac5676bfb7523274cd84dae5a38fcc76.tar.gz android_packages_apps_Trebuchet-848de496ac5676bfb7523274cd84dae5a38fcc76.tar.bz2 android_packages_apps_Trebuchet-848de496ac5676bfb7523274cd84dae5a38fcc76.zip |
am 0554b749: Merge "Hotseats: better strategy for finding the default browser." into froyo
Diffstat (limited to 'src/com/android/launcher2')
-rw-r--r-- | src/com/android/launcher2/Launcher.java | 170 |
1 files changed, 142 insertions, 28 deletions
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 5a2a7d37e..132f0e907 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -35,8 +35,10 @@ import android.content.Intent.ShortcutIconResource; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.content.res.Resources; +import android.content.res.TypedArray; import android.database.ContentObserver; import android.graphics.Bitmap; import android.graphics.Rect; @@ -74,6 +76,7 @@ import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import java.util.ArrayList; +import java.util.List; import java.util.HashMap; import java.io.DataOutputStream; import java.io.FileNotFoundException; @@ -203,13 +206,10 @@ public final class Launcher extends Activity // Hotseats (quick-launch icons next to AllApps) // TODO: move these intial intents out to Uris in an XML resource private static final int NUM_HOTSEATS = 2; - private Intent[] mHotseats = new Intent[] { - new Intent(Intent.ACTION_MAIN) - .setComponent(ComponentName.unflattenFromString( - "com.android.contacts/.ContactsLaunchActivity")), - new Intent(Intent.ACTION_WEB_SEARCH, Uri.EMPTY), - }; - private CharSequence[] mHotseatLabels = new CharSequence[2]; + private String[] mHotseatConfig = null; + private Intent[] mHotseats = null; + private Drawable[] mHotseatIcons = null; + private CharSequence[] mHotseatLabels = null; @Override protected void onCreate(Bundle savedInstanceState) { @@ -368,37 +368,144 @@ public final class Launcher extends Activity wpm.suggestDesiredDimensions(width * WALLPAPER_SCREENS_SPAN, height); } + // Note: This doesn't do all the client-id magic that BrowserProvider does + // in Browser. (http://b/2425179) + private Uri getDefaultBrowserUri() { + String url = getString(R.string.default_browser_url); + if (url.indexOf("{CID}") != -1) { + url = url.replace("{CID}", "android-google"); + } + return Uri.parse(url); + } + + // Load the Intent templates from arrays.xml to populate the hotseats. For + // each Intent, if it resolves to a single app, use that as the launch + // intent & use that app's label as the contentDescription. Otherwise, + // retain the ResolveActivity so the user can pick an app. private void loadHotseats() { + if (mHotseatConfig == null) { + mHotseatConfig = getResources().getStringArray(R.array.hotseats); + if (mHotseatConfig.length > 0) { + mHotseats = new Intent[mHotseatConfig.length]; + mHotseatLabels = new CharSequence[mHotseatConfig.length]; + mHotseatIcons = new Drawable[mHotseatConfig.length]; + } else { + mHotseats = null; + mHotseatIcons = null; + mHotseatLabels = null; + } + + TypedArray hotseatIconDrawables = getResources().obtainTypedArray(R.array.hotseat_icons); + for (int i=0; i<mHotseatConfig.length; i++) { + // load icon for this slot; currently unrelated to the actual activity + try { + mHotseatIcons[i] = hotseatIconDrawables.getDrawable(i); + } catch (ArrayIndexOutOfBoundsException ex) { + Log.w(TAG, "Missing hotseat_icons array item #" + i); + mHotseatIcons[i] = null; + } + } + hotseatIconDrawables.recycle(); + } + PackageManager pm = getPackageManager(); - for (int i=0; i<mHotseats.length; i++) { - Intent intent = mHotseats[i]; + for (int i=0; i<mHotseatConfig.length; i++) { + Intent intent = null; + if (mHotseatConfig[i].equals("*BROWSER*")) { + // magic value meaning "launch user's default web browser" + // replace it with a generic web request so we can see if there is indeed a default + String defaultUri = getString(R.string.default_browser_url); + intent = new Intent( + Intent.ACTION_VIEW, + ((defaultUri != null) + ? Uri.parse(defaultUri) + : getDefaultBrowserUri()) + ).addCategory(Intent.CATEGORY_BROWSABLE); + // note: if the user launches this without a default set, she + // will always be taken to the default URL above; this is + // unavoidable as we must specify a valid URL in order for the + // chooser to appear, and once the user selects something, that + // URL is unavoidably sent to the chosen app. + } else { + try { + intent = Intent.parseUri(mHotseatConfig[i], 0); + } catch (java.net.URISyntaxException ex) { + Log.w(TAG, "Invalid hotseat intent: " + mHotseatConfig[i]); + // bogus; leave intent=null + } + } + + if (intent == null) { + mHotseats[i] = null; + mHotseatLabels[i] = getText(R.string.activity_not_found); + continue; + } if (LOGD) { Log.d(TAG, "loadHotseats: hotseat " + i - + " initial intent=[" + intent.toUri(Intent.URI_INTENT_SCHEME) + + " initial intent=[" + + intent.toUri(Intent.URI_INTENT_SCHEME) + "]"); } - // fix up the default intents - if (intent.getAction().equals(Intent.ACTION_WEB_SEARCH) - && intent.getData().equals(Uri.EMPTY)) { - // use this to represent "default web browser" - intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/")); + ResolveInfo bestMatch = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); + List<ResolveInfo> allMatches = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + if (LOGD) { + Log.d(TAG, "Best match for intent: " + bestMatch); + Log.d(TAG, "All matches: "); + for (ResolveInfo ri : allMatches) { + Log.d(TAG, " --> " + ri); + } } - ComponentName com = intent.resolveActivity(pm); - mHotseats[i] = new Intent(Intent.ACTION_MAIN).setComponent(com); - - // load the labels for accessibility - try { - ActivityInfo ai = pm.getActivityInfo(com, 0); - mHotseatLabels[i] = ai.loadLabel(pm); - } catch (PackageManager.NameNotFoundException ex) { - mHotseatLabels[i] = ""; + // did this resolve to a single app, or the resolver? + if (allMatches.size() == 0 || bestMatch == null) { + // can't find any activity to handle this. let's leave the + // intent as-is and let Launcher show a toast when it fails + // to launch. + mHotseats[i] = intent; + + // set accessibility text to "Not installed" + mHotseatLabels[i] = getText(R.string.activity_not_found); + } else { + boolean found = false; + for (ResolveInfo ri : allMatches) { + if (bestMatch.activityInfo.name.equals(ri.activityInfo.name) + && bestMatch.activityInfo.applicationInfo.packageName + .equals(ri.activityInfo.applicationInfo.packageName)) { + found = true; + break; + } + } + + if (!found) { + if (LOGD) Log.d(TAG, "Multiple options, no default yet"); + // the bestMatch is probably the ResolveActivity, meaning the + // user has not yet selected a default + // so: we'll keep the original intent for now + mHotseats[i] = intent; + + // set the accessibility text to "Select shortcut" + mHotseatLabels[i] = getText(R.string.title_select_shortcut); + } else { + // we have an app! + // now reconstruct the intent to launch it through the front + // door + ComponentName com = new ComponentName( + bestMatch.activityInfo.applicationInfo.packageName, + bestMatch.activityInfo.name); + mHotseats[i] = new Intent(Intent.ACTION_MAIN).setComponent(com); + + // load the app label for accessibility + mHotseatLabels[i] = bestMatch.activityInfo.loadLabel(pm); + } } if (LOGD) { Log.d(TAG, "loadHotseats: hotseat " + i - + " intent=[" + mHotseats[i].toUri(Intent.URI_INTENT_SCHEME) + + " final intent=[" + + ((mHotseats[i] == null) + ? "null" + : mHotseats[i].toUri(Intent.URI_INTENT_SCHEME)) + "] label=[" + mHotseatLabels[i] + "]" ); @@ -622,8 +729,12 @@ public final class Launcher extends Activity mHandleView.setOnClickListener(this); mHandleView.setOnLongClickListener(this); - findViewById(R.id.hotseat_left).setContentDescription(mHotseatLabels[0]); - findViewById(R.id.hotseat_right).setContentDescription(mHotseatLabels[1]); + ImageView hotseatLeft = (ImageView) findViewById(R.id.hotseat_left); + hotseatLeft.setContentDescription(mHotseatLabels[0]); + hotseatLeft.setImageDrawable(mHotseatIcons[0]); + ImageView hotseatRight = (ImageView) findViewById(R.id.hotseat_right); + hotseatRight.setContentDescription(mHotseatLabels[1]); + hotseatRight.setImageDrawable(mHotseatIcons[1]); mPreviousView = (ImageView) dragLayer.findViewById(R.id.previous_screen); mNextView = (ImageView) dragLayer.findViewById(R.id.next_screen); @@ -678,7 +789,10 @@ public final class Launcher extends Activity index = 1; } - if (index >= 0 && mHotseats[index] != null) { + // reload these every tap; you never know when they might change + loadHotseats(); + if (index >= 0 && index < mHotseats.length && mHotseats[index] != null) { + Intent intent = mHotseats[index]; startActivitySafely( mHotseats[index], "hotseat" |