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

Commit dd107efe authored by guanxiongliu's avatar guanxiongliu Committed by android-build-merger
Browse files

Merge "Stop Prompting user to add account when no account available Bug:25161189"

am: 61dea672

* commit '61dea672':
  Stop Prompting user to add account when no account available Bug:25161189
parents 0d40ee25 61dea672
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -678,9 +678,6 @@
         contact filter state. [CHAR LIMIT=64] -->
    <string name="toast_displaying_all_contacts">Displaying all contacts</string>

    <!-- Message in the standard "no account" prompt that encourages the user to add a Google account before continuing to use the People app [CHAR LIMIT=NONE] -->
    <string name="no_account_prompt">Contacts works better with a Google Account.\n\n\u2022 Access from any web browser.\n\u2022 Back up your contacts securely.</string>

    <!-- Message in the standard "no account" prompt that encourages the user to add any account (non Google-specific) before continuing to use the People app [CHAR LIMIT=NONE] -->
    <string name="generic_no_account_prompt">Keep your contacts safe even if you lose your phone: synchronize with an online service.</string>

+2 −2
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ import com.android.contacts.common.model.AccountTypeManager;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.util.AccountsListAdapter;
import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
import com.android.contacts.util.AccountPromptUtils;
import com.android.contacts.common.util.ImplicitIntentsUtil;

import java.util.List;

@@ -70,7 +70,7 @@ public class ContactEditorAccountsChangedActivity extends AppCompatActivity {
    private final OnClickListener mAddAccountClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            final Intent intent = AccountPromptUtils.getIntentForAddingAccount();
            final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount();
            startActivityForResult(intent, SUBACTIVITY_ADD_NEW_ACCOUNT);
        }
    };
+5 −26
Original line number Diff line number Diff line
@@ -59,8 +59,6 @@ import com.android.contacts.activities.ActionBarAdapter.TabState;
import com.android.contacts.common.ContactsUtils;
import com.android.contacts.common.activity.RequestPermissionsActivity;
import com.android.contacts.common.dialog.ClearFrequentsDialog;
import com.android.contacts.common.util.ImplicitIntentsUtil;
import com.android.contacts.common.widget.FloatingActionButtonController;
import com.android.contacts.common.interactions.ImportExportDialogFragment;
import com.android.contacts.common.list.ContactEntryListFragment;
import com.android.contacts.common.list.ContactListFilter;
@@ -74,7 +72,9 @@ import com.android.contacts.common.preference.ContactsPreferenceActivity;
import com.android.contacts.common.preference.DisplayOptionsPreferenceFragment;
import com.android.contacts.common.util.AccountFilterUtil;
import com.android.contacts.common.util.Constants;
import com.android.contacts.common.util.ImplicitIntentsUtil;
import com.android.contacts.common.util.ViewUtil;
import com.android.contacts.common.widget.FloatingActionButtonController;
import com.android.contacts.editor.EditorIntents;
import com.android.contacts.interactions.ContactDeletionInteraction;
import com.android.contacts.interactions.ContactMultiDeletionInteraction;
@@ -92,7 +92,6 @@ import com.android.contacts.list.OnContactsUnavailableActionListener;
import com.android.contacts.list.ProviderStatusWatcher;
import com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener;
import com.android.contacts.quickcontact.QuickContactActivity;
import com.android.contacts.util.AccountPromptUtils;
import com.android.contacts.util.DialogManager;
import com.android.contacts.util.PhoneCapabilityTester;
import com.android.contactsbind.HelpUtils;
@@ -196,10 +195,6 @@ public class PeopleActivity extends AppCompatContactsActivity implements
        return (mProviderStatus != null) && mProviderStatus.equals(ProviderStatus.STATUS_NORMAL);
    }

    private boolean areContactWritableAccountsAvailable() {
        return ContactsUtils.areContactWritableAccountsAvailable(this);
    }

    private boolean areGroupWritableAccountsAvailable() {
        return ContactsUtils.areGroupWritableAccountsAvailable(this);
    }
@@ -899,24 +894,8 @@ public class PeopleActivity extends AppCompatContactsActivity implements
                mAllFragment.setEnabled(true);
            }
        } else {
            // If there are no accounts on the device and we should show the "no account" prompt
            // (based on {@link SharedPreferences}), then launch the account setup activity so the
            // user can sign-in or create an account.
            //
            // Also check for ability to modify accounts.  In limited user mode, you can't modify
            // accounts so there is no point sending users to account setup activity.
            final UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
            final boolean disallowModifyAccounts = userManager.getUserRestrictions().getBoolean(
                    UserManager.DISALLOW_MODIFY_ACCOUNTS);
            if (!disallowModifyAccounts && !areContactWritableAccountsAvailable() &&
                    AccountPromptUtils.shouldShowAccountPrompt(this)) {
                AccountPromptUtils.neverShowAccountPromptAgain(this);
                AccountPromptUtils.launchAccountPrompt(this);
                return;
            }

            // Otherwise, continue setting up the page so that the user can still use the app
            // without an account.
            // Setting up the page so that the user can still use the app
            // even without an account.
            if (mAllFragment != null) {
                mAllFragment.setEnabled(false);
            }
@@ -1024,7 +1003,7 @@ public class PeopleActivity extends AppCompatContactsActivity implements

        @Override
        public void onAddAccountAction() {
            final Intent intent = AccountPromptUtils.getIntentForAddingAccount();
            final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount();
            ImplicitIntentsUtil.startActivityOutsideApp(PeopleActivity.this, intent);
        }

+0 −143
Original line number Diff line number Diff line
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.contacts.util;

import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorDescription;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;
import android.provider.Settings;
import android.util.Log;

import com.android.contacts.R;
import com.android.contacts.common.model.account.GoogleAccountType;

import java.io.IOException;

/**
 * Utility class for controlling whether the standard "no account" prompt on launch is shown.
 */
public class AccountPromptUtils {

    private static final String TAG = AccountPromptUtils.class.getSimpleName();

    /** {@link SharedPreferences} key for whether or not the "no account" prompt should be shown. */
    private static final String KEY_SHOW_ACCOUNT_PROMPT = "settings.showAccountPrompt";

    /**
     * The following intent keys are understood by the {@link AccountManager} and should not be
     * changed unless the API changes.
     */
    private static final String KEY_INTRO_MESSAGE = "introMessage";
    private static final String KEY_ALLOW_SKIP_ACCOUNT_SETUP = "allowSkip";
    private static final String KEY_USER_SKIPPED_ACCOUNT_SETUP = "setupSkipped";

    private static SharedPreferences getSharedPreferences(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context);
    }

    /**
     * Returns true if the "no account" prompt should be shown
     * (according to {@link SharedPreferences}), otherwise return false. Since this prompt is
     * Google-specific for the time being, this method will also return false if the Google
     * account type is not available from the {@link AccountManager}.
     */
    public static boolean shouldShowAccountPrompt(Context context) {
        // TODO: Remove the filtering of account types once there is an API in
        // {@link AccountManager} to show a similar account prompt
        // (see {@link AccountManager#addAccount()} in {@link #launchAccountPrompt()}
        // for any type of account. Bug: 5375902
        AuthenticatorDescription[] allTypes =
                AccountManager.get(context).getAuthenticatorTypes();
        for (AuthenticatorDescription authenticatorType : allTypes) {
            if (GoogleAccountType.ACCOUNT_TYPE.equals(authenticatorType.type)) {
                return getSharedPreferences(context).getBoolean(KEY_SHOW_ACCOUNT_PROMPT, true);
            }
        }
        return false;
    }

    /**
     * Remember to never show the "no account" prompt again by saving this to
     * {@link SharedPreferences}.
     */
    public static void neverShowAccountPromptAgain(Context context) {
        getSharedPreferences(context).edit()
                .putBoolean(KEY_SHOW_ACCOUNT_PROMPT, false)
                .apply();
    }

    /**
     * Launch the "no account" prompt. (We assume the caller has already verified that the prompt
     * can be shown, so checking the {@link #KEY_SHOW_ACCOUNT_PROMPT} value in
     * {@link SharedPreferences} will not be done in this method).
     */
    public static void launchAccountPrompt(Activity activity) {
        Bundle options = new Bundle();
        options.putCharSequence(KEY_INTRO_MESSAGE, activity.getString(R.string.no_account_prompt));
        options.putBoolean(KEY_ALLOW_SKIP_ACCOUNT_SETUP, true);
        AccountManager.get(activity).addAccount(GoogleAccountType.ACCOUNT_TYPE, null, null, options,
                activity, getAccountManagerCallback(activity), null);
    }

    /**
     * When adding account
     * open the same UI screen for user to choose account
     */
    public static Intent getIntentForAddingAccount() {
         final Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT);
         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
         intent.putExtra(Settings.EXTRA_AUTHORITIES,
                 new String[]{ContactsContract.AUTHORITY});
         return intent;
    }

    private static AccountManagerCallback<Bundle> getAccountManagerCallback(
            final Activity activity) {
        return new AccountManagerCallback<Bundle>() {
            @Override
            public void run(AccountManagerFuture<Bundle> future) {
                if (future.isCancelled()) {
                    // The account creation process was canceled
                    return;
                }
                try {
                    Bundle result = future.getResult();
                    if (result.getBoolean(KEY_USER_SKIPPED_ACCOUNT_SETUP)) {
                        AccountPromptUtils.neverShowAccountPromptAgain(activity);
                    }
                } catch (OperationCanceledException ignore) {
                    Log.e(TAG, "Account setup error: account creation process canceled");
                } catch (IOException ignore) {
                    Log.e(TAG, "Account setup error: No authenticator was registered for this"
                            + "account type or the authenticator failed to respond");
                } catch (AuthenticatorException ignore) {
                    Log.e(TAG, "Account setup error: Authenticator experienced an I/O problem");
                }
            }
        };
    }
}