Add settings intent dialog

Add a dialog that can be launched via
an intent to prompt the user to enable
the provider for credman.

Test: make & atest & manual
Bug: 267816998
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:9d74509888b7dd65b287bc68b9445d9e23809cce)
Merged-In: Id88cc7b3bf2829d075fbba87ea5dc0a245b9ae32

Change-Id: Id88cc7b3bf2829d075fbba87ea5dc0a245b9ae32
This commit is contained in:
Becca Hughes
2023-02-03 00:04:21 +00:00
parent 40019f876b
commit b5f8ba6945
7 changed files with 353 additions and 7 deletions

View File

@@ -24,11 +24,16 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.ServiceInfo;
import android.credentials.CredentialProviderInfo;
import android.net.Uri;
import android.os.Looper;
import android.provider.Settings;
import androidx.lifecycle.Lifecycle;
import androidx.preference.PreferenceCategory;
@@ -47,6 +52,7 @@ import org.junit.runner.RunWith;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
@RunWith(AndroidJUnit4.class)
@@ -55,6 +61,8 @@ public class CredentialManagerPreferenceControllerTest {
private Context mContext;
private PreferenceScreen mScreen;
private PreferenceCategory mCredentialsPreferenceCategory;
private CredentialManagerPreferenceController.Delegate mDelegate;
private Optional<Integer> mReceivedResultCode;
private static final String TEST_PACKAGE_NAME_A = "com.android.providerA";
private static final String TEST_PACKAGE_NAME_B = "com.android.providerB";
@@ -62,6 +70,8 @@ public class CredentialManagerPreferenceControllerTest {
private static final String TEST_TITLE_APP_A = "test app A";
private static final String TEST_TITLE_APP_B = "test app B";
private static final String TEST_TITLE_SERVICE_C = "test service C1";
private static final String PRIMARY_INTENT = "android.settings.CREDENTIAL_PROVIDER";
private static final String ALTERNATE_INTENT = "android.settings.SYNC_SETTINGS";
@Before
public void setUp() {
@@ -73,9 +83,17 @@ public class CredentialManagerPreferenceControllerTest {
mCredentialsPreferenceCategory = new PreferenceCategory(mContext);
mCredentialsPreferenceCategory.setKey("credentials_test");
mScreen.addPreference(mCredentialsPreferenceCategory);
mReceivedResultCode = Optional.empty();
mDelegate =
new CredentialManagerPreferenceController.Delegate() {
@Override
public void setActivityResult(int resultCode) {
mReceivedResultCode = Optional.of(resultCode);
}
};
}
/*@Test
@Test
// Tests that getAvailabilityStatus() does not throw an exception if it's called before the
// Controller is initialized (this can happen during indexing).
public void getAvailabilityStatus_withoutInit_returnsUnavailable() {
@@ -252,7 +270,7 @@ public class CredentialManagerPreferenceControllerTest {
assertThat(enabledServices.size()).isEqualTo(1);
assertThat(enabledServices.contains("com.android.provider1/ClassA")).isFalse();
assertThat(enabledServices.contains("com.android.provider2/ClassA")).isTrue();
}*/
}
@Test
public void displayPreference_withServices_preferencesAdded_sameAppShouldBeMerged() {
@@ -312,12 +330,120 @@ public class CredentialManagerPreferenceControllerTest {
assertThat(prefs.get(TEST_PACKAGE_NAME_C).isChecked()).isTrue();
}
@Test
public void handleIntentWithProviderServiceInfo_handleBadIntent_missingData() {
CredentialProviderInfo cpi = createCredentialProviderInfo();
CredentialManagerPreferenceController controller =
createControllerWithServices(Lists.newArrayList(cpi));
// Create an intent with missing data.
Intent missingDataIntent = new Intent(PRIMARY_INTENT);
assertThat(controller.verifyReceivedIntent(missingDataIntent)).isFalse();
}
@Test
public void handleIntentWithProviderServiceInfo_handleBadIntent_successDialog() {
CredentialProviderInfo cpi = createCredentialProviderInfo();
CredentialManagerPreferenceController controller =
createControllerWithServices(Lists.newArrayList(cpi));
String packageName = cpi.getServiceInfo().packageName;
// Create an intent with valid data.
Intent intent = new Intent(PRIMARY_INTENT);
intent.setData(Uri.parse("package:" + packageName));
assertThat(controller.verifyReceivedIntent(intent)).isTrue();
controller.completeEnableProviderDialogBox(DialogInterface.BUTTON_POSITIVE, packageName);
assertThat(mReceivedResultCode.get()).isEqualTo(Activity.RESULT_OK);
}
@Test
public void handleIntentWithProviderServiceInfo_handleIntent_cancelDialog() {
CredentialProviderInfo cpi = createCredentialProviderInfo();
CredentialManagerPreferenceController controller =
createControllerWithServices(Lists.newArrayList(cpi));
String packageName = cpi.getServiceInfo().packageName;
// Create an intent with valid data.
Intent intent = new Intent(PRIMARY_INTENT);
intent.setData(Uri.parse("package:" + packageName));
assertThat(controller.verifyReceivedIntent(intent)).isTrue();
controller.completeEnableProviderDialogBox(DialogInterface.BUTTON_NEGATIVE, packageName);
assertThat(mReceivedResultCode.get()).isEqualTo(Activity.RESULT_CANCELED);
}
@Test
public void handleOtherIntentWithProviderServiceInfo_handleBadIntent_missingData() {
CredentialProviderInfo cpi = createCredentialProviderInfo();
CredentialManagerPreferenceController controller =
createControllerWithServices(Lists.newArrayList(cpi));
// Create an intent with missing data.
Intent missingDataIntent = new Intent(ALTERNATE_INTENT);
assertThat(controller.verifyReceivedIntent(missingDataIntent)).isFalse();
}
@Test
public void handleOtherIntentWithProviderServiceInfo_handleBadIntent_successDialog() {
CredentialProviderInfo cpi = createCredentialProviderInfo();
CredentialManagerPreferenceController controller =
createControllerWithServices(Lists.newArrayList(cpi));
String packageName = cpi.getServiceInfo().packageName;
// Create an intent with valid data.
Intent intent = new Intent(ALTERNATE_INTENT);
intent.setData(Uri.parse("package:" + packageName));
assertThat(controller.verifyReceivedIntent(intent)).isTrue();
controller.completeEnableProviderDialogBox(DialogInterface.BUTTON_POSITIVE, packageName);
assertThat(mReceivedResultCode.get()).isEqualTo(Activity.RESULT_OK);
}
@Test
public void handleOtherIntentWithProviderServiceInfo_handleIntent_cancelDialog() {
CredentialProviderInfo cpi = createCredentialProviderInfo();
CredentialManagerPreferenceController controller =
createControllerWithServices(Lists.newArrayList(cpi));
String packageName = cpi.getServiceInfo().packageName;
// Create an intent with valid data.
Intent intent = new Intent(ALTERNATE_INTENT);
intent.setData(Uri.parse("package:" + packageName));
assertThat(controller.verifyReceivedIntent(intent)).isTrue();
controller.completeEnableProviderDialogBox(DialogInterface.BUTTON_NEGATIVE, packageName);
assertThat(mReceivedResultCode.get()).isEqualTo(Activity.RESULT_CANCELED);
}
@Test
public void handleIntentWithProviderServiceInfo_handleIntent_incorrectAction() {
CredentialProviderInfo cpi = createCredentialProviderInfo();
CredentialManagerPreferenceController controller =
createControllerWithServices(Lists.newArrayList(cpi));
String packageName = cpi.getServiceInfo().packageName;
// Create an intent with valid data.
Intent intent = new Intent(Settings.ACTION_REQUEST_SET_AUTOFILL_SERVICE);
intent.setData(Uri.parse("package:" + packageName));
assertThat(controller.verifyReceivedIntent(intent)).isFalse();
assertThat(mReceivedResultCode.isPresent()).isFalse();
}
@Test
public void handleIntentWithProviderServiceInfo_handleNullIntent() {
CredentialProviderInfo cpi = createCredentialProviderInfo();
CredentialManagerPreferenceController controller =
createControllerWithServices(Lists.newArrayList(cpi));
// Use a null intent.
assertThat(controller.verifyReceivedIntent(null)).isFalse();
assertThat(mReceivedResultCode.isPresent()).isFalse();
}
private CredentialManagerPreferenceController createControllerWithServices(
List<CredentialProviderInfo> availableServices) {
CredentialManagerPreferenceController controller =
new CredentialManagerPreferenceController(
mContext, mCredentialsPreferenceCategory.getKey());
controller.setAvailableServices(() -> mock(Lifecycle.class), availableServices);
controller.setDelegate(mDelegate);
return controller;
}