Loading res/xml/app_and_notification.xml +6 −6 Original line number Diff line number Diff line Loading @@ -72,6 +72,6 @@ android:fragment="com.android.settings.applications.specialaccess.SpecialAccessSettings" android:title="@string/special_access" android:order="20" settings:searchable="false"/> settings:controller="com.android.settings.applications.SpecialAppAccessPreferenceController"/> </PreferenceScreen> src/com/android/settings/applications/AppAndNotificationDashboardFragment.java +8 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 { Loading @@ -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(); Loading @@ -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; } Loading src/com/android/settings/applications/AppStateBaseBridge.java +6 −1 Original line number Diff line number Diff line Loading @@ -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() { Loading Loading @@ -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) { Loading src/com/android/settings/applications/SpecialAppAccessPreferenceController.java +115 −18 Original line number Diff line number Diff line Loading @@ -13,43 +13,140 @@ */ package com.android.settings.applications; import android.app.Application; import android.content.Context; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.BasePreferenceController; import com.android.settings.datausage.AppStateDataUsageBridge; import com.android.settings.datausage.DataSaverBackend; import com.android.settingslib.core.AbstractPreferenceController; 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; import androidx.preference.Preference; import java.util.ArrayList; public class SpecialAppAccessPreferenceController extends BasePreferenceController implements AppStateBaseBridge.Callback, ApplicationsState.Callbacks, LifecycleObserver, OnStart, OnStop, OnDestroy { public class SpecialAppAccessPreferenceController extends AbstractPreferenceController implements PreferenceControllerMixin { @VisibleForTesting ApplicationsState.Session mSession; private static final String KEY_SPECIAL_ACCESS = "special_access"; private final ApplicationsState mApplicationsState; private final AppStateDataUsageBridge mDataUsageBridge; private final DataSaverBackend mDataSaverBackend; private 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 SpecialAppAccessPreferenceController(Context context) { super(context); public void setSession(Lifecycle lifecycle) { mSession = mApplicationsState.newSession(this, lifecycle); } @Override public int getAvailabilityStatus() { return AVAILABLE_UNSEARCHABLE; } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); } @Override public boolean isAvailable() { return true; public void onStart() { mDataUsageBridge.resume(); } @Override public String getPreferenceKey() { return KEY_SPECIAL_ACCESS; public void onStop() { mDataUsageBridge.pause(); } @Override public void onDestroy() { mDataUsageBridge.release(); } @Override public void updateState(Preference preference) { if (mDataSaverBackend == null) { mDataSaverBackend = new DataSaverBackend(mContext); 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++; } } final int count = mDataSaverBackend.getWhitelistedCount(); preference.setSummary(mContext.getResources().getQuantityString( 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() { } } src/com/android/settings/datausage/DataSaverBackend.java +8 −13 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -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); } } Loading
res/xml/app_and_notification.xml +6 −6 Original line number Diff line number Diff line Loading @@ -72,6 +72,6 @@ android:fragment="com.android.settings.applications.specialaccess.SpecialAccessSettings" android:title="@string/special_access" android:order="20" settings:searchable="false"/> settings:controller="com.android.settings.applications.SpecialAppAccessPreferenceController"/> </PreferenceScreen>
src/com/android/settings/applications/AppAndNotificationDashboardFragment.java +8 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 { Loading @@ -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(); Loading @@ -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; } Loading
src/com/android/settings/applications/AppStateBaseBridge.java +6 −1 Original line number Diff line number Diff line Loading @@ -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() { Loading Loading @@ -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) { Loading
src/com/android/settings/applications/SpecialAppAccessPreferenceController.java +115 −18 Original line number Diff line number Diff line Loading @@ -13,43 +13,140 @@ */ package com.android.settings.applications; import android.app.Application; import android.content.Context; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.BasePreferenceController; import com.android.settings.datausage.AppStateDataUsageBridge; import com.android.settings.datausage.DataSaverBackend; import com.android.settingslib.core.AbstractPreferenceController; 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; import androidx.preference.Preference; import java.util.ArrayList; public class SpecialAppAccessPreferenceController extends BasePreferenceController implements AppStateBaseBridge.Callback, ApplicationsState.Callbacks, LifecycleObserver, OnStart, OnStop, OnDestroy { public class SpecialAppAccessPreferenceController extends AbstractPreferenceController implements PreferenceControllerMixin { @VisibleForTesting ApplicationsState.Session mSession; private static final String KEY_SPECIAL_ACCESS = "special_access"; private final ApplicationsState mApplicationsState; private final AppStateDataUsageBridge mDataUsageBridge; private final DataSaverBackend mDataSaverBackend; private 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 SpecialAppAccessPreferenceController(Context context) { super(context); public void setSession(Lifecycle lifecycle) { mSession = mApplicationsState.newSession(this, lifecycle); } @Override public int getAvailabilityStatus() { return AVAILABLE_UNSEARCHABLE; } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); } @Override public boolean isAvailable() { return true; public void onStart() { mDataUsageBridge.resume(); } @Override public String getPreferenceKey() { return KEY_SPECIAL_ACCESS; public void onStop() { mDataUsageBridge.pause(); } @Override public void onDestroy() { mDataUsageBridge.release(); } @Override public void updateState(Preference preference) { if (mDataSaverBackend == null) { mDataSaverBackend = new DataSaverBackend(mContext); 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++; } } final int count = mDataSaverBackend.getWhitelistedCount(); preference.setSummary(mContext.getResources().getQuantityString( 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() { } }
src/com/android/settings/datausage/DataSaverBackend.java +8 −13 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -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); } }