Merge "Call forceLoad() when loader is not started to load hi-res photo"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 07bfdc0..31552b6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -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>
diff --git a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
index 617ef0d..9748e46 100644
--- a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
@@ -36,7 +36,7 @@
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 @@
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);
}
};
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index d887ef9..7643a05 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -59,8 +59,6 @@
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.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.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 @@
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 @@
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 @@
@Override
public void onAddAccountAction() {
- final Intent intent = AccountPromptUtils.getIntentForAddingAccount();
+ final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount();
ImplicitIntentsUtil.startActivityOutsideApp(PeopleActivity.this, intent);
}
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index e18324c..90cd350 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -406,7 +406,7 @@
mHasIntentLaunched = true;
try {
- startActivity(intent);
+ ImplicitIntentsUtil.startActivityInAppIfPossible(QuickContactActivity.this, intent);
} catch (SecurityException ex) {
Toast.makeText(QuickContactActivity.this, R.string.missing_app,
Toast.LENGTH_SHORT).show();
@@ -446,31 +446,6 @@
} else {
Log.w(TAG, "Invalid Data ID");
}
-
- // Pass the touch point through the intent for use in the InCallUI
- if (Intent.ACTION_CALL.equals(intent.getAction())) {
- if (TouchPointManager.getInstance().hasValidPoint()) {
- Bundle extras = new Bundle();
- extras.putParcelable(TouchPointManager.TOUCH_POINT,
- TouchPointManager.getInstance().getPoint());
- intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, extras);
- }
- }
-
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
- mHasIntentLaunched = true;
- try {
- ImplicitIntentsUtil.startActivityInAppIfPossible(QuickContactActivity.this, intent);
- } catch (SecurityException ex) {
- Toast.makeText(QuickContactActivity.this, R.string.missing_app,
- Toast.LENGTH_SHORT).show();
- Log.e(TAG, "QuickContacts does not have permission to launch "
- + intent);
- } catch (ActivityNotFoundException ex) {
- Toast.makeText(QuickContactActivity.this, R.string.missing_app,
- Toast.LENGTH_SHORT).show();
- }
}
};
diff --git a/src/com/android/contacts/util/AccountPromptUtils.java b/src/com/android/contacts/util/AccountPromptUtils.java
deleted file mode 100644
index 4fc95a5..0000000
--- a/src/com/android/contacts/util/AccountPromptUtils.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * 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");
- }
- }
- };
- }
-}