Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e554874 authored by Liefu Liu's avatar Liefu Liu Committed by Christopher Werner
Browse files

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
parent 53aebb03
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -36992,7 +36992,7 @@ package android.provider {
  }
  @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 {
+4 −0
Original line number Diff line number Diff line
@@ -11950,6 +11950,10 @@ package android.provider {
    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);
  }
+128 −24
Original line number Diff line number Diff line
@@ -3027,6 +3027,46 @@ public final class ContactsContract {
         */
        @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 final class ContactsContract {
                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);
            }
        }

        /**
@@ -9054,30 +9182,6 @@ public final class ContactsContract {
         */
        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.