Fix repeating apps on pause/resume

Preference list was getting duplicated on pausing and resuming the activity.

Pull the user info out of the preference list and make it a static header
so that it stays fixed. Can now remove all entries before re-adding.

Disable location by default and disable ability to change Unknown sources
 toggle.

Bug: 8685561
Bug: 8688400

Change-Id: I64ce728d5369e03ddaba562bcd66bb0720a037d2
This commit is contained in:
Amith Yamasani
2013-04-22 13:37:58 -07:00
parent bf3391f19b
commit 1bad7141b4
5 changed files with 130 additions and 32 deletions

View File

@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:orientation="vertical"
android:focusable="true"
android:clickable="true"
android:paddingStart="@*android:dimen/preference_fragment_padding_side"
android:paddingEnd="@*android:dimen/preference_fragment_padding_side" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/app_restrictions_pref"
android:gravity="center_vertical"
android:paddingStart="@*android:dimen/preference_item_padding_side"
android:paddingEnd="?android:attr/scrollbarSize"
android:background="?android:attr/selectableItemBackground" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:minWidth="@*android:dimen/preference_icon_minWidth"
android:orientation="horizontal">
<ImageView
android:id="@+android:id/icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center"
android:minWidth="48dp"
android:scaleType="centerInside"
android:layout_marginEnd="@*android:dimen/preference_item_padding_inner"
/>
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="6dip"
android:layout_marginTop="6dip"
android:layout_marginBottom="6dip"
android:layout_weight="1">
<TextView
android:id="@+android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="marquee"
android:fadingEdge="horizontal"/>
<TextView
android:id="@android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@android:id/title"
android:layout_alignStart="@android:id/title"
android:paddingBottom="3dip"
android:visibility="gone"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="13sp"
android:textColor="?android:attr/textColorSecondary"
android:focusable="false"
android:maxLines="4" />
</RelativeLayout>
</LinearLayout>
<View android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/divider_color" />
</LinearLayout>

View File

@@ -257,10 +257,8 @@ public class SecuritySettings extends SettingsPreferenceFragment
KEY_TOGGLE_INSTALL_APPLICATIONS); KEY_TOGGLE_INSTALL_APPLICATIONS);
mToggleAppInstallation.setChecked(isNonMarketAppsAllowed()); mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());
boolean isSideloadingAllowed =
!um.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
// Side loading of apps. // Side loading of apps.
mToggleAppInstallation.setEnabled(isSideloadingAllowed); mToggleAppInstallation.setEnabled(mIsPrimary);
// Package verification, only visible to primary user and if enabled // Package verification, only visible to primary user and if enabled
mToggleVerifyApps = (CheckBoxPreference) findPreference(KEY_TOGGLE_VERIFY_APPLICATIONS); mToggleVerifyApps = (CheckBoxPreference) findPreference(KEY_TOGGLE_VERIFY_APPLICATIONS);

View File

@@ -74,6 +74,7 @@ import android.widget.ImageView;
import android.widget.ListAdapter; import android.widget.ListAdapter;
import android.widget.ListPopupWindow; import android.widget.ListPopupWindow;
import android.widget.Switch; import android.widget.Switch;
import android.widget.TextView;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
@@ -104,7 +105,6 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
private UserManager mUserManager; private UserManager mUserManager;
private UserHandle mUser; private UserHandle mUser;
private Preference mUserPreference;
private PreferenceGroup mAppList; private PreferenceGroup mAppList;
private static final int MAX_APP_RESTRICTIONS = 100; private static final int MAX_APP_RESTRICTIONS = 100;
@@ -125,6 +125,9 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
private int mCustomRequestCode; private int mCustomRequestCode;
private HashMap<Integer, AppRestrictionsPreference> mCustomRequestMap = private HashMap<Integer, AppRestrictionsPreference> mCustomRequestMap =
new HashMap<Integer,AppRestrictionsPreference>(); new HashMap<Integer,AppRestrictionsPreference>();
private View mHeaderView;
private ImageView mUserIconView;
private TextView mUserNameView;
private List<SelectableAppInfo> mVisibleApps; private List<SelectableAppInfo> mVisibleApps;
private List<ApplicationInfo> mUserApps; private List<ApplicationInfo> mUserApps;
@@ -262,13 +265,24 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
addPreferencesFromResource(R.xml.app_restrictions); addPreferencesFromResource(R.xml.app_restrictions);
mAppList = getPreferenceScreen(); mAppList = getPreferenceScreen();
mUserPreference = findPreference(KEY_USER_INFO);
mUserPreference.setOnPreferenceClickListener(this);
setHasOptionsMenu(true); setHasOptionsMenu(true);
} }
@Override
public void onActivityCreated(Bundle savedInstanceState) {
if (mHeaderView == null) {
mHeaderView = LayoutInflater.from(getActivity()).inflate(
R.layout.user_info_header, null);
((ViewGroup) getListView().getParent()).addView(mHeaderView, 0);
mHeaderView.setOnClickListener(this);
mUserIconView = (ImageView) mHeaderView.findViewById(android.R.id.icon);
mUserNameView = (TextView) mHeaderView.findViewById(android.R.id.title);
getListView().setFastScrollEnabled(true);
}
// This is going to bind the preferences.
super.onActivityCreated(savedInstanceState);
}
@Override @Override
public void onSaveInstanceState(Bundle outState) { public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
@@ -282,12 +296,11 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
new AppLoadingTask().execute((Void[]) null); new AppLoadingTask().execute((Void[]) null);
UserInfo info = mUserManager.getUserInfo(mUser.getIdentifier()); UserInfo info = mUserManager.getUserInfo(mUser.getIdentifier());
mUserPreference.setTitle(info.name);
Bitmap userIcon = mUserManager.getUserIcon(mUser.getIdentifier()); Bitmap userIcon = mUserManager.getUserIcon(mUser.getIdentifier());
CircleFramedDrawable circularIcon = CircleFramedDrawable circularIcon =
CircleFramedDrawable.getInstance(this.getActivity(), userIcon); CircleFramedDrawable.getInstance(this.getActivity(), userIcon);
mUserPreference.setIcon(circularIcon); ((TextView) mHeaderView.findViewById(android.R.id.title)).setText(info.name);
mUserPreference.setTitle(info.name); ((ImageView) mHeaderView.findViewById(android.R.id.icon)).setImageDrawable(circularIcon);
} }
public void onPause() { public void onPause() {
@@ -335,6 +348,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
} }
private void addSystemApps(List<SelectableAppInfo> visibleApps, Intent intent) { private void addSystemApps(List<SelectableAppInfo> visibleApps, Intent intent) {
if (getActivity() == null) return;
final PackageManager pm = getActivity().getPackageManager(); final PackageManager pm = getActivity().getPackageManager();
List<ResolveInfo> launchableApps = pm.queryIntentActivities(intent, 0); List<ResolveInfo> launchableApps = pm.queryIntentActivities(intent, 0);
for (ResolveInfo app : launchableApps) { for (ResolveInfo app : launchableApps) {
@@ -377,6 +391,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
mAppList.setOrderingAsAdded(false); mAppList.setOrderingAsAdded(false);
mVisibleApps = new ArrayList<SelectableAppInfo>(); mVisibleApps = new ArrayList<SelectableAppInfo>();
final Context context = getActivity(); final Context context = getActivity();
if (context == null) return;
PackageManager pm = context.getPackageManager(); PackageManager pm = context.getPackageManager();
IPackageManager ipm = AppGlobals.getPackageManager(); IPackageManager ipm = AppGlobals.getPackageManager();
@@ -450,13 +465,14 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
packageMap.put(info.packageName, info); packageMap.put(info.packageName, info);
} }
} }
} }
private void populateApps() { private void populateApps() {
final Context context = getActivity(); final Context context = getActivity();
if (context == null) return;
PackageManager pm = context.getPackageManager(); PackageManager pm = context.getPackageManager();
IPackageManager ipm = AppGlobals.getPackageManager(); IPackageManager ipm = AppGlobals.getPackageManager();
mAppList.removeAll();
Intent restrictionsIntent = new Intent(Intent.ACTION_GET_RESTRICTION_ENTRIES); Intent restrictionsIntent = new Intent(Intent.ACTION_GET_RESTRICTION_ENTRIES);
final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(restrictionsIntent, 0); final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(restrictionsIntent, 0);
int i = 0; int i = 0;
@@ -464,14 +480,14 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
for (SelectableAppInfo app : mVisibleApps) { for (SelectableAppInfo app : mVisibleApps) {
String packageName = app.packageName; String packageName = app.packageName;
if (packageName == null) continue; if (packageName == null) continue;
final boolean isSettingsApp = packageName.equals(getActivity().getPackageName()); final boolean isSettingsApp = packageName.equals(context.getPackageName());
AppRestrictionsPreference p = new AppRestrictionsPreference(context, this); AppRestrictionsPreference p = new AppRestrictionsPreference(context, this);
final boolean hasSettings = resolveInfoListHasPackage(receivers, packageName); final boolean hasSettings = resolveInfoListHasPackage(receivers, packageName);
p.setIcon(app.icon); p.setIcon(app.icon);
p.setChecked(false); p.setChecked(false);
p.setTitle(app.activityName); p.setTitle(app.activityName);
if (app.masterEntry != null) { if (app.masterEntry != null) {
p.setSummary(getActivity().getString(R.string.user_restrictions_controlled_by, p.setSummary(context.getString(R.string.user_restrictions_controlled_by,
app.masterEntry.activityName)); app.masterEntry.activityName));
} }
p.setKey(PKG_PREFIX + packageName); p.setKey(PKG_PREFIX + packageName);
@@ -563,7 +579,9 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (v.getTag() instanceof AppRestrictionsPreference) { if (v == mHeaderView) {
showDialog(DIALOG_ID_EDIT_USER_INFO);
} else if (v.getTag() instanceof AppRestrictionsPreference) {
AppRestrictionsPreference pref = (AppRestrictionsPreference) v.getTag(); AppRestrictionsPreference pref = (AppRestrictionsPreference) v.getTag();
if (v.getId() == R.id.app_restrictions_settings) { if (v.getId() == R.id.app_restrictions_settings) {
toggleAppPanel(pref); toggleAppPanel(pref);
@@ -624,12 +642,6 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
} }
} }
} }
} else if (preference == mUserPreference) {
String userName = ((CharSequence) newValue).toString();
if (!TextUtils.isEmpty(userName)) {
mUserManager.setUserName(mUser.getIdentifier(), userName);
mUserPreference.setTitle(userName);
}
} }
return true; return true;
} }
@@ -840,8 +852,6 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
mAppListChanged = true; mAppListChanged = true;
} }
return true; return true;
} else if (preference == mUserPreference) {
showDialog(DIALOG_ID_EDIT_USER_INFO);
} }
return false; return false;
} }
@@ -862,7 +872,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
userNameView.setText(info.name); userNameView.setText(info.name);
final ImageView userPhotoView = (ImageView) content.findViewById(R.id.user_photo); final ImageView userPhotoView = (ImageView) content.findViewById(R.id.user_photo);
userPhotoView.setImageDrawable(mUserPreference.getIcon()); userPhotoView.setImageDrawable(mUserIconView.getDrawable());
mEditUserPhotoController = new EditUserPhotoController(this, userPhotoView); mEditUserPhotoController = new EditUserPhotoController(this, userPhotoView);
@@ -878,10 +888,11 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
// Update the name if changed. // Update the name if changed.
CharSequence userName = userNameView.getText(); CharSequence userName = userNameView.getText();
if (!TextUtils.isEmpty(userName)) { if (!TextUtils.isEmpty(userName)) {
CharSequence oldUserName = mUserPreference.getTitle(); CharSequence oldUserName = mUserNameView.getText();
if (oldUserName == null if (oldUserName == null
|| !userName.toString().equals(oldUserName.toString())) { || !userName.toString().equals(oldUserName.toString())) {
mUserPreference.setTitle(userName); ((TextView) mHeaderView.findViewById(android.R.id.title))
.setText(userName.toString());
mUserManager.setUserName(mUser.getIdentifier(), mUserManager.setUserName(mUser.getIdentifier(),
userName.toString()); userName.toString());
} }
@@ -889,8 +900,8 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
// Update the photo if changed. // Update the photo if changed.
Drawable userPhoto = mEditUserPhotoController.getNewUserPhotoDrawable(); Drawable userPhoto = mEditUserPhotoController.getNewUserPhotoDrawable();
if (userPhoto != null if (userPhoto != null
&& !userPhoto.equals(mUserPreference.getIcon())) { && !userPhoto.equals(mUserIconView.getDrawable())) {
mUserPreference.setIcon(userPhoto); mUserIconView.setImageDrawable(userPhoto);
new AsyncTask<Void, Void, Void>() { new AsyncTask<Void, Void, Void>() {
@Override @Override
protected Void doInBackground(Void... params) { protected Void doInBackground(Void... params) {

View File

@@ -34,21 +34,21 @@ public class RestrictionUtils {
// UserManager.DISALLOW_CONFIG_WIFI, // UserManager.DISALLOW_CONFIG_WIFI,
// UserManager.DISALLOW_CONFIG_BLUETOOTH, // UserManager.DISALLOW_CONFIG_BLUETOOTH,
UserManager.DISALLOW_SHARE_LOCATION, UserManager.DISALLOW_SHARE_LOCATION,
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES // UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES
}; };
public static final int [] sRestrictionTitles = { public static final int [] sRestrictionTitles = {
// R.string.restriction_wifi_config_title, // R.string.restriction_wifi_config_title,
// R.string.restriction_bluetooth_config_title, // R.string.restriction_bluetooth_config_title,
R.string.restriction_location_enable_title, R.string.restriction_location_enable_title,
R.string.install_applications // R.string.install_applications
}; };
public static final int [] sRestrictionDescriptions = { public static final int [] sRestrictionDescriptions = {
// R.string.restriction_wifi_config_summary, // R.string.restriction_wifi_config_summary,
// R.string.restriction_bluetooth_config_summary, // R.string.restriction_bluetooth_config_summary,
R.string.restriction_location_enable_summary, R.string.restriction_location_enable_summary,
R.string.install_unknown_applications // R.string.install_unknown_applications
}; };
/** /**

View File

@@ -45,6 +45,7 @@ import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceGroup; import android.preference.PreferenceGroup;
import android.provider.ContactsContract; import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Contacts;
import android.provider.Settings.Secure;
import android.util.Log; import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.Menu; import android.view.Menu;
@@ -305,7 +306,9 @@ public class UserSettings extends SettingsPreferenceFragment
int userId = newUserInfo.id; int userId = newUserInfo.id;
UserHandle user = new UserHandle(userId); UserHandle user = new UserHandle(userId);
mUserManager.setUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, true, user); mUserManager.setUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, true, user);
mUserManager.setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, true, user);
Secure.putStringForUser(getContentResolver(),
Secure.LOCATION_PROVIDERS_ALLOWED, "", userId);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
UserSettings.USER_DRAWABLES[ UserSettings.USER_DRAWABLES[
userId % UserSettings.USER_DRAWABLES.length]); userId % UserSettings.USER_DRAWABLES.length]);