Wait until drawer closes before lauching activities (1/2)

Also:
* set transparent status bar when drawer starts to move.
* move some logic to base activity so as to simplify logic.

Bug 29425259
Bug 28891044

Change-Id: I71cc84fcebac6e0eab840c83353279bdc197944d
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index a8c8956..466aa91 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -25,6 +25,7 @@
 import android.os.Bundle;
 import android.support.annotation.LayoutRes;
 import android.support.design.widget.NavigationView;
+import android.support.v4.content.ContextCompat;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBarDrawerToggle;
@@ -36,10 +37,12 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.SubMenu;
+import android.view.View;
 import android.view.ViewGroup;
 
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.compat.BlockedNumberContractCompat;
+import com.android.contacts.common.compat.CompatUtils;
 import com.android.contacts.common.compat.TelecomManagerUtil;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactListFilterController;
@@ -79,8 +82,51 @@
     protected static final String GROUPS_TAG = "groups";
     protected static final String FILTERS_TAG = "filters";
 
+    private class ContactsActionBarDrawerToggle extends ActionBarDrawerToggle {
+
+        private Runnable mRunnable;
+
+        public ContactsActionBarDrawerToggle(AppCompatActivity activity, DrawerLayout drawerLayout,
+                Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) {
+            super(activity, drawerLayout, toolbar, openDrawerContentDescRes,
+                    closeDrawerContentDescRes);
+        }
+
+        @Override
+        public void onDrawerOpened(View drawerView) {
+            super.onDrawerOpened(drawerView);
+            invalidateOptionsMenu();
+        }
+
+        @Override
+        public void onDrawerClosed(View view) {
+            super.onDrawerClosed(view);
+            invalidateOptionsMenu();
+        }
+
+        @Override
+        public void onDrawerStateChanged(int newState) {
+            super.onDrawerStateChanged(newState);
+            // Set transparent status bar when drawer starts to move.
+            if (CompatUtils.isLollipopCompatible() && newState != DrawerLayout.STATE_IDLE
+                    && getWindow().getStatusBarColor() == ContextCompat.getColor
+                    (ContactsDrawerActivity.this, R.color.primary_color_dark)) {
+                getWindow().setStatusBarColor(Color.TRANSPARENT);
+            }
+            if (mRunnable != null && newState == DrawerLayout.STATE_IDLE) {
+                mRunnable.run();
+                mRunnable = null;
+            }
+        }
+
+        public void runWhenIdle(Runnable runnable) {
+            mRunnable = runnable;
+        }
+    }
+
     protected ContactListFilterController mContactListFilterController;
     protected DrawerLayout mDrawer;
+    protected ContactsActionBarDrawerToggle mToggle;
     protected Toolbar mToolbar;
     protected NavigationView mNavigationView;
     protected GroupsFragment mGroupsFragment;
@@ -111,10 +157,10 @@
 
         // Set up hamburger button.
         mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
-        final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawer, mToolbar,
+        mToggle = new ContactsActionBarDrawerToggle(this, mDrawer, mToolbar,
                 R.string.navigation_drawer_open, R.string.navigation_drawer_close);
-        mDrawer.setDrawerListener(toggle);
-        toggle.syncState();
+        mDrawer.setDrawerListener(mToggle);
+        mToggle.syncState();
 
         // Set up hamburger menu items.
         mNavigationView = (NavigationView) findViewById(R.id.nav_view);
@@ -222,7 +268,13 @@
                 menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                     @Override
                     public boolean onMenuItemClick(MenuItem item) {
-                        onGroupMenuItemClicked(groupListItem.getGroupId());
+                        mToggle.runWhenIdle(new Runnable() {
+                            @Override
+                            public void run() {
+                                onGroupMenuItemClicked(groupListItem.getGroupId());
+                            }
+                        });
+                        mDrawer.closeDrawer(GravityCompat.START);
                         return true;
                     }
                 });
@@ -241,7 +293,13 @@
         menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
             @Override
             public boolean onMenuItemClick(MenuItem item) {
-                onCreateGroupMenuItemClicked();
+                mToggle.runWhenIdle(new Runnable() {
+                    @Override
+                    public void run() {
+                        onCreateGroupMenuItemClicked();
+                    }
+                });
+                mDrawer.closeDrawer(GravityCompat.START);
                 return true;
             }
         });
@@ -269,13 +327,14 @@
     }
 
     protected void onGroupMenuItemClicked(long groupId) {
-        final Intent intent = GroupUtil.createViewGroupIntent(this, groupId);
-        startActivity(intent);
+        startActivity(GroupUtil.createViewGroupIntent(this, groupId));
+        if (shouldFinish()) {
+            finish();
+        }
     }
 
     protected void onCreateGroupMenuItemClicked() {
         startActivity(GroupUtil.createAddGroupIntent(this));
-        mDrawer.closeDrawer(GravityCompat.START);
     }
 
     @Override
@@ -301,12 +360,18 @@
             menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                 @Override
                 public boolean onMenuItemClick(MenuItem item) {
+                    mToggle.runWhenIdle(new Runnable() {
+                        @Override
+                        public void run() {
+                            AccountFilterUtil.handleAccountFilterResult(
+                                    mContactListFilterController, AppCompatActivity.RESULT_OK,
+                                    intent);
+                            if (shouldFinish()) {
+                                finish();
+                            }
+                        }
+                    });
                     mDrawer.closeDrawer(GravityCompat.START);
-                    AccountFilterUtil.handleAccountFilterResult(mContactListFilterController,
-                            AppCompatActivity.RESULT_OK, intent);
-                    if (shouldFinish()) {
-                        finish();
-                    }
                     return true;
                 }
             });
@@ -348,26 +413,32 @@
     protected abstract boolean shouldFinish();
 
     @Override
-    public boolean onNavigationItemSelected(MenuItem item) {
+    public boolean onNavigationItemSelected(final MenuItem item) {
         final int id = item.getItemId();
 
-        if (id == R.id.nav_settings) {
-            startActivity(createPreferenceIntent());
-        } else if (id == R.id.nav_help) {
-            HelpUtils.launchHelpAndFeedbackForMainScreen(this);
-        } else if (id == R.id.nav_all_contacts) {
-            switchToAllContacts();
-        } else if (id == R.id.nav_blocked_numbers) {
-            final Intent intent = TelecomManagerUtil.createManageBlockedNumbersIntent(
-                    (TelecomManager) getSystemService(Context.TELECOM_SERVICE));
-            ImplicitIntentsUtil.startActivityInApp(this, intent);
-        } else if (id == R.id.nav_find_duplicates) {
-            launchFindDuplicates();
-        } else if (item.getIntent() != null) {
-            ImplicitIntentsUtil.startActivityInApp(this, item.getIntent());
-        } else {
-            Log.w(TAG, "Unhandled navigation view item selection");
-        }
+        mToggle.runWhenIdle(new Runnable() {
+            @Override
+            public void run() {
+                if (id == R.id.nav_settings) {
+                    startActivity(createPreferenceIntent());
+                } else if (id == R.id.nav_help) {
+                    HelpUtils.launchHelpAndFeedbackForMainScreen(ContactsDrawerActivity.this);
+                } else if (id == R.id.nav_all_contacts) {
+                    switchToAllContacts();
+                } else if (id == R.id.nav_blocked_numbers) {
+                    final Intent intent = TelecomManagerUtil.createManageBlockedNumbersIntent(
+                            (TelecomManager) getSystemService(Context.TELECOM_SERVICE));
+                    startActivity(intent);
+                } else if (id == R.id.nav_find_duplicates) {
+                    launchFindDuplicates();
+                } else if (item.getIntent() != null) {
+                    ImplicitIntentsUtil.startActivityInApp(ContactsDrawerActivity.this,
+                            item.getIntent());
+                } else {
+                    Log.w(TAG, "Unhandled navigation view item selection");
+                }
+            }
+        });
 
         mDrawer.closeDrawer(GravityCompat.START);
         return true;
@@ -390,6 +461,9 @@
         intent.putExtra(AccountFilterUtil.EXTRA_CONTACT_LIST_FILTER, filter);
         AccountFilterUtil.handleAccountFilterResult(
                 mContactListFilterController, AppCompatActivity.RESULT_OK, intent);
+        if (shouldFinish()) {
+            finish();
+        }
     }
 
     protected void launchFindDuplicates() {