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

Commit f2225d20 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix special access summary text"

parents 2534aea3 a2adcc57
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