Merge "Fix special access summary text"
This commit is contained in:
committed by
Android (Google) Code Review
commit
f2225d20f7
@@ -21,6 +21,8 @@ import android.app.Application;
|
||||
import android.content.Context;
|
||||
import android.provider.SearchIndexableResource;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
@@ -33,8 +35,6 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
@SearchIndexable
|
||||
public class AppAndNotificationDashboardFragment extends DashboardFragment {
|
||||
|
||||
@@ -60,6 +60,12 @@ public class AppAndNotificationDashboardFragment extends DashboardFragment {
|
||||
return R.xml.app_and_notification;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
use(SpecialAppAccessPreferenceController.class).setSession(getSettingsLifecycle());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
||||
final Activity activity = getActivity();
|
||||
@@ -77,7 +83,6 @@ public class AppAndNotificationDashboardFragment extends DashboardFragment {
|
||||
final List<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||
controllers.add(new EmergencyBroadcastPreferenceController(context,
|
||||
"app_and_notif_cell_broadcast_settings"));
|
||||
controllers.add(new SpecialAppAccessPreferenceController(context));
|
||||
controllers.add(new RecentAppsPreferenceController(context, app, host));
|
||||
return controllers;
|
||||
}
|
||||
|
@@ -45,7 +45,7 @@ public abstract class AppStateBaseBridge implements ApplicationsState.Callbacks
|
||||
// the same time as us as well.
|
||||
mHandler = new BackgroundHandler(mAppState != null ? mAppState.getBackgroundLooper()
|
||||
: Looper.getMainLooper());
|
||||
mMainHandler = new MainHandler();
|
||||
mMainHandler = new MainHandler(Looper.getMainLooper());
|
||||
}
|
||||
|
||||
public void resume() {
|
||||
@@ -106,11 +106,16 @@ public abstract class AppStateBaseBridge implements ApplicationsState.Callbacks
|
||||
}
|
||||
|
||||
protected abstract void loadAllExtraInfo();
|
||||
|
||||
protected abstract void updateExtraInfo(AppEntry app, String pkg, int uid);
|
||||
|
||||
private class MainHandler extends Handler {
|
||||
private static final int MSG_INFO_UPDATED = 1;
|
||||
|
||||
public MainHandler(Looper looper) {
|
||||
super(looper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
|
@@ -13,43 +13,140 @@
|
||||
*/
|
||||
package com.android.settings.applications;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.datausage.DataSaverBackend;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
public class SpecialAppAccessPreferenceController extends AbstractPreferenceController
|
||||
implements PreferenceControllerMixin {
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.datausage.AppStateDataUsageBridge;
|
||||
import com.android.settings.datausage.DataSaverBackend;
|
||||
import com.android.settingslib.applications.ApplicationsState;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnDestroy;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||
|
||||
private static final String KEY_SPECIAL_ACCESS = "special_access";
|
||||
import java.util.ArrayList;
|
||||
|
||||
private DataSaverBackend mDataSaverBackend;
|
||||
public class SpecialAppAccessPreferenceController extends BasePreferenceController implements
|
||||
AppStateBaseBridge.Callback, ApplicationsState.Callbacks, LifecycleObserver, OnStart,
|
||||
OnStop, OnDestroy {
|
||||
|
||||
public SpecialAppAccessPreferenceController(Context context) {
|
||||
super(context);
|
||||
@VisibleForTesting
|
||||
ApplicationsState.Session mSession;
|
||||
|
||||
private final ApplicationsState mApplicationsState;
|
||||
private final AppStateDataUsageBridge mDataUsageBridge;
|
||||
private final DataSaverBackend mDataSaverBackend;
|
||||
|
||||
private Preference mPreference;
|
||||
private boolean mExtraLoaded;
|
||||
|
||||
|
||||
public SpecialAppAccessPreferenceController(Context context, String key) {
|
||||
super(context, key);
|
||||
mApplicationsState = ApplicationsState.getInstance(
|
||||
(Application) context.getApplicationContext());
|
||||
mDataSaverBackend = new DataSaverBackend(context);
|
||||
mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
|
||||
}
|
||||
|
||||
public void setSession(Lifecycle lifecycle) {
|
||||
mSession = mApplicationsState.newSession(this, lifecycle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return true;
|
||||
public int getAvailabilityStatus() {
|
||||
return AVAILABLE_UNSEARCHABLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPreferenceKey() {
|
||||
return KEY_SPECIAL_ACCESS;
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
mPreference = screen.findPreference(getPreferenceKey());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
mDataUsageBridge.resume();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
mDataUsageBridge.pause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
mDataUsageBridge.release();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
if (mDataSaverBackend == null) {
|
||||
mDataSaverBackend = new DataSaverBackend(mContext);
|
||||
}
|
||||
final int count = mDataSaverBackend.getWhitelistedCount();
|
||||
preference.setSummary(mContext.getResources().getQuantityString(
|
||||
R.plurals.special_access_summary, count, count));
|
||||
updateSummary();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExtraInfoUpdated() {
|
||||
mExtraLoaded = true;
|
||||
updateSummary();
|
||||
}
|
||||
|
||||
private void updateSummary() {
|
||||
if (!mExtraLoaded || mPreference == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final ArrayList<ApplicationsState.AppEntry> allApps = mSession.getAllApps();
|
||||
int count = 0;
|
||||
for (ApplicationsState.AppEntry entry : allApps) {
|
||||
if (!ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(entry)) {
|
||||
continue;
|
||||
}
|
||||
if (entry.extraInfo != null && ((AppStateDataUsageBridge.DataUsageState)
|
||||
entry.extraInfo).isDataSaverWhitelisted) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
mPreference.setSummary(mContext.getResources().getQuantityString(
|
||||
R.plurals.special_access_summary, count, count));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRunningStateChanged(boolean running) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPackageListChanged() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPackageIconChanged() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPackageSizeChanged(String packageName) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAllSizesComputed() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLauncherInfoChanged() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadEntriesCompleted() {
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -95,19 +95,10 @@ public class DataSaverBackend {
|
||||
return mUidPolicies.get(uid, POLICY_NONE) == POLICY_ALLOW_METERED_BACKGROUND;
|
||||
}
|
||||
|
||||
public int getWhitelistedCount() {
|
||||
int count = 0;
|
||||
loadWhitelist();
|
||||
for (int i = 0; i < mUidPolicies.size(); i++) {
|
||||
if (mUidPolicies.valueAt(i) == POLICY_ALLOW_METERED_BACKGROUND) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
private void loadWhitelist() {
|
||||
if (mWhitelistInitialized) return;
|
||||
if (mWhitelistInitialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int uid : mPolicyManager.getUidsWithPolicy(POLICY_ALLOW_METERED_BACKGROUND)) {
|
||||
mUidPolicies.put(uid, POLICY_ALLOW_METERED_BACKGROUND);
|
||||
@@ -135,7 +126,9 @@ public class DataSaverBackend {
|
||||
}
|
||||
|
||||
private void loadBlacklist() {
|
||||
if (mBlacklistInitialized) return;
|
||||
if (mBlacklistInitialized) {
|
||||
return;
|
||||
}
|
||||
for (int uid : mPolicyManager.getUidsWithPolicy(POLICY_REJECT_METERED_BACKGROUND)) {
|
||||
mUidPolicies.put(uid, POLICY_REJECT_METERED_BACKGROUND);
|
||||
}
|
||||
@@ -212,7 +205,9 @@ public class DataSaverBackend {
|
||||
|
||||
public interface Listener {
|
||||
void onDataSaverChanged(boolean isDataSaving);
|
||||
|
||||
void onWhitelistStatusChanged(int uid, boolean isWhitelisted);
|
||||
|
||||
void onBlacklistStatusChanged(int uid, boolean isBlacklisted);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user