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();
}
}
}