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);
+ }
}