diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_certificate_info.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_certificate_info.png new file mode 100644 index 0000000000000..b1e0ff4d19587 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/ic_qs_certificate_info.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_certificate_info.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_certificate_info.png new file mode 100644 index 0000000000000..d7104c5a9997e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/ic_qs_certificate_info.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_certificate_info.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_certificate_info.png new file mode 100644 index 0000000000000..1bb29027b4bfe Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/ic_qs_certificate_info.png differ diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 1a0a1f018619d..8e886104fc31d 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -500,4 +500,20 @@ ! + + + Network may be monitored + + Done + + Network Monitoring + + This device is managed by: %s.\n\nYour administrator is capable of monitoring your network activity, including emails, apps, and secure websites.\n\nFor more information,contact your administrator. + + A third party is capable of monitoring your network\nactivity, including emails, apps, and secure websites.\n\nA trusted credential installed on your device is making this possible. + + Check trusted credentials diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java index 5f034a8c752c1..b9c6fef9c5d78 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java @@ -20,6 +20,7 @@ import android.app.ActivityManagerNative; import android.app.AlertDialog; import android.app.Dialog; import android.app.PendingIntent; +import android.app.admin.DevicePolicyManager; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -49,6 +50,7 @@ import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.Profile; import android.provider.Settings; +import android.security.KeyChain; import android.util.Log; import android.util.Pair; import android.view.LayoutInflater; @@ -89,6 +91,7 @@ class QuickSettings { private ViewGroup mContainerView; private DisplayManager mDisplayManager; + private DevicePolicyManager mDevicePolicyManager; private WifiDisplayStatus mWifiDisplayStatus; private PhoneStatusBar mStatusBarService; private BluetoothState mBluetoothState; @@ -100,6 +103,7 @@ class QuickSettings { private LocationController mLocationController; private AsyncTask> mUserInfoTask; + private AsyncTask> mQueryCertTask; private LevelListDrawable mBatteryLevels; private LevelListDrawable mChargingBatteryLevels; @@ -116,6 +120,8 @@ class QuickSettings { public QuickSettings(Context context, QuickSettingsContainerView container) { mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); + mDevicePolicyManager + = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); mContext = context; mContainerView = container; mModel = new QuickSettingsModel(context); @@ -137,6 +143,7 @@ class QuickSettings { filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + filter.addAction(KeyChain.ACTION_STORAGE_CHANGED); mContext.registerReceiver(mReceiver, filter); IntentFilter profileFilter = new IntentFilter(); @@ -181,6 +188,26 @@ class QuickSettings { rotationLockController.addRotationLockControllerCallback(mModel); } + private void queryForSslCaCerts() { + mQueryCertTask = new AsyncTask>() { + @Override + protected Pair doInBackground(Void... params) { + boolean hasCert = mDevicePolicyManager.hasAnyCaCertsInstalled(); + boolean isManaged = mDevicePolicyManager.getDeviceOwner() != null; + + return Pair.create(hasCert, isManaged); + } + @Override + protected void onPostExecute(Pair result) { + super.onPostExecute(result); + boolean hasCert = result.first; + boolean isManaged = result.second; + mModel.setSslCaCertWarningTileInfo(hasCert, isManaged); + } + }; + mQueryCertTask.execute(); + } + private void queryForUserInformation() { Context currentUserContext = null; UserInfo userInfo = null; @@ -254,6 +281,7 @@ class QuickSettings { addTemporaryTiles(mContainerView, inflater); queryForUserInformation(); + queryForSslCaCerts(); mTilesSetUp = true; } @@ -721,6 +749,25 @@ class QuickSettings { }); parent.addView(imeTile); */ + + // SSL CA Cert Warning. + final QuickSettingsBasicTile sslCaCertWarningTile = new QuickSettingsBasicTile(mContext); + sslCaCertWarningTile.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + collapsePanels(); + showSslCaCertWarningDialog(); + } + }); + + sslCaCertWarningTile.setImageResource( + com.android.internal.R.drawable.indicator_input_error); + sslCaCertWarningTile.setTextResource(R.string.ssl_ca_cert_warning); + + mModel.addSslCaCertWarningTile(sslCaCertWarningTile, + new QuickSettingsModel.BasicRefreshCallback(sslCaCertWarningTile) + .setShowWhenEnabled(true)); + parent.addView(sslCaCertWarningTile); } void updateResources() { @@ -777,6 +824,45 @@ class QuickSettings { dialog.show(); } + private void showSslCaCertWarningDialog() { + final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); + builder.setTitle(R.string.ssl_ca_cert_dialog_title); + builder.setCancelable(true); + final boolean hasDeviceOwner = mDevicePolicyManager.getDeviceOwner() != null; + int buttonLabel; + if (hasDeviceOwner) { + // Institutional case. Show informational message. + String message = mContext.getResources().getString(R.string.ssl_ca_cert_info_message, + mDevicePolicyManager.getDeviceOwnerName()); + builder.setMessage(message); + buttonLabel = R.string.done_button; + } else { + // Consumer case. Show scary warning. + builder.setMessage(R.string.ssl_ca_cert_warning_message); + buttonLabel = R.string.ssl_ca_cert_settings_button; + } + + builder.setPositiveButton(buttonLabel, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // do something. + if (hasDeviceOwner) { + // Close + } else { + startSettingsActivity("com.android.settings.TRUSTED_CREDENTIALS_USER"); + } + } + }); + + final Dialog dialog = builder.create(); + dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); + try { + WindowManagerGlobal.getWindowManagerService().dismissKeyguard(); + } catch (RemoteException e) { + } + dialog.show(); + } + private void updateWifiDisplayStatus() { mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus(); applyWifiDisplayStatus(); @@ -801,6 +887,7 @@ class QuickSettings { } if (mTilesSetUp) { queryForUserInformation(); + queryForSslCaCerts(); } } @@ -829,6 +916,8 @@ class QuickSettings { if (mUseDefaultAvatar) { queryForUserInformation(); } + } else if (KeyChain.ACTION_STORAGE_CHANGED.equals(action)) { + queryForSslCaCerts(); } } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java index 02a3690e33424..98e480aa588b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java @@ -263,6 +263,10 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, private RefreshCallback mSettingsCallback; private State mSettingsState = new State(); + private QuickSettingsTileView mSslCaCertWarningTile; + private RefreshCallback mSslCaCertWarningCallback; + private State mSslCaCertWarningState = new State(); + private RotationLockController mRotationLockController; public QuickSettingsModel(Context context) { @@ -747,4 +751,23 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, void refreshBrightnessTile() { onBrightnessLevelChanged(); } + + // SSL CA Cert warning. + public void addSslCaCertWarningTile(QuickSettingsTileView view, RefreshCallback cb) { + mSslCaCertWarningTile = view; + mSslCaCertWarningCallback = cb; + // Set a sane default while we wait for the AsyncTask to finish (no cert). + setSslCaCertWarningTileInfo(false, true); + } + public void setSslCaCertWarningTileInfo(boolean hasCert, boolean isManaged) { + Resources r = mContext.getResources(); + mSslCaCertWarningState.enabled = hasCert; + if (isManaged) { + mSslCaCertWarningState.iconId = R.drawable.ic_qs_certificate_info; + } else { + mSslCaCertWarningState.iconId = android.R.drawable.stat_notify_error; + } + mSslCaCertWarningState.label = r.getString(R.string.ssl_ca_cert_warning); + mSslCaCertWarningCallback.refreshView(mSslCaCertWarningTile, mSslCaCertWarningState); + } }