summaryrefslogtreecommitdiff
path: root/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java')
-rw-r--r--Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java361
1 files changed, 361 insertions, 0 deletions
diff --git a/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
new file mode 100644
index 000000000..3c25e8612
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
@@ -0,0 +1,361 @@
+/*
+ * Copyright (C) 2021 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.tv.settings.enterprise;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.UserInfo;
+import android.content.res.Resources;
+import android.net.ConnectivityManager;
+import android.net.VpnManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.text.SpannableStringBuilder;
+import android.text.style.ClickableSpan;
+import android.view.View;
+
+import com.android.tv.settings.util.ResourcesUtil;
+
+import java.util.Date;
+import java.util.List;
+
+public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFeatureProvider {
+
+ public static final String ACTION_PARENTAL_CONTROLS = "android.settings.SHOW_PARENTAL_CONTROLS";
+
+ private final Context mContext;
+ private final DevicePolicyManager mDpm;
+ private final PackageManager mPm;
+ private final UserManager mUm;
+ private final ConnectivityManager mCm;
+ private final VpnManager mVm;
+ private final Resources mResources;
+
+ private static final int MY_USER_ID = UserHandle.myUserId();
+
+ public EnterprisePrivacyFeatureProviderImpl(Context context, DevicePolicyManager dpm,
+ PackageManager pm, UserManager um, ConnectivityManager cm, VpnManager vm,
+ Resources resources) {
+ mContext = context.getApplicationContext();
+ mDpm = dpm;
+ mPm = pm;
+ mUm = um;
+ mCm = cm;
+ mVm = vm;
+ mResources = resources;
+ }
+
+ @Override
+ public boolean hasDeviceOwner() {
+ return getDeviceOwnerComponent() != null;
+ }
+
+ @Override
+ public boolean isInCompMode() {
+ 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()) {
+ return null;
+ }
+
+ final SpannableStringBuilder disclosure = new SpannableStringBuilder();
+ final CharSequence organizationName = mDpm.getDeviceOwnerOrganizationName();
+ if (organizationName != null) {
+ disclosure.append(ResourcesUtil.getString(mContext, "do_disclosure_with_name",
+ organizationName));
+ } else {
+ disclosure.append(ResourcesUtil.getString(mContext, "do_disclosure_generic"));
+ }
+ disclosure.append(ResourcesUtil.getString(mContext, "do_disclosure_learn_more_separator"));
+ disclosure.append(ResourcesUtil.getString(mContext, "learn_more"),
+ new EnterprisePrivacySpan(mContext), 0);
+ return disclosure;
+ }
+
+ @Override
+ public Date getLastSecurityLogRetrievalTime() {
+ final long timestamp = mDpm.getLastSecurityLogRetrievalTime();
+ return timestamp < 0 ? null : new Date(timestamp);
+ }
+
+ @Override
+ public Date getLastBugReportRequestTime() {
+ final long timestamp = mDpm.getLastBugReportRequestTime();
+ return timestamp < 0 ? null : new Date(timestamp);
+ }
+
+ @Override
+ public Date getLastNetworkLogRetrievalTime() {
+ final long timestamp = mDpm.getLastNetworkLogRetrievalTime();
+ return timestamp < 0 ? null : new Date(timestamp);
+ }
+
+ @Override
+ public boolean isSecurityLoggingEnabled() {
+ return mDpm.isSecurityLoggingEnabled(null);
+ }
+
+ @Override
+ public boolean isNetworkLoggingEnabled() {
+ return mDpm.isNetworkLoggingEnabled(null);
+ }
+
+ @Override
+ public boolean isAlwaysOnVpnSetInCurrentUser() {
+ return mVm.getAlwaysOnVpnPackageForUser(MY_USER_ID) != null;
+ }
+
+ @Override
+ public boolean isAlwaysOnVpnSetInManagedProfile() {
+ final int managedProfileUserId = getManagedProfileUserId();
+ return managedProfileUserId != UserHandle.USER_NULL && (mVm.getAlwaysOnVpnPackageForUser(
+ managedProfileUserId) != null);
+ }
+
+ @Override
+ public int getMaximumFailedPasswordsBeforeWipeInCurrentUser() {
+ ComponentName owner = mDpm.getDeviceOwnerComponentOnCallingUser();
+ if (owner == null) {
+ owner = mDpm.getProfileOwnerAsUser(MY_USER_ID);
+ }
+ if (owner == null) {
+ return 0;
+ }
+ return mDpm.getMaximumFailedPasswordsForWipe(owner, MY_USER_ID);
+ }
+
+ @Override
+ public int getMaximumFailedPasswordsBeforeWipeInManagedProfile() {
+ final int userId = getManagedProfileUserId();
+ if (userId == UserHandle.USER_NULL) {
+ return 0;
+ }
+ final ComponentName profileOwner = mDpm.getProfileOwnerAsUser(userId);
+ if (profileOwner == null) {
+ return 0;
+ }
+ return mDpm.getMaximumFailedPasswordsForWipe(profileOwner, userId);
+ }
+
+ @Override
+ public String getImeLabelIfOwnerSet() {
+ if (!mDpm.isCurrentInputMethodSetByOwner()) {
+ return null;
+ }
+ final String packageName = Settings.Secure.getStringForUser(mContext.getContentResolver(),
+ Settings.Secure.DEFAULT_INPUT_METHOD, MY_USER_ID);
+ if (packageName == null) {
+ return null;
+ }
+ try {
+ return mPm.getApplicationInfoAsUser(packageName, 0 /* flags */, MY_USER_ID)
+ .loadLabel(mPm).toString();
+ } catch (PackageManager.NameNotFoundException e) {
+ return null;
+ }
+ }
+
+ @Override
+ public int getNumberOfOwnerInstalledCaCertsForCurrentUser() {
+ final List<String> certs = mDpm.getOwnerInstalledCaCerts(new UserHandle(MY_USER_ID));
+ if (certs == null) {
+ return 0;
+ }
+ return certs.size();
+ }
+
+ @Override
+ public int getNumberOfOwnerInstalledCaCertsForManagedProfile() {
+ final int userId = getManagedProfileUserId();
+ if (userId == UserHandle.USER_NULL) {
+ return 0;
+ }
+ final List<String> certs = mDpm.getOwnerInstalledCaCerts(new UserHandle(userId));
+ if (certs == null) {
+ return 0;
+ }
+ return certs.size();
+ }
+
+ @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;
+ }
+
+ @Override
+ public boolean hasWorkPolicyInfo() {
+ return (getWorkPolicyInfoIntentDO() != null) || (getWorkPolicyInfoIntentPO() != null);
+ }
+
+ @Override
+ public boolean showWorkPolicyInfo() {
+ Intent intent = getWorkPolicyInfoIntentDO();
+ if (intent != null) {
+ mContext.startActivity(intent);
+ return true;
+ }
+
+ intent = getWorkPolicyInfoIntentPO();
+ final UserInfo userInfo = getManagedProfileUserInfo();
+ if (intent != null && userInfo != null) {
+ mContext.startActivityAsUser(intent, userInfo.getUserHandle());
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean showParentalControls() {
+ Intent intent = getParentalControlsIntent();
+ if (intent != null) {
+ mContext.startActivity(intent);
+ return true;
+ }
+
+ return false;
+ }
+
+ private Intent getParentalControlsIntent() {
+ final ComponentName componentName =
+ mDpm.getProfileOwnerOrDeviceOwnerSupervisionComponent(new UserHandle(MY_USER_ID));
+ if (componentName == null) {
+ return null;
+ }
+
+ final Intent intent = new Intent(ACTION_PARENTAL_CONTROLS)
+ .setPackage(componentName.getPackageName())
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ final List<ResolveInfo> activities = mPm.queryIntentActivitiesAsUser(intent, 0, MY_USER_ID);
+ if (activities.size() != 0) {
+ return intent;
+ }
+ return null;
+ }
+
+ private ComponentName getDeviceOwnerComponent() {
+ if (!mPm.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN)) {
+ return null;
+ }
+ return mDpm.getDeviceOwnerComponentOnAnyUser();
+ }
+
+ private UserInfo getManagedProfileUserInfo() {
+ for (final UserInfo userInfo : mUm.getProfiles(MY_USER_ID)) {
+ if (userInfo.isManagedProfile()) {
+ return userInfo;
+ }
+ }
+ return null;
+ }
+
+ private int getManagedProfileUserId() {
+ final UserInfo userInfo = getManagedProfileUserInfo();
+ if (userInfo != null) {
+ return userInfo.id;
+ }
+ return UserHandle.USER_NULL;
+ }
+
+ private Intent getWorkPolicyInfoIntentDO() {
+ final ComponentName ownerComponent = getDeviceOwnerComponent();
+ if (ownerComponent == null) {
+ return null;
+ }
+
+ // Only search for the required action in the Device Owner's package
+ final Intent intent =
+ new Intent(Settings.ACTION_SHOW_WORK_POLICY_INFO)
+ .setPackage(ownerComponent.getPackageName())
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ final List<ResolveInfo> activities = mPm.queryIntentActivities(intent, 0);
+ if (activities.size() != 0) {
+ return intent;
+ }
+
+ return null;
+ }
+
+ private Intent getWorkPolicyInfoIntentPO() {
+ final int userId = getManagedProfileUserId();
+ if (userId == UserHandle.USER_NULL) {
+ return null;
+ }
+
+ final ComponentName ownerComponent = mDpm.getProfileOwnerAsUser(userId);
+ if (ownerComponent == null) {
+ return null;
+ }
+
+ // Only search for the required action in the Profile Owner's package
+ final Intent intent =
+ new Intent(Settings.ACTION_SHOW_WORK_POLICY_INFO)
+ .setPackage(ownerComponent.getPackageName())
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ final List<ResolveInfo> activities = mPm.queryIntentActivitiesAsUser(intent, 0, userId);
+ if (activities.size() != 0) {
+ return intent;
+ }
+
+ return null;
+ }
+
+ protected static class EnterprisePrivacySpan extends ClickableSpan {
+ private final Context mContext;
+
+ public EnterprisePrivacySpan(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ public void onClick(View widget) {
+ mContext.startActivity(new Intent(Settings.ACTION_ENTERPRISE_PRIVACY_SETTINGS)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return object instanceof EnterprisePrivacySpan
+ && ((EnterprisePrivacySpan) object).mContext == mContext;
+ }
+ }
+}