Start removing N/A DO disclosures from search index

DO disclosures referring to actions that the admin did not actually
take are hidden in the UI, but still show up in the search index. This
CL takes the following steps toward fixing this:
* Pass the list of PreferenceControllers to the search indexer
* Make the first two PrefrenceControllers set isAvailable() correctly

There are more disclosures to update, but the difficult work is done
as all others will follow the same pattern.

Bug: 32692748
Test: m RunSettingsRoboTests

Change-Id: I7d3e248b80abe72b79fce7afa11f28a822de6986
This commit is contained in:
Bartosz Fabianowski
2017-03-10 15:47:14 +01:00
parent 92ae1f2d8e
commit 5dc168af1a
13 changed files with 179 additions and 82 deletions

View File

@@ -57,6 +57,10 @@ public abstract class AppCounter extends AsyncTask<Void, Void, Integer> {
onCountComplete(count);
}
void executeInForeground() {
onPostExecute(doInBackground());
}
protected abstract void onCountComplete(int num);
protected abstract List<UserInfo> getUsersToCount();
protected abstract boolean includeInCount(ApplicationInfo info);

View File

@@ -35,15 +35,17 @@ public interface ApplicationFeatureProvider {
public static final int IGNORE_INSTALL_REASON = -1;
/**
* Asynchronously calculates the total number of apps installed on the device, across all users
* and managed profiles.
* Calculates the total number of apps installed on the device, across all users and managed
* profiles.
*
* @param installReason Only consider apps with this install reason; may be any install reason
* defined in {@link android.content.pm.PackageManager} or
* {@link #IGNORE_INSTALL_REASON} to count all apps, irrespective of install reason.
* @param async Whether to count asynchronously in a background thread
* @param callback The callback to invoke with the result
*/
void calculateNumberOfInstalledApps(int installReason, NumberOfAppsCallback callback);
void calculateNumberOfInstalledApps(int installReason, boolean async,
NumberOfAppsCallback callback);
/**
* Asynchronously calculates the total number of apps installed on the device, across all users

View File

@@ -56,8 +56,15 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide
}
@Override
public void calculateNumberOfInstalledApps(int installReason, NumberOfAppsCallback callback) {
new AllUserInstalledAppCounter(mContext, installReason, mPm, callback).execute();
public void calculateNumberOfInstalledApps(int installReason, boolean async,
NumberOfAppsCallback callback) {
final AllUserInstalledAppCounter counter = new AllUserInstalledAppCounter(mContext,
installReason, mPm, callback);
if (async) {
counter.execute();
} else {
counter.executeInForeground();
}
}
@Override

View File

@@ -20,25 +20,30 @@ import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.core.PreferenceController;
import com.android.settings.core.DynamicAvailabilityPreferenceController;
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.overlay.FeatureFactory;
public class EnterpriseInstalledPackagesPreferenceController extends PreferenceController {
public class EnterpriseInstalledPackagesPreferenceController
extends DynamicAvailabilityPreferenceController {
private static final String KEY_NUMBER_ENTERPRISE_INSTALLED_PACKAGES
= "number_enterprise_installed_packages";
private final ApplicationFeatureProvider mFeatureProvider;
private final boolean mAsync;
public EnterpriseInstalledPackagesPreferenceController(Context context) {
super(context);
public EnterpriseInstalledPackagesPreferenceController(Context context, Lifecycle lifecycle,
boolean async) {
super(context, lifecycle);
mFeatureProvider = FeatureFactory.getFactory(context)
.getApplicationFeatureProvider(context);
mAsync = async;
}
@Override
public void updateState(Preference preference) {
mFeatureProvider.calculateNumberOfInstalledApps(
PackageManager.INSTALL_REASON_POLICY,
PackageManager.INSTALL_REASON_POLICY, true /* async */,
(num) -> {
if (num == 0) {
preference.setVisible(false);
@@ -52,7 +57,20 @@ public class EnterpriseInstalledPackagesPreferenceController extends PreferenceC
@Override
public boolean isAvailable() {
return true;
if (mAsync) {
// When called on the main UI thread, we must not block. Since calculating the number of
// enterprise-installed apps takes a bit of time, we always return true here and
// determine the pref's actual visibility asynchronously in updateState().
return true;
}
// When called by the search indexer, we are on a background thread that we can block. Also,
// changes to the pref's visibility made in updateState() would not be seen by the indexer.
// We block and return synchronously whether there are enterprise-installed apps or not.
final Boolean[] haveEnterpriseInstalledPackages = { null };
mFeatureProvider.calculateNumberOfInstalledApps(PackageManager.INSTALL_REASON_POLICY,
false /* async */, (num) -> haveEnterpriseInstalledPackages[0] = num > 0);
return haveEnterpriseInstalledPackages[0];
}
@Override

View File

@@ -22,6 +22,7 @@ import android.provider.SearchIndexableResource;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.core.PreferenceController;
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -51,16 +52,22 @@ public class EnterprisePrivacySettings extends DashboardFragment {
@Override
protected List<PreferenceController> getPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle(), true /* async */);
}
private static List<PreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle, boolean async) {
final List controllers = new ArrayList<PreferenceController>();
controllers.add(new InstalledPackagesPreferenceController(context));
controllers.add(new NetworkLogsPreferenceController(context));
controllers.add(new BugReportsPreferenceController(context));
controllers.add(new SecurityLogsPreferenceController(context));
controllers.add(new EnterpriseInstalledPackagesPreferenceController(context));
controllers.add(new EnterpriseInstalledPackagesPreferenceController(context, lifecycle,
async));
controllers.add(new AdminGrantedLocationPermissionsPreferenceController(context));
controllers.add(new AdminGrantedMicrophonePermissionPreferenceController(context));
controllers.add(new AdminGrantedCameraPermissionPreferenceController(context));
controllers.add(new EnterpriseSetDefaultAppsPreferenceController(context));
controllers.add(new EnterpriseSetDefaultAppsPreferenceController(context, lifecycle));
controllers.add(new AlwaysOnVpnPrimaryUserPreferenceController(context));
controllers.add(new AlwaysOnVpnManagedProfilePreferenceController(context));
controllers.add(new GlobalHttpProxyPreferenceController(context));
@@ -91,6 +98,11 @@ public class EnterprisePrivacySettings extends DashboardFragment {
final SearchIndexableResource sir = new SearchIndexableResource(context);
sir.xmlResId = R.xml.enterprise_privacy_settings;
return Arrays.asList(sir);
}
@Override
public List<PreferenceController> getPreferenceControllers(Context context) {
return buildPreferenceControllers(context, null /* lifecycle */, false /* async */);
}
};
}

View File

@@ -22,22 +22,40 @@ import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.core.PreferenceController;
import com.android.settings.core.DynamicAvailabilityPreferenceController;
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.overlay.FeatureFactory;
public class EnterpriseSetDefaultAppsPreferenceController extends PreferenceController {
public class EnterpriseSetDefaultAppsPreferenceController
extends DynamicAvailabilityPreferenceController {
private static final String KEY_DEFAULT_APPS = "number_enterprise_set_default_apps";
private final ApplicationFeatureProvider mFeatureProvider;
public EnterpriseSetDefaultAppsPreferenceController(Context context) {
super(context);
public EnterpriseSetDefaultAppsPreferenceController(Context context, Lifecycle lifecycle) {
super(context, lifecycle);
mFeatureProvider = FeatureFactory.getFactory(context)
.getApplicationFeatureProvider(context);
}
@Override
public void updateState(Preference preference) {
final int num = getNumberOfEnterpriseSetDefaultApps();
preference.setSummary(mContext.getResources().getQuantityString(
R.plurals.enterprise_privacy_number_packages, num, num));
}
@Override
public boolean isAvailable() {
return getNumberOfEnterpriseSetDefaultApps() > 0;
}
@Override
public String getPreferenceKey() {
return KEY_DEFAULT_APPS;
}
private int getNumberOfEnterpriseSetDefaultApps() {
// Browser
int num = mFeatureProvider.findPersistentPreferredActivities(new Intent[] {
buildIntent(Intent.ACTION_VIEW, Intent.CATEGORY_BROWSABLE, "http:", null)}).size();
@@ -64,23 +82,7 @@ public class EnterpriseSetDefaultAppsPreferenceController extends PreferenceCont
num += mFeatureProvider.findPersistentPreferredActivities(new Intent[] {
new Intent(Intent.ACTION_DIAL), new Intent(Intent.ACTION_CALL)}).size();
if (num == 0) {
preference.setVisible(false);
} else {
preference.setVisible(true);
preference.setSummary(mContext.getResources().getQuantityString(
R.plurals.enterprise_privacy_number_packages, num, num));
}
}
@Override
public boolean isAvailable() {
return true;
}
@Override
public String getPreferenceKey() {
return KEY_DEFAULT_APPS;
return num;
}
private static Intent buildIntent(String action, String category, String protocol,

View File

@@ -36,7 +36,7 @@ public class InstalledPackagesPreferenceController extends PreferenceController
@Override
public void updateState(Preference preference) {
mFeatureProvider.calculateNumberOfInstalledApps(
ApplicationFeatureProvider.IGNORE_INSTALL_REASON,
ApplicationFeatureProvider.IGNORE_INSTALL_REASON, true /* async */,
(num) -> {
if (num == 0) {
preference.setSummary("");