package com.henninghall.date_picker; import com.henninghall.date_picker.wheels.Wheel; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Locale; public class WheelOrder { private final HashMap wheelPerWheelType; private PickerView pickerView; private ArrayList orderedWheels; WheelOrder(final PickerView view) { this.pickerView = view; this.wheelPerWheelType = new HashMap() {{ put(WheelType.DAY, pickerView.dayWheel); put(WheelType.YEAR, pickerView.yearWheel); put(WheelType.MONTH, pickerView.monthWheel); put(WheelType.DATE, pickerView.dateWheel); put(WheelType.HOUR, pickerView.hourWheel); put(WheelType.MINUTE, pickerView.minutesWheel); put(WheelType.AM_PM, pickerView.ampmWheel); }}; } private void updateAllWheels(final Locale locale) { try { this.orderedWheels = getOrderedWheels(locale); pickerView.wheelsWrapper.removeAllViews(); for (int i = 0; i < wheelPerWheelType.size(); i++) { Wheel w = getWheels(i); if(w.visible()) { pickerView.wheelsWrapper.addView(w.picker); } } } catch (Exception e) { e.printStackTrace(); } } void update(final Locale locale) { updateAllWheels(locale); pickerView.emptyWheelUpdater.update(); } private Wheel getWheels(int index){ return wheelPerWheelType.get(orderedWheels.get(index)); } Wheel getVisibleWheel(int index){ return getVisibleWheels().get(index); } private ArrayList getVisibleWheels() { ArrayList visibleOrderedWheels = new ArrayList<>(); for (WheelType wheelType : orderedWheels){ Wheel wheel = wheelPerWheelType.get(wheelType); if(wheel.visible()) { visibleOrderedWheels.add(wheel); } } return visibleOrderedWheels; } private ArrayList getOrderedWheels(Locale locale) throws Exception { String dateTimePattern = LocaleUtils.getDateTimePattern(locale); ArrayList unorderedTypes = new ArrayList(Arrays.asList(WheelType.values())); ArrayList orderedWheels = new ArrayList<>(); // Always put day wheel first unorderedTypes.remove(WheelType.DAY); orderedWheels.add(WheelType.DAY); for (char ch : dateTimePattern.toCharArray()){ try { WheelType wheelType = Utils.patternCharToWheelType(ch); if (unorderedTypes.contains(wheelType)) { unorderedTypes.remove(wheelType); orderedWheels.add(wheelType); } } catch (Exception e) { // ignore unknown pattern chars that not correspond to any wheel type } } // If AM/PM wheel remains it means that the locale does not have AM/PM by default and it // should be put last. if(unorderedTypes.contains(WheelType.AM_PM)){ unorderedTypes.remove(WheelType.AM_PM); orderedWheels.add(WheelType.AM_PM); } if(!unorderedTypes.isEmpty()) { throw new Exception(unorderedTypes.size() + " wheel types cannot be ordered. Wheel type 0: " + unorderedTypes.get(0)); } return orderedWheels; } }