package net.osmand.plus.dashboard.tools;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.TextView;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.OsmandSettings.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dashboard.DashboardOnMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class DashboardSettingsDialogFragment extends DialogFragment
implements NumberPickerDialogFragment.CanAcceptNumber {
private static final org.apache.commons.logging.Log LOG =
PlatformUtil.getLog(NumberPickerDialogFragment.class);
private static final String CHECKED_ITEMS = "checked_items";
private static final String NUMBER_OF_ROWS_ARRAY = "number_of_rows_array";
private MapActivity mapActivity;
private ArrayList<DashFragmentData> mFragmentsData;
private DashFragmentAdapter mAdapter;
private int textColorPrimary;
private int textColorSecondary;
private static final int MAXIMUM_NUMBER_OF_ROWS = 10;
private static final int DEFAULT_NUMBER_OF_ROWS = 5;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mapActivity = (MapActivity) activity;
mFragmentsData = new ArrayList<>();
for (DashFragmentData fragmentData : mapActivity.getDashboard().getFragmentsData()) {
if (fragmentData.canBeDisabled()) mFragmentsData.add(fragmentData);
}
mFragmentsData.addAll(OsmandPlugin.getPluginsCardsList());
Collections.sort(mFragmentsData);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
TypedValue typedValue = new TypedValue();
Resources.Theme theme = getActivity().getTheme();
theme.resolveAttribute(android.R.attr.textColorPrimary, typedValue, true);
textColorPrimary = typedValue.data;
theme.resolveAttribute(R.attr.dialog_inactive_text_color, typedValue, true);
textColorSecondary = typedValue.data;
final OsmandSettings settings = mapActivity.getMyApplication().getSettings();
final View showDashboardOnStart = createCheckboxItem(settings.SHOW_DASHBOARD_ON_START,
R.string.show_on_start , R.string.show_on_start_description);
final View accessFromMap = createCheckboxItem(settings.SHOW_DASHBOARD_ON_MAP_SCREEN,
R.string.access_from_map, R.string.access_from_map_description);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
if (savedInstanceState != null && savedInstanceState.containsKey(CHECKED_ITEMS)) {
mAdapter = new DashFragmentAdapter(getActivity(), mFragmentsData,
savedInstanceState.getBooleanArray(CHECKED_ITEMS),
savedInstanceState.getIntArray(NUMBER_OF_ROWS_ARRAY));
} else {
mAdapter = new DashFragmentAdapter(getActivity(), mFragmentsData, settings);
}
builder.setTitle(R.string.dahboard_options_dialog_title)
.setAdapter(mAdapter, null)
.setPositiveButton(R.string.shared_string_apply, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int type) {
boolean[] shouldShow = mAdapter.getCheckedItems();
int[] numberOfRows = mAdapter.getNumbersOfRows();
for (int i = 0; i < shouldShow.length; i++) {
final DashFragmentData fragmentData = mFragmentsData.get(i);
settings.registerBooleanPreference(
DashboardOnMap.SHOULD_SHOW + fragmentData.tag, true)
.makeGlobal().set(shouldShow[i]);
if (fragmentData.rowNumberTag != null) {
settings.registerIntPreference(fragmentData.rowNumberTag, DEFAULT_NUMBER_OF_ROWS)
.makeGlobal().set(numberOfRows[i]);
}
}
mapActivity.getDashboard().refreshDashboardFragments();
settings.SHOW_DASHBOARD_ON_START.set(
((CompoundButton) showDashboardOnStart.findViewById(R.id.toggle_item)).isChecked());
settings.SHOW_DASHBOARD_ON_MAP_SCREEN.set(
((CompoundButton) accessFromMap.findViewById(R.id.toggle_item)).isChecked());
mapActivity.getMapLayers().getMapControlsLayer().initDasboardRelatedControls();
}
})
.setNegativeButton(R.string.shared_string_cancel, null);
final AlertDialog dialog = builder.create();
ListView listView = dialog.getListView();
listView.addHeaderView(showDashboardOnStart);
listView.addHeaderView(accessFromMap);
return dialog;
}
private View createCheckboxItem(final CommonPreference<Boolean> pref, int text, int description) {
final View view = LayoutInflater.from(getActivity()).inflate(
R.layout.show_dashboard_on_start_dialog_item, null, false);
final TextView textView = (TextView) view.findViewById(R.id.text);
final TextView subtextView = (TextView) view.findViewById(R.id.subtext);
textView.setText(text);
subtextView.setText(description);
final CompoundButton compoundButton = (CompoundButton) view.findViewById(R.id.toggle_item);
compoundButton.setChecked(pref.get());
textView.setTextColor(pref.get() ? textColorPrimary
: textColorSecondary);
compoundButton.setOnCheckedChangeListener(
new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
textView.setTextColor(b ? textColorPrimary : textColorSecondary);
}
});
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putBooleanArray(CHECKED_ITEMS, mAdapter.getCheckedItems());
outState.putIntArray(NUMBER_OF_ROWS_ARRAY, mAdapter.getNumbersOfRows());
super.onSaveInstanceState(outState);
}
@Override
public void acceptNumber(String tag, int number) {
mAdapter.getNumbersOfRows()[Integer.parseInt(tag)] = number;
mAdapter.notifyDataSetChanged();
}
private class DashFragmentAdapter extends ArrayAdapter<DashFragmentData> {
private final boolean[] checkedItems;
private final int[] numbersOfRows;
public DashFragmentAdapter(@NonNull Context context, @NonNull List<DashFragmentData> objects,
@NonNull boolean[] checkedItems, @NonNull int[] numbersOfRows) {
super(context, 0, objects);
this.checkedItems = checkedItems;
this.numbersOfRows = numbersOfRows;
}
public DashFragmentAdapter(@NonNull Context context, @NonNull List<DashFragmentData> objects,
@NonNull OsmandSettings settings) {
super(context, 0, objects);
numbersOfRows = new int[objects.size()];
checkedItems = new boolean[objects.size()];
for (int i = 0; i < objects.size(); i++) {
checkedItems[i] = settings
.registerBooleanPreference(DashboardOnMap.SHOULD_SHOW + objects.get(i).tag, true).makeGlobal()
.get();
if (objects.get(i).tag != null) {
numbersOfRows[i] = settings.registerIntPreference(objects.get(i).rowNumberTag, 5).makeGlobal()
.get();
}
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final DashViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.dashboard_settings_dialog_item,
parent, false);
viewHolder = new DashViewHolder(this, convertView, getContext());
} else {
viewHolder = (DashViewHolder) convertView.getTag();
}
viewHolder.bindDashView(getItem(position), position);
convertView.setTag(viewHolder);
return convertView;
}
public boolean[] getCheckedItems() {
return checkedItems;
}
public int[] getNumbersOfRows() {
return numbersOfRows;
}
public boolean isChecked(int position) {
return checkedItems[position];
}
public int getNumberOfRows(int position) {
return numbersOfRows[position];
}
final CompoundButton.OnCheckedChangeListener onTurnedOnOffListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
DashViewHolder localViewHolder = (DashViewHolder) compoundButton.getTag();
if (localViewHolder == null) {
return;
}
int position = localViewHolder.position;
checkedItems[position] = b;
localViewHolder.bindDashView(getItem(position), position);
}
};
final View.OnClickListener onNumberClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
DashViewHolder localViewHolder = (DashViewHolder) v.getTag();
String header = getContext().getString(getItem(localViewHolder.position)
.shouldShowFunction.getTitleId());
String subheader = getContext().getResources().getString(R.string.count_of_lines);
final String stringPosition = String.valueOf(localViewHolder.position);
NumberPickerDialogFragment.createInstance(header, subheader, stringPosition, getNumberOfRows(localViewHolder.position), MAXIMUM_NUMBER_OF_ROWS)
.show(getChildFragmentManager(), NumberPickerDialogFragment.TAG);
}
};
}
private class DashViewHolder {
final TextView textView;
final CompoundButton compoundButton;
final TextView numberOfRowsTextView;
private int position;
private int colorBlue;
private DashFragmentAdapter dashFragmentAdapter;
public DashViewHolder(DashFragmentAdapter dashFragmentAdapter, View view, Context ctx) {
this.dashFragmentAdapter = dashFragmentAdapter;
this.numberOfRowsTextView = (TextView) view.findViewById(R.id.numberOfRowsTextView);
this.textView = (TextView) view.findViewById(R.id.text);
this.compoundButton = (CompoundButton) view.findViewById(R.id.toggle_item);
colorBlue = ctx.getResources().getColor(R.color.dashboard_blue);
}
public void bindDashView(DashFragmentData fragmentData, int position) {
if (fragmentData.hasRows()) {
numberOfRowsTextView.setVisibility(View.VISIBLE);
numberOfRowsTextView.setText(String.valueOf(dashFragmentAdapter.getNumberOfRows(position)));
numberOfRowsTextView.setTextColor(dashFragmentAdapter.isChecked(position) ? colorBlue :
textColorSecondary);
} else {
numberOfRowsTextView.setVisibility(View.GONE);
}
textView.setText(fragmentData.shouldShowFunction.getTitleId());
textView.setTextColor(dashFragmentAdapter.isChecked(position)? textColorPrimary :
textColorSecondary);
this.position = position;
compoundButton.setChecked(dashFragmentAdapter.isChecked(position));
compoundButton.setTag(this);
compoundButton.setOnCheckedChangeListener(dashFragmentAdapter.onTurnedOnOffListener);
numberOfRowsTextView.setTag(this);
numberOfRowsTextView.setOnClickListener(dashFragmentAdapter.onNumberClickListener);
}
}
}