package com.henninghall.date_picker; import android.util.Log; import com.henninghall.date_picker.models.Mode; import com.henninghall.date_picker.models.Variant; import com.henninghall.date_picker.models.WheelType; import java.util.ArrayList; import java.util.Arrays; public class DerivedData { private final State state; DerivedData(State state) { this.state = state; } public ArrayList getVisibleWheels() { ArrayList visibleWheels = new ArrayList<>(); Mode mode = state.getMode(); switch (mode){ case datetime: { visibleWheels.add(WheelType.DAY); visibleWheels.add(WheelType.HOUR); visibleWheels.add(WheelType.MINUTE); break; } case time: { visibleWheels.add(WheelType.HOUR); visibleWheels.add(WheelType.MINUTE); break; } case date: { visibleWheels.add(WheelType.YEAR); visibleWheels.add(WheelType.MONTH); visibleWheels.add(WheelType.DATE); break; } } if((mode == Mode.time || mode == Mode.datetime) && Utils.usesAmPm()){ visibleWheels.add(WheelType.AM_PM); } return visibleWheels; } public ArrayList getOrderedVisibleWheels() { ArrayList orderedWheels = getOrderedWheels(); ArrayList visibleWheels = getVisibleWheels(); ArrayList visibleOrderedWheels = new ArrayList<>(); for (WheelType wheel : orderedWheels){ if(visibleWheels.contains(wheel)) visibleOrderedWheels.add(wheel); } return visibleOrderedWheels; } private ArrayList getOrderedWheels() { String dateTimePattern = LocaleUtils.getDateTimePattern(state.getLocale()); 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()) { Log.e( "RNDatePicker", unorderedTypes.size() + " wheel types cannot be ordered. Wheel type 0: " + unorderedTypes.get(0)); } return orderedWheels; } public int getShownCount() { int DP_PER_SHOW_SHOW_COUNT = 35; int showCount = state.getHeight() / DP_PER_SHOW_SHOW_COUNT; int oddShowCount = showCount % 2 == 0 ? showCount + 1 : showCount; return oddShowCount; } public boolean hasNativeStyle() { return state.getVariant() == Variant.nativeAndroid; } public int getRootLayout() { switch (state.getVariant()){ case nativeAndroid: return R.layout.native_picker; case iosClone: return R.layout.ios_clone; default: return R.layout.ios_clone; } } }