Merge "Implement editor springboard activity" into ub-contactsdialer-h-dev
diff --git a/res/values/colors.xml b/res/values/colors.xml
index f55cc95..98c522d 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -45,6 +45,9 @@
<color name="primary_color_dark">#0277bd</color>
<color name="primary_color">#0288d1</color>
+ <color name="group_primary_color_dark">#546E7A</color>
+ <color name="group_primary_color">#607D8B</color>
+
<!-- Color of the selected tab underline -->
<color name="contacts_accent_color">#FFFFFF</color>
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index b810eec..3fc3c9d 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -54,6 +54,7 @@
import com.android.contacts.common.util.AccountFilterUtil;
import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
import com.android.contacts.common.util.ImplicitIntentsUtil;
+import com.android.contacts.common.util.MaterialColorMapUtils;
import com.android.contacts.common.util.ViewUtil;
import com.android.contacts.editor.ContactEditorFragment;
import com.android.contacts.editor.SelectAccountDialogFragment;
@@ -134,6 +135,7 @@
// another fragment in navigation drawer, the current search/selection mode will be
// overlaid by the action bar of the newly-created fragment.
stopSearchAndSelection();
+ updateStatusBarBackground();
}
private void stopSearchAndSelection() {
@@ -170,7 +172,7 @@
super.onDrawerStateChanged(newState);
// Set transparent status bar when drawer starts to move.
if (newState != DrawerLayout.STATE_IDLE) {
- makeStatusBarTransparent();
+ updateStatusBarBackground();
}
if (mRunnable != null && newState == DrawerLayout.STATE_IDLE) {
mRunnable.run();
@@ -285,17 +287,23 @@
protected void onResume() {
super.onResume();
if (mDrawer.isDrawerOpen(GravityCompat.START)) {
- makeStatusBarTransparent();
+ updateStatusBarBackground();
}
}
- private void makeStatusBarTransparent() {
- // Avoid making status bar transparent when action bar's selection mode is on.
- if (getWindow().getStatusBarColor() !=
- ContextCompat.getColor(this, R.color.contextual_selection_bar_status_bar_color)
- && CompatUtils.isLollipopCompatible()) {
- getWindow().setStatusBarColor(Color.TRANSPARENT);
+ public void updateStatusBarBackground() {
+ updateStatusBarBackground(/* color */ -1);
+ }
+
+ public void updateStatusBarBackground(int color) {
+ if (!CompatUtils.isLollipopCompatible()) return;
+ if (color == -1) {
+ mDrawer.setStatusBarBackgroundColor(MaterialColorMapUtils.getStatusBarColor(this));
+ } else {
+ mDrawer.setStatusBarBackgroundColor(color);
}
+ mDrawer.invalidate();
+ getWindow().setStatusBarColor(Color.TRANSPARENT);
}
// Set up fragment manager to load groups and filters.
@@ -417,7 +425,7 @@
return null;
}
- protected boolean isGroupView() {
+ public boolean isGroupView() {
return mCurrentView == ContactsView.GROUP_VIEW;
}
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 824d4ea..880aa63 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -43,9 +43,11 @@
import android.widget.EditText;
import android.widget.TextView;
+import com.android.contacts.ContactsDrawerActivity;
import com.android.contacts.R;
import com.android.contacts.activities.ActionBarAdapter.Listener.Action;
import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.util.MaterialColorMapUtils;
import com.android.contacts.list.ContactsRequest;
import java.util.ArrayList;
@@ -365,6 +367,8 @@
= (mSearchContainer.getParent() == null) == mSearchMode;
final boolean isTabHeightChanging = isSearchModeChanging || isSelectionModeChanging;
+ // Update toolbar and status bar color.
+ mToolBarFrame.setBackgroundColor(MaterialColorMapUtils.getToolBarColor(mActivity));
updateStatusBarColor(isSelectionModeChanging && !isSearchModeChanging);
// When skipAnimation=true, it is possible that we will switch from search mode
@@ -494,12 +498,11 @@
mActivity, R.color.contextual_selection_bar_status_bar_color);
runStatusBarAnimation(/* colorTo */ cabStatusBarColor);
} else {
- final int normalStatusBarColor = ContextCompat.getColor(
- mActivity, R.color.primary_color_dark);
if (shouldAnimate) {
- runStatusBarAnimation(/* colorTo */ normalStatusBarColor);
- } else {
- mActivity.getWindow().setStatusBarColor(normalStatusBarColor);
+ runStatusBarAnimation(/* colorTo */
+ MaterialColorMapUtils.getStatusBarColor(mActivity));
+ } else if (mActivity instanceof ContactsDrawerActivity) {
+ ((ContactsDrawerActivity) mActivity).updateStatusBarBackground();
}
}
}
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index e4dc56d..b2a0a07 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -27,6 +27,8 @@
import android.content.Intent;
import android.content.SyncStatusObserver;
import android.content.IntentFilter;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@@ -34,6 +36,7 @@
import android.provider.ContactsContract.ProviderStatus;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
+import android.support.v4.content.ContextCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.SwipeRefreshLayout;
@@ -384,10 +387,7 @@
setUpAllFragment(fragmentManager);
- if (isGroupView()) {
- mMembersFragment = (GroupMembersFragment)
- fragmentManager.findFragmentByTag(TAG_GROUP_VIEW);
- }
+ mMembersFragment = (GroupMembersFragment) fragmentManager.findFragmentByTag(TAG_GROUP_VIEW);
// Configure floating action button
mFloatingActionButtonContainer = findViewById(R.id.floating_action_button_container);
@@ -692,11 +692,13 @@
}
private boolean isAllFragmentInSelectionMode() {
- return mAllFragment.getActionBarAdapter().isSelectionMode();
+ return mAllFragment.getActionBarAdapter() != null
+ && mAllFragment.getActionBarAdapter().isSelectionMode();
}
private boolean isAllFragmentInSearchMode() {
- return mAllFragment.getActionBarAdapter().isSearchMode();
+ return mAllFragment.getActionBarAdapter() != null
+ && mAllFragment.getActionBarAdapter().isSearchMode();
}
@Override
@@ -758,10 +760,11 @@
}
private void switchToOrUpdateGroupView(String action) {
- final boolean shouldUpdate = mMembersFragment != null;
- switchView(ContactsView.GROUP_VIEW);
- if (shouldUpdate) {
+ // If group fragment is active and visible, we simply update it.
+ if (mMembersFragment != null && !mMembersFragment.isInactive()) {
mMembersFragment.updateExistingGroupFragment(mGroupUri, action);
+ } else {
+ switchView(ContactsView.GROUP_VIEW);
}
}
@@ -782,14 +785,21 @@
transaction.replace(
R.id.contacts_list_container, mMembersFragment, TAG_GROUP_VIEW);
} else if (isDuplicatesView()) {
- final Fragment duplicatesFragment = ObjectFactory.getDuplicatesFragment();
- final Fragment duplicatesUtilFragment = ObjectFactory.getDuplicatesUtilFragment();
- if (duplicatesFragment != null && duplicatesUtilFragment != null) {
+ Fragment duplicatesFragment = fragmentManager.findFragmentByTag(TAG_DUPLICATES);
+ Fragment duplicatesUtilFragment =
+ fragmentManager.findFragmentByTag(TAG_DUPLICATES_UTIL);
+ if (duplicatesFragment == null || duplicatesUtilFragment == null) {
+ duplicatesFragment = ObjectFactory.getDuplicatesFragment();
+ duplicatesUtilFragment = ObjectFactory.getDuplicatesUtilFragment();
duplicatesUtilFragment.setTargetFragment(duplicatesFragment, /* requestCode */ 0);
- transaction.replace(
- R.id.contacts_list_container, duplicatesFragment, TAG_DUPLICATES);
- transaction.add(duplicatesUtilFragment, TAG_DUPLICATES_UTIL);
}
+ transaction.replace(
+ R.id.contacts_list_container, duplicatesFragment, TAG_DUPLICATES);
+ if (!duplicatesUtilFragment.isAdded()) {
+ transaction.add(duplicatesUtilFragment, TAG_DUPLICATES_UTIL);
+ resetToolBarStatusBarColor();
+ }
+ resetToolBarStatusBarColor();
}
transaction.addToBackStack(TAG_SECOND_LEVEL);
transaction.commit();
@@ -806,6 +816,7 @@
mShouldSwitchToAllContacts = false;
mCurrentView = ContactsView.ALL_CONTACTS;
showFabWithAnimation(/* showFab */ true);
+ mAllFragment.scrollToTop();
super.switchToAllContacts();
}
@@ -814,6 +825,14 @@
getFragmentManager().popBackStackImmediate(
TAG_SECOND_LEVEL, FragmentManager.POP_BACK_STACK_INCLUSIVE);
mMembersFragment = null;
+ resetToolBarStatusBarColor();
+ }
+
+ // Reset toolbar and status bar color to Contacts theme color.
+ private void resetToolBarStatusBarColor() {
+ findViewById(R.id.toolbar_frame).setBackgroundColor(
+ ContextCompat.getColor(this, R.color.primary_color));
+ updateStatusBarBackground(ContextCompat.getColor(this, R.color.primary_color_dark));
}
@Override
diff --git a/src/com/android/contacts/common/util/MaterialColorMapUtils.java b/src/com/android/contacts/common/util/MaterialColorMapUtils.java
index a8fbf42..50d8f0f 100644
--- a/src/com/android/contacts/common/util/MaterialColorMapUtils.java
+++ b/src/com/android/contacts/common/util/MaterialColorMapUtils.java
@@ -16,13 +16,16 @@
package com.android.contacts.common.util;
-import com.android.contacts.common.R;
+import com.android.contacts.ContactsDrawerActivity;
+import com.android.contacts.R;
+import android.app.Activity;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Trace;
+import android.support.v4.content.ContextCompat;
public class MaterialColorMapUtils {
private final TypedArray sPrimaryColors;
@@ -177,4 +180,26 @@
return H;
}
+
+ /**
+ * Returns status bar color for group view and non-group views.
+ */
+ public static int getStatusBarColor(Activity activity) {
+ final boolean isGroupView = activity instanceof ContactsDrawerActivity
+ && ((ContactsDrawerActivity) activity).isGroupView();
+ return isGroupView
+ ? ContextCompat.getColor(activity, R.color.group_primary_color_dark)
+ : ContextCompat.getColor(activity, R.color.primary_color_dark);
+ }
+
+ /**
+ * Returns toolbar color for group view and non-group views.
+ */
+ public static int getToolBarColor(Activity activity) {
+ final boolean isGroupView = activity instanceof ContactsDrawerActivity
+ && ((ContactsDrawerActivity) activity).isGroupView();
+ return isGroupView
+ ? ContextCompat.getColor(activity, R.color.group_primary_color)
+ : ContextCompat.getColor(activity, R.color.primary_color);
+ }
}
diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index 809cf20..30f339c 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -24,8 +24,9 @@
import android.database.CursorWrapper;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
import android.provider.ContactsContract.Contacts;
-import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
@@ -78,7 +79,7 @@
private static final String ARG_GROUP_URI = "groupUri";
private static final int LOADER_GROUP_METADATA = 0;
-
+ private static final int MSG_FAIL_TO_LOAD = 1;
private static final int RESULT_GROUP_ADD_MEMBER = 100;
/** Filters out duplicate contacts. */
@@ -194,9 +195,7 @@
Log.e(TAG, "Failed to load group metadata for " + mGroupUri);
Toast.makeText(getContext(), R.string.groupLoadErrorToast, Toast.LENGTH_SHORT)
.show();
- // TODO: we probably shouldn't finish mActivity.
- mActivity.setResult(AppCompatActivity.RESULT_CANCELED);
- mActivity.finish();
+ mHandler.sendEmptyMessage(MSG_FAIL_TO_LOAD);
return;
}
mGroupMetaData = new GroupMetaData(getActivity(), cursor);
@@ -219,6 +218,15 @@
private Set<String> mGroupMemberContactIds = new HashSet();
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if(msg.what == MSG_FAIL_TO_LOAD) {
+ mActivity.onBackPressed();
+ }
+ }
+ };
+
public static GroupMembersFragment newInstance(Uri groupUri) {
final Bundle args = new Bundle();
args.putParcelable(ARG_GROUP_URI, groupUri);
@@ -646,6 +654,13 @@
return mGroupMetaData != null && mGroupMetaData.groupId == groupId;
}
+ /**
+ * Return true if the fragment is not yet added, being removed, or detached.
+ */
+ public boolean isInactive() {
+ return !isAdded() || isRemoving() || isDetached();
+ }
+
@Override
public void onDestroy() {
if (mActionBarAdapter != null) {