summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Jang <wjang@google.com>2015-03-10 15:57:05 -0700
committerWalter Jang <wjang@google.com>2015-03-11 12:40:15 -0700
commit1e8801bc9bc60bdd1c95f582c460590272cfad64 (patch)
treec55cfa9429955d8250bc266327731f5cd68f7e88
parent0554998975eccfe77440e6dc2200f08adfd45473 (diff)
downloadpackages_apps_Contacts-1e8801bc9bc60bdd1c95f582c460590272cfad64.tar.gz
packages_apps_Contacts-1e8801bc9bc60bdd1c95f582c460590272cfad64.tar.bz2
packages_apps_Contacts-1e8801bc9bc60bdd1c95f582c460590272cfad64.zip
Pass full res contact photos between the compact and full editors
Bug 19624360 Bug 19655206 Change-Id: I590ec7ecec75a9af95b824f5db9cda8f8aeda675
-rw-r--r--src/com/android/contacts/ContactSaveService.java3
-rw-r--r--src/com/android/contacts/activities/ContactEditorBaseActivity.java5
-rw-r--r--src/com/android/contacts/editor/CompactContactEditorFragment.java23
-rw-r--r--src/com/android/contacts/editor/ContactEditorBaseFragment.java55
-rw-r--r--src/com/android/contacts/editor/ContactEditorFragment.java13
-rw-r--r--src/com/android/contacts/editor/EditorIntents.java18
-rw-r--r--src/com/android/contacts/quickcontact/QuickContactActivity.java6
7 files changed, 99 insertions, 24 deletions
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index d81867ce3..266ea469d 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -330,6 +330,9 @@ public class ContactSaveService extends IntentService {
Intent callbackIntent = new Intent(context, callbackActivity);
callbackIntent.putExtra(saveModeExtraKey, saveMode);
callbackIntent.setAction(callbackAction);
+ if (updatedPhotos != null) {
+ callbackIntent.putExtra(EXTRA_UPDATED_PHOTOS, (Parcelable) updatedPhotos);
+ }
serviceIntent.putExtra(ContactSaveService.EXTRA_CALLBACK_INTENT, callbackIntent);
}
return serviceIntent;
diff --git a/src/com/android/contacts/activities/ContactEditorBaseActivity.java b/src/com/android/contacts/activities/ContactEditorBaseActivity.java
index 25846bc18..acc754edc 100644
--- a/src/com/android/contacts/activities/ContactEditorBaseActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorBaseActivity.java
@@ -161,7 +161,7 @@ abstract public class ContactEditorBaseActivity extends ContactsActivity
* Invoked after the contact is saved.
*/
void onSaveCompleted(boolean hadChanges, int saveMode, boolean saveSucceeded,
- Uri contactLookupUri);
+ Uri contactLookupUri, Bundle updatedPhotos);
/**
* Invoked after the contact is joined.
@@ -238,7 +238,8 @@ abstract public class ContactEditorBaseActivity extends ContactsActivity
intent.getIntExtra(ContactEditorFragment.SAVE_MODE_EXTRA_KEY,
ContactEditor.SaveMode.CLOSE),
intent.getBooleanExtra(ContactSaveService.EXTRA_SAVE_SUCCEEDED, false),
- intent.getData());
+ intent.getData(),
+ (Bundle) intent.getParcelableExtra(ContactSaveService.EXTRA_UPDATED_PHOTOS));
} else if (ACTION_JOIN_COMPLETED.equals(action)) {
mFragment.onJoinCompleted(intent.getData());
}
diff --git a/src/com/android/contacts/editor/CompactContactEditorFragment.java b/src/com/android/contacts/editor/CompactContactEditorFragment.java
index 9a962626a..f33f796ef 100644
--- a/src/com/android/contacts/editor/CompactContactEditorFragment.java
+++ b/src/com/android/contacts/editor/CompactContactEditorFragment.java
@@ -78,6 +78,10 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl
}
getContent().setPhoto(bitmap);
+ // Clear any previously saved full resolution photos under negative raw contact IDs
+ // so that we will use the newly selected photo, instead of an old one on rotations.
+ removeNewRawContactPhotos();
+
// If a new photo was chosen but not yet saved,
// we need to update the UI immediately
mUpdatedPhotos.putParcelable(String.valueOf(mPhotoRawContactId), uri);
@@ -129,7 +133,6 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl
private PhotoHandler mPhotoHandler;
private Uri mPhotoUri;
private long mPhotoRawContactId;
- private Bundle mUpdatedPhotos = new Bundle();
private boolean mShowToastAfterSave = true;
@Override
@@ -139,7 +142,6 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl
if (savedState != null) {
mPhotoUri = savedState.getParcelable(KEY_PHOTO_URI);
mPhotoRawContactId = savedState.getLong(KEY_PHOTO_RAW_CONTACT_ID);
- mUpdatedPhotos = savedState.getParcelable(KEY_UPDATED_PHOTOS);
}
}
@@ -157,7 +159,6 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl
public void onSaveInstanceState(Bundle outState) {
outState.putParcelable(KEY_PHOTO_URI, mPhotoUri);
outState.putLong(KEY_PHOTO_RAW_CONTACT_ID, mPhotoRawContactId);
- outState.putParcelable(KEY_UPDATED_PHOTOS, mUpdatedPhotos);
super.onSaveInstanceState(outState);
}
@@ -217,7 +218,19 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl
// Set up the photo widget
mPhotoHandler = createPhotoHandler();
mPhotoRawContactId = editorView.getPhotoRawContactId();
- if (mUpdatedPhotos.containsKey(String.valueOf(mPhotoRawContactId))) {
+ if (mPhotoRawContactId < 0) {
+ // Since the raw contact IDs for new contacts are random negative numbers
+ // we consider any negative key a match
+ for (String key : mUpdatedPhotos.keySet()) {
+ try {
+ if (Integer.parseInt(key) < 0) {
+ editorView.setFullSizePhoto((Uri) mUpdatedPhotos.getParcelable(key));
+ break;
+ }
+ } catch (NumberFormatException ignored) {
+ }
+ }
+ } else if (mUpdatedPhotos.containsKey(String.valueOf(mPhotoRawContactId))) {
editorView.setFullSizePhoto((Uri) mUpdatedPhotos.getParcelable(
String.valueOf(mPhotoRawContactId)));
}
@@ -356,7 +369,7 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl
// Prepare an Intent to start the expanded editor
final Intent intent = isInsert
- ? EditorIntents.createInsertContactIntent(mState, getDisplayName())
+ ? EditorIntents.createInsertContactIntent(mState, getDisplayName(), mUpdatedPhotos)
: EditorIntents.createEditContactIntent(mLookupUri, getMaterialPalette());
ImplicitIntentsUtil.startActivityInApp(getActivity(), intent);
diff --git a/src/com/android/contacts/editor/ContactEditorBaseFragment.java b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
index 258747d57..5e9a98724 100644
--- a/src/com/android/contacts/editor/ContactEditorBaseFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
@@ -142,6 +142,8 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
// Join Activity
private static final String KEY_CONTACT_ID_FOR_JOIN = "contactidforjoin";
+ private static final String KEY_UPDATED_PHOTOS = "updatedPhotos";
+
protected static final int REQUEST_CODE_JOIN = 0;
protected static final int REQUEST_CODE_ACCOUNTS_CHANGED = 1;
protected static final int REQUEST_CODE_PICK_RINGTONE = 2;
@@ -165,6 +167,12 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
public static final String INTENT_EXTRA_MATERIAL_PALETTE = "material_palette";
/**
+ * Intent key to pass a Bundle of raw contact IDs to photos URIs between the compact editor
+ * and the fully expanded one.
+ */
+ public static final String INTENT_EXTRA_UPDATED_PHOTOS = "updated_photos";
+
+ /**
* Intent extra to specify a {@link ContactEditor.SaveMode}.
*/
public static final String SAVE_MODE_EXTRA_KEY = "saveMode";
@@ -342,6 +350,9 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
// Join Activity
protected long mContactIdForJoin;
+ // Full resolution photo URIs
+ protected Bundle mUpdatedPhotos = new Bundle();
+
//
// Editor state for {@link ContactEditorView}.
// (Not saved/restored on rotates)
@@ -474,6 +485,9 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
// Join Activity
mContactIdForJoin = savedState.getLong(KEY_CONTACT_ID_FOR_JOIN);
+
+ // Full resolution photo URIs
+ mUpdatedPhotos = savedState.getParcelable(KEY_UPDATED_PHOTOS);
}
// mState can still be null because it may not have have finished loading before
@@ -594,6 +608,9 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
// Join Activity
outState.putLong(KEY_CONTACT_ID_FOR_JOIN, mContactIdForJoin);
+ // Full resolution photo URIs
+ outState.putParcelable(KEY_UPDATED_PHOTOS, mUpdatedPhotos);
+
super.onSaveInstanceState(outState);
}
@@ -888,7 +905,8 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
mStatus = Status.EDITING;
return true;
}
- onSaveCompleted(false, saveMode, /* saveSucceeded =*/ mLookupUri != null, mLookupUri);
+ onSaveCompleted(false, saveMode, /* saveSucceeded =*/ mLookupUri != null, mLookupUri,
+ /* updatedPhotos =*/ null);
return true;
}
@@ -902,7 +920,7 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
// If we're coming back from the fully expanded editor and this is an insert, just
// pass any values entered by the user back to the compact editor without doing a save
final Intent resultIntent = EditorIntents.createCompactInsertContactIntent(
- mState, getDisplayName());
+ mState, getDisplayName(), mUpdatedPhotos);
mListener.onSaveFinished(resultIntent);
return true;
}
@@ -1277,8 +1295,10 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
mIntentExtras.getBoolean(INTENT_EXTRA_NEW_LOCAL_PROFILE);
mDisableDeleteMenuOption =
mIntentExtras.getBoolean(INTENT_EXTRA_DISABLE_DELETE_MENU_OPTION);
- mMaterialPalette =
- mIntentExtras.getParcelable(INTENT_EXTRA_MATERIAL_PALETTE);
+ mMaterialPalette = mIntentExtras.getParcelable(INTENT_EXTRA_MATERIAL_PALETTE);
+ if (mIntentExtras.containsKey(INTENT_EXTRA_UPDATED_PHOTOS)) {
+ mUpdatedPhotos = mIntentExtras.getParcelable(INTENT_EXTRA_UPDATED_PHOTOS);
+ }
}
}
@@ -1301,12 +1321,12 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
@Override
public void onJoinCompleted(Uri uri) {
- onSaveCompleted(false, SaveMode.RELOAD, uri != null, uri);
+ onSaveCompleted(false, SaveMode.RELOAD, uri != null, uri, /* updatedPhotos =*/ null);
}
@Override
public void onSaveCompleted(boolean hadChanges, int saveMode, boolean saveSucceeded,
- Uri contactLookupUri) {
+ Uri contactLookupUri, Bundle updatedPhotos) {
if (hadChanges) {
if (saveSucceeded) {
if (saveMode != SaveMode.JOIN && showToastAfterSave()) {
@@ -1329,10 +1349,10 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
} else if (saveMode == SaveMode.COMPACT) {
if (isInsert(getActivity().getIntent())) {
resultIntent = EditorIntents.createCompactInsertContactIntent(
- mState, getDisplayName());
+ mState, getDisplayName(), updatedPhotos);
} else {
resultIntent = EditorIntents.createCompactEditContactIntent(
- lookupUri, getMaterialPalette());
+ lookupUri, getMaterialPalette(), updatedPhotos);
}
} else {
resultIntent = null;
@@ -1564,6 +1584,25 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
abstract protected void joinAggregate(long contactId);
//
+ // Photos
+ //
+
+ /**
+ * Removes the full resolution photo URIs for new raw contacts (identified by negative raw
+ * contact IDs) from the member Bundle of updated photos.
+ */
+ protected void removeNewRawContactPhotos() {
+ for (String key : mUpdatedPhotos.keySet()) {
+ try {
+ if (Integer.parseInt(key) < 0) {
+ mUpdatedPhotos.remove(key);
+ }
+ } catch (NumberFormatException ignored) {
+ }
+ }
+ }
+
+ //
// Utility methods
//
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 791e20d36..133d9eb23 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -88,7 +88,6 @@ public class ContactEditorFragment extends ContactEditorBaseFragment implements
*/
private PhotoHandler mCurrentPhotoHandler;
private Uri mCurrentPhotoUri;
- private Bundle mUpdatedPhotos = new Bundle();
public ContactEditorFragment() {
}
@@ -114,7 +113,6 @@ public class ContactEditorFragment extends ContactEditorBaseFragment implements
mRawContactIdRequestingPhoto = savedState.getLong(
KEY_RAW_CONTACT_ID_REQUESTING_PHOTO);
mCurrentPhotoUri = savedState.getParcelable(KEY_CURRENT_PHOTO_URI);
- mUpdatedPhotos = savedState.getParcelable(KEY_UPDATED_PHOTOS);
}
}
@@ -532,6 +530,10 @@ public class ContactEditorFragment extends ContactEditorBaseFragment implements
@Override
protected boolean doSaveAction(int saveMode) {
// Save contact and reload the compact editor after saving.
+ // Note, the full resolution photos Bundle must be passed to the ContactSaveService
+ // and then passed along in the result Intent in order for the compact editor to
+ // receive it, instead of mUpdatedPhotos being accessed directly in onSaveCompleted,
+ // because we clear mUpdatedPhotos after starting the save service below.
Intent intent = ContactSaveService.createSaveContactIntent(mContext, mState,
SAVE_MODE_EXTRA_KEY, saveMode, isEditingUserProfile(),
((Activity) mContext).getClass(), ContactEditorActivity.ACTION_SAVE_COMPLETED,
@@ -549,7 +551,6 @@ public class ContactEditorFragment extends ContactEditorBaseFragment implements
outState.putSerializable(KEY_EXPANDED_EDITORS, mExpandedEditors);
outState.putLong(KEY_RAW_CONTACT_ID_REQUESTING_PHOTO, mRawContactIdRequestingPhoto);
outState.putParcelable(KEY_CURRENT_PHOTO_URI, mCurrentPhotoUri);
- outState.putParcelable(KEY_UPDATED_PHOTOS, mUpdatedPhotos);
super.onSaveInstanceState(outState);
}
@@ -604,6 +605,12 @@ public class ContactEditorFragment extends ContactEditorBaseFragment implements
Log.w(TAG, "The contact that requested the photo is no longer present.");
}
+ // For inserts where the raw contact ID is a negative number, we must clear any previously
+ // saved full resolution photos under negative raw contact IDs so that the compact editor
+ // will use the newly selected photo, instead of an old one.
+ if (isInsert(getActivity().getIntent()) && rawContact < 0) {
+ removeNewRawContactPhotos();
+ }
mUpdatedPhotos.putParcelable(String.valueOf(rawContact), photoUri);
}
diff --git a/src/com/android/contacts/editor/EditorIntents.java b/src/com/android/contacts/editor/EditorIntents.java
index 39c14e5ff..3fb2145e0 100644
--- a/src/com/android/contacts/editor/EditorIntents.java
+++ b/src/com/android/contacts/editor/EditorIntents.java
@@ -24,6 +24,7 @@ import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
import android.content.ContentValues;
import android.content.Intent;
import android.net.Uri;
+import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.text.TextUtils;
@@ -43,9 +44,10 @@ public class EditorIntents {
* existing contact.
*/
public static Intent createCompactEditContactIntent(Uri contactLookupUri,
- MaterialPalette materialPalette) {
+ MaterialPalette materialPalette, Bundle updatedPhotos) {
final Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
putMaterialPalette(intent, materialPalette);
+ putUpdatedPhotos(intent, updatedPhotos);
return intent;
}
@@ -54,7 +56,7 @@ public class EditorIntents {
*/
public static Intent createCompactInsertContactIntent() {
return createCompactInsertContactIntent(/* rawContactDeltaList =*/ null,
- /* displayName =*/ null);
+ /* displayName =*/ null, /* updatedPhotos =*/ null);
}
/**
@@ -62,11 +64,12 @@ public class EditorIntents {
* the field values specified by rawContactDeltaList pre-populate in the form.
*/
public static Intent createCompactInsertContactIntent(RawContactDeltaList rawContactDeltaList,
- String displayName) {
+ String displayName, Bundle updatedPhotos) {
final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
if (rawContactDeltaList != null || displayName != null) {
putRawContactDeltaValues(intent, rawContactDeltaList, displayName);
}
+ putUpdatedPhotos(intent, updatedPhotos);
return intent;
}
@@ -105,11 +108,12 @@ public class EditorIntents {
* existing contact.
*/
public static Intent createInsertContactIntent(RawContactDeltaList rawContactDeltaList,
- String displayName) {
+ String displayName, Bundle updatedPhotos) {
final Intent intent = new Intent(ContactEditorBaseActivity.ACTION_INSERT,
Contacts.CONTENT_URI);
addContactIntentFlags(intent);
putRawContactDeltaValues(intent, rawContactDeltaList, displayName);
+ putUpdatedPhotos(intent, updatedPhotos);
return intent;
}
@@ -126,6 +130,12 @@ public class EditorIntents {
}
}
+ private static void putUpdatedPhotos(Intent intent, Bundle updatedPhotos) {
+ if (updatedPhotos != null && !updatedPhotos.isEmpty()) {
+ intent.putExtra(ContactEditorBaseFragment.INTENT_EXTRA_UPDATED_PHOTOS, updatedPhotos);
+ }
+ }
+
private static void putRawContactDeltaValues(Intent intent,
RawContactDeltaList rawContactDeltaList, String displayName) {
// Pass on all the data that has been entered so far
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 3584fa85d..2c2d36f0c 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -2177,8 +2177,10 @@ public class QuickContactActivity extends ContactsActivity {
private Intent getEditContactIntent() {
return EditorIntents.createCompactEditContactIntent(
- mContactData.getLookupUri(), mHasComputedThemeColor
- ? new MaterialPalette(mColorFilterColor, mStatusBarColor) : null);
+ mContactData.getLookupUri(),
+ mHasComputedThemeColor
+ ? new MaterialPalette(mColorFilterColor, mStatusBarColor) : null,
+ /* updatedPhotos =*/ null);
}
private void editContact() {