package net.osmand.plus.quickaction;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.ShapeDrawable;
import android.support.annotation.StyleRes;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.view.ContextThemeWrapper;
import android.support.v7.widget.GridLayout;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.quickaction.actions.NewAction;
import java.util.List;
import static net.osmand.plus.R.id.imageView;
public class QuickActionsWidget extends LinearLayout {
private static final int ELEMENT_PER_PAGE = 6;
private QuickAction.QuickActionSelectionListener selectionListener;
private List<QuickAction> actions;
private ImageButton next;
private ImageButton prev;
private ViewPager viewPager;
private LinearLayout dots;
private LinearLayout controls;
private View container;
public QuickActionsWidget(Context context) {
super(context);
}
public QuickActionsWidget(Context context, AttributeSet attrs) {
super(context, attrs);
}
public QuickActionsWidget(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setActions(List<QuickAction> actions){
this.actions = actions;
this.actions.add(new NewAction());
removeAllViews();
setupLayout(getContext(), countPage());
}
public void setSelectionListener(QuickAction.QuickActionSelectionListener selectionListener) {
this.selectionListener = selectionListener;
}
private void setupLayout(Context context, int pageCount){
OsmandApplication application = ((OsmandApplication) getContext().getApplicationContext());
boolean light = application.getSettings().isLightContent() && !application.getDaynightHelper().isNightMode();
inflate(new ContextThemeWrapper(context, light
? R.style.OsmandLightTheme
: R.style.OsmandDarkTheme), R.layout.quick_action_widget, this);
container = findViewById(R.id.container);
viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPager.setAdapter(new ViewsPagerAdapter());
container.setBackgroundResource(light
? R.drawable.bg_card_light
: R.drawable.bg_card_dark);
viewPager.getLayoutParams().height = actions.size() > ELEMENT_PER_PAGE / 2
? (int) getResources().getDimension(R.dimen.quick_action_widget_height_big)
: (int) getResources().getDimension(R.dimen.quick_action_widget_height_small);
viewPager.requestLayout();
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
updateControls(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
next = (ImageButton) findViewById(R.id.btnNext);
prev = (ImageButton) findViewById(R.id.btnPrev);
next.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (viewPager.getAdapter().getCount() > viewPager.getCurrentItem() + 1) {
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
}
}
});
prev.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (viewPager.getCurrentItem() - 1 >= 0) {
viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
}
}
});
dots = (LinearLayout) findViewById(R.id.dots);
dots.removeAllViews();
if (pageCount > 1) {
int color = light ? R.color.icon_color_light : R.color.white_50_transparent;
for (int i = 0; i < pageCount; i++) {
ImageView dot = (ImageView) getLayoutInflater()
.inflate(R.layout.quick_action_widget_dot, dots, false);
dot.setImageDrawable(i == 0
? getIconsCache().getIcon(R.drawable.ic_dot_position, R.color.dashboard_blue)
: getIconsCache().getIcon(R.drawable.ic_dot_position, color));
dots.addView(dot);
}
}
controls = (LinearLayout) findViewById(R.id.controls);
controls.setVisibility(pageCount > 1 ? VISIBLE : GONE);
Drawable background = controls.getBackground();
int backgroundColor = ContextCompat.getColor(context, light ? R.color.dashboard_divider_light : R.color.dashboard_divider_dark);
if (background instanceof ShapeDrawable) {
((ShapeDrawable)background).getPaint().setColor(backgroundColor);
} else if (background instanceof GradientDrawable) {
((GradientDrawable)background).setColor(backgroundColor);
} else if (background instanceof ColorDrawable) {
((ColorDrawable)background).setColor(backgroundColor);
}
updateControls(viewPager.getCurrentItem());
}
private void updateControls(int position) {
OsmandApplication application = ((OsmandApplication) getContext().getApplicationContext());
boolean light = application.getSettings().isLightContent() && !application.getDaynightHelper().isNightMode();
int colorEnabled = light ? R.color.icon_color : R.color.color_white;
int colorDisabled = light ? R.color.icon_color_light : R.color.white_50_transparent;
next.setEnabled(viewPager.getAdapter().getCount() > position + 1);
next.setImageDrawable(next.isEnabled()
? getIconsCache().getIcon(R.drawable.ic_arrow_forward, colorEnabled)
: getIconsCache().getIcon(R.drawable.ic_arrow_forward, colorDisabled));
prev.setEnabled(position > 0);
prev.setImageDrawable(prev.isEnabled()
? getIconsCache().getIcon(R.drawable.ic_arrow_back, colorEnabled)
: getIconsCache().getIcon(R.drawable.ic_arrow_back, colorDisabled));
for (int i = 0; i < dots.getChildCount(); i++){
((ImageView) dots.getChildAt(i)).setImageDrawable(i == position
? getIconsCache().getIcon(R.drawable.ic_dot_position, R.color.dashboard_blue)
: getIconsCache().getIcon(R.drawable.ic_dot_position, colorDisabled));
}
}
private View createPageView(ViewGroup container, int position){
OsmandApplication application = ((OsmandApplication) getContext().getApplicationContext());
boolean light = application.getSettings().isLightContent() && !application.getDaynightHelper().isNightMode();
LayoutInflater li = getLayoutInflater(light
? R.style.OsmandLightTheme
: R.style.OsmandDarkTheme);
View page = li.inflate(R.layout.quick_action_widget_page, container, false);
GridLayout gridLayout = (GridLayout) page.findViewById(R.id.grid);
final boolean land = !AndroidUiHelper.isOrientationPortrait((Activity) getContext());
final int maxItems = actions.size() == 1 ? 1 : ELEMENT_PER_PAGE;
for (int i = 0; i < maxItems; i++){
View view = li.inflate(R.layout.quick_action_widget_item, gridLayout, false);
if (i + (position * ELEMENT_PER_PAGE) < actions.size()) {
final QuickAction action = QuickActionFactory.produceAction(
actions.get(i + (position * ELEMENT_PER_PAGE)));
((ImageView) view.findViewById(imageView))
.setImageResource(action.getIconRes(getContext()));
((TextView) view.findViewById(R.id.title))
.setText(action.getActionText(application));
if (action.isActionWithSlash(application)) {
((ImageView) view.findViewById(R.id.imageSlash))
.setImageResource(light
? R.drawable.ic_action_icon_hide_white
: R.drawable.ic_action_icon_hide_dark);
}
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (selectionListener != null) selectionListener.onActionSelected(action);
}
});
if (action.isActionEditable()) {
view.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
CreateEditActionDialog dialog = CreateEditActionDialog.newInstance(action.id);
dialog.show(((AppCompatActivity) getContext()).getSupportFragmentManager(), AddQuickActionDialog.TAG);
return true;
}
});
}
}
if (land) {
view.findViewById(R.id.dividerBot).setVisibility(GONE);
view.findViewById(R.id.dividerRight).setVisibility(VISIBLE);
} else {
view.findViewById(R.id.dividerBot).setVisibility(i < ELEMENT_PER_PAGE / 2 ? VISIBLE : GONE);
view.findViewById(R.id.dividerRight).setVisibility(((i + 1) % 3) == 0 ? GONE : VISIBLE);
}
gridLayout.addView(view);
}
return gridLayout;
}
private class ViewsPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return countPage();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = createPageView(container, position);
container.addView(view, 0);
return view;
}
@Override
public void destroyItem(ViewGroup collection, int position, Object view) {
collection.removeView((View) view);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
private int countPage(){
return (int) Math.ceil((actions.size()) / (double) 6);
}
private LayoutInflater getLayoutInflater(){
return (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
private LayoutInflater getLayoutInflater(@StyleRes int style){
return (LayoutInflater) new ContextThemeWrapper(getContext(), style).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
private OsmandApplication getApplication(){
return (OsmandApplication)(getContext().getApplicationContext());
}
private IconsCache getIconsCache(){
return getApplication().getIconsCache();
}
}