diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/settings/CreateShortcut.java | 53 | ||||
-rw-r--r-- | src/com/android/settings/Settings.java | 1 | ||||
-rw-r--r-- | src/com/android/settings/SettingsActivity.java | 24 |
3 files changed, 67 insertions, 11 deletions
diff --git a/src/com/android/settings/CreateShortcut.java b/src/com/android/settings/CreateShortcut.java index fa2ce7c..637bc6f 100644 --- a/src/com/android/settings/CreateShortcut.java +++ b/src/com/android/settings/CreateShortcut.java @@ -17,18 +17,33 @@ package com.android.settings; import android.app.LauncherActivity; +import android.content.Context; import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.Canvas; +import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; import android.view.View; +import android.view.View.MeasureSpec; +import android.widget.ImageView; import android.widget.ListView; import com.android.settings.Settings.TetherSettingsActivity; +import com.android.settings.dashboard.DashboardCategory; +import com.android.settings.dashboard.DashboardTile; import com.android.settingslib.TetherUtil; +import java.util.ArrayList; import java.util.List; public class CreateShortcut extends LauncherActivity { + private static final String TOP_LEVEL_HEADER = "com.android.settings.TOP_LEVEL_HEADER_ID"; + @Override protected Intent getTargetIntent() { Intent targetIntent = new Intent(Intent.ACTION_MAIN, null); @@ -46,10 +61,45 @@ public class CreateShortcut extends LauncherActivity { Intent.ShortcutIconResource.fromContext(this, R.mipmap.ic_launcher_settings)); intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, itemForPosition(position).label); + ResolveInfo resolveInfo = itemForPosition(position).resolveInfo; + ActivityInfo activityInfo = resolveInfo.activityInfo; + if (activityInfo.metaData != null && activityInfo.metaData.containsKey(TOP_LEVEL_HEADER)) { + int topLevelId = activityInfo.metaData.getInt(TOP_LEVEL_HEADER); + int resourceId = getDrawableResource(topLevelId); + intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, createIcon(resourceId)); + } setResult(RESULT_OK, intent); finish(); } + private Bitmap createIcon(int resource) { + Context context = new ContextThemeWrapper(this, android.R.style.Theme_Material_Light); + View view = LayoutInflater.from(context).inflate(R.layout.shortcut_badge, null); + ((ImageView) view.findViewById(android.R.id.icon)).setImageResource(resource); + + int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + view.measure(spec, spec); + Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), + Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); + view.draw(canvas); + return bitmap; + } + + private int getDrawableResource(int topLevelId) { + ArrayList<DashboardCategory> categories = new ArrayList<>(); + SettingsActivity.loadCategoriesFromResource(R.xml.dashboard_categories, categories, this); + for (DashboardCategory category : categories) { + for (DashboardTile tile : category.tiles) { + if (tile.id == topLevelId) { + return tile.iconRes; + } + } + } + return 0; + } + @Override protected boolean onEvaluateShowIcons() { return false; @@ -60,7 +110,8 @@ public class CreateShortcut extends LauncherActivity { * implementation queries for activities. */ protected List<ResolveInfo> onQueryPackageManager(Intent queryIntent) { - List<ResolveInfo> activities = super.onQueryPackageManager(queryIntent); + List<ResolveInfo> activities = getPackageManager().queryIntentActivities(queryIntent, + PackageManager.GET_META_DATA); if (activities == null) return null; for (int i = activities.size() - 1; i >= 0; i--) { ResolveInfo info = activities.get(i); diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 5fb94f0..ea4f77a 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -113,5 +113,6 @@ public class Settings extends SettingsActivity { public static class TopLevelSettings extends SettingsActivity { /* empty */ } public static class ApnSettingsActivity extends SettingsActivity { /* empty */ } public static class WifiCallingSettingsActivity extends SettingsActivity { /* empty */ } + public static class MemorySettingsActivity extends SettingsActivity { /* empty */ } } diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 89231df..f376644 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -1039,7 +1039,7 @@ public class SettingsActivity extends Activity */ private void buildDashboardCategories(List<DashboardCategory> categories) { categories.clear(); - loadCategoriesFromResource(R.xml.dashboard_categories, categories); + loadCategoriesFromResource(R.xml.dashboard_categories, categories, this); updateTilesList(categories); } @@ -1050,10 +1050,11 @@ public class SettingsActivity extends Activity * @param resid The XML resource to load and parse. * @param target The list in which the parsed categories and tiles should be placed. */ - private void loadCategoriesFromResource(int resid, List<DashboardCategory> target) { + public static void loadCategoriesFromResource(int resid, List<DashboardCategory> target, + Context context) { XmlResourceParser parser = null; try { - parser = getResources().getXml(resid); + parser = context.getResources().getXml(resid); AttributeSet attrs = Xml.asAttributeSet(parser); int type; @@ -1082,7 +1083,7 @@ public class SettingsActivity extends Activity if ("dashboard-category".equals(nodeName)) { DashboardCategory category = new DashboardCategory(); - TypedArray sa = obtainStyledAttributes( + TypedArray sa = context.obtainStyledAttributes( attrs, com.android.internal.R.styleable.PreferenceHeader); category.id = sa.getResourceId( com.android.internal.R.styleable.PreferenceHeader_id, @@ -1098,12 +1099,13 @@ public class SettingsActivity extends Activity } } sa.recycle(); - sa = obtainStyledAttributes(attrs, com.android.internal.R.styleable.Preference); + sa = context.obtainStyledAttributes(attrs, + com.android.internal.R.styleable.Preference); tv = sa.peekValue( com.android.internal.R.styleable.Preference_key); if (tv != null && tv.type == TypedValue.TYPE_STRING) { if (tv.resourceId != 0) { - category.key = getString(tv.resourceId); + category.key = context.getString(tv.resourceId); } else { category.key = tv.string.toString(); } @@ -1121,7 +1123,7 @@ public class SettingsActivity extends Activity if (innerNodeName.equals("dashboard-tile")) { DashboardTile tile = new DashboardTile(); - sa = obtainStyledAttributes( + sa = context.obtainStyledAttributes( attrs, com.android.internal.R.styleable.PreferenceHeader); tile.id = sa.getResourceId( com.android.internal.R.styleable.PreferenceHeader_id, @@ -1163,11 +1165,13 @@ public class SettingsActivity extends Activity String innerNodeName2 = parser.getName(); if (innerNodeName2.equals("extra")) { - getResources().parseBundleExtra("extra", attrs, curBundle); + context.getResources().parseBundleExtra("extra", attrs, + curBundle); XmlUtils.skipCurrentTag(parser); } else if (innerNodeName2.equals("intent")) { - tile.intent = Intent.parseIntent(getResources(), parser, attrs); + tile.intent = Intent.parseIntent(context.getResources(), parser, + attrs); } else { XmlUtils.skipCurrentTag(parser); @@ -1180,7 +1184,7 @@ public class SettingsActivity extends Activity } // Show the SIM Cards setting if there are more than 2 SIMs installed. - if(tile.id != R.id.sim_settings || Utils.showSimCardTile(this)){ + if(tile.id != R.id.sim_settings || Utils.showSimCardTile(context)){ category.addTile(tile); } |