13f990ba4e35a99078d831c041290e574a320caa5Walter Jang/* 23f990ba4e35a99078d831c041290e574a320caa5Walter Jang * Copyright (C) 2015 The Android Open Source Project 33f990ba4e35a99078d831c041290e574a320caa5Walter Jang * 43f990ba4e35a99078d831c041290e574a320caa5Walter Jang * Licensed under the Apache License, Version 2.0 (the "License"); 53f990ba4e35a99078d831c041290e574a320caa5Walter Jang * you may not use this file except in compliance with the License. 63f990ba4e35a99078d831c041290e574a320caa5Walter Jang * You may obtain a copy of the License at 73f990ba4e35a99078d831c041290e574a320caa5Walter Jang * 83f990ba4e35a99078d831c041290e574a320caa5Walter Jang * http://www.apache.org/licenses/LICENSE-2.0 93f990ba4e35a99078d831c041290e574a320caa5Walter Jang * 103f990ba4e35a99078d831c041290e574a320caa5Walter Jang * Unless required by applicable law or agreed to in writing, software 113f990ba4e35a99078d831c041290e574a320caa5Walter Jang * distributed under the License is distributed on an "AS IS" BASIS, 123f990ba4e35a99078d831c041290e574a320caa5Walter Jang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133f990ba4e35a99078d831c041290e574a320caa5Walter Jang * See the License for the specific language governing permissions and 143f990ba4e35a99078d831c041290e574a320caa5Walter Jang * limitations under the License 153f990ba4e35a99078d831c041290e574a320caa5Walter Jang */ 163f990ba4e35a99078d831c041290e574a320caa5Walter Jang 173f990ba4e35a99078d831c041290e574a320caa5Walter Jangpackage com.android.contacts.activities; 183f990ba4e35a99078d831c041290e574a320caa5Walter Jang 19da20b47c2b85390a2c3772379e71203c5aab513cGary Maiimport android.app.Dialog; 20da20b47c2b85390a2c3772379e71203c5aab513cGary Maiimport android.app.FragmentTransaction; 2130363a22d8b0f7ab467b2ab7f864d415d2d10916Gary Maiimport android.content.ComponentName; 22da20b47c2b85390a2c3772379e71203c5aab513cGary Maiimport android.content.ContentValues; 23da20b47c2b85390a2c3772379e71203c5aab513cGary Maiimport android.content.Intent; 24da20b47c2b85390a2c3772379e71203c5aab513cGary Maiimport android.net.Uri; 25da20b47c2b85390a2c3772379e71203c5aab513cGary Maiimport android.os.Bundle; 26581585d9ad2e7d3d4b65798acaa0fa462d30710dWalter Jangimport android.provider.ContactsContract.QuickContact; 27c40f3e945c43ff1ff90abb7fb2daf56aba315e10Gary Maiimport android.support.v7.widget.Toolbar; 28da20b47c2b85390a2c3772379e71203c5aab513cGary Maiimport android.util.Log; 29da20b47c2b85390a2c3772379e71203c5aab513cGary Maiimport android.view.View; 30da20b47c2b85390a2c3772379e71203c5aab513cGary Maiimport android.view.inputmethod.InputMethodManager; 31da20b47c2b85390a2c3772379e71203c5aab513cGary Mai 32c40f3e945c43ff1ff90abb7fb2daf56aba315e10Gary Maiimport com.android.contacts.AppCompatContactsActivity; 338d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jangimport com.android.contacts.ContactSaveService; 34082273bd687613e67c96d8087b964c5dc41e52a5Marcus Hagerottimport com.android.contacts.DynamicShortcuts; 353f990ba4e35a99078d831c041290e574a320caa5Walter Jangimport com.android.contacts.R; 3631a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport com.android.contacts.detail.PhotoSelectionHandler; 37363af60ea23e5a3b945005712a16564ab69db18bGary Maiimport com.android.contacts.editor.ContactEditorFragment; 388d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jangimport com.android.contacts.editor.EditorIntents; 3931a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport com.android.contacts.editor.PhotoSourceDialogFragment; 408d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jangimport com.android.contacts.interactions.ContactDeletionInteraction; 410a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.model.RawContactDeltaList; 428d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jangimport com.android.contacts.util.DialogManager; 430a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.util.ImplicitIntentsUtil; 443f990ba4e35a99078d831c041290e574a320caa5Walter Jang 4531a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport java.io.FileNotFoundException; 4631a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport java.util.ArrayList; 4731a74ad969b650eb733e536569254ed3978c4f54Walter Jang 483f990ba4e35a99078d831c041290e574a320caa5Walter Jang/** 493f990ba4e35a99078d831c041290e574a320caa5Walter Jang * Contact editor with only the most important fields displayed initially. 503f990ba4e35a99078d831c041290e574a320caa5Walter Jang */ 51c40f3e945c43ff1ff90abb7fb2daf56aba315e10Gary Maipublic class ContactEditorActivity extends AppCompatContactsActivity implements 52da20b47c2b85390a2c3772379e71203c5aab513cGary Mai PhotoSourceDialogFragment.Listener, 538d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang DialogManager.DialogShowingViewActivity { 548d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang private static final String TAG = "ContactEditorActivity"; 558d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 568d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public static final String ACTION_JOIN_COMPLETED = "joinCompleted"; 578d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public static final String ACTION_SAVE_COMPLETED = "saveCompleted"; 588d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 598d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public static final int RESULT_CODE_SPLIT = 2; 608d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang // 3 used for ContactDeletionInteraction.RESULT_CODE_DELETED 618d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public static final int RESULT_CODE_EDITED = 4; 623f990ba4e35a99078d831c041290e574a320caa5Walter Jang 63935b56aabd5ee1562df1d16324ce8e3f51005651Marcus Hagerott /** 64807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott * The contact will be saved to this account when this is set for an insert. This 65935b56aabd5ee1562df1d16324ce8e3f51005651Marcus Hagerott * is necessary because {@link android.accounts.Account} cannot be created with null values 66935b56aabd5ee1562df1d16324ce8e3f51005651Marcus Hagerott * for the name and type and an Account is needed for 67935b56aabd5ee1562df1d16324ce8e3f51005651Marcus Hagerott * {@link android.provider.ContactsContract.Intents.Insert#EXTRA_ACCOUNT} 68935b56aabd5ee1562df1d16324ce8e3f51005651Marcus Hagerott */ 69807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott public static final String EXTRA_ACCOUNT_WITH_DATA_SET = 70807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott "com.android.contacts.ACCOUNT_WITH_DATA_SET"; 71935b56aabd5ee1562df1d16324ce8e3f51005651Marcus Hagerott 72363af60ea23e5a3b945005712a16564ab69db18bGary Mai private static final String TAG_EDITOR_FRAGMENT = "editor_fragment"; 7331a74ad969b650eb733e536569254ed3978c4f54Walter Jang 7431a74ad969b650eb733e536569254ed3978c4f54Walter Jang private static final String STATE_PHOTO_MODE = "photo_mode"; 75bfea74f34f3c1c4ea33302c0c59635acb7b801adWenyi Wang private static final String STATE_ACTION_BAR_TITLE = "action_bar_title"; 76a9242e143ef468e74d28ac525539f803e120c520Wenyi Wang private static final String STATE_PHOTO_URI = "photo_uri"; 7731a74ad969b650eb733e536569254ed3978c4f54Walter Jang 7831a74ad969b650eb733e536569254ed3978c4f54Walter Jang /** 798d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Boolean intent key that specifies that this activity should finish itself 808d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * (instead of launching a new view intent) after the editor changes have been 818d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * saved. 828d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 838d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public static final String INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED = 848d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang "finishActivityOnSaveCompleted"; 858d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 868d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 878d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Contract for contact editors Fragments that are managed by this Activity. 888d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 898d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public interface ContactEditor { 908d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 918d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 928d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Modes that specify what the AsyncTask has to perform after saving 938d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 948d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang interface SaveMode { 958d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 968d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Close the editor after saving 978d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 988d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang int CLOSE = 0; 998d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1008d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1018d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Reload the data so that the user can continue editing 1028d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1038d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang int RELOAD = 1; 1048d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1058d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1068d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Split the contact after saving 1078d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1088d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang int SPLIT = 2; 1098d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1108d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1118d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Join another contact after saving 1128d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1138d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang int JOIN = 3; 1148d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1158d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 116363af60ea23e5a3b945005712a16564ab69db18bGary Mai * Navigate to the editor view after saving. 1178d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 118363af60ea23e5a3b945005712a16564ab69db18bGary Mai int EDITOR = 4; 1198d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 1208d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1218d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1228d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * The status of the contact editor. 1238d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1248d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang interface Status { 1258d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1268d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * The loader is fetching data 1278d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1288d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang int LOADING = 0; 1298d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1308d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1318d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Not currently busy. We are waiting for the user to enter data 1328d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1338d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang int EDITING = 1; 1348d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1358d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1368d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * The data is currently being saved. This is used to prevent more 1378d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * auto-saves (they shouldn't overlap) 1388d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1398d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang int SAVING = 2; 1408d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1418d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1428d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Prevents any more saves. This is used if in the following cases: 1438d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * - After Save/Close 1448d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * - After Revert 1458d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * - After the user has accepted an edit suggestion 146363af60ea23e5a3b945005712a16564ab69db18bGary Mai * - After the user chooses to expand the editor 1478d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1488d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang int CLOSING = 3; 1498d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1508d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1518d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Prevents saving while running a child activity. 1528d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1538d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang int SUB_ACTIVITY = 4; 1548d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 1558d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1568d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1578d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Sets the hosting Activity that will receive callbacks from the contact editor. 1588d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 159363af60ea23e5a3b945005712a16564ab69db18bGary Mai void setListener(ContactEditorFragment.Listener listener); 1608d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1618d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1628d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Initialize the contact editor. 1638d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1648d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang void load(String action, Uri lookupUri, Bundle intentExtras); 1658d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1668d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1675336e6ef1924162b94942cbd8f69202d553822daGary Mai * Applies extras from the hosting Activity to the writable raw contact. 1688d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1698d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang void setIntentExtras(Bundle extras); 1708d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1718d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1728d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Saves or creates the contact based on the mode, and if successful 1738d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * finishes the activity. 1748d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1758d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang boolean save(int saveMode); 1768d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1778d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1788d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * If there are no unsaved changes, just close the editor, otherwise the user is prompted 1798d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * before discarding unsaved changes. 1808d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1818d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang boolean revert(); 1828d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1838d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1848d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Invoked after the contact is saved. 1858d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1868d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang void onSaveCompleted(boolean hadChanges, int saveMode, boolean saveSucceeded, 1878d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang Uri contactLookupUri, Long joinContactId); 1888d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1898d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 1908d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang * Invoked after the contact is joined. 1918d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang */ 1928d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang void onJoinCompleted(Uri uri); 1938d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 1948d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 1958d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang /** 19631a74ad969b650eb733e536569254ed3978c4f54Walter Jang * Displays a PopupWindow with photo edit options. 19731a74ad969b650eb733e536569254ed3978c4f54Walter Jang */ 198363af60ea23e5a3b945005712a16564ab69db18bGary Mai private final class EditorPhotoSelectionHandler extends PhotoSelectionHandler { 19931a74ad969b650eb733e536569254ed3978c4f54Walter Jang 20031a74ad969b650eb733e536569254ed3978c4f54Walter Jang /** 20131a74ad969b650eb733e536569254ed3978c4f54Walter Jang * Receiver of photo edit option callbacks. 20231a74ad969b650eb733e536569254ed3978c4f54Walter Jang */ 203363af60ea23e5a3b945005712a16564ab69db18bGary Mai private final class EditorPhotoActionListener extends PhotoActionListener { 20431a74ad969b650eb733e536569254ed3978c4f54Walter Jang 20531a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 20631a74ad969b650eb733e536569254ed3978c4f54Walter Jang public void onRemovePictureChosen() { 20731a74ad969b650eb733e536569254ed3978c4f54Walter Jang getEditorFragment().removePhoto(); 20831a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 20931a74ad969b650eb733e536569254ed3978c4f54Walter Jang 21031a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 21131a74ad969b650eb733e536569254ed3978c4f54Walter Jang public void onPhotoSelected(Uri uri) throws FileNotFoundException { 21231a74ad969b650eb733e536569254ed3978c4f54Walter Jang mPhotoUri = uri; 21331a74ad969b650eb733e536569254ed3978c4f54Walter Jang getEditorFragment().updatePhoto(uri); 21431a74ad969b650eb733e536569254ed3978c4f54Walter Jang 21531a74ad969b650eb733e536569254ed3978c4f54Walter Jang // Re-create the photo handler the next time we need it so that additional photo 21631a74ad969b650eb733e536569254ed3978c4f54Walter Jang // selections create a new temp file (and don't hit the one that was just added 21731a74ad969b650eb733e536569254ed3978c4f54Walter Jang // to the cache). 21831a74ad969b650eb733e536569254ed3978c4f54Walter Jang mPhotoSelectionHandler = null; 21931a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 22031a74ad969b650eb733e536569254ed3978c4f54Walter Jang 22131a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 22231a74ad969b650eb733e536569254ed3978c4f54Walter Jang public Uri getCurrentPhotoUri() { 22331a74ad969b650eb733e536569254ed3978c4f54Walter Jang return mPhotoUri; 22431a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 22531a74ad969b650eb733e536569254ed3978c4f54Walter Jang 22631a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 22731a74ad969b650eb733e536569254ed3978c4f54Walter Jang public void onPhotoSelectionDismissed() { 22831a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 22931a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 23031a74ad969b650eb733e536569254ed3978c4f54Walter Jang 231363af60ea23e5a3b945005712a16564ab69db18bGary Mai private final EditorPhotoActionListener mPhotoActionListener; 23231a74ad969b650eb733e536569254ed3978c4f54Walter Jang 233363af60ea23e5a3b945005712a16564ab69db18bGary Mai public EditorPhotoSelectionHandler(int photoMode) { 23431a74ad969b650eb733e536569254ed3978c4f54Walter Jang // We pass a null changeAnchorView since we are overriding onClick so that we 23531a74ad969b650eb733e536569254ed3978c4f54Walter Jang // can show the photo options in a dialog instead of a ListPopupWindow (which would 23631a74ad969b650eb733e536569254ed3978c4f54Walter Jang // be anchored at changeAnchorView). 23731a74ad969b650eb733e536569254ed3978c4f54Walter Jang 23831a74ad969b650eb733e536569254ed3978c4f54Walter Jang // TODO: empty raw contact delta list 239363af60ea23e5a3b945005712a16564ab69db18bGary Mai super(ContactEditorActivity.this, /* changeAnchorView =*/ null, photoMode, 24031a74ad969b650eb733e536569254ed3978c4f54Walter Jang /* isDirectoryContact =*/ false, new RawContactDeltaList()); 241363af60ea23e5a3b945005712a16564ab69db18bGary Mai mPhotoActionListener = new EditorPhotoActionListener(); 24231a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 24331a74ad969b650eb733e536569254ed3978c4f54Walter Jang 24431a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 24531a74ad969b650eb733e536569254ed3978c4f54Walter Jang public PhotoActionListener getListener() { 24631a74ad969b650eb733e536569254ed3978c4f54Walter Jang return mPhotoActionListener; 24731a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 24831a74ad969b650eb733e536569254ed3978c4f54Walter Jang 24931a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 25031a74ad969b650eb733e536569254ed3978c4f54Walter Jang protected void startPhotoActivity(Intent intent, int requestCode, Uri photoUri) { 25131a74ad969b650eb733e536569254ed3978c4f54Walter Jang mPhotoUri = photoUri; 25231a74ad969b650eb733e536569254ed3978c4f54Walter Jang startActivityForResult(intent, requestCode); 25331a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 25431a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 25531a74ad969b650eb733e536569254ed3978c4f54Walter Jang 2568d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang private int mActionBarTitleResId; 2578d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang private ContactEditor mFragment; 25815646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai private Toolbar mToolbar; 2598d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang private boolean mFinishActivityOnSaveCompleted; 2608d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang private DialogManager mDialogManager = new DialogManager(this); 2618d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 262363af60ea23e5a3b945005712a16564ab69db18bGary Mai private EditorPhotoSelectionHandler mPhotoSelectionHandler; 26331a74ad969b650eb733e536569254ed3978c4f54Walter Jang private Uri mPhotoUri; 26431a74ad969b650eb733e536569254ed3978c4f54Walter Jang private int mPhotoMode; 265e2797dad8a5dd18561077c723db01d8e136a820dWalter Jang 266363af60ea23e5a3b945005712a16564ab69db18bGary Mai private final ContactEditorFragment.Listener mFragmentListener = 267363af60ea23e5a3b945005712a16564ab69db18bGary Mai new ContactEditorFragment.Listener() { 2688d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 2698d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 2708d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public void onDeleteRequested(Uri contactUri) { 2718d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang ContactDeletionInteraction.start( 272363af60ea23e5a3b945005712a16564ab69db18bGary Mai ContactEditorActivity.this, contactUri, true); 2738d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 2748d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 2758d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 2768d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public void onReverted() { 2778d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang finish(); 2788d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 2798d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 2808d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 2818d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public void onSaveFinished(Intent resultIntent) { 2828d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang if (mFinishActivityOnSaveCompleted) { 2838d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang setResult(resultIntent == null ? RESULT_CANCELED : RESULT_OK, resultIntent); 2848d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } else if (resultIntent != null) { 2858b341130a8af178e8f7491e7f8ec6b0714ae5d3fWalter Jang ImplicitIntentsUtil.startActivityInApp( 2868b341130a8af178e8f7491e7f8ec6b0714ae5d3fWalter Jang ContactEditorActivity.this, resultIntent); 2878d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 2888d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang finish(); 2898d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 2908d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 2918d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 2928d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public void onContactSplit(Uri newLookupUri) { 2938d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang setResult(RESULT_CODE_SPLIT, /* data */ null); 2948d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang finish(); 2958d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 2968d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 2978d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 2988d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public void onContactNotFound() { 2998d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang finish(); 3008d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 3018d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 3028d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 303678108ebb9926a79ad0d7ac4f11417dec1583d42Gary Mai public void onEditOtherRawContactRequested( 304678108ebb9926a79ad0d7ac4f11417dec1583d42Gary Mai Uri contactLookupUri, long rawContactId, ArrayList<ContentValues> values) { 305678108ebb9926a79ad0d7ac4f11417dec1583d42Gary Mai final Intent intent = EditorIntents.createEditOtherRawContactIntent( 306678108ebb9926a79ad0d7ac4f11417dec1583d42Gary Mai ContactEditorActivity.this, contactLookupUri, rawContactId, values); 3078d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang ImplicitIntentsUtil.startActivityInApp( 308363af60ea23e5a3b945005712a16564ab69db18bGary Mai ContactEditorActivity.this, intent); 3098d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang finish(); 3108d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 3118d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang }; 3128d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 3133f990ba4e35a99078d831c041290e574a320caa5Walter Jang @Override 3143f990ba4e35a99078d831c041290e574a320caa5Walter Jang public void onCreate(Bundle savedState) { 3153f990ba4e35a99078d831c041290e574a320caa5Walter Jang super.onCreate(savedState); 3163f990ba4e35a99078d831c041290e574a320caa5Walter Jang 3171e899dc127a212bfd2198fe7adba5c33eb4cd751Gary Mai RequestPermissionsActivity.startPermissionActivityIfNeeded(this); 318bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell 3198d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang final Intent intent = getIntent(); 3208d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang final String action = intent.getAction(); 3218d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 32230363a22d8b0f7ab467b2ab7f864d415d2d10916Gary Mai // Update the component name of our intent to be this class to clear out any activity 32330363a22d8b0f7ab467b2ab7f864d415d2d10916Gary Mai // aliases. Otherwise ContactSaveService won't notify this activity once a save is finished. 32430363a22d8b0f7ab467b2ab7f864d415d2d10916Gary Mai // See b/34154706 for more info. 32530363a22d8b0f7ab467b2ab7f864d415d2d10916Gary Mai intent.setComponent(new ComponentName(this, ContactEditorActivity.class)); 32630363a22d8b0f7ab467b2ab7f864d415d2d10916Gary Mai 3278d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang // Determine whether or not this activity should be finished after the user is done 3288d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang // editing the contact or if this activity should launch another activity to view the 3298d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang // contact's details. 3308d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang mFinishActivityOnSaveCompleted = intent.getBooleanExtra( 3318d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, false); 3328d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 3338d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang // The only situation where action could be ACTION_JOIN_COMPLETED is if the 3348d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang // user joined the contact with another and closed the activity before 3358d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang // the save operation was completed. The activity should remain closed then. 3368d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang if (ACTION_JOIN_COMPLETED.equals(action)) { 3378d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang finish(); 3388d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang return; 3398d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 3408d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 3418d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang if (ACTION_SAVE_COMPLETED.equals(action)) { 3428d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang finish(); 3438d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang return; 3448d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 3458d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 346363af60ea23e5a3b945005712a16564ab69db18bGary Mai setContentView(R.layout.contact_editor_activity); 34715646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai mToolbar = (Toolbar) findViewById(R.id.toolbar); 348c40f3e945c43ff1ff90abb7fb2daf56aba315e10Gary Mai setSupportActionBar(mToolbar); 34915646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai if (Intent.ACTION_EDIT.equals(action)) { 35015646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai mActionBarTitleResId = R.string.contact_editor_title_existing_contact; 35115646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai } else { 35215646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai mActionBarTitleResId = R.string.contact_editor_title_new_contact; 35315646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai } 35415646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai mToolbar.setTitle(mActionBarTitleResId); 355d8f3da6a4ea4054bd47959db85657a7e01d28358Gary Mai // Set activity title for Talkback 356d8f3da6a4ea4054bd47959db85657a7e01d28358Gary Mai setTitle(mActionBarTitleResId); 3573f990ba4e35a99078d831c041290e574a320caa5Walter Jang 35831a74ad969b650eb733e536569254ed3978c4f54Walter Jang if (savedState == null) { 35931a74ad969b650eb733e536569254ed3978c4f54Walter Jang // Create the editor and photo selection fragments 360363af60ea23e5a3b945005712a16564ab69db18bGary Mai mFragment = new ContactEditorFragment(); 361a69f58fcf5c143ac7dd6421a30004d56813e321aWalter Jang getFragmentManager().beginTransaction() 362363af60ea23e5a3b945005712a16564ab69db18bGary Mai .add(R.id.fragment_container, getEditorFragment(), TAG_EDITOR_FRAGMENT) 363a69f58fcf5c143ac7dd6421a30004d56813e321aWalter Jang .commit(); 36431a74ad969b650eb733e536569254ed3978c4f54Walter Jang } else { 36531a74ad969b650eb733e536569254ed3978c4f54Walter Jang // Restore state 36631a74ad969b650eb733e536569254ed3978c4f54Walter Jang mPhotoMode = savedState.getInt(STATE_PHOTO_MODE); 367bfea74f34f3c1c4ea33302c0c59635acb7b801adWenyi Wang mActionBarTitleResId = savedState.getInt(STATE_ACTION_BAR_TITLE); 368a9242e143ef468e74d28ac525539f803e120c520Wenyi Wang mPhotoUri = Uri.parse(savedState.getString(STATE_PHOTO_URI)); 36931a74ad969b650eb733e536569254ed3978c4f54Walter Jang 37031a74ad969b650eb733e536569254ed3978c4f54Walter Jang // Show/hide the editor and photo selection fragments (w/o animations) 371363af60ea23e5a3b945005712a16564ab69db18bGary Mai mFragment = (ContactEditorFragment) getFragmentManager() 372363af60ea23e5a3b945005712a16564ab69db18bGary Mai .findFragmentByTag(TAG_EDITOR_FRAGMENT); 37331a74ad969b650eb733e536569254ed3978c4f54Walter Jang final FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 374da20b47c2b85390a2c3772379e71203c5aab513cGary Mai fragmentTransaction.show(getEditorFragment()).commit(); 37515646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai mToolbar.setTitle(mActionBarTitleResId); 376a69f58fcf5c143ac7dd6421a30004d56813e321aWalter Jang } 37731a74ad969b650eb733e536569254ed3978c4f54Walter Jang 37831a74ad969b650eb733e536569254ed3978c4f54Walter Jang // Set listeners 3793f990ba4e35a99078d831c041290e574a320caa5Walter Jang mFragment.setListener(mFragmentListener); 3803f990ba4e35a99078d831c041290e574a320caa5Walter Jang 38131a74ad969b650eb733e536569254ed3978c4f54Walter Jang // Load editor data (even if it's hidden) 3823f990ba4e35a99078d831c041290e574a320caa5Walter Jang final Uri uri = Intent.ACTION_EDIT.equals(action) ? getIntent().getData() : null; 3833f990ba4e35a99078d831c041290e574a320caa5Walter Jang mFragment.load(action, uri, getIntent().getExtras()); 384082273bd687613e67c96d8087b964c5dc41e52a5Marcus Hagerott 385082273bd687613e67c96d8087b964c5dc41e52a5Marcus Hagerott if (Intent.ACTION_INSERT.equals(action)) { 386082273bd687613e67c96d8087b964c5dc41e52a5Marcus Hagerott DynamicShortcuts.reportShortcutUsed(this, DynamicShortcuts.SHORTCUT_ADD_CONTACT); 387082273bd687613e67c96d8087b964c5dc41e52a5Marcus Hagerott } 3883f990ba4e35a99078d831c041290e574a320caa5Walter Jang } 38931a74ad969b650eb733e536569254ed3978c4f54Walter Jang 3908d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 3918d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang protected void onPause() { 3928d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang super.onPause(); 3938d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang final InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); 3948d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang final View currentFocus = getCurrentFocus(); 3958d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang if (imm != null && currentFocus != null) { 3968d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0); 3978d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 3988d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 3998d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 4008d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 4018d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang protected void onNewIntent(Intent intent) { 4028d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang super.onNewIntent(intent); 4038d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 4048d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang if (mFragment == null) { 4058d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang return; 4068d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 4078d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 4088d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang final String action = intent.getAction(); 4098d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang if (Intent.ACTION_EDIT.equals(action)) { 4108d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang mFragment.setIntentExtras(intent.getExtras()); 4118d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } else if (ACTION_SAVE_COMPLETED.equals(action)) { 4128d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang mFragment.onSaveCompleted(true, 413363af60ea23e5a3b945005712a16564ab69db18bGary Mai intent.getIntExtra(ContactEditorFragment.SAVE_MODE_EXTRA_KEY, 4148d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang ContactEditor.SaveMode.CLOSE), 4158d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang intent.getBooleanExtra(ContactSaveService.EXTRA_SAVE_SUCCEEDED, false), 4168d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang intent.getData(), 417363af60ea23e5a3b945005712a16564ab69db18bGary Mai intent.getLongExtra(ContactEditorFragment.JOIN_CONTACT_ID_EXTRA_KEY, -1)); 4188d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } else if (ACTION_JOIN_COMPLETED.equals(action)) { 4198d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang mFragment.onJoinCompleted(intent.getData()); 4208d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 4218d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 4228d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 4238d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 4248d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang protected Dialog onCreateDialog(int id, Bundle args) { 4258d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang if (DialogManager.isManagedId(id)) return mDialogManager.onCreateDialog(id, args); 4268d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 4278d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang // Nobody knows about the Dialog 4288d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang Log.w(TAG, "Unknown dialog requested, id: " + id + ", args: " + args); 4298d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang return null; 4308d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 4318d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 4328d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 4338d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang public DialogManager getDialogManager() { 4348d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang return mDialogManager; 4358d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang } 4368d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang 4378d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang @Override 43831a74ad969b650eb733e536569254ed3978c4f54Walter Jang protected void onSaveInstanceState(Bundle outState) { 43931a74ad969b650eb733e536569254ed3978c4f54Walter Jang super.onSaveInstanceState(outState); 440bfea74f34f3c1c4ea33302c0c59635acb7b801adWenyi Wang outState.putInt(STATE_PHOTO_MODE, mPhotoMode); 441bfea74f34f3c1c4ea33302c0c59635acb7b801adWenyi Wang outState.putInt(STATE_ACTION_BAR_TITLE, mActionBarTitleResId); 442a9242e143ef468e74d28ac525539f803e120c520Wenyi Wang outState.putString(STATE_PHOTO_URI, 443a9242e143ef468e74d28ac525539f803e120c520Wenyi Wang mPhotoUri != null ? mPhotoUri.toString() : Uri.EMPTY.toString()); 44431a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 44531a74ad969b650eb733e536569254ed3978c4f54Walter Jang 44631a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 44731a74ad969b650eb733e536569254ed3978c4f54Walter Jang public void onActivityResult(int requestCode, int resultCode, Intent data) { 448a9242e143ef468e74d28ac525539f803e120c520Wenyi Wang if (mPhotoSelectionHandler == null) { 449363af60ea23e5a3b945005712a16564ab69db18bGary Mai mPhotoSelectionHandler = (EditorPhotoSelectionHandler) getPhotoSelectionHandler(); 450a9242e143ef468e74d28ac525539f803e120c520Wenyi Wang } 451a9242e143ef468e74d28ac525539f803e120c520Wenyi Wang if (mPhotoSelectionHandler.handlePhotoActivityResult(requestCode, resultCode, data)) { 4523f18d6197a54aad10bea9c5cc2c89ca82809e793Walter Jang return; 4533f18d6197a54aad10bea9c5cc2c89ca82809e793Walter Jang } 4543f18d6197a54aad10bea9c5cc2c89ca82809e793Walter Jang super.onActivityResult(requestCode, resultCode, data); 45531a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 45631a74ad969b650eb733e536569254ed3978c4f54Walter Jang 45731a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 45831a74ad969b650eb733e536569254ed3978c4f54Walter Jang public void onBackPressed() { 459da20b47c2b85390a2c3772379e71203c5aab513cGary Mai if (mFragment != null) { 4608d45cdbd4e1e0b37d705fd1dca3d8f941f75e772Walter Jang mFragment.revert(); 46131a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 46231a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 46331a74ad969b650eb733e536569254ed3978c4f54Walter Jang 46431a74ad969b650eb733e536569254ed3978c4f54Walter Jang /** 46531a74ad969b650eb733e536569254ed3978c4f54Walter Jang * Opens a dialog showing options for the user to change their photo (take, choose, or remove 46631a74ad969b650eb733e536569254ed3978c4f54Walter Jang * photo). 46731a74ad969b650eb733e536569254ed3978c4f54Walter Jang */ 46831a74ad969b650eb733e536569254ed3978c4f54Walter Jang public void changePhoto(int photoMode) { 46931a74ad969b650eb733e536569254ed3978c4f54Walter Jang mPhotoMode = photoMode; 47030328dbe381565e9eba39c096aaa939bb484913cGary Mai // This method is called from an onClick handler in the PhotoEditorView. It's possible for 47130328dbe381565e9eba39c096aaa939bb484913cGary Mai // onClick methods to run after onSaveInstanceState is called for the activity, so check 47230328dbe381565e9eba39c096aaa939bb484913cGary Mai // if it's safe to commit transactions before trying. 47330328dbe381565e9eba39c096aaa939bb484913cGary Mai if (isSafeToCommitTransactions()) { 47430328dbe381565e9eba39c096aaa939bb484913cGary Mai PhotoSourceDialogFragment.show(this, mPhotoMode); 47530328dbe381565e9eba39c096aaa939bb484913cGary Mai } 47631a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 47731a74ad969b650eb733e536569254ed3978c4f54Walter Jang 47815646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai public Toolbar getToolbar() { 47915646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai return mToolbar; 48015646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai } 48115646ce3e2e7a7f889976dc5684ecbc3029230c2Gary Mai 48231a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 48331a74ad969b650eb733e536569254ed3978c4f54Walter Jang public void onRemovePictureChosen() { 48431a74ad969b650eb733e536569254ed3978c4f54Walter Jang getPhotoSelectionHandler().getListener().onRemovePictureChosen(); 48531a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 48631a74ad969b650eb733e536569254ed3978c4f54Walter Jang 48731a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 48831a74ad969b650eb733e536569254ed3978c4f54Walter Jang public void onTakePhotoChosen() { 48931a74ad969b650eb733e536569254ed3978c4f54Walter Jang getPhotoSelectionHandler().getListener().onTakePhotoChosen(); 49031a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 49131a74ad969b650eb733e536569254ed3978c4f54Walter Jang 49231a74ad969b650eb733e536569254ed3978c4f54Walter Jang @Override 49331a74ad969b650eb733e536569254ed3978c4f54Walter Jang public void onPickFromGalleryChosen() { 49431a74ad969b650eb733e536569254ed3978c4f54Walter Jang getPhotoSelectionHandler().getListener().onPickFromGalleryChosen(); 49531a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 49631a74ad969b650eb733e536569254ed3978c4f54Walter Jang 49731a74ad969b650eb733e536569254ed3978c4f54Walter Jang private PhotoSelectionHandler getPhotoSelectionHandler() { 49831a74ad969b650eb733e536569254ed3978c4f54Walter Jang if (mPhotoSelectionHandler == null) { 499363af60ea23e5a3b945005712a16564ab69db18bGary Mai mPhotoSelectionHandler = new EditorPhotoSelectionHandler(mPhotoMode); 50031a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 50131a74ad969b650eb733e536569254ed3978c4f54Walter Jang return mPhotoSelectionHandler; 50231a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 50331a74ad969b650eb733e536569254ed3978c4f54Walter Jang 504363af60ea23e5a3b945005712a16564ab69db18bGary Mai private ContactEditorFragment getEditorFragment() { 505363af60ea23e5a3b945005712a16564ab69db18bGary Mai return (ContactEditorFragment) mFragment; 50631a74ad969b650eb733e536569254ed3978c4f54Walter Jang } 5073f990ba4e35a99078d831c041290e574a320caa5Walter Jang} 508