Home | History | Annotate | Download | only in enterprise
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.settings.enterprise;
     18 
     19 import android.content.ComponentName;
     20 import android.content.Context;
     21 import android.content.Intent;
     22 import android.content.pm.PackageManager;
     23 import android.content.pm.UserInfo;
     24 import android.content.res.Resources;
     25 import android.os.UserHandle;
     26 import android.os.UserManager;
     27 import android.provider.Settings;
     28 import android.text.SpannableStringBuilder;
     29 import android.text.style.ClickableSpan;
     30 import android.view.View;
     31 
     32 import com.android.settings.R;
     33 import com.android.settings.applications.PackageManagerWrapper;
     34 import com.android.settings.vpn2.ConnectivityManagerWrapper;
     35 import com.android.settings.vpn2.VpnUtils;
     36 
     37 import java.util.Date;
     38 import java.util.List;
     39 
     40 public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFeatureProvider {
     41 
     42     private final Context mContext;
     43     private final DevicePolicyManagerWrapper mDpm;
     44     private final PackageManagerWrapper mPm;
     45     private final UserManager mUm;
     46     private final ConnectivityManagerWrapper mCm;
     47     private final Resources mResources;
     48 
     49     private static final int MY_USER_ID = UserHandle.myUserId();
     50 
     51     public EnterprisePrivacyFeatureProviderImpl(Context context, DevicePolicyManagerWrapper dpm,
     52             PackageManagerWrapper pm, UserManager um, ConnectivityManagerWrapper cm,
     53             Resources resources) {
     54         mContext = context.getApplicationContext();
     55         mDpm = dpm;
     56         mPm = pm;
     57         mUm = um;
     58         mCm = cm;
     59         mResources = resources;
     60     }
     61 
     62     @Override
     63     public boolean hasDeviceOwner() {
     64         if (!mPm.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN)) {
     65             return false;
     66         }
     67         return mDpm.getDeviceOwnerComponentOnAnyUser() != null;
     68     }
     69 
     70     private int getManagedProfileUserId() {
     71         for (final UserInfo userInfo : mUm.getProfiles(MY_USER_ID)) {
     72             if (userInfo.isManagedProfile()) {
     73                 return userInfo.id;
     74             }
     75         }
     76         return UserHandle.USER_NULL;
     77     }
     78 
     79     @Override
     80     public boolean isInCompMode() {
     81         return hasDeviceOwner() && getManagedProfileUserId() != UserHandle.USER_NULL;
     82     }
     83 
     84     @Override
     85     public String getDeviceOwnerOrganizationName() {
     86         final CharSequence organizationName = mDpm.getDeviceOwnerOrganizationName();
     87         if (organizationName == null) {
     88             return null;
     89         } else {
     90             return organizationName.toString();
     91         }
     92     }
     93 
     94     @Override
     95     public CharSequence getDeviceOwnerDisclosure() {
     96         if (!hasDeviceOwner()) {
     97             return null;
     98         }
     99 
    100         final SpannableStringBuilder disclosure = new SpannableStringBuilder();
    101         final CharSequence organizationName = mDpm.getDeviceOwnerOrganizationName();
    102         if (organizationName != null) {
    103             disclosure.append(mResources.getString(R.string.do_disclosure_with_name,
    104                     organizationName));
    105         } else {
    106             disclosure.append(mResources.getString(R.string.do_disclosure_generic));
    107         }
    108         disclosure.append(mResources.getString(R.string.do_disclosure_learn_more_separator));
    109         disclosure.append(mResources.getString(R.string.do_disclosure_learn_more),
    110                 new EnterprisePrivacySpan(mContext), 0);
    111         return disclosure;
    112     }
    113 
    114     @Override
    115     public Date getLastSecurityLogRetrievalTime() {
    116         final long timestamp = mDpm.getLastSecurityLogRetrievalTime();
    117         return timestamp < 0 ? null : new Date(timestamp);
    118     }
    119 
    120     @Override
    121     public Date getLastBugReportRequestTime() {
    122         final long timestamp = mDpm.getLastBugReportRequestTime();
    123         return timestamp < 0 ? null : new Date(timestamp);
    124     }
    125 
    126     @Override
    127     public Date getLastNetworkLogRetrievalTime() {
    128         final long timestamp = mDpm.getLastNetworkLogRetrievalTime();
    129         return timestamp < 0 ? null : new Date(timestamp);
    130     }
    131 
    132     @Override
    133     public boolean isSecurityLoggingEnabled() {
    134         return mDpm.isSecurityLoggingEnabled(null);
    135     }
    136 
    137     @Override
    138     public boolean isNetworkLoggingEnabled() {
    139         return mDpm.isNetworkLoggingEnabled(null);
    140     }
    141 
    142     @Override
    143     public boolean isAlwaysOnVpnSetInCurrentUser() {
    144         return VpnUtils.isAlwaysOnVpnSet(mCm, MY_USER_ID);
    145     }
    146 
    147     @Override
    148     public boolean isAlwaysOnVpnSetInManagedProfile() {
    149         final int managedProfileUserId = getManagedProfileUserId();
    150         return managedProfileUserId != UserHandle.USER_NULL &&
    151                 VpnUtils.isAlwaysOnVpnSet(mCm, managedProfileUserId);
    152     }
    153 
    154     @Override
    155     public boolean isGlobalHttpProxySet() {
    156         return mCm.getGlobalProxy() != null;
    157     }
    158 
    159     @Override
    160     public int getMaximumFailedPasswordsBeforeWipeInCurrentUser() {
    161         final ComponentName profileOwner = mDpm.getProfileOwnerAsUser(MY_USER_ID);
    162         if (profileOwner == null) {
    163             return 0;
    164         }
    165         return mDpm.getMaximumFailedPasswordsForWipe(profileOwner, MY_USER_ID);
    166     }
    167 
    168     @Override
    169     public int getMaximumFailedPasswordsBeforeWipeInManagedProfile() {
    170         final int userId = getManagedProfileUserId();
    171         if (userId == UserHandle.USER_NULL) {
    172             return 0;
    173         }
    174         final ComponentName profileOwner = mDpm.getProfileOwnerAsUser(userId);
    175         if (profileOwner == null) {
    176             return 0;
    177         }
    178         return mDpm.getMaximumFailedPasswordsForWipe(profileOwner, userId);
    179     }
    180 
    181     @Override
    182     public String getImeLabelIfOwnerSet() {
    183         if (!mDpm.isCurrentInputMethodSetByOwner()) {
    184             return null;
    185         }
    186         final String packageName = Settings.Secure.getStringForUser(mContext.getContentResolver(),
    187                 Settings.Secure.DEFAULT_INPUT_METHOD, MY_USER_ID);
    188         if (packageName == null) {
    189             return null;
    190         }
    191         try {
    192             return mPm.getApplicationInfoAsUser(packageName, 0 /* flags */, MY_USER_ID)
    193                     .loadLabel(mPm.getPackageManager()).toString();
    194         } catch (PackageManager.NameNotFoundException e) {
    195             return null;
    196         }
    197     }
    198 
    199     @Override
    200     public int getNumberOfOwnerInstalledCaCertsForCurrentUserAndManagedProfile() {
    201         int num = 0;
    202         List<String> certs = mDpm.getOwnerInstalledCaCerts(new UserHandle(MY_USER_ID));
    203         if (certs != null) {
    204             num += certs.size();
    205         }
    206         final int userId = getManagedProfileUserId();
    207         if (userId != UserHandle.USER_NULL) {
    208             certs = mDpm.getOwnerInstalledCaCerts(new UserHandle(userId));
    209             if (certs != null) {
    210                 num += certs.size();
    211             }
    212         }
    213         return num;
    214     }
    215 
    216     @Override
    217     public int getNumberOfActiveDeviceAdminsForCurrentUserAndManagedProfile() {
    218         int activeAdmins = 0;
    219         for (final UserInfo userInfo : mUm.getProfiles(MY_USER_ID)) {
    220             final List<ComponentName> activeAdminsForUser
    221                     = mDpm.getActiveAdminsAsUser(userInfo.id);
    222             if (activeAdminsForUser != null) {
    223                 activeAdmins += activeAdminsForUser.size();
    224             }
    225         }
    226         return activeAdmins;
    227     }
    228 
    229     protected static class EnterprisePrivacySpan extends ClickableSpan {
    230         private final Context mContext;
    231 
    232         public EnterprisePrivacySpan(Context context) {
    233             mContext = context;
    234         }
    235 
    236         @Override
    237         public void onClick(View widget) {
    238             mContext.startActivity(new Intent(Settings.ACTION_ENTERPRISE_PRIVACY_SETTINGS));
    239         }
    240 
    241         @Override
    242         public boolean equals(Object object) {
    243             return object instanceof EnterprisePrivacySpan
    244                     && ((EnterprisePrivacySpan) object).mContext == mContext;
    245         }
    246     }
    247 }
    248