diff options
author | Lifu Tang <lifu@google.com> | 2019-04-25 14:41:41 -0700 |
---|---|---|
committer | Lifu Tang <lifu@google.com> | 2019-04-26 15:05:06 -0700 |
commit | d3a6d5e860cb4c8e3899fbe4742d97586c1d3d77 (patch) | |
tree | 4f29b84f63226e52fb23eea7b1a6afffb6920c4f /src/com/android/settings/location | |
parent | c7564be56299362f18ae1cbf81b7a9d9068fec80 (diff) | |
download | packages_apps_Settings-d3a6d5e860cb4c8e3899fbe4742d97586c1d3d77.tar.gz packages_apps_Settings-d3a6d5e860cb4c8e3899fbe4742d97586c1d3d77.tar.bz2 packages_apps_Settings-d3a6d5e860cb4c8e3899fbe4742d97586c1d3d77.zip |
Update location app stats
- Count apps in both primary and work profiles
- Show the number of any location permitted app instead of background
allowed apps on Location settings page
- Update the text at the top-level settings page
Bug: 129296799
Bug: 129358133
Bug: 129358508
Bug: 131432116
Test: build, flash, and test manually
Change-Id: I1a4284257a8a284140b81685efc98a2cc4a74619
Diffstat (limited to 'src/com/android/settings/location')
-rw-r--r-- | src/com/android/settings/location/AppLocationPermissionPreferenceController.java | 89 | ||||
-rw-r--r-- | src/com/android/settings/location/TopLevelLocationPreferenceController.java | 49 |
2 files changed, 99 insertions, 39 deletions
diff --git a/src/com/android/settings/location/AppLocationPermissionPreferenceController.java b/src/com/android/settings/location/AppLocationPermissionPreferenceController.java index 43a6a9b26d..65abe997a9 100644 --- a/src/com/android/settings/location/AppLocationPermissionPreferenceController.java +++ b/src/com/android/settings/location/AppLocationPermissionPreferenceController.java @@ -1,11 +1,12 @@ package com.android.settings.location; -import static android.Manifest.permission.ACCESS_BACKGROUND_LOCATION; import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import android.content.Context; import android.location.LocationManager; +import android.os.UserHandle; +import android.os.UserManager; import android.permission.PermissionControllerManager; import android.provider.Settings; @@ -13,11 +14,12 @@ import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.core.lifecycle.Lifecycle; import java.util.Arrays; -import java.util.Collections; +import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class AppLocationPermissionPreferenceController extends @@ -29,7 +31,12 @@ public class AppLocationPermissionPreferenceController extends int mNumTotal = -1; /** Total number of apps that has background location permission. */ @VisibleForTesting - int mNumBackground = -1; + int mNumHasLocation = -1; + + final AtomicInteger loadingInProgress = new AtomicInteger(0); + private int mNumTotalLoading = 0; + private int mNumHasLocationLoading = 0; + private final LocationManager mLocationManager; private Preference mPreference; @@ -52,52 +59,76 @@ public class AppLocationPermissionPreferenceController extends @Override public CharSequence getSummary() { if (mLocationManager.isLocationEnabled()) { - if (mNumTotal == -1 || mNumBackground == -1) { + if (mNumTotal == -1 || mNumHasLocation == -1) { return mContext.getString(R.string.location_settings_loading_app_permission_stats); } return mContext.getResources().getQuantityString( - R.plurals.location_app_permission_summary_location_on, mNumBackground, - mNumBackground, mNumTotal); + R.plurals.location_app_permission_summary_location_on, mNumHasLocation, + mNumHasLocation, mNumTotal); } else { return mContext.getString(R.string.location_app_permission_summary_location_off); } } + private void setAppCounts(int numTotal, int numHasLocation) { + mNumTotal = numTotal; + mNumHasLocation = numHasLocation; + refreshSummary(mPreference); + } + @Override public void updateState(Preference preference) { super.updateState(preference); mPreference = preference; - final AtomicInteger loadingInProgress = new AtomicInteger(2); refreshSummary(preference); - // Bail out if location has been disabled. - if (!mLocationManager.isLocationEnabled()) { + // Bail out if location has been disabled, or there's another loading request in progress. + if (!mLocationManager.isLocationEnabled() || + loadingInProgress.get() != 0) { return; } - PermissionControllerManager permController = - mContext.getSystemService(PermissionControllerManager.class); - permController.countPermissionApps( - Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), 0, - (numApps) -> { - mNumTotal = numApps; - if (loadingInProgress.decrementAndGet() == 0) { - refreshSummary(preference); - } - }, null); - - permController.countPermissionApps( - Collections.singletonList(ACCESS_BACKGROUND_LOCATION), - PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED, - (numApps) -> { - mNumBackground = numApps; + mNumTotalLoading = 0; + mNumHasLocationLoading = 0; + // Retrieve a list of users inside the current user profile group. + final List<UserHandle> users = mContext.getSystemService( + UserManager.class).getUserProfiles(); + loadingInProgress.set(2 * users.size()); + for (UserHandle user : users) { + final Context userContext = Utils.createPackageContextAsUser(mContext, + user.getIdentifier()); + if (userContext == null) { + for (int i = 0; i < 2; ++i) { if (loadingInProgress.decrementAndGet() == 0) { - refreshSummary(preference); + setAppCounts(mNumTotalLoading, mNumHasLocationLoading); } - }, null); + } + continue; + } + final PermissionControllerManager permController = + userContext.getSystemService(PermissionControllerManager.class); + permController.countPermissionApps( + Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), 0, + (numApps) -> { + mNumTotalLoading += numApps; + if (loadingInProgress.decrementAndGet() == 0) { + setAppCounts(mNumTotalLoading, mNumHasLocationLoading); + } + }, null); + permController.countPermissionApps( + Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), + PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED, + (numApps) -> { + mNumHasLocationLoading += numApps; + if (loadingInProgress.decrementAndGet() == 0) { + setAppCounts(mNumTotalLoading, mNumHasLocationLoading); + } + }, null); + } } @Override public void onLocationModeChanged(int mode, boolean restricted) { - // 'null' is checked inside updateState(), so no need to check here. - updateState(mPreference); + if (mPreference != null) { + updateState(mPreference); + } } } diff --git a/src/com/android/settings/location/TopLevelLocationPreferenceController.java b/src/com/android/settings/location/TopLevelLocationPreferenceController.java index baad7805b4..ec58a3422d 100644 --- a/src/com/android/settings/location/TopLevelLocationPreferenceController.java +++ b/src/com/android/settings/location/TopLevelLocationPreferenceController.java @@ -8,18 +8,23 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.location.LocationManager; +import android.os.UserHandle; +import android.os.UserManager; import android.permission.PermissionControllerManager; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.core.BasePreferenceController; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; public class TopLevelLocationPreferenceController extends BasePreferenceController implements LifecycleObserver, OnStart, OnStop { @@ -28,8 +33,10 @@ public class TopLevelLocationPreferenceController extends BasePreferenceControll private final LocationManager mLocationManager; /** Total number of apps that has location permission. */ private int mNumTotal = -1; + private int mNumTotalLoading = 0; private BroadcastReceiver mReceiver; private Preference mPreference; + private AtomicInteger loadingInProgress = new AtomicInteger(0); public TopLevelLocationPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); @@ -66,16 +73,37 @@ public class TopLevelLocationPreferenceController extends BasePreferenceControll super.updateState(preference); mPreference = preference; refreshSummary(preference); - // Bail out if location has been disabled. - if (!mLocationManager.isLocationEnabled()) { + // Bail out if location has been disabled, or there's another loading request in progress. + if (!mLocationManager.isLocationEnabled() || + loadingInProgress.get() != 0) { return; } - mContext.getSystemService(PermissionControllerManager.class).countPermissionApps( - Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), - PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED, - (numApps) -> { - setLocationAppCount(numApps); - }, null); + mNumTotalLoading = 0; + // Retrieve a list of users inside the current user profile group. + final List<UserHandle> users = mContext.getSystemService( + UserManager.class).getUserProfiles(); + loadingInProgress.set(users.size()); + for (UserHandle user : users) { + final Context userContext = Utils.createPackageContextAsUser(mContext, + user.getIdentifier()); + if (userContext == null) { + if (loadingInProgress.decrementAndGet() == 0) { + setLocationAppCount(mNumTotalLoading); + } + continue; + } + final PermissionControllerManager permController = + userContext.getSystemService(PermissionControllerManager.class); + permController.countPermissionApps( + Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), + PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED, + (numApps) -> { + mNumTotalLoading += numApps; + if (loadingInProgress.decrementAndGet() == 0) { + setLocationAppCount(mNumTotalLoading); + } + }, null); + } } @Override @@ -98,7 +126,8 @@ public class TopLevelLocationPreferenceController extends BasePreferenceControll } private void refreshLocationMode() { - // 'null' is checked inside updateState(), so no need to check here. - updateState(mPreference); + if (mPreference != null) { + updateState(mPreference); + } } } |