Merge "User restrictions for creds storage & user removal" into jb-mr2-dev
diff --git a/Android.mk b/Android.mk
index 22c7143..c8b81dc 100644
--- a/Android.mk
+++ b/Android.mk
@@ -13,6 +13,8 @@
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+LOCAL_AAPT_FLAGS += -c zz_ZZ
+
include $(BUILD_PACKAGE)
# Use the folloing include to make our test apk.
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e9218e1..8a779c9 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -87,16 +87,6 @@
</intent-filter>
</activity>
- <!-- User Restrictions activity -->
-
- <activity android:name=".users.UserRestrictionsActivity"
- android:label="@string/user_restrictions_title">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
<activity android:name=".SubSettings"
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
diff --git a/src/com/android/settings/LocalePicker.java b/src/com/android/settings/LocalePicker.java
index 8ea99a1..6600703 100644
--- a/src/com/android/settings/LocalePicker.java
+++ b/src/com/android/settings/LocalePicker.java
@@ -23,8 +23,10 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
+import android.content.Context;
import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
+import com.android.settings.DevelopmentSettings;
import java.util.Locale;
@@ -46,6 +48,15 @@
}
@Override
+ protected boolean isInDeveloperMode() {
+ final boolean showDev = getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE,
+ Context.MODE_PRIVATE).getBoolean(
+ DevelopmentSettings.PREF_SHOW,
+ android.os.Build.TYPE.equals("eng"));
+ return showDev;
+ }
+
+ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_TARGET_LOCALE)) {
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index c2ff0d9..2a5adb1 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -238,7 +238,16 @@
// and want to pretend that the language is valid for all locales.
// We need a way to support languages that aren't tied to a particular
// locale instead of hiding the locale qualifier.
- if (hasOnlyOneLanguageInstance(language,
+ if (language.equals("zz")) {
+ String country = conf.locale.getCountry();
+ if (country.equals("ZZ")) {
+ localeString = "[Developer] Accented English (zz_ZZ)";
+ } else if (country.equals("ZY")) {
+ localeString = "[Developer] Fake Bi-Directional (zz_ZY)";
+ } else {
+ localeString = "";
+ }
+ } else if (hasOnlyOneLanguageInstance(language,
Resources.getSystem().getAssets().getLocales())) {
localeString = conf.locale.getDisplayLanguage(conf.locale);
} else {
diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java
index 9c5d47a..5e2868e 100644
--- a/src/com/android/settings/users/AppRestrictionsFragment.java
+++ b/src/com/android/settings/users/AppRestrictionsFragment.java
@@ -16,6 +16,7 @@
package com.android.settings.users;
+import android.app.Activity;
import android.app.AppGlobals;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
@@ -37,6 +38,7 @@
import android.os.Bundle;
import android.os.Parcelable;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.preference.CheckBoxPreference;
@@ -71,6 +73,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
@@ -95,9 +98,17 @@
private static final int MAX_APP_RESTRICTIONS = 100;
private static final String DELIMITER = ";";
+
+ /** Key for extra passed in from calling fragment for the userId of the user being edited */
+ public static final String EXTRA_USER_ID = "user_id";
+
+ /** Key for extra passed in from calling fragment to indicate if this is a newly created user */
+ public static final String EXTRA_NEW_USER = "new_user";
+
HashMap<String,Boolean> mSelectedPackages = new HashMap<String,Boolean>();
private boolean mFirstTime = true;
private boolean mNewUser;
+ private boolean mAppListChanged;
private int mCustomRequestCode;
private HashMap<Integer, AppRestrictionsPreference> mCustomRequestMap =
@@ -117,16 +128,6 @@
}
}
- public static class Activity extends PreferenceActivity {
- @Override
- public Intent getIntent() {
- Intent modIntent = new Intent(super.getIntent());
- modIntent.putExtra(EXTRA_SHOW_FRAGMENT, AppRestrictionsFragment.class.getName());
- modIntent.putExtra(EXTRA_NO_HEADERS, true);
- return modIntent;
- }
- }
-
static class AppRestrictionsPreference extends SwitchPreference {
private boolean hasSettings;
private OnClickListener listener;
@@ -206,6 +207,17 @@
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ if (icicle != null) {
+ mNewUser = icicle.getBoolean(EXTRA_NEW_USER, false);
+ mUser = new UserHandle(icicle.getInt(EXTRA_USER_ID));
+ } else {
+ Bundle args = getArguments();
+
+ if (args.containsKey(EXTRA_USER_ID)) {
+ mUser = new UserHandle(args.getInt(EXTRA_USER_ID));
+ }
+ mNewUser = args.getBoolean(EXTRA_NEW_USER, false);
+ }
mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
addPreferencesFromResource(R.xml.app_restrictions);
mAppList = getPreferenceScreen();
@@ -218,13 +230,16 @@
setHasOptionsMenu(true);
}
- void setUser(UserHandle user, boolean newUser) {
- mUser = user;
- mNewUser = newUser;
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(EXTRA_NEW_USER, mNewUser);
+ outState.putInt(EXTRA_USER_ID, mUser.getIdentifier());
}
public void onResume() {
super.onResume();
+ mAppListChanged = false;
if (mFirstTime) {
mFirstTime = false;
populateApps();
@@ -238,6 +253,34 @@
mUserPreference.setText(info.name);
}
+ public void onPause() {
+ super.onPause();
+ if (mAppListChanged) {
+ updateUserAppList();
+ }
+ }
+
+ private void updateUserAppList() {
+ IPackageManager ipm = IPackageManager.Stub.asInterface(
+ ServiceManager.getService("package"));
+ for (Map.Entry<String,Boolean> entry : mSelectedPackages.entrySet()) {
+ if (entry.getValue()) {
+ // Enable selected apps
+ try {
+ ipm.installExistingPackageAsUser(entry.getKey(), mUser.getIdentifier());
+ } catch (RemoteException re) {
+ }
+ } else {
+ // Blacklist all other apps, system or downloaded
+ try {
+ ipm.deletePackageAsUser(entry.getKey(), null, mUser.getIdentifier(),
+ PackageManager.DELETE_SYSTEM_APP);
+ } catch (RemoteException re) {
+ }
+ }
+ }
+ }
+
private void addSystemApps(List<SelectableAppInfo> visibleApps, Intent intent) {
final PackageManager pm = getActivity().getPackageManager();
List<ResolveInfo> launchableApps = pm.queryIntentActivities(intent, 0);
@@ -341,6 +384,7 @@
for (SelectableAppInfo app : visibleApps) {
String packageName = app.packageName;
if (packageName == null) continue;
+ final boolean isSettingsApp = packageName.equals(getActivity().getPackageName());
AppRestrictionsPreference p = new AppRestrictionsPreference(context, this);
final boolean hasSettings = resolveInfoListHasPackage(receivers, packageName);
p.setIcon(app.icon);
@@ -350,8 +394,7 @@
app.masterEntry.activityName));
}
p.setKey(PKG_PREFIX + packageName);
- p.setSettingsEnabled(hasSettings
- || packageName.equals(getActivity().getPackageName()));
+ p.setSettingsEnabled(hasSettings || isSettingsApp);
p.setPersistent(false);
p.setOnPreferenceChangeListener(this);
p.setOnPreferenceClickListener(this);
@@ -368,7 +411,7 @@
p.setChecked(true);
p.setImmutable(true);
// If the app is required and has no restrictions, skip showing it
- if (!hasSettings) continue;
+ if (!hasSettings && !isSettingsApp) continue;
} else if (!mNewUser && appInfoListHasPackage(userApps, packageName)) {
p.setChecked(true);
}
@@ -377,12 +420,13 @@
p.setChecked(mSelectedPackages.get(packageName));
}
mAppList.addPreference(p);
- if (packageName.equals(getActivity().getPackageName())) {
+ if (isSettingsApp) {
p.setOrder(MAX_APP_RESTRICTIONS * 1);
} else {
p.setOrder(MAX_APP_RESTRICTIONS * (i + 2));
}
mSelectedPackages.put(packageName, p.isChecked());
+ mAppListChanged = true;
i++;
}
}
@@ -437,6 +481,7 @@
pref.setChecked(!pref.isChecked());
mSelectedPackages.put(pref.getKey().substring(PKG_PREFIX.length()),
pref.isChecked());
+ mAppListChanged = true;
updateAllEntries(pref.getKey(), pref.isChecked());
}
}
@@ -689,6 +734,7 @@
arp.setChecked(!arp.isChecked());
mSelectedPackages.put(arp.getKey().substring(PKG_PREFIX.length()), arp.isChecked());
updateAllEntries(arp.getKey(), arp.isChecked());
+ mAppListChanged = true;
}
return true;
}
diff --git a/src/com/android/settings/users/UserRestrictionsActivity.java b/src/com/android/settings/users/UserRestrictionsActivity.java
deleted file mode 100644
index 1a90a81..0000000
--- a/src/com/android/settings/users/UserRestrictionsActivity.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.users;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.app.Activity;
-import android.content.Context;
-import android.content.pm.IPackageManager;
-import android.content.pm.PackageManager;
-import android.content.pm.UserInfo;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-
-import com.android.settings.R;
-
-import java.util.Map;
-
-public class UserRestrictionsActivity extends Activity implements OnClickListener {
-
- private static final String TAG = UserRestrictionsActivity.class.getSimpleName();
-
- static final String EXTRA_USER_NAME = "user_name";
- static final String EXTRA_USER_ID = "user_id";
- static final String EXTRA_ACCOUNTS = "accounts";
-
- private Button mFinishButton;
- private Button mBackButton;
- private AppRestrictionsFragment mAppsFragment;
- private UserInfo mUserInfo;
- private boolean mNewUser;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.user_limits);
-
- mBackButton = (Button) findViewById(R.id.back_button);
- if (mBackButton != null) {
- mBackButton.setOnClickListener(this);
- }
- mFinishButton = (Button) findViewById(R.id.next_button);
- if (mFinishButton != null) {
- mFinishButton.setOnClickListener(this);
- }
- mAppsFragment = (AppRestrictionsFragment)
- getFragmentManager().findFragmentById(R.id.user_limits_fragment);
-
- UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
- String name = getIntent().getStringExtra(EXTRA_USER_NAME);
- int userId = getIntent().getIntExtra(EXTRA_USER_ID, -1);
- // Create the user so we have an id
- if (userId == -1) {
- mNewUser = true;
- mUserInfo = um.createUser(name, UserInfo.FLAG_RESTRICTED);
- um.setUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, true,
- new UserHandle(mUserInfo.id));
-
- Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
- UserSettings.USER_DRAWABLES[
- mUserInfo.id % UserSettings.USER_DRAWABLES.length]);
- um.setUserIcon(mUserInfo.id, bitmap);
- } else {
- mUserInfo = um.getUserInfo(userId);
- }
- if (mAppsFragment != null) {
- mAppsFragment.setUser(new UserHandle(mUserInfo.id), mNewUser);
- }
- }
-
- @Override
- public void onClick(View v) {
- if (v == mFinishButton) {
- if (mNewUser) {
- AccountManager am = AccountManager.get(this);
- Account [] accounts = am.getAccounts();
- if (accounts != null) {
- for (Account account : accounts) {
- am.addSharedAccount(account,
- new UserHandle(mUserInfo.id));
- }
- }
- }
-
- IPackageManager ipm = IPackageManager.Stub.asInterface(
- ServiceManager.getService("package"));
- for (Map.Entry<String,Boolean> entry : mAppsFragment.mSelectedPackages.entrySet()) {
- if (entry.getValue()) {
- // Enable selected apps
- try {
- ipm.installExistingPackageAsUser(entry.getKey(), mUserInfo.id);
- } catch (RemoteException re) {
- }
- } else {
- // Blacklist all other apps, system or downloaded
- try {
- ipm.deletePackageAsUser(entry.getKey(), null, mUserInfo.id,
- PackageManager.DELETE_SYSTEM_APP);
- } catch (RemoteException re) {
- }
- }
- }
- setResult(RESULT_OK);
- mUserInfo = null;
- finish();
- }
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
-
- if (mUserInfo != null && mNewUser) {
- UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
- um.removeUser(mUserInfo.id);
- }
- }
-}
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 01d041a..a0e4c35 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -42,6 +42,7 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.preference.Preference;
+import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceGroup;
@@ -83,16 +84,20 @@
private static final String KEY_ADD_RESTRICTED_USER = "user_add_restricted";
private static final String KEY_ADD_TRUSTED_USER = "user_add_trusted";
- private static final int MENU_ADD_USER = Menu.FIRST;
- private static final int MENU_REMOVE_USER = Menu.FIRST+1;
+ private static final int MENU_REMOVE_USER = Menu.FIRST;
private static final int DIALOG_CONFIRM_REMOVE = 1;
- private static final int DIALOG_ADD_USER = 2;
- private static final int DIALOG_SETUP_USER = 3;
- private static final int DIALOG_USER_CANNOT_MANAGE = 4;
+ private static final int DIALOG_ADD_USER_TRUSTED = 2;
+ private static final int DIALOG_ADD_USER_LIMITED = 3;
+ private static final int DIALOG_SETUP_USER = 4;
+ private static final int DIALOG_USER_CANNOT_MANAGE = 5;
private static final int MESSAGE_UPDATE_LIST = 1;
private static final int MESSAGE_SETUP_USER = 2;
+ private static final int MESSAGE_CONFIG_USER = 3;
+
+ private static final int USER_TYPE_TRUSTED = 1;
+ private static final int USER_TYPE_LIMITED = 2;
private static final String KEY_ADD_USER_LONG_MESSAGE_DISPLAYED =
"key_add_user_long_message_displayed";
@@ -135,6 +140,9 @@
case MESSAGE_SETUP_USER:
onUserCreated(msg.arg1);
break;
+ case MESSAGE_CONFIG_USER:
+ onManageUserClicked(msg.arg1, true);
+ break;
}
}
};
@@ -238,10 +246,7 @@
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final int itemId = item.getItemId();
- if (itemId == MENU_ADD_USER) {
- onAddUserClicked();
- return true;
- } else if (itemId == MENU_REMOVE_USER) {
+ if (itemId == MENU_REMOVE_USER) {
onRemoveUserClicked(UserHandle.myUserId());
return true;
} else {
@@ -279,10 +284,17 @@
}
}
- private void onAddUserClicked() {
+ private void onAddUserClicked(int userType) {
synchronized (mUserLock) {
if (mRemovingUserId == -1 && !mAddingUser) {
- showDialog(DIALOG_ADD_USER);
+ switch (userType) {
+ case USER_TYPE_TRUSTED:
+ showDialog(DIALOG_ADD_USER_TRUSTED);
+ break;
+ case USER_TYPE_LIMITED:
+ showDialog(DIALOG_ADD_USER_LIMITED);
+ break;
+ }
}
}
}
@@ -296,11 +308,50 @@
}
}
- private void onManageUserClicked(int userId) {
- Intent appsChooser = new Intent();
- appsChooser.setClass(getActivity(), UserRestrictionsActivity.class);
- appsChooser.putExtra(UserRestrictionsActivity.EXTRA_USER_ID, userId);
- startActivity(appsChooser);
+ private UserInfo createLimitedUser() {
+ UserInfo newUserInfo = mUserManager.createUser(
+ getResources().getString(R.string.user_new_user_name),
+ UserInfo.FLAG_RESTRICTED);
+ int userId = newUserInfo.id;
+ UserHandle user = new UserHandle(userId);
+ mUserManager.setUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, true, user);
+
+ Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
+ UserSettings.USER_DRAWABLES[
+ userId % UserSettings.USER_DRAWABLES.length]);
+ mUserManager.setUserIcon(userId, bitmap);
+ // Add shared accounts
+ AccountManager am = AccountManager.get(getActivity());
+ Account [] accounts = am.getAccounts();
+ if (accounts != null) {
+ for (Account account : accounts) {
+ am.addSharedAccount(account, user);
+ }
+ }
+ return newUserInfo;
+ }
+
+ private UserInfo createTrustedUser() {
+ UserInfo newUserInfo = mUserManager.createUser(
+ getActivity().getResources().getString(R.string.user_new_user_name), 0);
+ if (newUserInfo != null) {
+ assignDefaultPhoto(newUserInfo);
+ }
+ return newUserInfo;
+ }
+
+ private void onManageUserClicked(int userId, boolean newUser) {
+ Bundle extras = new Bundle();
+ extras.putInt(AppRestrictionsFragment.EXTRA_USER_ID, userId);
+ extras.putBoolean(AppRestrictionsFragment.EXTRA_NEW_USER, newUser);
+ String title = getResources().getString(R.string.user_new_user_name);
+ if (userId > UserHandle.USER_OWNER) {
+ title = mUserManager.getUserInfo(userId).name;
+ }
+ ((PreferenceActivity) getActivity()).startPreferencePanel(
+ AppRestrictionsFragment.class.getName(),
+ extras, 0, title,
+ null, 0);
}
private void onUserCreated(int userId) {
@@ -341,7 +392,8 @@
.setMessage(R.string.user_cannot_manage_message)
.setPositiveButton(android.R.string.ok, null)
.create();
- case DIALOG_ADD_USER: {
+ case DIALOG_ADD_USER_TRUSTED:
+ case DIALOG_ADD_USER_LIMITED: {
final SharedPreferences preferences = getActivity().getPreferences(
Context.MODE_PRIVATE);
final boolean longMessageDisplayed = preferences.getBoolean(
@@ -349,13 +401,15 @@
final int messageResId = longMessageDisplayed
? R.string.user_add_user_message_short
: R.string.user_add_user_message_long;
+ final int userType = dialogId == DIALOG_ADD_USER_TRUSTED
+ ? USER_TYPE_TRUSTED : USER_TYPE_LIMITED;
Dialog dlg = new AlertDialog.Builder(getActivity())
.setTitle(R.string.user_add_user_title)
.setMessage(messageResId)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
- addUserNow();
+ addUserNow(userType);
if (!longMessageDisplayed) {
preferences.edit().putBoolean(KEY_ADD_USER_LONG_MESSAGE_DISPLAYED,
true).commit();
@@ -410,23 +464,29 @@
}
}
- private void addUserNow() {
+ private void addUserNow(final int userType) {
synchronized (mUserLock) {
mAddingUser = true;
updateUserList();
new Thread() {
public void run() {
+ UserInfo user = null;
// Could take a few seconds
- UserInfo user = mUserManager.createUser(
- getActivity().getResources().getString(R.string.user_new_user_name), 0);
- if (user != null) {
- assignDefaultPhoto(user);
+ if (userType == USER_TYPE_TRUSTED) {
+ user = createTrustedUser();
+ } else {
+ user = createLimitedUser();
}
synchronized (mUserLock) {
mAddingUser = false;
mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
- mHandler.sendMessage(mHandler.obtainMessage(
- MESSAGE_SETUP_USER, user.id, user.serialNumber));
+ if (userType == USER_TYPE_TRUSTED) {
+ mHandler.sendMessage(mHandler.obtainMessage(
+ MESSAGE_SETUP_USER, user.id, user.serialNumber));
+ } else {
+ mHandler.sendMessage(mHandler.obtainMessage(
+ MESSAGE_CONFIG_USER, user.id, user.serialNumber));
+ }
}
}
}.start();
@@ -590,16 +650,9 @@
}
}
} else if (pref == mAddTrustedUser) {
- onAddUserClicked();
+ onAddUserClicked(USER_TYPE_TRUSTED);
} else if (pref == mAddRestrictedUser) {
- Account[] accounts = ((AccountManager) getSystemService(Context.ACCOUNT_SERVICE))
- .getAccounts();
- Intent intent = new Intent(getActivity(), UserRestrictionsActivity.class);
- intent.putExtra(UserRestrictionsActivity.EXTRA_USER_NAME,
- getResources().getString(R.string.user_new_user_name));
- intent.putExtra(UserRestrictionsActivity.EXTRA_ACCOUNTS,
- accounts);
- startActivity(intent);
+ onAddUserClicked(USER_TYPE_LIMITED);
}
return false;
}
@@ -627,7 +680,7 @@
onRemoveUserClicked(userId);
break;
case UserPreference.SETTINGS_ID:
- onManageUserClicked(userId);
+ onManageUserClicked(userId, false);
break;
}
}
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index 138a9d3..63ef549 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -45,6 +45,7 @@
import android.preference.PreferenceCategory;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
+import android.text.InputFilter;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
@@ -430,6 +431,7 @@
return dialog;
} else if (id == DIALOG_RENAME) {
mDeviceNameText = new EditText(getActivity());
+ mDeviceNameText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(30)});
if (mSavedDeviceName != null) {
mDeviceNameText.setText(mSavedDeviceName);
mDeviceNameText.setSelection(mSavedDeviceName.length());