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