Switch to use small icon for most app related pages

- Renamed AppProgressPreference to AppPreference to handle most app
  related prefs
- Add ed AppSwitchPreference - the same layout as AppPreference except
  it's a SwitchPreference
- Use above 2 prefs in most app related pages.
  - Everything under special access pages
  - Recent app list in App & notifications
  - App data usage detail page
  - Default app picker pages

Bug: 65182905
Test: robotests
Change-Id: I96c980ba1db49e36dabe25b5eade1197215aad11
This commit is contained in:
Fan Zhang
2017-10-28 15:11:49 -07:00
parent 974d2fe080
commit 1c3a4de93d
25 changed files with 350 additions and 121 deletions

View File

@@ -43,9 +43,9 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Switch;
import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto;
@@ -205,7 +205,7 @@ public class DeviceAdminSettings extends ListFragment implements Instrumentable
static class ViewHolder {
ImageView icon;
TextView name;
CheckBox checkbox;
Switch checkbox;
TextView description;
}
@@ -291,10 +291,10 @@ public class DeviceAdminSettings extends ListFragment implements Instrumentable
private View newDeviceAdminView(ViewGroup parent) {
View v = mInflater.inflate(R.layout.device_admin_item, parent, false);
ViewHolder h = new ViewHolder();
h.icon = (ImageView) v.findViewById(R.id.icon);
h.name = (TextView) v.findViewById(R.id.name);
h.checkbox = (CheckBox) v.findViewById(R.id.checkbox);
h.description = (TextView) v.findViewById(R.id.description);
h.icon = v.findViewById(R.id.icon);
h.name = v.findViewById(R.id.name);
h.checkbox = v.findViewById(R.id.checkbox);
h.description = v.findViewById(R.id.description);
v.setTag(h);
return v;
}

View File

@@ -38,6 +38,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.notification.EmptyTextSettings;
import com.android.settings.widget.AppPreference;
import com.android.settings.wrapper.ActivityInfoWrapper;
import com.android.settings.wrapper.UserManagerWrapper;
import com.android.settingslib.wrapper.PackageManagerWrapper;
@@ -176,7 +177,7 @@ public class PictureInPictureSettings extends EmptyTextSettings {
final String packageName = appInfo.packageName;
final CharSequence label = appInfo.loadLabel(pm);
final Preference pref = new Preference(prefContext);
final Preference pref = new AppPreference(prefContext);
pref.setIcon(mIconDrawableFactory.getBadgedIcon(appInfo, userId));
pref.setTitle(pm.getUserBadgedLabel(label, user));
pref.setSummary(PictureInPictureDetails.getPreferenceSummary(prefContext,

View File

@@ -18,14 +18,13 @@ package com.android.settings.applications;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.drawable.ColorDrawable;
import android.text.TextUtils;
import android.text.format.Formatter;
import android.util.Log;
import com.android.settings.AppProgressPreference;
import com.android.settings.widget.AppPreference;
public class ProcessStatsPreference extends AppProgressPreference {
public class ProcessStatsPreference extends AppPreference {
static final String TAG = "ProcessStatsPreference";
private ProcStatsPackageEntry mEntry;

View File

@@ -40,6 +40,7 @@ import android.util.Log;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.widget.AppPreference;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.wrapper.PackageManagerWrapper;
@@ -230,8 +231,7 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController
boolean rebindPref = true;
Preference pref = appPreferences.remove(pkgName);
if (pref == null) {
pref = new Preference(prefContext);
pref.setLayoutResource(R.layout.preference_app);
pref = new AppPreference(prefContext);
rebindPref = false;
}
pref.setKey(pkgName);

View File

@@ -84,6 +84,11 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment
}
}
@Override
protected int getRadioButtonPreferenceCustomLayoutResId() {
return R.layout.preference_app;
}
protected ConfirmationDialogFragment newConfirmationDialogFragment(String selectedKey,
CharSequence confirmationMessage) {
final ConfirmationDialogFragment fragment = new ConfirmationDialogFragment();

View File

@@ -29,6 +29,7 @@ import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.widget.GearPreference;
import com.android.settingslib.TwoTargetPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.wrapper.PackageManagerWrapper;
@@ -53,6 +54,12 @@ public abstract class DefaultAppPreferenceController extends AbstractPreferenceC
public void updateState(Preference preference) {
final DefaultAppInfo app = getDefaultAppInfo();
CharSequence defaultAppLabel = getDefaultAppLabel();
if (preference instanceof TwoTargetPreference) {
// For use small icon because we are displaying an app preference.
// We only need to do this for TwoTargetPreference because the other prefs are
// already using AppPreference so their icon is already normalized.
((TwoTargetPreference) preference).setUseSmallIcon(true);
}
if (!TextUtils.isEmpty(defaultAppLabel)) {
preference.setSummary(defaultAppLabel);
Utils.setSafeIcon(preference, getDefaultAppIcon());

View File

@@ -15,19 +15,18 @@
package com.android.settings.datausage;
import android.content.Context;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.text.format.Formatter;
import android.view.View;
import android.widget.ProgressBar;
import com.android.settings.R;
import com.android.settings.widget.AppPreference;
import com.android.settingslib.AppItem;
import com.android.settingslib.net.UidDetail;
import com.android.settingslib.net.UidDetailProvider;
import com.android.settingslib.utils.ThreadUtils;
public class AppDataUsagePreference extends Preference {
public class AppDataUsagePreference extends AppPreference {
private final AppItem mItem;
private final int mPercent;
@@ -38,8 +37,6 @@ public class AppDataUsagePreference extends Preference {
super(context);
mItem = item;
mPercent = percent;
setLayoutResource(R.layout.preference_app);
setWidgetLayoutResource(R.layout.widget_progress_bar);
if (item.restricted && item.total <= 0) {
setSummary(com.android.settings.R.string.data_usage_app_restricted);
@@ -60,7 +57,6 @@ public class AppDataUsagePreference extends Preference {
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
final ProgressBar progress = (ProgressBar) holder.findViewById(
android.R.id.progress);

View File

@@ -18,7 +18,6 @@ import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.os.UserHandle;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.view.Menu;
@@ -34,6 +33,7 @@ import com.android.settings.applications.AppStateBaseBridge;
import com.android.settings.applications.InstalledAppDetails;
import com.android.settings.datausage.AppStateDataUsageBridge.DataUsageState;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.AppSwitchPreference;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
import com.android.settingslib.applications.ApplicationsState.AppFilter;
@@ -59,11 +59,7 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setAnimationAllowed(true);
if (usePreferenceScreenTitle()) {
addPreferencesFromResource(R.xml.unrestricted_data_access_settings);
} else {
setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
}
addPreferencesFromResource(R.xml.unrestricted_data_access_settings);
mApplicationsState = ApplicationsState.getInstance(
(Application) getContext().getApplicationContext());
mDataSaverBackend = new DataSaverBackend(getContext());
@@ -239,7 +235,8 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
return app != null && UserHandle.isApp(app.info.uid);
}
private class AccessPreference extends SwitchPreference implements DataSaverBackend.Listener {
private class AccessPreference extends AppSwitchPreference
implements DataSaverBackend.Listener {
private final AppEntry mEntry;
private final DataUsageState mState;

View File

@@ -22,11 +22,11 @@ import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.util.IconDrawableFactory;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.applications.UserAppInfo;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.widget.AppPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import java.util.List;
@@ -68,8 +68,7 @@ public class ApplicationListPreferenceController extends AbstractPreferenceContr
final Context prefContext = mParent.getPreferenceManager().getContext();
for (int position = 0; position < result.size(); position++) {
final UserAppInfo item = result.get(position);
final Preference preference = new Preference(prefContext);
preference.setLayoutResource(R.layout.preference_app);
final Preference preference = new AppPreference(prefContext);
preference.setTitle(item.appInfo.loadLabel(mPm));
preference.setIcon(iconDrawableFactory.getBadgedIcon(item.appInfo));
preference.setOrder(position);

View File

@@ -51,6 +51,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.AppSwitchPreference;
import java.util.ArrayList;
import java.util.Collections;
@@ -138,7 +139,7 @@ public class ZenAccessSettings extends EmptyTextSettings {
for (ApplicationInfo app : apps) {
final String pkg = app.packageName;
final CharSequence label = app.loadLabel(mPkgMan);
final SwitchPreference pref = new SwitchPreference(getPrefContext());
final SwitchPreference pref = new AppSwitchPreference(getPrefContext());
pref.setPersistent(false);
pref.setIcon(app.loadIcon(mPkgMan));
pref.setTitle(label);

View File

@@ -21,7 +21,6 @@ import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Fragment;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
@@ -46,6 +45,7 @@ import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.notification.EmptyTextSettings;
import com.android.settings.widget.AppSwitchPreference;
import java.util.Collections;
import java.util.List;
@@ -127,7 +127,7 @@ public abstract class ManagedServiceSettings extends EmptyTextSettings {
Log.e(TAG, "can't find package name", e);
}
final String summary = service.loadLabel(mPm).toString();
final SwitchPreference pref = new SwitchPreference(getPrefContext());
final SwitchPreference pref = new AppSwitchPreference(getPrefContext());
pref.setPersistent(false);
pref.setIcon(mIconDrawableFactory.getBadgedIcon(service, service.applicationInfo,
UserHandle.getUserId(service.applicationInfo.uid)));

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2017 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.
@@ -13,26 +13,36 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings;
package com.android.settings.widget;
import android.content.Context;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ProgressBar;
public class AppProgressPreference extends Preference {
import com.android.settings.R;
public class AppPreference extends Preference {
private int mProgress;
private boolean mProgressVisible;
public AppProgressPreference(Context context, AttributeSet attrs) {
public AppPreference(Context context) {
super(context);
setLayoutResource(R.layout.preference_app);
}
public AppPreference(Context context, AttributeSet attrs) {
super(context, attrs);
setLayoutResource(R.layout.preference_app);
setWidgetLayoutResource(R.layout.widget_progress_bar);
}
public void setProgress(int amount) {
mProgress = amount;
mProgressVisible = true;
notifyChanged();
}
@@ -40,7 +50,14 @@ public class AppProgressPreference extends Preference {
public void onBindViewHolder(PreferenceViewHolder view) {
super.onBindViewHolder(view);
view.findViewById(R.id.summary_container)
.setVisibility(TextUtils.isEmpty(getSummary()) ? View.GONE : View.VISIBLE);
final ProgressBar progress = (ProgressBar) view.findViewById(android.R.id.progress);
progress.setProgress(mProgress);
if (mProgressVisible) {
progress.setProgress(mProgress);
progress.setVisibility(View.VISIBLE);
} else {
progress.setVisibility(View.GONE);
}
}
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) 2017 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.widget;
import android.content.Context;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceViewHolder;
import android.text.TextUtils;
import android.view.View;
import com.android.settings.R;
public class AppSwitchPreference extends SwitchPreference {
public AppSwitchPreference(Context context) {
super(context);
setLayoutResource(R.layout.preference_app);
}
@Override
public void onBindViewHolder(PreferenceViewHolder view) {
super.onBindViewHolder(view);
view.findViewById(R.id.summary_container)
.setVisibility(TextUtils.isEmpty(getSummary()) ? View.GONE : View.VISIBLE);
}
}

View File

@@ -21,8 +21,8 @@ import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import android.support.annotation.LayoutRes;
import android.support.annotation.VisibleForTesting;
import android.support.annotation.XmlRes;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
@@ -135,7 +135,7 @@ public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFr
final PreferenceScreen screen = getPreferenceScreen();
screen.removeAll();
final int customLayoutResId = getRadioButtomPreferenceCustomLayoutResId();
final int customLayoutResId = getRadioButtonPreferenceCustomLayoutResId();
if (shouldShowItemNone()) {
final RadioButtonPreference nonePref = new RadioButtonPreference(getPrefContext());
if (customLayoutResId > 0) {
@@ -218,8 +218,8 @@ public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFr
/**
* Provides a custom layout for each candidate row.
*/
@XmlRes
protected int getRadioButtomPreferenceCustomLayoutResId() {
@LayoutRes
protected int getRadioButtonPreferenceCustomLayoutResId() {
return 0;
}