summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Jurka <mikejurka@google.com>2012-09-07 09:24:03 -0700
committerMichael Jurka <mikejurka@google.com>2012-09-14 12:44:20 -0700
commit8227e303850d7c1162c62947b70d0592432b455e (patch)
treea3bba25ff5953a4a85d050a89a05bbf690186739
parenta92861471d41a6cfae0c7e6825d02398fdbd0b42 (diff)
downloadpackages_apps_Settings-8227e303850d7c1162c62947b70d0592432b455e.tar.gz
packages_apps_Settings-8227e303850d7c1162c62947b70d0592432b455e.tar.bz2
packages_apps_Settings-8227e303850d7c1162c62947b70d0592432b455e.zip
Add support for setting lock widgets
Change-Id: I26165f1bc60e3cf277dbdd4f627ac720b492ffde
-rw-r--r--res/values/strings.xml8
-rw-r--r--res/xml/security_settings_chooser.xml6
-rw-r--r--res/xml/security_settings_lockscreen.xml6
-rw-r--r--res/xml/security_settings_password.xml6
-rw-r--r--res/xml/security_settings_pattern.xml5
-rw-r--r--res/xml/security_settings_pin.xml6
-rw-r--r--src/com/android/settings/AppWidgetPickActivity.java41
-rw-r--r--src/com/android/settings/SecuritySettings.java117
8 files changed, 170 insertions, 25 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f1b4a5eb64..f22013e3b9 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -794,6 +794,12 @@
<!-- Title for PreferenceScreen to launch picker for security method when there is none [CHAR LIMIT=22] -->
<string name="unlock_set_unlock_launch_picker_title">Screen lock</string>
+ <!-- Title for PreferenceScreen to launch picker for a user-selected widget that will live on lock screen [CHAR LIMIT=22] -->
+ <string name="choose_user_selected_lockscreen_widget_picker_title">Widget</string>
+
+ <!-- String to display if there is no user-selected widget on lock screen [CHAR LIMIT=22] -->
+ <string name="widget_none">None</string>
+
<!-- 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>
@@ -2342,6 +2348,8 @@
<string name="lockpattern_too_many_failed_confirmation_attempts_header">Too many incorrect attempts!</string>
<!-- Security & location settings screen, change unlock pattern screen countdown hint on bottom of screen after too many incorrect attempts -->
<string name="lockpattern_too_many_failed_confirmation_attempts_footer">Try again in <xliff:g id="number">%d</xliff:g> seconds.</string>
+ <!-- Displayed when user launches a widget configuration activity that was uninstalled -->
+ <string name="activity_not_found">Application is not installed on your phone.</string>
<!-- ChooseLockPatternTutorial --> <skip />
<!-- ChooseLockPatternTutorial, button labels: This is to cancel the tutorial -->
diff --git a/res/xml/security_settings_chooser.xml b/res/xml/security_settings_chooser.xml
index 60d3a9f1ad..98422ba513 100644
--- a/res/xml/security_settings_chooser.xml
+++ b/res/xml/security_settings_chooser.xml
@@ -27,6 +27,12 @@
android:persistent="false"/>
<PreferenceScreen
+ android:key="choose_user_selected_lockscreen_widget"
+ android:title="@string/choose_user_selected_lockscreen_widget_picker_title"
+ android:summary=""
+ android:persistent="false"/>
+
+ <PreferenceScreen
android:fragment="com.android.settings.OwnerInfoSettings"
android:key="owner_info_settings"
android:title="@string/owner_info_settings_title"
diff --git a/res/xml/security_settings_lockscreen.xml b/res/xml/security_settings_lockscreen.xml
index fbdee60581..06ec934d2a 100644
--- a/res/xml/security_settings_lockscreen.xml
+++ b/res/xml/security_settings_lockscreen.xml
@@ -25,7 +25,11 @@
android:title="@string/unlock_set_unlock_launch_picker_title"
android:summary="@string/unlock_set_unlock_mode_off"
android:persistent="false"/>
-
+ <PreferenceScreen
+ android:fragment="com.android.settings.OwnerInfoSettings"
+ android:key="owner_info_settings"
+ android:title="@string/owner_info_settings_title"
+ android:summary="@string/owner_info_settings_summary"/>
</PreferenceCategory>
</PreferenceScreen>
diff --git a/res/xml/security_settings_password.xml b/res/xml/security_settings_password.xml
index 0e9c71d5a2..4fb260623b 100644
--- a/res/xml/security_settings_password.xml
+++ b/res/xml/security_settings_password.xml
@@ -26,6 +26,12 @@
android:summary="@string/unlock_set_unlock_mode_password"
android:persistent="false"/>
+ <PreferenceScreen
+ android:key="choose_user_selected_lockscreen_widget"
+ android:title="@string/choose_user_selected_lockscreen_widget_picker_title"
+ android:summary=""
+ android:persistent="false"/>
+
<ListPreference
android:key="lock_after_timeout"
android:title="@string/lock_after_timeout"
diff --git a/res/xml/security_settings_pattern.xml b/res/xml/security_settings_pattern.xml
index b91b2b6b25..ebc9c41de4 100644
--- a/res/xml/security_settings_pattern.xml
+++ b/res/xml/security_settings_pattern.xml
@@ -25,6 +25,11 @@
android:title="@string/unlock_set_unlock_launch_picker_title"
android:summary="@string/unlock_set_unlock_mode_pattern"
android:persistent="false"/>
+ <PreferenceScreen
+ android:key="choose_user_selected_lockscreen_widget"
+ android:title="@string/choose_user_selected_lockscreen_widget_picker_title"
+ android:summary=""
+ android:persistent="false"/>
<CheckBoxPreference
android:key="visiblepattern"
diff --git a/res/xml/security_settings_pin.xml b/res/xml/security_settings_pin.xml
index 4562a9a919..b90814041d 100644
--- a/res/xml/security_settings_pin.xml
+++ b/res/xml/security_settings_pin.xml
@@ -25,7 +25,11 @@
android:title="@string/unlock_set_unlock_launch_picker_title"
android:summary="@string/unlock_set_unlock_mode_pin"
android:persistent="false"/>
-
+ <PreferenceScreen
+ android:key="choose_user_selected_lockscreen_widget"
+ android:title="@string/choose_user_selected_lockscreen_widget_picker_title"
+ android:summary=""
+ android:persistent="false"/>
<ListPreference
android:key="lock_after_timeout"
android:title="@string/lock_after_timeout"
diff --git a/src/com/android/settings/AppWidgetPickActivity.java b/src/com/android/settings/AppWidgetPickActivity.java
index 019699b2ab..f573edf240 100644
--- a/src/com/android/settings/AppWidgetPickActivity.java
+++ b/src/com/android/settings/AppWidgetPickActivity.java
@@ -129,12 +129,7 @@ public class AppWidgetPickActivity extends ActivityPicker {
}
if (LOGD) Log.d(TAG, "Using " + customInfo.size() + " custom items");
- // We don't filter out any widgets.
- int categoryFilter = AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN |
- AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD;
- // We don't require any features.
- int featuresFilter = AppWidgetProviderInfo.WIDGET_FEATURES_NONE;
- putAppWidgetItems(customInfo, customExtras, items, categoryFilter, featuresFilter);
+ putAppWidgetItems(customInfo, customExtras, items, 0, 0, true);
}
/**
@@ -172,7 +167,7 @@ public class AppWidgetPickActivity extends ActivityPicker {
*/
void putAppWidgetItems(List<AppWidgetProviderInfo> appWidgets,
List<Bundle> customExtras, List<PickAdapter.Item> items, int categoryFilter,
- int featuresFilter) {
+ int featuresFilter, boolean ignoreFilters) {
if (appWidgets == null) return;
final int size = appWidgets.size();
for (int i = 0; i < size; i++) {
@@ -199,12 +194,12 @@ public class AppWidgetPickActivity extends ActivityPicker {
}
// We remove any widgets whose category isn't included in the filter
- if ((info.widgetCategory & categoryFilter) == 0) {
+ if (!ignoreFilters && (info.widgetCategory & categoryFilter) == 0) {
continue;
}
// We remove any widgets who don't have all the features in the features filter
- if ((info.widgetFeatures & featuresFilter) != featuresFilter) {
+ if (!ignoreFilters && (info.widgetFeatures & featuresFilter) != featuresFilter) {
continue;
}
@@ -219,9 +214,12 @@ public class AppWidgetPickActivity extends ActivityPicker {
*/
@Override
protected List<PickAdapter.Item> getItems() {
+ final Intent intent = getIntent();
+ boolean sortCustomAppWidgets =
+ intent.getBooleanExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, true);
+
List<PickAdapter.Item> items = new ArrayList<PickAdapter.Item>();
- final Intent intent = getIntent();
int categoryFilter = AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN;
if (intent.getExtras().containsKey(AppWidgetManager.EXTRA_CATEGORY_FILTER)) {
categoryFilter = intent.getExtras().getInt(AppWidgetManager.EXTRA_CATEGORY_FILTER);
@@ -234,16 +232,23 @@ public class AppWidgetPickActivity extends ActivityPicker {
}
putInstalledAppWidgets(items, categoryFilter, featuresFilter);
- putCustomAppWidgets(items);
-
+
// Sort all items together by label
+ if (sortCustomAppWidgets) {
+ putCustomAppWidgets(items);
+ }
Collections.sort(items, new Comparator<PickAdapter.Item>() {
- Collator mCollator = Collator.getInstance();
- public int compare(PickAdapter.Item lhs, PickAdapter.Item rhs) {
- return mCollator.compare(lhs.label, rhs.label);
- }
- });
+ Collator mCollator = Collator.getInstance();
+ public int compare(PickAdapter.Item lhs, PickAdapter.Item rhs) {
+ return mCollator.compare(lhs.label, rhs.label);
+ }
+ });
+ if (!sortCustomAppWidgets) {
+ List<PickAdapter.Item> customItems = new ArrayList<PickAdapter.Item>();
+ putCustomAppWidgets(customItems);
+ items.addAll(0, customItems);
+ }
return items;
}
@@ -252,7 +257,7 @@ public class AppWidgetPickActivity extends ActivityPicker {
*/
void putInstalledAppWidgets(List<PickAdapter.Item> items, int categoryFilter, int featuresFilter) {
List<AppWidgetProviderInfo> installed = mAppWidgetManager.getInstalledProviders();
- putAppWidgetItems(installed, null, items, categoryFilter, featuresFilter);
+ putAppWidgetItems(installed, null, items, categoryFilter, featuresFilter, false);
}
/**
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index e309c37a52..e9e3a193e4 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -21,13 +21,18 @@ import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
import android.app.Activity;
import android.app.AlertDialog;
+import android.app.KeyguardManager;
import android.app.admin.DevicePolicyManager;
+import android.appwidget.AppWidgetHost;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.Vibrator;
@@ -41,8 +46,8 @@ import android.provider.Settings;
import android.security.KeyStore;
import android.telephony.TelephonyManager;
import android.util.Log;
+import android.widget.Toast;
-import com.android.internal.telephony.Phone;
import com.android.internal.widget.LockPatternUtils;
import java.util.ArrayList;
@@ -53,9 +58,12 @@ import java.util.List;
*/
public class SecuritySettings extends SettingsPreferenceFragment
implements OnPreferenceChangeListener, DialogInterface.OnClickListener {
+ static final String TAG = "SecuritySettings";
// Lock Settings
private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";
+ private static final String KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET =
+ "choose_user_selected_lockscreen_widget";
private static final String KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING =
"biometric_weak_improve_matching";
private static final String KEY_BIOMETRIC_WEAK_LIVELINESS = "biometric_weak_liveliness";
@@ -64,9 +72,12 @@ public class SecuritySettings extends SettingsPreferenceFragment
private static final String KEY_TACTILE_FEEDBACK_ENABLED = "unlock_tactile_feedback";
private static final String KEY_SECURITY_CATEGORY = "security_category";
private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout";
+ private static final String EXTRA_NO_WIDGET = "com.android.settings.NO_WIDGET";
private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST = 124;
private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF = 125;
+ private static final int REQUEST_PICK_APPWIDGET = 126;
+ private static final int REQUEST_CREATE_APPWIDGET = 127;
// Misc Settings
private static final String KEY_SIM_LOCK = "sim_lock";
@@ -80,6 +91,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
DevicePolicyManager mDPM;
private ChooseLockSettingsHelper mChooseLockSettingsHelper;
+ private Preference mUserSelectedWidget;
private LockPatternUtils mLockPatternUtils;
private ListPreference mLockAfter;
@@ -241,6 +253,23 @@ public class SecuritySettings extends SettingsPreferenceFragment
mToggleVerifyApps.setEnabled(false);
}
+ mUserSelectedWidget = root.findPreference(KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET);
+ AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity());
+ int appWidgetId = -1;
+ String appWidgetIdString = Settings.Secure.getString(
+ getContentResolver(), Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID);
+ if (appWidgetIdString != null) {;
+ appWidgetId = (int) Integer.decode(appWidgetIdString);
+ }
+ if (appWidgetId == -1) {
+ mUserSelectedWidget.setSummary(getResources().getString(R.string.widget_none));
+ } else {
+ AppWidgetProviderInfo appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);
+ if (appWidget != null) {
+ mUserSelectedWidget.setSummary(appWidget.label);
+ }
+ }
+
return root;
}
@@ -393,6 +422,17 @@ public class SecuritySettings extends SettingsPreferenceFragment
}
}
+ void startActivityForResultSafely(Intent intent, int requestCode) {
+ try {
+ startActivityForResult(intent, requestCode);
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(getActivity(), R.string.activity_not_found, Toast.LENGTH_SHORT).show();
+ } catch (SecurityException e) {
+ Toast.makeText(getActivity(), R.string.activity_not_found, Toast.LENGTH_SHORT).show();
+ Log.e(TAG, "Settings does not have the permission to launch " + intent, e);
+ }
+ }
+
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
final String key = preference.getKey();
@@ -401,6 +441,38 @@ public class SecuritySettings extends SettingsPreferenceFragment
if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) {
startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
+ } else if (KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET.equals(key)) {
+ // 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.allocateAppWidgetIdForHost(
+ "com.android.internal.policy.impl.keyguard", 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);
+ startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
+ } else {
+ Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
+ }
} else if (KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING.equals(key)) {
ChooseLockSettingsHelper helper =
new ChooseLockSettingsHelper(this.getActivity(), this);
@@ -479,10 +551,45 @@ public class SecuritySettings extends SettingsPreferenceFragment
resultCode == Activity.RESULT_OK) {
final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
lockPatternUtils.setBiometricWeakLivelinessEnabled(false);
- // Setting the mBiometricWeakLiveliness checked value to false is handled when onResume
- // is called by grabbing the value from lockPatternUtils. We can't set it here
- // because mBiometricWeakLiveliness could be null
+ // Setting the mBiometricWeakLiveliness checked value to false is handled when onResume
+ // is called by grabbing the value from lockPatternUtils. We can't set it here
+ // because mBiometricWeakLiveliness could be null
return;
+ } else if (requestCode == REQUEST_PICK_APPWIDGET ||
+ requestCode == REQUEST_CREATE_APPWIDGET) {
+ int appWidgetId = (data == null) ? -1 : data.getIntExtra(
+ AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
+ if (requestCode == REQUEST_PICK_APPWIDGET && resultCode == Activity.RESULT_OK) {
+ AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity());
+ boolean noWidget = data.getBooleanExtra(EXTRA_NO_WIDGET, false);
+
+ AppWidgetProviderInfo appWidget = null;
+ if (!noWidget) {
+ appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);
+ }
+
+ if (!noWidget && appWidget.configure != null) {
+ // Launch over to configure widget, if needed
+ Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
+ intent.setComponent(appWidget.configure);
+ intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
+
+ startActivityForResultSafely(intent, REQUEST_CREATE_APPWIDGET);
+ } else {
+ // Otherwise just add it
+ if (noWidget) {
+ data.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
+ }
+ onActivityResult(REQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data);
+ }
+ } else if (requestCode == REQUEST_CREATE_APPWIDGET && resultCode == Activity.RESULT_OK) {
+ Settings.Secure.putString(getContentResolver(),
+ Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID,
+ Integer.toString(appWidgetId));
+
+ } else {
+ AppWidgetHost.deleteAppWidgetIdForHost(appWidgetId);
+ }
}
createPreferenceHierarchy();
}