Make a menu affordance for devices that don't have a hard menu key.

Also, updated menus to use a menu layout.

Fixes Bug:5129431 No Menu option in Calculator for additional options

Change-Id: I3409e175c0fec9bb51900b994235ae98cbfdf7ef
diff --git a/src/com/android/calculator2/Calculator.java b/src/com/android/calculator2/Calculator.java
index 23567e9..7d3aefc 100644
--- a/src/com/android/calculator2/Calculator.java
+++ b/src/com/android/calculator2/Calculator.java
@@ -21,11 +21,19 @@
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ViewConfiguration;
 import android.view.WindowManager;
+import android.view.View.OnClickListener;
+import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnMenuItemClickListener;
 
-public class Calculator extends Activity implements PanelSwitcher.Listener, Logic.Listener {
+import java.util.ArrayList;
+
+public class Calculator extends Activity implements PanelSwitcher.Listener, Logic.Listener,
+        OnClickListener, OnMenuItemClickListener {
     EventListener mListener = new EventListener();
     private CalculatorDisplay mDisplay;
     private Persist mPersist;
@@ -34,10 +42,7 @@
     private PanelSwitcher mPanelSwitcher;
     private View mClearButton;
     private View mBackspaceButton;
-
-    private static final int CMD_CLEAR_HISTORY  = 1;
-    private static final int CMD_BASIC_PANEL    = 2;
-    private static final int CMD_ADVANCED_PANEL = 3;
+    private View mOverflowMenuButton;
 
     static final int BASIC_PANEL    = 0;
     static final int ADVANCED_PANEL = 1;
@@ -90,6 +95,9 @@
         mListener.setHandler(mLogic, mPanelSwitcher);
         mDisplay.setOnKeyListener(mListener);
 
+        if (!ViewConfiguration.get(this).hasPermanentMenuKey()) {
+            createFakeMenu();
+        }
         setOnClickListener(R.id.digit0);
         setOnClickListener(R.id.digit1);
         setOnClickListener(R.id.digit2);
@@ -142,55 +150,80 @@
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
-        MenuItem item;
-
-        item = menu.add(0, CMD_CLEAR_HISTORY, 0, R.string.clear_history);
-        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-        item.setIcon(R.drawable.clear_history);
-
-        item = menu.add(0, CMD_ADVANCED_PANEL, 0, R.string.advanced);
-        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-        item.setIcon(R.drawable.advanced);
-
-        item = menu.add(0, CMD_BASIC_PANEL, 0, R.string.basic);
-        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-        item.setIcon(R.drawable.simple);
-
+        getMenuInflater().inflate(R.menu.menu, menu);
         return true;
     }
 
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
-        menu.findItem(CMD_BASIC_PANEL).setVisible(mPanelSwitcher != null &&
-                          mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL);
-
-        menu.findItem(CMD_ADVANCED_PANEL).setVisible(mPanelSwitcher != null &&
-                          mPanelSwitcher.getCurrentIndex() == BASIC_PANEL);
-
+        menu.findItem(R.id.basic).setVisible(getBasicVisibility());
+        menu.findItem(R.id.advanced).setVisible(getAdvancedVisibility());
         return true;
     }
 
+
+    private void createFakeMenu() {
+        mOverflowMenuButton = findViewById(R.id.overflow_menu);
+        if (mOverflowMenuButton != null) {
+            mOverflowMenuButton.setVisibility(View.VISIBLE);
+            mOverflowMenuButton.setOnClickListener(this);
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.overflow_menu:
+                PopupMenu menu = constructPopupMenu();
+                if (menu != null) {
+                    menu.show();
+                }
+                break;
+        }
+    }
+
+    private PopupMenu constructPopupMenu() {
+        final PopupMenu popupMenu = new PopupMenu(this, mOverflowMenuButton);
+        final Menu menu = popupMenu.getMenu();
+        popupMenu.inflate(R.menu.menu);
+        popupMenu.setOnMenuItemClickListener(this);
+        onPrepareOptionsMenu(menu);
+        return popupMenu;
+    }
+
+
+    @Override
+    public boolean onMenuItemClick(MenuItem item) {
+        return onOptionsItemSelected(item);
+    }
+
+    private boolean getBasicVisibility() {
+        return mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL;
+    }
+
+    private boolean getAdvancedVisibility() {
+        return mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == BASIC_PANEL;
+    }
+
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
-        case CMD_CLEAR_HISTORY:
-            mHistory.clear();
-            break;
+            case R.id.clear_history:
+                mHistory.clear();
+                break;
 
-        case CMD_BASIC_PANEL:
-            if (mPanelSwitcher != null &&
-                mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
-                mPanelSwitcher.moveRight();
-            }
-            break;
+            case R.id.basic:
+                if (mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {
+                    mPanelSwitcher.moveRight();
+                }
+                break;
 
-        case CMD_ADVANCED_PANEL:
-            if (mPanelSwitcher != null &&
-                mPanelSwitcher.getCurrentIndex() == BASIC_PANEL) {
-                mPanelSwitcher.moveLeft();
-            }
-            break;
+            case R.id.advanced:
+                if (mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == BASIC_PANEL) {
+                    mPanelSwitcher.moveLeft();
+                }
+                break;
         }
         return super.onOptionsItemSelected(item);
     }