1b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein/* 2b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * Copyright (C) 2013 The Android Open Source Project 3b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * 4b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * Licensed under the Apache License, Version 2.0 (the "License"); 5b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * you may not use this file except in compliance with the License. 6b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * You may obtain a copy of the License at 7b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * 8b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * http://www.apache.org/licenses/LICENSE-2.0 9b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * 10b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * Unless required by applicable law or agreed to in writing, software 11b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * distributed under the License is distributed on an "AS IS" BASIS, 12b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * See the License for the specific language governing permissions and 14b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein * limitations under the License. 15b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein */ 16b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein 17b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzsteinpackage com.android.datetimepicker; 18b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein 19b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzsteinimport android.animation.Keyframe; 20b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzsteinimport android.animation.ObjectAnimator; 21b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzsteinimport android.animation.PropertyValuesHolder; 22cb3f2522609186db6239ad154af275957118295cSam Blitzsteinimport android.annotation.SuppressLint; 23b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzsteinimport android.os.Build; 243e9818e0267619fecebd55095ab26c53eff92e93James Kungimport android.text.format.Time; 25b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzsteinimport android.view.View; 26b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein 273e9818e0267619fecebd55095ab26c53eff92e93James Kungimport java.util.Calendar; 283e9818e0267619fecebd55095ab26c53eff92e93James Kung 293e9818e0267619fecebd55095ab26c53eff92e93James Kung/** 303e9818e0267619fecebd55095ab26c53eff92e93James Kung * Utility helper functions for time and date pickers. 313e9818e0267619fecebd55095ab26c53eff92e93James Kung */ 32b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzsteinpublic class Utils { 333e9818e0267619fecebd55095ab26c53eff92e93James Kung 343e9818e0267619fecebd55095ab26c53eff92e93James Kung public static final int MONDAY_BEFORE_JULIAN_EPOCH = Time.EPOCH_JULIAN_DAY - 3; 352e00aa34c051111529290cf23c6ba940c2c0c142James Kung public static final int PULSE_ANIMATOR_DURATION = 544; 363e9818e0267619fecebd55095ab26c53eff92e93James Kung 371f129e23db2dc5837a856f7734b15a5a8be6be94Sam Blitzstein // Alpha level for time picker selection. 381f129e23db2dc5837a856f7734b15a5a8be6be94Sam Blitzstein public static final int SELECTED_ALPHA = 51; 391f129e23db2dc5837a856f7734b15a5a8be6be94Sam Blitzstein public static final int SELECTED_ALPHA_THEME_DARK = 102; 401f129e23db2dc5837a856f7734b15a5a8be6be94Sam Blitzstein // Alpha level for fully opaque. 411f129e23db2dc5837a856f7734b15a5a8be6be94Sam Blitzstein public static final int FULL_ALPHA = 255; 421f129e23db2dc5837a856f7734b15a5a8be6be94Sam Blitzstein 431f129e23db2dc5837a856f7734b15a5a8be6be94Sam Blitzstein 443e9818e0267619fecebd55095ab26c53eff92e93James Kung static final String SHARED_PREFS_NAME = "com.android.calendar_preferences"; 453e9818e0267619fecebd55095ab26c53eff92e93James Kung 46b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein public static boolean isJellybeanOrLater() { 473e9818e0267619fecebd55095ab26c53eff92e93James Kung return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 483e9818e0267619fecebd55095ab26c53eff92e93James Kung } 493e9818e0267619fecebd55095ab26c53eff92e93James Kung 50cb3f2522609186db6239ad154af275957118295cSam Blitzstein /** 51cb3f2522609186db6239ad154af275957118295cSam Blitzstein * Try to speak the specified text, for accessibility. Only available on JB or later. 52cb3f2522609186db6239ad154af275957118295cSam Blitzstein * @param text Text to announce. 53cb3f2522609186db6239ad154af275957118295cSam Blitzstein */ 54cb3f2522609186db6239ad154af275957118295cSam Blitzstein @SuppressLint("NewApi") 55cb3f2522609186db6239ad154af275957118295cSam Blitzstein public static void tryAccessibilityAnnounce(View view, CharSequence text) { 56cb3f2522609186db6239ad154af275957118295cSam Blitzstein if (isJellybeanOrLater() && view != null && text != null) { 57cb3f2522609186db6239ad154af275957118295cSam Blitzstein view.announceForAccessibility(text); 58cb3f2522609186db6239ad154af275957118295cSam Blitzstein } 59cb3f2522609186db6239ad154af275957118295cSam Blitzstein } 60cb3f2522609186db6239ad154af275957118295cSam Blitzstein 613e9818e0267619fecebd55095ab26c53eff92e93James Kung public static int getDaysInMonth(int month, int year) { 623e9818e0267619fecebd55095ab26c53eff92e93James Kung switch (month) { 633e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.JANUARY: 643e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.MARCH: 653e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.MAY: 663e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.JULY: 673e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.AUGUST: 683e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.OCTOBER: 693e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.DECEMBER: 703e9818e0267619fecebd55095ab26c53eff92e93James Kung return 31; 713e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.APRIL: 723e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.JUNE: 733e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.SEPTEMBER: 743e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.NOVEMBER: 753e9818e0267619fecebd55095ab26c53eff92e93James Kung return 30; 763e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.FEBRUARY: 773e9818e0267619fecebd55095ab26c53eff92e93James Kung return (year % 4 == 0) ? 29 : 28; 783e9818e0267619fecebd55095ab26c53eff92e93James Kung default: 793e9818e0267619fecebd55095ab26c53eff92e93James Kung throw new IllegalArgumentException("Invalid Month"); 803e9818e0267619fecebd55095ab26c53eff92e93James Kung } 813e9818e0267619fecebd55095ab26c53eff92e93James Kung } 823e9818e0267619fecebd55095ab26c53eff92e93James Kung 833e9818e0267619fecebd55095ab26c53eff92e93James Kung /** 843e9818e0267619fecebd55095ab26c53eff92e93James Kung * Takes a number of weeks since the epoch and calculates the Julian day of 853e9818e0267619fecebd55095ab26c53eff92e93James Kung * the Monday for that week. 863e9818e0267619fecebd55095ab26c53eff92e93James Kung * 873e9818e0267619fecebd55095ab26c53eff92e93James Kung * This assumes that the week containing the {@link Time#EPOCH_JULIAN_DAY} 883e9818e0267619fecebd55095ab26c53eff92e93James Kung * is considered week 0. It returns the Julian day for the Monday 893e9818e0267619fecebd55095ab26c53eff92e93James Kung * {@code week} weeks after the Monday of the week containing the epoch. 903e9818e0267619fecebd55095ab26c53eff92e93James Kung * 913e9818e0267619fecebd55095ab26c53eff92e93James Kung * @param week Number of weeks since the epoch 923e9818e0267619fecebd55095ab26c53eff92e93James Kung * @return The julian day for the Monday of the given week since the epoch 933e9818e0267619fecebd55095ab26c53eff92e93James Kung */ 943e9818e0267619fecebd55095ab26c53eff92e93James Kung public static int getJulianMondayFromWeeksSinceEpoch(int week) { 953e9818e0267619fecebd55095ab26c53eff92e93James Kung return MONDAY_BEFORE_JULIAN_EPOCH + week * 7; 963e9818e0267619fecebd55095ab26c53eff92e93James Kung } 973e9818e0267619fecebd55095ab26c53eff92e93James Kung 983e9818e0267619fecebd55095ab26c53eff92e93James Kung /** 993e9818e0267619fecebd55095ab26c53eff92e93James Kung * Returns the week since {@link Time#EPOCH_JULIAN_DAY} (Jan 1, 1970) 1003e9818e0267619fecebd55095ab26c53eff92e93James Kung * adjusted for first day of week. 1013e9818e0267619fecebd55095ab26c53eff92e93James Kung * 1023e9818e0267619fecebd55095ab26c53eff92e93James Kung * This takes a julian day and the week start day and calculates which 1033e9818e0267619fecebd55095ab26c53eff92e93James Kung * week since {@link Time#EPOCH_JULIAN_DAY} that day occurs in, starting 1043e9818e0267619fecebd55095ab26c53eff92e93James Kung * at 0. *Do not* use this to compute the ISO week number for the year. 1053e9818e0267619fecebd55095ab26c53eff92e93James Kung * 1063e9818e0267619fecebd55095ab26c53eff92e93James Kung * @param julianDay The julian day to calculate the week number for 1073e9818e0267619fecebd55095ab26c53eff92e93James Kung * @param firstDayOfWeek Which week day is the first day of the week, 1083e9818e0267619fecebd55095ab26c53eff92e93James Kung * see {@link Time#SUNDAY} 1093e9818e0267619fecebd55095ab26c53eff92e93James Kung * @return Weeks since the epoch 1103e9818e0267619fecebd55095ab26c53eff92e93James Kung */ 1113e9818e0267619fecebd55095ab26c53eff92e93James Kung public static int getWeeksSinceEpochFromJulianDay(int julianDay, int firstDayOfWeek) { 1123e9818e0267619fecebd55095ab26c53eff92e93James Kung int diff = Time.THURSDAY - firstDayOfWeek; 1133e9818e0267619fecebd55095ab26c53eff92e93James Kung if (diff < 0) { 1143e9818e0267619fecebd55095ab26c53eff92e93James Kung diff += 7; 1153e9818e0267619fecebd55095ab26c53eff92e93James Kung } 1163e9818e0267619fecebd55095ab26c53eff92e93James Kung int refDay = Time.EPOCH_JULIAN_DAY - diff; 1173e9818e0267619fecebd55095ab26c53eff92e93James Kung return (julianDay - refDay) / 7; 118b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein } 119b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein 120b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein /** 121b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein * Render an animator to pulsate a view in place. 122b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein * @param labelToAnimate the view to pulsate. 123b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein * @return The animator object. Use .start() to begin. 124b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein */ 1252e00aa34c051111529290cf23c6ba940c2c0c142James Kung public static ObjectAnimator getPulseAnimator(View labelToAnimate, float decreaseRatio, 1262e00aa34c051111529290cf23c6ba940c2c0c142James Kung float increaseRatio) { 127b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein Keyframe k0 = Keyframe.ofFloat(0f, 1f); 1282e00aa34c051111529290cf23c6ba940c2c0c142James Kung Keyframe k1 = Keyframe.ofFloat(0.275f, decreaseRatio); 1292e00aa34c051111529290cf23c6ba940c2c0c142James Kung Keyframe k2 = Keyframe.ofFloat(0.69f, increaseRatio); 130b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein Keyframe k3 = Keyframe.ofFloat(1f, 1f); 131b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein 132b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein PropertyValuesHolder scaleX = PropertyValuesHolder.ofKeyframe("scaleX", k0, k1, k2, k3); 133b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein PropertyValuesHolder scaleY = PropertyValuesHolder.ofKeyframe("scaleY", k0, k1, k2, k3); 134b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein ObjectAnimator pulseAnimator = 135b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein ObjectAnimator.ofPropertyValuesHolder(labelToAnimate, scaleX, scaleY); 136b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein pulseAnimator.setDuration(PULSE_ANIMATOR_DURATION); 137b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein 138b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein return pulseAnimator; 139b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein } 140b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein} 141