package de.westnordost.streetcomplete.quests.opening_hours; import android.app.AlertDialog; import android.content.Context; import android.support.design.widget.TabLayout; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.TimePicker; import de.westnordost.streetcomplete.R; public class TimeRangePickerDialog extends AlertDialog implements View.OnClickListener { private static final int START_TIME_TAB = 0, END_TIME_TAB = 1; private final TimePicker startPicker, endPicker; private final ViewGroup endPickerContainer; private final ViewPager viewPager; private final TabLayout tabLayout; private final CheckBox openEndCheckbox; private final OnTimeRangeChangeListener listener; public interface OnTimeRangeChangeListener { void onTimeRangeChange(TimeRange timeRange); } public TimeRangePickerDialog(Context context, OnTimeRangeChangeListener listener, CharSequence startTimeLabel, CharSequence endTimeLabel, TimeRange timeRange) { super(context, R.style.AppTheme_AlertDialog); this.listener = listener; final LayoutInflater inflater = LayoutInflater.from(context); final View view = inflater.inflate(R.layout.time_range_picker_dialog, null); setView(view); setButton(BUTTON_POSITIVE, context.getString(android.R.string.ok), (OnClickListener) null); setButton(BUTTON_NEGATIVE, context.getString(android.R.string.cancel), (OnClickListener) null); AttributeSet a; startPicker = (TimePicker) inflater.inflate(R.layout.time_range_picker_start_picker, null); startPicker.setIs24HourView(true); endPickerContainer = (ViewGroup) inflater.inflate(R.layout.time_range_picker_end_picker, null); openEndCheckbox = (CheckBox) endPickerContainer.findViewById(R.id.checkBox); endPicker = (TimePicker) endPickerContainer.findViewById(R.id.picker); endPicker.setIs24HourView(true); if(timeRange != null) { startPicker.setCurrentHour(timeRange.getStart() / 60); startPicker.setCurrentMinute(timeRange.getStart() % 60); endPicker.setCurrentHour(timeRange.getEnd() / 60); endPicker.setCurrentMinute(timeRange.getEnd() % 60); openEndCheckbox.setChecked(timeRange.isOpenEnded); } viewPager = (ViewPager) view.findViewById(R.id.view_pager); viewPager.setAdapter(new CustomAdapter(startTimeLabel, endTimeLabel)); tabLayout = (TabLayout) view.findViewById(R.id.tab_layout); tabLayout.setupWithViewPager(viewPager); tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabReselected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } }); } private class CustomAdapter extends PagerAdapter { private final CharSequence[] labels; public CustomAdapter(CharSequence startTimeLabel, CharSequence endTimeLabel) { labels = new CharSequence[] {startTimeLabel, endTimeLabel}; } @Override public int getCount() { return labels.length; } @Override public boolean isViewFromObject(View view, Object object) { if(object.equals(START_TIME_TAB)) return view == startPicker; if(object.equals(END_TIME_TAB)) return view == endPickerContainer; return false; } @Override public void destroyItem(ViewGroup container, int position, Object object) { if(position == START_TIME_TAB) container.removeView(startPicker); if(position == END_TIME_TAB) container.removeView(endPickerContainer); } @Override public Object instantiateItem(ViewGroup container, int position) { if(position == START_TIME_TAB) container.addView(startPicker); if(position == END_TIME_TAB) container.addView(endPickerContainer); return position; } @Override public CharSequence getPageTitle(int position) { return labels[position]; } } @Override public void show() { super.show(); // to override the default OK=dismiss() behavior getButton(BUTTON_POSITIVE).setOnClickListener(this); } @Override public void onClick(View v) { switch(tabLayout.getSelectedTabPosition()) { case START_TIME_TAB: viewPager.setCurrentItem(END_TIME_TAB); break; case END_TIME_TAB: applyAndDismiss(); break; } } private void applyAndDismiss() { if (listener != null) { listener.onTimeRangeChange( new TimeRange(getMinutesStart(), getMinutesEnd(), openEndCheckbox.isChecked())); } dismiss(); } private int getMinutesStart() { return startPicker.getCurrentHour() * 60 + startPicker.getCurrentMinute(); } private int getMinutesEnd() { return endPicker.getCurrentHour() * 60 + endPicker.getCurrentMinute(); } }