Add popup menu to paged change details and offer abandon/restore

The paged change details fragment hides the default support action
bar. To offer additional actions, add a custom popup menu. For now
abandon/restore are available from this menu (more action will come
later).

Change-Id: I3528539efd8a501b3202dc8d7d345d6d2a8b54eb
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/app/src/main/java/com/google/reviewit/AbandonFragment.java b/app/src/main/java/com/google/reviewit/AbandonFragment.java
index 18fd229..ca99768 100644
--- a/app/src/main/java/com/google/reviewit/AbandonFragment.java
+++ b/app/src/main/java/com/google/reviewit/AbandonFragment.java
@@ -50,7 +50,7 @@
   public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
 
-    Change change = getApp().getSortActionHandler().getCurrentChange();
+    Change change = getApp().getCurrentChange();
     setTitle(getString(R.string.abandon_change_title, change.info._number));
     init(change);
   }
diff --git a/app/src/main/java/com/google/reviewit/PagedChangeDetailsFragment.java b/app/src/main/java/com/google/reviewit/PagedChangeDetailsFragment.java
index 72f5de8..ee78ec5 100644
--- a/app/src/main/java/com/google/reviewit/PagedChangeDetailsFragment.java
+++ b/app/src/main/java/com/google/reviewit/PagedChangeDetailsFragment.java
@@ -19,7 +19,11 @@
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentPagerAdapter;
 import android.support.v4.view.ViewPager;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.PopupMenu;
 
+import com.google.gerrit.extensions.client.ChangeStatus;
 import com.google.reviewit.app.Change;
 import com.google.reviewit.widget.ChangeEntry;
 import com.google.reviewit.widget.SlidingTabLayout;
@@ -47,7 +51,7 @@
   }
 
   private void init() {
-    Change change = getApp().getQueryHandler().getCurrentChange();
+    final Change change = getApp().getQueryHandler().getCurrentChange();
     checkArgument(change != null, "No change to display");
 
     ChangeEntry changeEntry = new ChangeEntry(getContext());
@@ -97,5 +101,39 @@
     tabs.setBottomBorderThickness(widgetUtil.dpToPx(1));
     tabs.setSelectedIndicatorThickness(widgetUtil.dpToPx(5));
     tabs.setViewPager(pager);
+
+    final View more = v(R.id.more);
+    more.setOnClickListener(new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        PopupMenu popup = new PopupMenu(getContext(), more);
+        popup.getMenuInflater()
+            .inflate(R.menu.menu_paged_change_details, popup.getMenu());
+
+        popup.getMenu().findItem(R.id.action_abandon).setVisible(
+            change.info.status == ChangeStatus.NEW
+                || change.info.status == ChangeStatus.SUBMITTED);
+        popup.getMenu().findItem(R.id.action_restore).setVisible(
+            change.info.status == ChangeStatus.ABANDONED);
+
+        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+          public boolean onMenuItemClick(MenuItem item) {
+            switch (item.getItemId()) {
+              case R.id.action_abandon:
+                display(AbandonFragment.create(
+                    PagedChangeDetailsFragment.class));
+                return true;
+              case R.id.action_restore:
+                display(RestoreFragment.create(
+                    PagedChangeDetailsFragment.class));
+                return true;
+              default:
+                return true;
+            }
+          }
+        });
+        popup.show();
+      }
+    });
   }
 }
diff --git a/app/src/main/java/com/google/reviewit/RestoreFragment.java b/app/src/main/java/com/google/reviewit/RestoreFragment.java
index abd107b..e51ebfa 100644
--- a/app/src/main/java/com/google/reviewit/RestoreFragment.java
+++ b/app/src/main/java/com/google/reviewit/RestoreFragment.java
@@ -50,7 +50,7 @@
   public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
 
-    Change change = getApp().getSortActionHandler().getCurrentChange();
+    Change change = getApp().getCurrentChange();
     setTitle(getString(R.string.restore_change_title, change.info._number));
     init(change);
   }
diff --git a/app/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png
new file mode 100755
index 0000000..67f07e4
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png
new file mode 100755
index 0000000..017e45e
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png
new file mode 100755
index 0000000..efab8a7
--- /dev/null
+++ b/app/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png
new file mode 100755
index 0000000..d322813
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_more_vert_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_more_vert_white_24dp.png
new file mode 100755
index 0000000..2f2cb3d
--- /dev/null
+++ b/app/src/main/res/drawable-xxxhdpi/ic_more_vert_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/layout/content_paged_change_details.xml b/app/src/main/res/layout/content_paged_change_details.xml
index fd707df..0178bba 100644
--- a/app/src/main/res/layout/content_paged_change_details.xml
+++ b/app/src/main/res/layout/content_paged_change_details.xml
@@ -30,11 +30,52 @@
     android:layout_height="1dp"
     android:layout_width="match_parent"/>
 
-  <com.google.reviewit.widget.SlidingTabLayout
-    android:id="@+id/tabs"
+  <LinearLayout
+    android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:background="@color/tabBackground"/>
+    android:baselineAligned="false">
+
+    <com.google.reviewit.widget.SlidingTabLayout
+      android:id="@+id/tabs"
+      android:layout_width="0dp"
+      android:layout_height="wrap_content"
+      android:layout_weight="1"
+      android:background="@color/tabBackground"/>
+
+    <LinearLayout
+      android:orientation="vertical"
+      android:layout_width="wrap_content"
+      android:layout_height="match_parent">
+      <View
+        android:background="@color/tabBackground"
+        android:layout_height="0dp"
+        android:layout_width="match_parent"
+        android:layout_weight="1"/>
+
+      <ImageView
+        android:id="@+id/more"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:src="@drawable/ic_more_vert_white_24dp"
+        android:tint="@color/tab"
+        android:paddingStart="3dp"
+        android:paddingEnd="3dp"
+        android:background="@color/tabBackground"
+        android:contentDescription="@string/more_description"/>
+
+      <View
+        android:background="@color/tabBackground"
+        android:layout_height="0dp"
+        android:layout_width="match_parent"
+        android:layout_weight="1"/>
+
+      <View
+        android:background="@color/tab"
+        android:layout_height="1dp"
+        android:layout_width="match_parent"/>
+    </LinearLayout>
+  </LinearLayout>
 
   <android.support.v4.view.ViewPager
     android:id="@+id/pager"
diff --git a/app/src/main/res/menu/menu_paged_change_details.xml b/app/src/main/res/menu/menu_paged_change_details.xml
new file mode 100644
index 0000000..70267c8
--- /dev/null
+++ b/app/src/main/res/menu/menu_paged_change_details.xml
@@ -0,0 +1,27 @@
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License. -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+  <item
+    android:id="@+id/action_abandon"
+    android:orderInCategory="100"
+    android:title="@string/action_abandon"
+    app:showAsAction="never"/>
+  <item
+    android:id="@+id/action_restore"
+    android:orderInCategory="100"
+    android:title="@string/action_restore"
+    app:showAsAction="never"/>
+</menu>
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 7a0cc62..dd38d9a 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -76,6 +76,7 @@
   <color name="nonMergable">#F5BC00</color>
   <color name="noResults">#CEFFB8</color>
   <color name="noState">#FFFFFF</color>
+  <color name="popupBackground">#d4e0ff</color>
   <color name="postReview">#FFF</color>
   <color name="progressBar">#4f91c9</color>
   <color name="progressBarBackground">#08000000</color>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e79741b..9bf157e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -247,6 +247,9 @@
   <string name="review_error">Posting review failed with %1$d %2$s</string>
   <string name="submit_error">Submit failed with %1$d %2$s</string>
 
+  <!-- PagedChangeDetailsFragment -->
+  <string name="more_description">More Actions Menu</string>
+
   <!-- CommitMessageFragment -->
   <string name="commit_message_title">Commit Message</string>
 
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 230b562..1a0e376 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -16,6 +16,11 @@
 
   <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
     <item name="android:windowBackground">@drawable/preview_screen</item>
+    <item name="android:popupMenuStyle">@style/PopupMenu</item>
+  </style>
+
+  <style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
+    <item name="android:popupBackground">@color/popupBackground</item>
   </style>
 
   <style name="AppTheme.NoActionBar">