UI refinements to security screen widgets interface
Bug #7158868 Change-Id: Ia5be3986323119ea78b9e486b4d2e6e81bf145e7
This commit is contained in:
@@ -17,9 +17,9 @@
|
|||||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
android:minHeight="?android:attr/listPreferredItemHeightSmall"
|
||||||
android:textAppearance="?android:attr/textAppearanceLarge"
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:drawablePadding="14dip"
|
android:drawablePadding="8dip"
|
||||||
android:paddingStart="15dip"
|
android:paddingStart="11dip"
|
||||||
android:paddingEnd="15dip" />
|
android:paddingEnd="11dip" />
|
||||||
|
@@ -807,8 +807,8 @@
|
|||||||
<!-- String to display if there is no user-selected widget on lock screen [CHAR LIMIT=22] -->
|
<!-- String to display if there is no user-selected widget on lock screen [CHAR LIMIT=22] -->
|
||||||
<string name="widget_none">None</string>
|
<string name="widget_none">None</string>
|
||||||
|
|
||||||
<!-- String to display if the default status widget is selected [CHAR LIMIT=22] -->
|
<!-- String to display if the clock status widget is selected (it is the default) [CHAR LIMIT=22] -->
|
||||||
<string name="widget_default">Default</string>
|
<string name="widget_default">Clock</string>
|
||||||
|
|
||||||
<!-- Title for PreferenceScreen to change security method: None/Pattern/PIN/Password [CHAR LIMIT=22] -->
|
<!-- Title for PreferenceScreen to change security method: None/Pattern/PIN/Password [CHAR LIMIT=22] -->
|
||||||
<string name="unlock_set_unlock_launch_picker_change_title">Change lock screen</string>
|
<string name="unlock_set_unlock_launch_picker_change_title">Change lock screen</string>
|
||||||
|
@@ -21,17 +21,20 @@ import android.appwidget.AppWidgetProviderInfo;
|
|||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
|
import android.content.res.Resources;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import java.text.Collator;
|
import java.text.Collator;
|
||||||
import java.util.List;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays a list of {@link AppWidgetProviderInfo} widgets, along with any
|
* Displays a list of {@link AppWidgetProviderInfo} widgets, along with any
|
||||||
@@ -49,6 +52,7 @@ public class AppWidgetPickActivity extends ActivityPicker {
|
|||||||
|
|
||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
private AppWidgetManager mAppWidgetManager;
|
private AppWidgetManager mAppWidgetManager;
|
||||||
|
List<PickAdapter.Item> mItems;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The allocated {@link AppWidgetManager#EXTRA_APPWIDGET_ID} that this
|
* The allocated {@link AppWidgetManager#EXTRA_APPWIDGET_ID} that this
|
||||||
@@ -143,11 +147,10 @@ public class AppWidgetPickActivity extends ActivityPicker {
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
Intent intent = getIntentForPosition(which);
|
Intent intent = getIntentForPosition(which);
|
||||||
|
PickAdapter.Item item = (PickAdapter.Item) mItems.get(which);
|
||||||
|
|
||||||
int result;
|
int result;
|
||||||
if (intent.getExtras() != null &&
|
if (item.extras != null) {
|
||||||
(intent.getExtras().containsKey(AppWidgetManager.EXTRA_CUSTOM_INFO) ||
|
|
||||||
intent.getExtras().containsKey(AppWidgetManager.EXTRA_CUSTOM_EXTRAS))) {
|
|
||||||
// If these extras are present it's because this entry is custom.
|
// If these extras are present it's because this entry is custom.
|
||||||
// Don't try to bind it, just pass it back to the app.
|
// Don't try to bind it, just pass it back to the app.
|
||||||
setResultData(RESULT_OK, intent);
|
setResultData(RESULT_OK, intent);
|
||||||
@@ -185,11 +188,47 @@ public class AppWidgetPickActivity extends ActivityPicker {
|
|||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
AppWidgetProviderInfo info = appWidgets.get(i);
|
AppWidgetProviderInfo info = appWidgets.get(i);
|
||||||
|
|
||||||
|
// We remove any widgets whose category isn't included in the filter
|
||||||
|
if (!ignoreFilters && (info.widgetCategory & categoryFilter) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We remove any widgets who don't have all the features in the features filter
|
||||||
|
if (!ignoreFilters && (info.widgetFeatures & featuresFilter) != featuresFilter) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
CharSequence label = info.label;
|
CharSequence label = info.label;
|
||||||
Drawable icon = null;
|
Drawable icon = null;
|
||||||
|
|
||||||
if (info.icon != 0) {
|
if (info.icon != 0) {
|
||||||
icon = mPackageManager.getDrawable(info.provider.getPackageName(), info.icon, null);
|
try {
|
||||||
|
final Resources res = getResources();
|
||||||
|
final int density = res.getDisplayMetrics().densityDpi;
|
||||||
|
int iconDensity;
|
||||||
|
switch (density) {
|
||||||
|
case DisplayMetrics.DENSITY_MEDIUM:
|
||||||
|
iconDensity = DisplayMetrics.DENSITY_LOW;
|
||||||
|
case DisplayMetrics.DENSITY_TV:
|
||||||
|
iconDensity = DisplayMetrics.DENSITY_MEDIUM;
|
||||||
|
case DisplayMetrics.DENSITY_HIGH:
|
||||||
|
iconDensity = DisplayMetrics.DENSITY_MEDIUM;
|
||||||
|
case DisplayMetrics.DENSITY_XHIGH:
|
||||||
|
iconDensity = DisplayMetrics.DENSITY_HIGH;
|
||||||
|
case DisplayMetrics.DENSITY_XXHIGH:
|
||||||
|
iconDensity = DisplayMetrics.DENSITY_XHIGH;
|
||||||
|
default:
|
||||||
|
// The density is some abnormal value. Return some other
|
||||||
|
// abnormal value that is a reasonable scaling of it.
|
||||||
|
iconDensity = (int)((density*0.75f)+.5f);
|
||||||
|
}
|
||||||
|
Resources packageResources = mPackageManager.
|
||||||
|
getResourcesForApplication(info.provider.getPackageName());
|
||||||
|
icon = packageResources.getDrawableForDensity(info.icon, iconDensity);
|
||||||
|
} catch (NameNotFoundException e) {
|
||||||
|
Log.w(TAG, "Can't load icon drawable 0x" + Integer.toHexString(info.icon)
|
||||||
|
+ " for provider: " + info.provider);
|
||||||
|
}
|
||||||
if (icon == null) {
|
if (icon == null) {
|
||||||
Log.w(TAG, "Can't load icon drawable 0x" + Integer.toHexString(info.icon)
|
Log.w(TAG, "Can't load icon drawable 0x" + Integer.toHexString(info.icon)
|
||||||
+ " for provider: " + info.provider);
|
+ " for provider: " + info.provider);
|
||||||
@@ -205,16 +244,6 @@ public class AppWidgetPickActivity extends ActivityPicker {
|
|||||||
item.extras = customExtras.get(i);
|
item.extras = customExtras.get(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We remove any widgets whose category isn't included in the filter
|
|
||||||
if (!ignoreFilters && (info.widgetCategory & categoryFilter) == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We remove any widgets who don't have all the features in the features filter
|
|
||||||
if (!ignoreFilters && (info.widgetFeatures & featuresFilter) != featuresFilter) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
items.add(item);
|
items.add(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -259,8 +288,9 @@ public class AppWidgetPickActivity extends ActivityPicker {
|
|||||||
if (!sortCustomAppWidgets) {
|
if (!sortCustomAppWidgets) {
|
||||||
List<PickAdapter.Item> customItems = new ArrayList<PickAdapter.Item>();
|
List<PickAdapter.Item> customItems = new ArrayList<PickAdapter.Item>();
|
||||||
putCustomAppWidgets(customItems);
|
putCustomAppWidgets(customItems);
|
||||||
items.addAll(0, customItems);
|
items.addAll(customItems);
|
||||||
}
|
}
|
||||||
|
mItems = items;
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -475,6 +475,46 @@ public class SecuritySettings extends SettingsPreferenceFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void launchPickActivityIntent(int featuresFilter, int defaultLabelId, int defaultIconId,
|
||||||
|
ComponentName defaultComponentName, String defaultTag) {
|
||||||
|
// Create intent to pick widget
|
||||||
|
Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
|
||||||
|
|
||||||
|
// Found in KeyguardHostView.java
|
||||||
|
final int KEYGUARD_HOST_ID = 0x4B455947;
|
||||||
|
int appWidgetId = AppWidgetHost.allocateAppWidgetIdForSystem(KEYGUARD_HOST_ID);
|
||||||
|
if (appWidgetId != -1) {
|
||||||
|
pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
|
||||||
|
pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false);
|
||||||
|
pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
|
||||||
|
AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
|
||||||
|
if (featuresFilter != AppWidgetProviderInfo.WIDGET_FEATURES_NONE) {
|
||||||
|
pickIntent.putExtra(AppWidgetManager.EXTRA_FEATURES_FILTER, featuresFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add an entry for "none" to let someone select no widget
|
||||||
|
AppWidgetProviderInfo defaultInfo = new AppWidgetProviderInfo();
|
||||||
|
ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>();
|
||||||
|
defaultInfo.label = getResources().getString(defaultLabelId);
|
||||||
|
defaultInfo.icon = defaultIconId;
|
||||||
|
defaultInfo.provider = defaultComponentName;
|
||||||
|
extraInfos.add(defaultInfo);
|
||||||
|
|
||||||
|
ArrayList<Bundle> extraExtras = new ArrayList<Bundle>();
|
||||||
|
Bundle b = new Bundle();
|
||||||
|
b.putBoolean(defaultTag, true);
|
||||||
|
extraExtras.add(b);
|
||||||
|
|
||||||
|
// Launch the widget picker
|
||||||
|
pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos);
|
||||||
|
pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras);
|
||||||
|
pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent());
|
||||||
|
startActivityForResult(pickIntent, REQUEST_PICK_USER_SELECTED_APPWIDGET);
|
||||||
|
} else {
|
||||||
|
Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Intent getBaseIntent() {
|
private Intent getBaseIntent() {
|
||||||
Intent baseIntent = new Intent(Intent.ACTION_MAIN, null);
|
Intent baseIntent = new Intent(Intent.ACTION_MAIN, null);
|
||||||
baseIntent.addCategory(Intent.CATEGORY_DEFAULT);
|
baseIntent.addCategory(Intent.CATEGORY_DEFAULT);
|
||||||
@@ -495,73 +535,19 @@ public class SecuritySettings extends SettingsPreferenceFragment
|
|||||||
startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
|
startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
|
||||||
SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
|
SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
|
||||||
} else if (KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET.equals(key)) {
|
} else if (KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET.equals(key)) {
|
||||||
// Create intent to pick widget
|
launchPickActivityIntent(AppWidgetProviderInfo.WIDGET_FEATURES_NONE,
|
||||||
Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
|
R.string.widget_none, 0, new ComponentName("", ""), EXTRA_NO_WIDGET);
|
||||||
|
|
||||||
// Found in KeyguardHostView.java
|
|
||||||
final int KEYGUARD_HOST_ID = 0x4B455947;
|
|
||||||
int appWidgetId = AppWidgetHost.allocateAppWidgetIdForSystem(KEYGUARD_HOST_ID);
|
|
||||||
if (appWidgetId != -1) {
|
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
|
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false);
|
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
|
|
||||||
AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
|
|
||||||
|
|
||||||
// Add an entry for "none" to let someone select no widget
|
|
||||||
AppWidgetProviderInfo noneInfo = new AppWidgetProviderInfo();
|
|
||||||
ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>();
|
|
||||||
noneInfo.label = getResources().getString(R.string.widget_none);
|
|
||||||
noneInfo.provider = new ComponentName("", "");
|
|
||||||
extraInfos.add(noneInfo);
|
|
||||||
|
|
||||||
ArrayList<Bundle> extraExtras = new ArrayList<Bundle>();
|
|
||||||
Bundle b = new Bundle();
|
|
||||||
b.putBoolean(EXTRA_NO_WIDGET, true);
|
|
||||||
extraExtras.add(b);
|
|
||||||
|
|
||||||
// Launch the widget picker
|
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos);
|
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras);
|
|
||||||
pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent());
|
|
||||||
startActivityForResult(pickIntent, REQUEST_PICK_USER_SELECTED_APPWIDGET);
|
|
||||||
} else {
|
|
||||||
Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
|
|
||||||
}
|
|
||||||
} else if (KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET.equals(key)) {
|
} else if (KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET.equals(key)) {
|
||||||
// Create intent to pick widget
|
int defaultIconId;
|
||||||
Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
|
ComponentName clock = new ComponentName(
|
||||||
|
"com.google.android.deskclock", "com.android.deskclock.DeskClock");
|
||||||
// Found in KeyguardHostView.java
|
try {
|
||||||
final int KEYGUARD_HOST_ID = 0x4B455947;
|
defaultIconId = getActivity().getPackageManager().getActivityInfo(clock, 0).icon;
|
||||||
int appWidgetId = AppWidgetHost.allocateAppWidgetIdForSystem(KEYGUARD_HOST_ID);
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
if (appWidgetId != -1) {
|
defaultIconId = 0;
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
|
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false);
|
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
|
|
||||||
AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
|
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_FEATURES_FILTER,
|
|
||||||
AppWidgetProviderInfo.WIDGET_FEATURES_STATUS);
|
|
||||||
|
|
||||||
// Add an entry for "none" to let someone select no widget
|
|
||||||
AppWidgetProviderInfo noneInfo = new AppWidgetProviderInfo();
|
|
||||||
ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>();
|
|
||||||
noneInfo.label = getResources().getString(R.string.widget_default);
|
|
||||||
noneInfo.provider = new ComponentName("", "");
|
|
||||||
extraInfos.add(noneInfo);
|
|
||||||
|
|
||||||
ArrayList<Bundle> extraExtras = new ArrayList<Bundle>();
|
|
||||||
Bundle b = new Bundle();
|
|
||||||
b.putBoolean(EXTRA_DEFAULT_WIDGET, true);
|
|
||||||
extraExtras.add(b);
|
|
||||||
|
|
||||||
// Launch the widget picker
|
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos);
|
|
||||||
pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras);
|
|
||||||
pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent());
|
|
||||||
startActivityForResult(pickIntent, REQUEST_PICK_STATUS_APPWIDGET);
|
|
||||||
} else {
|
|
||||||
Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
|
|
||||||
}
|
}
|
||||||
|
launchPickActivityIntent(AppWidgetProviderInfo.WIDGET_FEATURES_STATUS,
|
||||||
|
R.string.widget_default, defaultIconId, clock, EXTRA_DEFAULT_WIDGET);
|
||||||
} else if (KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING.equals(key)) {
|
} else if (KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING.equals(key)) {
|
||||||
ChooseLockSettingsHelper helper =
|
ChooseLockSettingsHelper helper =
|
||||||
new ChooseLockSettingsHelper(this.getActivity(), this);
|
new ChooseLockSettingsHelper(this.getActivity(), this);
|
||||||
|
Reference in New Issue
Block a user