Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2adcc57 authored by Fan Zhang's avatar Fan Zhang
Browse files

Fix special access summary text

Use ApplicationState to count number of apps using unrestricted_data.

Change-Id: I083ff50e3e516536c87afa71d786b22e83d9a498
Fixes: 69313992
Test: robotests
parent 161ff18a
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -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>
+8 −3
Original line number Diff line number Diff line
@@ -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;
    }
+6 −1
Original line number Diff line number Diff line
@@ -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) {
+115 −18
Original line number Diff line number Diff line
@@ -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() {
    }

}
+8 −13
Original line number Diff line number Diff line
@@ -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);
    }
}
Loading