package com.openfarmanager.android.view.panels;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import com.openfarmanager.android.App;
import com.openfarmanager.android.R;
import com.openfarmanager.android.core.Settings;
import com.openfarmanager.android.toolbar.MenuBuilder;
import com.openfarmanager.android.toolbar.MenuItemImpl;
import com.openfarmanager.android.utils.SystemUtils;
import java.util.ArrayList;
import static com.openfarmanager.android.controllers.FileSystemController.ALT_DOWN;
import static com.openfarmanager.android.controllers.FileSystemController.ALT_UP;
import static com.openfarmanager.android.controllers.FileSystemController.APPLAUNCHER;
import static com.openfarmanager.android.controllers.FileSystemController.BOOKMARKS;
import static com.openfarmanager.android.controllers.FileSystemController.DIFF;
import static com.openfarmanager.android.controllers.FileSystemController.EXIT;
import static com.openfarmanager.android.controllers.FileSystemController.HELP;
import static com.openfarmanager.android.controllers.FileSystemController.MENU;
import static com.openfarmanager.android.controllers.FileSystemController.NETWORK;
import static com.openfarmanager.android.controllers.FileSystemController.NEW;
import static com.openfarmanager.android.controllers.FileSystemController.QUICKVIEW;
import static com.openfarmanager.android.controllers.FileSystemController.SEARCH;
import static com.openfarmanager.android.controllers.FileSystemController.SELECT;
import static com.openfarmanager.android.controllers.FileSystemController.SETTINGS;
public class MainToolbar extends LinearLayout {
public static final SparseIntArray sActions = new SparseIntArray();
static {
sActions.put(R.id.action_select, SELECT);
sActions.put(R.id.action_new, NEW);
sActions.put(R.id.menu_action, MENU);
sActions.put(R.id.action_quckview, QUICKVIEW);
sActions.put(R.id.action_exit, EXIT);
sActions.put(R.id.action_diff, DIFF);
sActions.put(R.id.action_find, SEARCH);
sActions.put(R.id.action_help, HELP);
sActions.put(R.id.action_settings, SETTINGS);
sActions.put(R.id.action_network, NETWORK);
sActions.put(R.id.action_applauncher, APPLAUNCHER);
sActions.put(R.id.action_bookmarks, BOOKMARKS);
}
private float mDensity;
private int mMinWidth;
private Handler mHandler;
private MenuBuilder mMenu;
private int mItemsCount;
private View mAltView;
private View mApplicationsView;
private View mQuickView;
private View mMoreView;
private View mSelectView;
private OnClickListener mClickListener = view -> {
MenuItem item = (MenuItem) view.getTag();
if (item.hasSubMenu()) {
showSubMenu(item);
} else {
sendMessage(item);
}
};
public MainToolbar(Context context) {
super(context);
initMenu(context);
}
public MainToolbar(Context context, AttributeSet attrs) {
super(context, attrs);
initMenu(context);
}
public MainToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initMenu(context);
}
public View getAltView() {
return mAltView;
}
public View getApplicationsView() {
return mApplicationsView;
}
public View getQuickView() {
return mQuickView;
}
public View getMoreView() {
return mMoreView;
}
public View getSelectView() {
return mSelectView;
}
private void sendMessage(MenuItem item) {
sendMessage(sActions.get(item.getItemId()));
}
View.OnTouchListener mAltListener = (view, motionEvent) -> {
Settings settings = App.sInstance.getSettings();
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
if (!SystemUtils.isHoneycombOrNever() || settings.isHoldAltOnTouch()) {
view.setSelected(!view.isSelected());
//noinspection ResourceAsColor
view.setBackgroundColor(view.isSelected() ?
Color.parseColor(App.sInstance.getString(R.color.grey_button)) : settings.getSecondaryColor());
} else {
view.setBackgroundColor(Color.parseColor(App.sInstance.getString(R.color.grey_button)));
}
sendMessage(ALT_DOWN);
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
if (SystemUtils.isHoneycombOrNever() && !settings.isHoldAltOnTouch()) {
sendMessage(ALT_UP);
view.setBackgroundColor(settings.getSecondaryColor());
}
}
return true;
};
private void showSubMenu(MenuItem item) {
final Dialog dialog = SubMenuDialog.newInstance(getContext(), item, this::sendMessage);
dialog.show();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (w != oldw) {
buildMenu(false);
}
}
public void buildMenu(boolean forceRedraw) {
int itemsCount = getMeasuredWidth() / mMinWidth;
if (itemsCount == mItemsCount && !forceRedraw) {
return;
}
removeAllViews();
mItemsCount = itemsCount;
int used = mMenu.size();
SparseArray<TextView> mViews = new SparseArray<TextView>();
for (int i = 0; i < mMenu.size(); i++) {
MenuItem item = mMenu.getItem(i);
TextView view = getTextView(item);
mViews.put(i * 100, view);
switch (item.getItemId()) {
case R.id.action_alt:
mAltView = view;
break;
case R.id.action_applauncher:
mApplicationsView = view;
break;
case R.id.action_quckview:
mQuickView = view;
break;
case R.id.menu_more:
mMoreView = view;
break;
case R.id.action_select:
mSelectView = view;
break;
}
}
int expanded = 0;
while (true) {
if (expanded == mMenu.size() || used > mItemsCount) {
break;
}
MenuItem item = mMenu.getItem(expanded);
expanded++;
if (!item.hasSubMenu()) {
continue;
}
if (used + item.getSubMenu().size() > mItemsCount) {
continue;
}
used += item.getSubMenu().size() - 1;
int index = 0;
for (int i = 0; i < mViews.size(); i++) {
if (mViews.valueAt(i).getTag().equals(item)) {
index = mViews.keyAt(i);
mViews.remove(index);
}
}
for (int i = 0; i < item.getSubMenu().size(); i++) {
MenuItem sub = item.getSubMenu().getItem(i);
sub.getOrder();
mViews.put(index + i, getTextView(sub));
}
}
for (int i = 0; i < mViews.size(); i++) {
addView(mViews.valueAt(i));
}
post(this::requestLayout);
}
private TextView getTextView(MenuItem item) {
int threedip = (int) (3 * mDensity);
Settings settings = App.sInstance.getSettings();
int size = settings.getBottomPanelFontSize();
TextView view = new TextView(getContext());
view.setTypeface(settings.getMainPanelFontType());
view.setText(item.getTitle());
view.setGravity(Gravity.CENTER);
view.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1);
layoutParams.setMargins(threedip, 0, threedip, 0);
view.setLayoutParams(layoutParams);
view.setTag(item);
if (item.getItemId() == R.id.action_alt) {
view.setOnTouchListener(mAltListener);
} else {
view.setOnClickListener(mClickListener);
}
view.setBackgroundColor(settings.getSecondaryColor());
view.setTextColor(getResources().getColor(R.color.black));
view.setSingleLine();
view.setPadding(threedip, threedip, threedip, threedip);
view.setHeight((int) ((6 + 2 * size) * mDensity));
view.setMinWidth((int) (80 * mDensity));
return view;
}
private void initMenu(Context context) {
mDensity = getResources().getDisplayMetrics().density;
mMinWidth = (int) (80 * mDensity);
mMenu = new MenuBuilder(context);
int res = context.getResources().getIdentifier("main", "menu", context.getPackageName());
new MenuInflater(context).inflate(res, mMenu);
}
public void setHandler(Handler handler) {
this.mHandler = handler;
}
public void sendMessage(int what) {
if (mHandler != null) {
mHandler.sendEmptyMessage(what);
}
}
/**
* Used to show select dialog for non-expanded groups
*/
public static class SubMenuDialog extends Dialog {
private MenuItem mMenu;
private ArrayList<MenuItemImpl> mMenuItems = new ArrayList<>();
private SubMenuDialog.OnActionSelectedListener mListener;
public SubMenuDialog(Context context) {
super(context, R.style.Action_Dialog);
}
public static SubMenuDialog newInstance(Context context, ArrayList<MenuItemImpl> items, OnActionSelectedListener listener) {
SubMenuDialog dialog = new SubMenuDialog(context);
dialog.mMenuItems.addAll(Stream.of(items).filter(item -> item.getItemId() != R.id.action_alt).collect(Collectors.toList()));
dialog.mListener = listener;
return dialog;
}
public static SubMenuDialog newInstance(Context context, MenuItem menu, OnActionSelectedListener listener) {
SubMenuDialog dialog = new SubMenuDialog(context);
dialog.mMenu = menu;
dialog.mListener = listener;
return dialog;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
View view = View.inflate(App.sInstance.getApplicationContext(), R.layout.dialog_file_action_menu, null);
final ListView actionsList = (ListView) view.findViewById(R.id.action_list);
String[] items;
if (mMenu != null) {
items = new String[mMenu.getSubMenu().size()];
for (int i = 0; i < mMenu.getSubMenu().size(); i++) {
MenuItem sub = mMenu.getSubMenu().getItem(i);
items[i] = (String) sub.getTitle();
}
} else {
items = new String[mMenuItems.size()];
int i = 0;
for (MenuItemImpl menuItem : mMenuItems) {
items[i++] = (String) menuItem.getTitle();
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
App.sInstance.getApplicationContext(), android.R.layout.simple_list_item_1, android.R.id.text1, items) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View item = super.getView(position, convertView, parent);
item.setMinimumWidth(actionsList.getWidth());
return item;
}
};
actionsList.setAdapter(adapter);
actionsList.setOnItemClickListener((adapterView, view1, i, l) -> {
dismiss();
mListener.onActionSelected(mMenu != null ? mMenu.getSubMenu().getItem(i) : mMenuItems.get(i));
});
setContentView(view);
}
public void setMenu(MenuItem menu) {
mMenu = menu;
}
public void setListener(SubMenuDialog.OnActionSelectedListener listener) {
mListener = listener;
}
public interface OnActionSelectedListener {
void onActionSelected(MenuItem item);
}
}
}