Merge "Visual updated for CollapsingToolbarLayout"
diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java
index 6bfd01a..881affc 100644
--- a/src/com/android/settings/core/FeatureFlags.java
+++ b/src/com/android/settings/core/FeatureFlags.java
@@ -21,7 +21,6 @@
*/
public class FeatureFlags {
public static final String AUDIO_SWITCHER_SETTINGS = "settings_audio_switcher";
- public static final String DYNAMIC_SYSTEM = "settings_dynamic_system";
public static final String HEARING_AID_SETTINGS = "settings_bluetooth_hearing_aid";
public static final String WIFI_DETAILS_DATAUSAGE_HEADER =
"settings_wifi_details_datausage_header";
diff --git a/src/com/android/settings/development/DSULoader.java b/src/com/android/settings/development/DSULoader.java
index 1c897c4..d4fa0c6 100644
--- a/src/com/android/settings/development/DSULoader.java
+++ b/src/com/android/settings/development/DSULoader.java
@@ -55,8 +55,6 @@
* also offers the flexibility to overwrite the default setting and load OEMs owned images.
*/
public class DSULoader extends ListActivity {
- public static final String PROPERTY_KEY_FEATURE_FLAG =
- "persist.sys.fflag.override.settings_dynamic_system";
private static final int Q_VNDK_BASE = 28;
private static final int Q_OS_BASE = 10;
@@ -344,7 +342,6 @@
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
- SystemProperties.set(PROPERTY_KEY_FEATURE_FLAG, "1");
String dsuList = SystemProperties.get(PROPERTY_KEY_LIST);
Slog.e(TAG, "Try to get DSU list from: " + PROPERTY_KEY_LIST);
if (dsuList == null || dsuList.isEmpty()) {
diff --git a/src/com/android/settings/development/featureflags/FeatureFlagPersistent.java b/src/com/android/settings/development/featureflags/FeatureFlagPersistent.java
index d89df79..7670ef1 100644
--- a/src/com/android/settings/development/featureflags/FeatureFlagPersistent.java
+++ b/src/com/android/settings/development/featureflags/FeatureFlagPersistent.java
@@ -35,7 +35,6 @@
static {
PERSISTENT_FLAGS = new HashSet<>();
PERSISTENT_FLAGS.add(FeatureFlags.HEARING_AID_SETTINGS);
- PERSISTENT_FLAGS.add(FeatureFlags.DYNAMIC_SYSTEM);
}
public static boolean isEnabled(Context context, String feature) {
diff --git a/src/com/android/settings/security/CredentialManagementAppButtonsController.java b/src/com/android/settings/security/CredentialManagementAppButtonsController.java
index 9efa098..c6afded 100644
--- a/src/com/android/settings/security/CredentialManagementAppButtonsController.java
+++ b/src/com/android/settings/security/CredentialManagementAppButtonsController.java
@@ -17,6 +17,7 @@
package com.android.settings.security;
import android.app.AppOpsManager;
+import android.app.admin.DevicePolicyEventLogger;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -25,6 +26,7 @@
import android.os.RemoteException;
import android.security.IKeyChainService;
import android.security.KeyChain;
+import android.stats.devicepolicy.DevicePolicyEnums;
import android.util.Log;
import androidx.preference.PreferenceScreen;
@@ -98,6 +100,9 @@
try {
IKeyChainService service = KeyChain.bind(mContext).getService();
service.removeCredentialManagementApp();
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.CREDENTIAL_MANAGEMENT_APP_REMOVED)
+ .write();
} catch (InterruptedException | RemoteException e) {
Log.e(TAG, "Unable to remove the credential management app");
}
diff --git a/src/com/android/settings/security/RequestManageCredentials.java b/src/com/android/settings/security/RequestManageCredentials.java
index 56fa83d..4ee4fdf 100644
--- a/src/com/android/settings/security/RequestManageCredentials.java
+++ b/src/com/android/settings/security/RequestManageCredentials.java
@@ -18,9 +18,11 @@
import android.annotation.Nullable;
import android.app.Activity;
+import android.app.admin.DevicePolicyEventLogger;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.pm.UserInfo;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
@@ -30,6 +32,7 @@
import android.security.AppUriAuthenticationPolicy;
import android.security.Credentials;
import android.security.KeyChain;
+import android.stats.devicepolicy.DevicePolicyEnums;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -45,6 +48,8 @@
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
+import java.util.Map;
+
/**
* Displays a full screen to the user asking whether the calling app can manage the user's
* KeyChain credentials. This screen includes the authentication policy highlighting what apps and
@@ -86,21 +91,28 @@
if (!Credentials.ACTION_MANAGE_CREDENTIALS.equals(getIntent().getAction())) {
Log.e(TAG, "Unable to start activity because intent action is not "
+ Credentials.ACTION_MANAGE_CREDENTIALS);
+ logRequestFailure();
finishWithResultCancelled();
return;
}
if (isManagedDevice()) {
Log.e(TAG, "Credential management on managed devices should be done by the Device "
+ "Policy Controller, not a credential management app");
+ logRequestFailure();
finishWithResultCancelled();
return;
}
mCredentialManagerPackage = getLaunchedFromPackage();
if (TextUtils.isEmpty(mCredentialManagerPackage)) {
Log.e(TAG, "Unknown credential manager app");
+ logRequestFailure();
finishWithResultCancelled();
return;
}
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.CREDENTIAL_MANAGEMENT_APP_REQUEST_NAME)
+ .setStrings(mCredentialManagerPackage)
+ .write();
setContentView(R.layout.request_manage_credentials);
mKeyChainTread = new HandlerThread("KeyChainConnection");
@@ -111,10 +123,16 @@
getIntent().getParcelableExtra(KeyChain.EXTRA_AUTHENTICATION_POLICY);
if (!isValidAuthenticationPolicy(policy)) {
Log.e(TAG, "Invalid authentication policy");
+ logRequestFailure();
finishWithResultCancelled();
return;
}
mAuthenticationPolicy = policy;
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.CREDENTIAL_MANAGEMENT_APP_REQUEST_POLICY)
+ .setStrings(getNumberOfAuthenticationPolicyApps(mAuthenticationPolicy),
+ getNumberOfAuthenticationPolicyUris(mAuthenticationPolicy))
+ .write();
loadRecyclerView();
loadButtons();
@@ -185,6 +203,9 @@
Button allowButton = findViewById(R.id.allow_button);
dontAllowButton.setOnClickListener(b -> {
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.CREDENTIAL_MANAGEMENT_APP_REQUEST_DENIED)
+ .write();
finishWithResultCancelled();
});
allowButton.setOnClickListener(b -> setOrUpdateCredentialManagementApp());
@@ -203,8 +224,12 @@
try {
mKeyChainConnection.getService().setCredentialManagementApp(
mCredentialManagerPackage, mAuthenticationPolicy);
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.CREDENTIAL_MANAGEMENT_APP_REQUEST_ACCEPTED)
+ .write();
} catch (RemoteException e) {
Log.e(TAG, "Unable to set credential manager app", e);
+ logRequestFailure();
}
finish();
}
@@ -269,4 +294,24 @@
setResult(RESULT_CANCELED);
finish();
}
+
+ private void logRequestFailure() {
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.CREDENTIAL_MANAGEMENT_APP_REQUEST_FAILED)
+ .write();
+ }
+
+ private String getNumberOfAuthenticationPolicyUris(AppUriAuthenticationPolicy policy) {
+ int numberOfUris = 0;
+ for (Map.Entry<String, Map<Uri, String>> appsToUris :
+ policy.getAppAndUriMappings().entrySet()) {
+ numberOfUris += appsToUris.getValue().size();
+ }
+ return String.valueOf(numberOfUris);
+ }
+
+ private String getNumberOfAuthenticationPolicyApps(AppUriAuthenticationPolicy policy) {
+ return String.valueOf(policy.getAppAndUriMappings().size());
+ }
+
}