Added getDefaultAccountForNewContacts and
setDefaultAccountForNewContacts APIs
Bug: 352313110,364637693
Test: added new test (atest CtsContactsProviderTestCases:ContactsContract_DefaultAccountTest)
Flag: android.provider.new_default_account_api_enabled
modified: core/api/current.txt
modified: core/api/system-current.txt
modified: core/java/android/provider/ContactsContract.java
Change-Id: I0893e2d0dcd3175677ce9478e351044813295011
diff --git a/core/api/current.txt b/core/api/current.txt
index 4f91361..c3c41f8 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -36992,7 +36992,7 @@
}
@FlaggedApi("android.provider.new_default_account_api_enabled") public static final class ContactsContract.RawContacts.DefaultAccount {
- ctor public ContactsContract.RawContacts.DefaultAccount();
+ method @FlaggedApi("android.provider.new_default_account_api_enabled") @NonNull public static android.provider.ContactsContract.RawContacts.DefaultAccount.DefaultAccountAndState getDefaultAccountForNewContacts(@NonNull android.content.ContentResolver);
}
@FlaggedApi("android.provider.new_default_account_api_enabled") public static final class ContactsContract.RawContacts.DefaultAccount.DefaultAccountAndState {
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 4b6c62e..7e43e46 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -11950,6 +11950,10 @@
field @Deprecated public static final String STATE = "state";
}
+ @FlaggedApi("android.provider.new_default_account_api_enabled") public static final class ContactsContract.RawContacts.DefaultAccount {
+ method @FlaggedApi("android.provider.new_default_account_api_enabled") @RequiresPermission(android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS) public static void setDefaultAccountForNewContacts(@NonNull android.content.ContentResolver, @NonNull android.provider.ContactsContract.RawContacts.DefaultAccount.DefaultAccountAndState);
+ }
+
public static final class ContactsContract.Settings implements android.provider.ContactsContract.SettingsColumns {
method @RequiresPermission(android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS) public static void setDefaultAccount(@NonNull android.content.ContentResolver, @Nullable android.accounts.Account);
}
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 27b1dfb..d557046 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -3027,6 +3027,46 @@
*/
@FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
public static final class DefaultAccount {
+ /**
+ * Key in the outgoing Bundle for the default account list.
+ *
+ * @hide
+ */
+ public static final String KEY_ELIGIBLE_DEFAULT_ACCOUNTS =
+ "key_eligible_default_accounts";
+ /**
+ * The method to invoke in order to query eligiblie default accounts.
+ *
+ * @hide
+ */
+ public static final String QUERY_ELIGIBLE_DEFAULT_ACCOUNTS_METHOD =
+ "queryEligibleDefaultAccounts";
+ /**
+ * Key in the Bundle for the default account state.
+ *
+ * @hide
+ */
+ public static final String KEY_DEFAULT_ACCOUNT_STATE =
+ "key_default_account_state";
+ /**
+ * The method to invoke in order to set the default account.
+ *
+ * @hide
+ */
+ public static final String SET_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD =
+ "setDefaultAccountForNewContacts";
+ /**
+ * The method to invoke in order to query the default account.
+ *
+ * @hide
+ */
+ public static final String QUERY_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD =
+ "queryDefaultAccountForNewContacts";
+
+ private DefaultAccount() {
+
+ }
+
/**
* Represents the state of the default account, and the actual {@link Account} if it's
@@ -3228,6 +3268,94 @@
public @interface DefaultAccountState {
}
}
+
+ /**
+ * Get the account that is set as the default account for new contacts, which should be
+ * initially selected when creating a new contact on contact management apps.
+ *
+ * @param resolver the ContentResolver to query.
+ *
+ * @return the default account state for new contacts.
+ * @throws RuntimeException if failed to look up the default account.
+ * @throws IllegalStateException if the default account is in an invalid state.
+ */
+ @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
+ public static @NonNull DefaultAccountAndState getDefaultAccountForNewContacts(
+ @NonNull ContentResolver resolver) {
+ Bundle response = nullSafeCall(resolver, ContactsContract.AUTHORITY_URI,
+ QUERY_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD, null, null);
+
+ int defaultContactsAccountState = response.getInt(KEY_DEFAULT_ACCOUNT_STATE, -1);
+ if (defaultContactsAccountState
+ == DefaultAccountAndState.DEFAULT_ACCOUNT_STATE_CLOUD) {
+ String accountName = response.getString(Settings.ACCOUNT_NAME);
+ String accountType = response.getString(Settings.ACCOUNT_TYPE);
+ if (TextUtils.isEmpty(accountName) || TextUtils.isEmpty(accountType)) {
+ throw new IllegalStateException(
+ "account name and type cannot be null or empty");
+ }
+ return new DefaultAccountAndState(
+ DefaultAccountAndState.DEFAULT_ACCOUNT_STATE_CLOUD,
+ new Account(accountName, accountType));
+ } else if (defaultContactsAccountState
+ == DefaultAccountAndState.DEFAULT_ACCOUNT_STATE_LOCAL
+ || defaultContactsAccountState
+ == DefaultAccountAndState.DEFAULT_ACCOUNT_STATE_NOT_SET) {
+ return new DefaultAccountAndState(defaultContactsAccountState, /*cloudAccount=*/
+ null);
+ } else {
+ throw new IllegalStateException("Invalid default account state");
+ }
+ }
+
+ /**
+ * Sets the default account that should be initially selected when creating a new
+ * contact on
+ * contact management apps. Apps can only set one of
+ * The following accounts as the default account:
+ * <ol>
+ * <li> local account
+ * <li> cloud account that are eligible to be set as default account.
+ * </ol>
+ *
+ * @param resolver the ContentResolver to query.
+ * @param defaultAccountAndState the default account and state to be set. To set the
+ * local
+ * account as the
+ * default account, this parameter should be
+ * {@link DefaultAccountAndState#ofLocal()}. To set the a
+ * cloud
+ * account as the default account, this parameter should
+ * be
+ * {@link DefaultAccountAndState#ofCloud(Account)}. To
+ * set
+ * the
+ * default account to a "not set" state, this parameter
+ * should
+ * be {@link DefaultAccountAndState#ofNotSet()}.
+ *
+ * @throws RuntimeException if it fails to set the default account.
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS)
+ @FlaggedApi(Flags.FLAG_NEW_DEFAULT_ACCOUNT_API_ENABLED)
+ @SystemApi
+ public static void setDefaultAccountForNewContacts(@NonNull ContentResolver resolver,
+ @NonNull DefaultAccountAndState defaultAccountAndState) {
+ Bundle extras = new Bundle();
+
+ extras.putInt(KEY_DEFAULT_ACCOUNT_STATE, defaultAccountAndState.getState());
+ if (defaultAccountAndState.getState()
+ == DefaultAccountAndState.DEFAULT_ACCOUNT_STATE_CLOUD) {
+ Account cloudAccount = defaultAccountAndState.getAccount();
+ assert cloudAccount != null;
+ extras.putString(Settings.ACCOUNT_NAME, cloudAccount.name);
+ extras.putString(Settings.ACCOUNT_TYPE, cloudAccount.type);
+ }
+ nullSafeCall(resolver, ContactsContract.AUTHORITY_URI,
+ SET_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD, null, extras);
+ }
}
/**
@@ -9055,30 +9183,6 @@
public static final String KEY_DEFAULT_ACCOUNT = "key_default_account";
/**
- * Key in the Bundle for the default account state.
- *
- * @hide
- */
- public static final String KEY_DEFAULT_ACCOUNT_STATE =
- "key_default_contacts_account_state";
-
- /**
- * The method to invoke in order to set the default account.
- *
- * @hide
- */
- public static final String SET_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD =
- "setDefaultAccountForNewContacts";
-
- /**
- * The method to invoke in order to query the default account.
- *
- * @hide
- */
- public static final String QUERY_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD =
- "queryDefaultAccountForNewContacts";
-
- /**
* Get the account that is set as the default account for new contacts, which should be
* initially selected when creating a new contact on contact management apps.
* If the setting has not been set by any app, it will return null. Once the setting