Merge "Update strings and layout for enterprise privacy"

This commit is contained in:
TreeHugger Robot
2017-03-14 00:44:02 +00:00
committed by Android (Google) Code Review
15 changed files with 420 additions and 22 deletions

View File

@@ -58,6 +58,8 @@ import com.android.settings.TrustAgentUtils.TrustAgentComponentInfo;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.enterprise.EnterprisePrivacyPreferenceController;
import com.android.settings.enterprise.ManageDeviceAdminPreferenceController;
import com.android.settings.fingerprint.FingerprintSettings;
import com.android.settings.location.LocationPreferenceController;
import com.android.settings.overlay.FeatureFactory;
@@ -128,6 +130,10 @@ public class SecuritySettings extends SettingsPreferenceFragment
static final String KEY_PACKAGE_VERIFIER_STATUS = "security_status_package_verifier";
private static final int PACKAGE_VERIFIER_STATE_ENABLED = 1;
// Device management settings
private static final String KEY_ENTERPRISE_PRIVACY = "enterprise_privacy";
private static final String KEY_MANAGE_DEVICE_ADMIN = "manage_device_admin";
// These switch preferences need special handling since they're not all stored in Settings.
private static final String SWITCH_PREFERENCE_KEYS[] = {
KEY_SHOW_PASSWORD, KEY_UNIFICATION, KEY_VISIBLE_PATTERN_PROFILE
@@ -164,6 +170,8 @@ public class SecuritySettings extends SettingsPreferenceFragment
private String mCurrentProfilePassword;
private LocationPreferenceController mLocationcontroller;
private ManageDeviceAdminPreferenceController mManageDeviceAdminPreferenceController;
private EnterprisePrivacyPreferenceController mEnterprisePrivacyPreferenceController;
@Override
public int getMetricsCategory() {
@@ -201,6 +209,10 @@ public class SecuritySettings extends SettingsPreferenceFragment
}
mLocationcontroller = new LocationPreferenceController(activity);
mManageDeviceAdminPreferenceController
= new ManageDeviceAdminPreferenceController(activity);
mEnterprisePrivacyPreferenceController
= new EnterprisePrivacyPreferenceController(activity, null /* lifecycle */);
}
private static int getResIdForLockUnlockScreen(Context context,
@@ -394,6 +406,11 @@ public class SecuritySettings extends SettingsPreferenceFragment
}
mLocationcontroller.displayPreference(root);
mManageDeviceAdminPreferenceController.updateState(
root.findPreference(KEY_MANAGE_DEVICE_ADMIN));
mEnterprisePrivacyPreferenceController.displayPreference(root);
mEnterprisePrivacyPreferenceController.onResume();
return root;
}
@@ -895,6 +912,11 @@ public class SecuritySettings extends SettingsPreferenceFragment
keys.add(KEY_MANAGE_TRUST_AGENTS);
}
if (!(new EnterprisePrivacyPreferenceController(context, null /* lifecycle */))
.isAvailable()) {
keys.add(KEY_ENTERPRISE_PRIVACY);
}
return keys;
}
}

View File

@@ -30,6 +30,13 @@ import java.util.List;
* newer than the API version supported by Robolectric.
*/
public interface DevicePolicyManagerWrapper {
/**
* Calls {@code DevicePolicyManager.getActiveAdminsAsUser()}.
*
* @see android.app.admin.DevicePolicyManager#getActiveAdminsAsUser
*/
public @Nullable List<ComponentName> getActiveAdminsAsUser(int userId);
/**
* Calls {@code DevicePolicyManager.getMaximumFailedPasswordsForWipe()}.
*

View File

@@ -31,6 +31,11 @@ public class DevicePolicyManagerWrapperImpl implements DevicePolicyManagerWrappe
mDpm = dpm;
}
@Override
public @Nullable List<ComponentName> getActiveAdminsAsUser(int userId) {
return mDpm.getActiveAdminsAsUser(userId);
}
@Override
public int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin, int userHandle) {
return mDpm.getMaximumFailedPasswordsForWipe(admin, userHandle);

View File

@@ -31,6 +31,13 @@ public interface EnterprisePrivacyFeatureProvider {
*/
boolean isInCompMode();
/**
* Returns the name of the organization managing the device via a Device Owner app. If the device
* is not managed by a Device Owner app or the name of the managing organization was not set,
* returns {@code null}.
*/
String getDeviceOwnerOrganizationName();
/**
* Returns a message informing the user that the device is managed by a Device Owner app. The
* message includes a Learn More link that takes the user to the enterprise privacy section of
@@ -100,4 +107,10 @@ public interface EnterprisePrivacyFeatureProvider {
* managed profile (if any).
*/
int getNumberOfOwnerInstalledCaCertsInManagedProfile();
/**
* Returns the number of Device Admin apps active in the current user and the user's managed
* profile (if any).
*/
int getNumberOfActiveDeviceAdminsForCurrentUserAndManagedProfile();
}

View File

@@ -83,6 +83,16 @@ public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFe
return hasDeviceOwner() && getManagedProfileUserId() != UserHandle.USER_NULL;
}
@Override
public String getDeviceOwnerOrganizationName() {
final CharSequence organizationName = mDpm.getDeviceOwnerOrganizationName();
if (organizationName == null) {
return null;
} else {
return organizationName.toString();
}
}
@Override
public CharSequence getDeviceOwnerDisclosure() {
if (!hasDeviceOwner()) {
@@ -194,6 +204,19 @@ public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFe
return certs != null ? certs.size() : 0;
}
@Override
public int getNumberOfActiveDeviceAdminsForCurrentUserAndManagedProfile() {
int activeAdmins = 0;
for (final UserInfo userInfo : mUm.getProfiles(MY_USER_ID)) {
final List<ComponentName> activeAdminsForUser
= mDpm.getActiveAdminsAsUser(userInfo.id);
if (activeAdminsForUser != null) {
activeAdmins += activeAdminsForUser.size();
}
}
return activeAdmins;
}
protected static class EnterprisePrivacySpan extends ClickableSpan {
private final Context mContext;

View File

@@ -0,0 +1,56 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.android.settings.enterprise;
import android.content.Context;
import android.content.res.Resources;
import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.DynamicAvailabilityPreferenceController;
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.overlay.FeatureFactory;
public class EnterprisePrivacyPreferenceController extends DynamicAvailabilityPreferenceController {
private static final String KEY_ENTERPRISE_PRIVACY = "enterprise_privacy";
private final EnterprisePrivacyFeatureProvider mFeatureProvider;
public EnterprisePrivacyPreferenceController(Context context, Lifecycle lifecycle) {
super(context, lifecycle);
mFeatureProvider = FeatureFactory.getFactory(context)
.getEnterprisePrivacyFeatureProvider(context);
}
@Override
public void updateState(Preference preference) {
final String organizationName = mFeatureProvider.getDeviceOwnerOrganizationName();
if (organizationName == null) {
preference.setSummary(R.string.enterprise_privacy_settings_summary_generic);
} else {
preference.setSummary(mContext.getResources().getString(
R.string.enterprise_privacy_settings_summary_with_name, organizationName));
}
}
@Override
public boolean isAvailable() {
return mFeatureProvider.hasDeviceOwner();
}
@Override
public String getPreferenceKey() {
return KEY_ENTERPRISE_PRIVACY;
}
}

View File

@@ -0,0 +1,52 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.android.settings.enterprise;
import android.content.Context;
import android.content.res.Resources;
import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.PreferenceController;
import com.android.settings.overlay.FeatureFactory;
public class ManageDeviceAdminPreferenceController extends PreferenceController {
private static final String KEY_MANAGE_DEVICE_ADMIN = "manage_device_admin";
private final EnterprisePrivacyFeatureProvider mFeatureProvider;
public ManageDeviceAdminPreferenceController(Context context) {
super(context);
mFeatureProvider = FeatureFactory.getFactory(context)
.getEnterprisePrivacyFeatureProvider(context);
}
@Override
public void updateState(Preference preference) {
final int activeAdmins
= mFeatureProvider.getNumberOfActiveDeviceAdminsForCurrentUserAndManagedProfile();
preference.setSummary(mContext.getResources().getQuantityString(
R.plurals.number_of_device_admins, activeAdmins, activeAdmins));
}
@Override
public boolean isAvailable() {
return true;
}
@Override
public String getPreferenceKey() {
return KEY_MANAGE_DEVICE_ADMIN;
}
}

View File

@@ -172,6 +172,7 @@ public final class Ranking {
sRankMap.put(SecuritySettings.class.getName(), RANK_SECURITY);
sRankMap.put(ChooseLockGeneric.ChooseLockGenericFragment.class.getName(), RANK_SECURITY);
sRankMap.put(ScreenPinningSettings.class.getName(), RANK_SECURITY);
sRankMap.put(EnterprisePrivacySettings.class.getName(), RANK_SECURITY);
// Accounts
sRankMap.put(UserAndAccountDashboardFragment.class.getName(), RANK_ACCOUNT);
@@ -181,7 +182,6 @@ public final class Ranking {
// Privacy
sRankMap.put(PrivacySettings.class.getName(), RANK_PRIVACY);
sRankMap.put(EnterprisePrivacySettings.class.getName(), RANK_PRIVACY);
// Date / Time
sRankMap.put(DateTimeSettings.class.getName(), RANK_DATE_TIME);