Merge "Modified doPickRingtone() and onRingtonePicked() to handle silent ringtone" into ub-contactsdialer-a-dev
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 36e805c..53bfce0 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -84,6 +84,8 @@
     private ContactsIntentResolver mIntentResolver;
     protected ContactEntryListFragment<?> mListFragment;
 
+    private boolean mIsVisible;
+
     private int mActionCode = -1;
     private boolean mIsSearchMode;
     private boolean mIsSearchSupported;
@@ -137,6 +139,25 @@
         prepareSearchViewAndActionBar();
     }
 
+    @Override
+    protected void onStart() {
+        super.onStart();
+        mIsVisible = true;
+    }
+
+    @Override
+    protected void onStop() {
+        mIsVisible = false;
+        super.onStop();
+    }
+
+    /**
+     * Returns true when the Activity is currently visible (between onStart and onStop).
+     */
+    /* package */ boolean isVisible() {
+        return mIsVisible;
+    }
+
     private void prepareSearchViewAndActionBar() {
         final ActionBar actionBar = getActionBar();
         mSearchViewContainer = LayoutInflater.from(actionBar.getThemedContext())
@@ -212,6 +233,7 @@
 
     @Override
     protected void onSaveInstanceState(Bundle outState) {
+        mIsVisible = false;
         super.onSaveInstanceState(outState);
         outState.putInt(KEY_ACTION_CODE, mActionCode);
         outState.putBoolean(KEY_SEARCH_MODE, mIsSearchMode);
@@ -484,17 +506,13 @@
     private final class PhoneNumberPickerActionListener implements
             OnPhoneNumberPickerActionListener {
         @Override
-        public void onPickPhoneNumberAction(Uri dataUri) {
+        public void onPickPhoneNumberAction(Uri dataUri, int callInitiationType) {
             returnPickerResult(dataUri);
         }
 
         @Override
-        public void onCallNumberDirectly(String phoneNumber) {
-            Log.w(TAG, "Unsupported call.");
-        }
-
-        @Override
-        public void onCallNumberDirectly(String phoneNumber, boolean isVideoCall) {
+        public void onCallNumberDirectly(String phoneNumber, boolean isVideoCall,
+                int callInitiationType) {
             Log.w(TAG, "Unsupported call.");
         }
 
@@ -503,6 +521,7 @@
             returnPickerResult(intent);
         }
 
+        @Override
         public void onHomeInActionBarSelected() {
             ContactSelectionActivity.this.onBackPressed();
         }
@@ -672,6 +691,10 @@
 
     @Override
     public void onBackPressed() {
+        if (!isVisible()) {
+            return;
+        }
+
         if (mIsSearchMode) {
             mIsSearchMode = false;
             configureSearchMode();
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 9103a53..ec78b4d 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -142,6 +142,8 @@
     private MultiSelectContactsListFragment mAllFragment;
     private ContactTileListFragment mFavoritesFragment;
 
+    private boolean mIsVisible;
+
     /** ViewPager for swipe */
     private ViewPager mTabPager;
     private ViewPagerTabs mViewPagerTabs;
@@ -410,6 +412,14 @@
             configureFragments(!mIsRecreatedInstance);
         }
         super.onStart();
+
+        mIsVisible = true;
+    }
+
+    @Override
+    protected void onStop() {
+        mIsVisible = false;
+        super.onStop();
     }
 
     @Override
@@ -454,6 +464,13 @@
         super.onDestroy();
     }
 
+    /**
+     * Returns true when the Activity is currently visible (between onStart and onStop).
+     */
+    /* package */ boolean isVisible() {
+        return mIsVisible;
+    }
+
     private void configureFragments(boolean fromRequest) {
         if (fromRequest) {
             ContactListFilter filter = null;
@@ -1338,6 +1355,10 @@
 
     @Override
     public void onBackPressed() {
+        if (!isVisible()) {
+            return;
+        }
+
         if (mActionBarAdapter.isSelectionMode()) {
             mActionBarAdapter.setSelectionMode(false);
             mAllFragment.displayCheckBoxes(false);
@@ -1350,6 +1371,8 @@
 
     @Override
     protected void onSaveInstanceState(Bundle outState) {
+        mIsVisible = false;
+
         super.onSaveInstanceState(outState);
         mActionBarAdapter.onSaveInstanceState(outState);
 
diff --git a/src/com/android/contacts/editor/CompactContactEditorFragment.java b/src/com/android/contacts/editor/CompactContactEditorFragment.java
index 656c5ae..3a062cf 100644
--- a/src/com/android/contacts/editor/CompactContactEditorFragment.java
+++ b/src/com/android/contacts/editor/CompactContactEditorFragment.java
@@ -363,8 +363,8 @@
 
         // Prepare an Intent to start the expanded editor
         final Intent intent = isInsert
-                ? EditorIntents.createInsertContactIntent(
-                        mState, getDisplayName(), getPhoneticName(), mUpdatedPhotos)
+                ? EditorIntents.createInsertContactIntent(mState, getDisplayName(),
+                        getPhoneticName(), mUpdatedPhotos, mNewLocalProfile)
                 : EditorIntents.createEditContactIntent(mLookupUri, getMaterialPalette(),
                         mPhotoId, mNameId);
         ImplicitIntentsUtil.startActivityInApp(getActivity(), intent);
diff --git a/src/com/android/contacts/editor/ContactEditorBaseFragment.java b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
index fc85fe7..4f2ae78 100644
--- a/src/com/android/contacts/editor/ContactEditorBaseFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
@@ -792,7 +792,7 @@
                     && !isSingleReadOnlyContact);
             // Cannot join a user profile
             joinMenu.setVisible(!isEditingUserProfile());
-            deleteMenu.setVisible(!mDisableDeleteMenuOption);
+            deleteMenu.setVisible(!mDisableDeleteMenuOption && !isEditingUserProfile());
         } else {
             // something else, so don't show the help menu
             helpMenu.setVisible(false);
@@ -970,7 +970,7 @@
             // 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(), getPhoneticName(), mUpdatedPhotos);
+                    mState, getDisplayName(), getPhoneticName(), mUpdatedPhotos, mNewLocalProfile);
             resultIntent.putExtra(INTENT_EXTRA_SAVE_BACK_PRESSED, backPressed);
             mListener.onSaveFinished(resultIntent);
             return true;
@@ -1123,7 +1123,7 @@
                 mListener.onCustomCreateContactActivityRequested(account, mIntentExtras);
             }
         } else {
-            setStateForNewContact(account, accountType);
+            setStateForNewContact(account, accountType, isEditingUserProfile());
         }
     }
 
@@ -1200,9 +1200,10 @@
     /**
      * Prepare {@link #mState} for a newly created phone-local contact.
      */
-    private void setStateForNewContact(AccountWithDataSet account, AccountType accountType) {
-        setStateForNewContact(account, accountType,
-                /* oldState =*/ null, /* oldAccountType =*/ null);
+    private void setStateForNewContact(AccountWithDataSet account, AccountType accountType,
+            boolean isUserProfile) {
+        setStateForNewContact(account, accountType, /* oldState =*/ null,
+                /* oldAccountType =*/ null, isUserProfile);
     }
 
     /**
@@ -1210,9 +1211,10 @@
      * specified by oldState and oldAccountType.
      */
     protected void setStateForNewContact(AccountWithDataSet account, AccountType accountType,
-            RawContactDelta oldState, AccountType oldAccountType) {
+            RawContactDelta oldState, AccountType oldAccountType, boolean isUserProfile) {
         mStatus = Status.EDITING;
         mState.add(createNewRawContactDelta(account, accountType, oldState, oldAccountType));
+        mIsUserProfile = isUserProfile;
         mNewContactDataReady = true;
         bindEditors();
     }
@@ -1448,7 +1450,8 @@
                             mContext, contactLookupUri, mLookupUri);
                     final Intent resultIntent = isInsert(getActivity().getIntent())
                             ? EditorIntents.createCompactInsertContactIntent(
-                                    mState, getDisplayName(), getPhoneticName(), updatedPhotos)
+                                    mState, getDisplayName(), getPhoneticName(), updatedPhotos,
+                                    mNewLocalProfile)
                             : EditorIntents.createCompactEditContactIntent(
                                     lookupUri, getMaterialPalette(), updatedPhotos, photoId,
                                     nameId);
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 4da17fa..b29ad30 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -166,9 +166,11 @@
             mExistingContactDataReady = false;
             mNewContactDataReady = false;
             mState = new RawContactDeltaList();
-            setStateForNewContact(newAccount, newAccountType, oldState, oldAccountType);
+            setStateForNewContact(newAccount, newAccountType, oldState, oldAccountType,
+                    isEditingUserProfile());
             if (mIsEdit) {
-                setStateForExistingContact(mReadOnlyDisplayName, mIsUserProfile, mRawContacts);
+                setStateForExistingContact(mReadOnlyDisplayName, isEditingUserProfile(),
+                        mRawContacts);
             }
         }
     }
@@ -300,7 +302,7 @@
 
                 rawContactEditor.setAutoAddToDefaultGroup(mAutoAddToDefaultGroup);
 
-                if (isAggregationSuggestionRawContactId(rawContactId)) {
+                if (!isEditingUserProfile() && isAggregationSuggestionRawContactId(rawContactId)) {
                     acquireAggregationSuggestions(activity,
                             rawContactEditor.getNameEditor().getRawContactId(),
                             rawContactEditor.getNameEditor().getValues());
diff --git a/src/com/android/contacts/editor/EditorIntents.java b/src/com/android/contacts/editor/EditorIntents.java
index a3c29fc..68ce76f 100644
--- a/src/com/android/contacts/editor/EditorIntents.java
+++ b/src/com/android/contacts/editor/EditorIntents.java
@@ -58,7 +58,8 @@
      */
     public static Intent createCompactInsertContactIntent() {
         return createCompactInsertContactIntent(/* rawContactDeltaList =*/ null,
-                /* displayName =*/ null, /* phoneticName =*/ null, /* updatedPhotos =*/ null);
+                /* displayName =*/ null, /* phoneticName =*/ null, /* updatedPhotos =*/ null,
+                /* isNewLocalProfile =*/ false);
     }
 
     /**
@@ -66,8 +67,10 @@
      * the field values specified by rawContactDeltaList pre-populate in the form.
      */
     public static Intent createCompactInsertContactIntent(RawContactDeltaList rawContactDeltaList,
-            String displayName, String phoneticName, Bundle updatedPhotos) {
+            String displayName, String phoneticName, Bundle updatedPhotos,
+            boolean isNewLocalProfile) {
         final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
+        intent.putExtra(ContactEditorFragment.INTENT_EXTRA_NEW_LOCAL_PROFILE, isNewLocalProfile);
         if (rawContactDeltaList != null || displayName != null || phoneticName != null) {
             putRawContactDeltaValues(intent, rawContactDeltaList, displayName, phoneticName);
         }
@@ -112,9 +115,11 @@
      * existing contact.
      */
     public static Intent createInsertContactIntent(RawContactDeltaList rawContactDeltaList,
-            String displayName, String phoneticName, Bundle updatedPhotos) {
+            String displayName, String phoneticName, Bundle updatedPhotos,
+            boolean isNewLocalProfile) {
         final Intent intent = new Intent(ContactEditorBaseActivity.ACTION_INSERT,
                 Contacts.CONTENT_URI);
+        intent.putExtra(ContactEditorFragment.INTENT_EXTRA_NEW_LOCAL_PROFILE, isNewLocalProfile);
         addContactIntentFlags(intent);
         putRawContactDeltaValues(intent, rawContactDeltaList, displayName, phoneticName);
         putUpdatedPhotos(intent, updatedPhotos);
diff --git a/src/com/android/contacts/editor/RawContactDeltaComparator.java b/src/com/android/contacts/editor/RawContactDeltaComparator.java
index 17a4dda..1a00c9d 100644
--- a/src/com/android/contacts/editor/RawContactDeltaComparator.java
+++ b/src/com/android/contacts/editor/RawContactDeltaComparator.java
@@ -120,12 +120,14 @@
         // Both are in the same account, fall back to contact ID
         Long oneId = one.getRawContactId();
         Long twoId = two.getRawContactId();
-        if (oneId == null) {
+        if (oneId == null && twoId == null) {
+            return 0;
+        } else if (oneId == null) {
             return -1;
         } else if (twoId == null) {
             return 1;
         }
 
-        return (int) (oneId - twoId);
+        return Long.compare(oneId, twoId);
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index b05cbab..a626ad0 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -114,7 +114,7 @@
     static ContactDeletionInteraction startWithTestLoaderManager(
             Activity activity, Uri contactUri, boolean finishActivityWhenDone,
             TestLoaderManagerBase testLoaderManager) {
-        if (contactUri == null) {
+        if (contactUri == null || activity.isDestroyed()) {
             return null;
         }
 
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 64d8aec..8bb6976 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -2396,7 +2396,7 @@
             }
 
             final MenuItem deleteMenuItem = menu.findItem(R.id.menu_delete);
-            deleteMenuItem.setVisible(isContactEditable());
+            deleteMenuItem.setVisible(isContactEditable() && !mContactData.isUserProfile());
 
             final MenuItem shareMenuItem = menu.findItem(R.id.menu_share);
             shareMenuItem.setVisible(isContactShareable());