Refactor MultiListLayout to improve encapsulation.

Test: Automated tests pass, power menus render as expected with 3-4 items.
Change-Id: Iae2fbd9c46b4a2955665ae25838f75507461bba7
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index 1f3762d..3273253 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -65,8 +65,6 @@
 import android.view.WindowManager;
 import android.view.WindowManagerGlobal;
 import android.view.accessibility.AccessibilityEvent;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.BaseAdapter;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.ImageView.ScaleType;
@@ -87,6 +85,7 @@
 import com.android.systemui.Dependency;
 import com.android.systemui.Interpolators;
 import com.android.systemui.MultiListLayout;
+import com.android.systemui.MultiListLayout.MultiListAdapter;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
 import com.android.systemui.plugins.GlobalActionsPanelPlugin;
@@ -99,16 +98,14 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Locale;
 
 /**
  * Helper to show the global actions dialog.  Each item is an {@link Action} that
  * may show depending on whether the keyguard is showing, and whether the device
  * is provisioned.
  */
-class GlobalActionsDialog implements DialogInterface.OnDismissListener,
-        DialogInterface.OnClickListener, DialogInterface.OnShowListener,
-        ConfigurationController.ConfigurationListener {
+public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
+        DialogInterface.OnShowListener, ConfigurationController.ConfigurationListener {
 
     static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
     static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
@@ -158,7 +155,7 @@
     private boolean mHasVibrator;
     private boolean mHasLogoutButton;
     private boolean mHasLockdownButton;
-    private boolean mSeparatedEmergencyButtonEnabled;
+    private boolean mUseSeparatedList;
     private final boolean mShowSilentToggle;
     private final EmergencyAffordanceManager mEmergencyAffordanceManager;
     private final ScreenshotHelper mScreenshotHelper;
@@ -336,7 +333,7 @@
         ArraySet<String> addedKeys = new ArraySet<String>();
         mHasLogoutButton = false;
         mHasLockdownButton = false;
-        mSeparatedEmergencyButtonEnabled = true;
+        mUseSeparatedList = true;
         for (int i = 0; i < defaultActions.length; i++) {
             String actionKey = defaultActions[i];
             if (addedKeys.contains(actionKey)) {
@@ -384,7 +381,7 @@
                     mHasLogoutButton = true;
                 }
             } else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) {
-                if (mSeparatedEmergencyButtonEnabled
+                if (mUseSeparatedList
                         && !mEmergencyAffordanceManager.needsEmergencyAffordance()) {
                     mItems.add(new EmergencyDialerAction());
                 }
@@ -401,14 +398,6 @@
 
         mAdapter = new MyAdapter();
 
-        OnItemLongClickListener onItemLongClickListener = (parent, view, position, id) -> {
-            final Action action = mAdapter.getItem(position);
-            if (action instanceof LongPressAction) {
-                mDialog.dismiss();
-                return ((LongPressAction) action).onLongPress();
-            }
-            return false;
-        };
         GlobalActionsPanelPlugin.PanelViewController panelViewController =
                 mPanelExtension.get() != null
                         ? mPanelExtension.get().onPanelShown(() -> {
@@ -417,8 +406,8 @@
                             }
                         })
                         : null;
-        ActionsDialog dialog = new ActionsDialog(mContext, this, mAdapter, onItemLongClickListener,
-                mSeparatedEmergencyButtonEnabled, panelViewController);
+        ActionsDialog dialog = new ActionsDialog(mContext, mAdapter, mUseSeparatedList,
+                panelViewController);
         dialog.setCanceledOnTouchOutside(false); // Handled by the custom class.
         dialog.setKeyguardShowing(mKeyguardShowing);
 
@@ -548,7 +537,6 @@
         }
     }
 
-
     private class ScreenshotAction extends SinglePressAction implements LongPressAction {
         public ScreenshotAction() {
             super(R.drawable.ic_screenshot, R.string.global_action_screenshot);
@@ -713,7 +701,7 @@
 
     private Action getEmergencyAction() {
         Drawable emergencyIcon = mContext.getDrawable(R.drawable.emergency_icon);
-        if(!mSeparatedEmergencyButtonEnabled) {
+        if (!mUseSeparatedList) {
             // use un-colored legacy treatment
             emergencyIcon.setTintList(null);
         }
@@ -907,15 +895,6 @@
     }
 
     /** {@inheritDoc} */
-    public void onClick(DialogInterface dialog, int which) {
-        Action item = mAdapter.getItem(which);
-        if (!(item instanceof SilentModeTriStateAction)) {
-            dialog.dismiss();
-        }
-        item.onPress();
-    }
-
-    /** {@inheritDoc} */
     public void onShow(DialogInterface dialog) {
         MetricsLogger.visible(mContext, MetricsEvent.POWER_MENU);
     }
@@ -927,11 +906,10 @@
      * the device is provisioned
      * via {@link com.android.systemui.globalactions.GlobalActionsDialog#mDeviceProvisioned}.
      */
-    private class MyAdapter extends BaseAdapter {
-
+    public class MyAdapter extends MultiListAdapter {
+        @Override
         public int getCount() {
             int count = 0;
-
             for (int i = 0; i < mItems.size(); i++) {
                 final Action action = mItems.get(i);
 
@@ -951,7 +929,8 @@
             return getItem(position).isEnabled();
         }
 
-        public ArrayList<Action> getSeparatedActions(boolean shouldUseSeparatedView) {
+        @Override
+        public ArrayList<Action> getSeparatedItems(boolean shouldUseSeparatedView) {
             ArrayList<Action> separatedActions = new ArrayList<Action>();
             if (!shouldUseSeparatedView) {
                 return separatedActions;
@@ -965,7 +944,8 @@
             return separatedActions;
         }
 
-        public ArrayList<Action> getListActions(boolean shouldUseSeparatedView) {
+        @Override
+        public ArrayList<Action> getListItems(boolean shouldUseSeparatedView) {
             if (!shouldUseSeparatedView) {
                 return new ArrayList<Action>(mItems);
             }
@@ -984,6 +964,7 @@
             return false;
         }
 
+        @Override
         public Action getItem(int position) {
 
             int filteredPos = 0;
@@ -1013,6 +994,7 @@
             return position;
         }
 
+        @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             Action action = getItem(position);
             View view = action.create(mContext, convertView, parent, LayoutInflater.from(mContext));
@@ -1022,6 +1004,25 @@
             }
             return view;
         }
+
+        @Override
+        public boolean onLongClickItem(int position) {
+            final Action action = mAdapter.getItem(position);
+            if (action instanceof LongPressAction) {
+                mDialog.dismiss();
+                return ((LongPressAction) action).onLongPress();
+            }
+            return false;
+        }
+
+        @Override
+        public void onClickItem(int position) {
+            Action item = mAdapter.getItem(position);
+            if (!(item instanceof SilentModeTriStateAction)) {
+                mDialog.dismiss();
+            }
+            item.onPress();
+        }
     }
 
     // note: the scheme below made more sense when we were planning on having
@@ -1033,7 +1034,7 @@
     /**
      * What each item in the global actions dialog must be able to support.
      */
-    private interface Action {
+    public interface Action {
         /**
          * @return Text that will be announced when dialog is created.  null
          * for none.
@@ -1052,7 +1053,8 @@
 
         /**
          * @return whether this action should appear in the dialog before the
-         * device is provisioned.
+         * device is provisioned.onlongpress
+         *
          */
         boolean showBeforeProvisioning();
 
@@ -1488,26 +1490,21 @@
         private final Context mContext;
         private final MyAdapter mAdapter;
         private MultiListLayout mGlobalActionsLayout;
-        private final OnClickListener mClickListener;
-        private final OnItemLongClickListener mLongClickListener;
         private final Drawable mBackgroundDrawable;
         private final ColorExtractor mColorExtractor;
         private final GlobalActionsPanelPlugin.PanelViewController mPanelController;
         private boolean mKeyguardShowing;
-        private boolean mShouldDisplaySeparatedButton;
+        private boolean mUseSeparatedList;
         private boolean mShowing;
         private final float mScrimAlpha;
 
-        public ActionsDialog(Context context, OnClickListener clickListener, MyAdapter adapter,
-                OnItemLongClickListener longClickListener, boolean shouldDisplaySeparatedButton,
+        ActionsDialog(Context context, MyAdapter adapter, boolean separated,
                 GlobalActionsPanelPlugin.PanelViewController plugin) {
             super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions);
             mContext = context;
             mAdapter = adapter;
-            mClickListener = clickListener;
-            mLongClickListener = longClickListener;
             mColorExtractor = Dependency.get(SysuiColorExtractor.class);
-            mShouldDisplaySeparatedButton = shouldDisplaySeparatedButton;
+            mUseSeparatedList = separated;
 
             // Window initialization
             Window window = getWindow();
@@ -1573,7 +1570,7 @@
             mGlobalActionsLayout = (MultiListLayout)
                     findViewById(com.android.systemui.R.id.global_actions_view);
             mGlobalActionsLayout.setOutsideTouchListener(view -> dismiss());
-            mGlobalActionsLayout.setHasSeparatedView(mShouldDisplaySeparatedButton);
+            mGlobalActionsLayout.setSeparated(mUseSeparatedList);
             mGlobalActionsLayout.setListViewAccessibilityDelegate(new View.AccessibilityDelegate() {
                 @Override
                 public boolean dispatchPopulateAccessibilityEvent(
@@ -1584,6 +1581,7 @@
                 }
             });
             mGlobalActionsLayout.setRotationListener(this::onRotate);
+            mGlobalActionsLayout.setAdapter(mAdapter);
         }
 
         private boolean isPanelEnabled(Context context) {
@@ -1601,55 +1599,11 @@
             return com.android.systemui.R.layout.global_actions_wrapped;
         }
 
-        private void updateList() {
-            mGlobalActionsLayout.removeAllItems();
-            ArrayList<Action> separatedActions =
-                    mAdapter.getSeparatedActions(mShouldDisplaySeparatedButton);
-            ArrayList<Action> listActions = mAdapter.getListActions(mShouldDisplaySeparatedButton);
-            mGlobalActionsLayout.setExpectedListItemCount(listActions.size());
-            mGlobalActionsLayout.setExpectedSeparatedItemCount(separatedActions.size());
-            int rotation = RotationUtils.getRotation(mContext);
-
-            boolean reverse = false; // should we add items to parents in the reverse order?
-            if (isGridEnabled(mContext)) {
-                if (rotation == RotationUtils.ROTATION_NONE
-                        || rotation == RotationUtils.ROTATION_SEASCAPE) {
-                    reverse = !reverse; // if we're in portrait or seascape, reverse items
-                }
-                if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
-                        == View.LAYOUT_DIRECTION_RTL) {
-                    reverse = !reverse; // if we're in an RTL language, reverse items (again)
-                }
-            }
-
-            for (int i = 0; i < mAdapter.getCount(); i++) {
-                Action action = mAdapter.getItem(i);
-                int separatedIndex = separatedActions.indexOf(action);
-                ViewGroup parent;
-                if (separatedIndex != -1) {
-                    parent = mGlobalActionsLayout.getParentView(true, separatedIndex, rotation);
-                } else {
-                    int listIndex = listActions.indexOf(action);
-                    parent = mGlobalActionsLayout.getParentView(false, listIndex, rotation);
-                }
-                View v = mAdapter.getView(i, null, parent);
-                final int pos = i;
-                v.setOnClickListener(view -> mClickListener.onClick(this, pos));
-                v.setOnLongClickListener(view ->
-                        mLongClickListener.onItemLongClick(null, v, pos, 0));
-                if (reverse) {
-                    parent.addView(v, 0); // reverse order of items
-                } else {
-                    parent.addView(v);
-                }
-            }
-        }
-
         @Override
         protected void onStart() {
             super.setCanceledOnTouchOutside(true);
             super.onStart();
-            updateList();
+            mGlobalActionsLayout.updateList();
 
             if (mBackgroundDrawable instanceof GradientDrawable) {
                 Point displaySize = new Point();
@@ -1767,7 +1721,7 @@
         public void onRotate(int from, int to) {
             if (mShowing && isGridEnabled(mContext)) {
                 initializeLayout();
-                updateList();
+                mGlobalActionsLayout.updateList();
             }
         }
     }