Utils.java revision cb3f2522609186db6239ad154af275957118295c
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 373e9818e0267619fecebd55095ab26c53eff92e93James Kung static final String SHARED_PREFS_NAME = "com.android.calendar_preferences"; 383e9818e0267619fecebd55095ab26c53eff92e93James Kung 39b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein public static boolean isJellybeanOrLater() { 403e9818e0267619fecebd55095ab26c53eff92e93James Kung return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 413e9818e0267619fecebd55095ab26c53eff92e93James Kung } 423e9818e0267619fecebd55095ab26c53eff92e93James Kung 43cb3f2522609186db6239ad154af275957118295cSam Blitzstein /** 44cb3f2522609186db6239ad154af275957118295cSam Blitzstein * Try to speak the specified text, for accessibility. Only available on JB or later. 45cb3f2522609186db6239ad154af275957118295cSam Blitzstein * @param text Text to announce. 46cb3f2522609186db6239ad154af275957118295cSam Blitzstein */ 47cb3f2522609186db6239ad154af275957118295cSam Blitzstein @SuppressLint("NewApi") 48cb3f2522609186db6239ad154af275957118295cSam Blitzstein public static void tryAccessibilityAnnounce(View view, CharSequence text) { 49cb3f2522609186db6239ad154af275957118295cSam Blitzstein if (isJellybeanOrLater() && view != null && text != null) { 50cb3f2522609186db6239ad154af275957118295cSam Blitzstein view.announceForAccessibility(text); 51cb3f2522609186db6239ad154af275957118295cSam Blitzstein } 52cb3f2522609186db6239ad154af275957118295cSam Blitzstein } 53cb3f2522609186db6239ad154af275957118295cSam Blitzstein 543e9818e0267619fecebd55095ab26c53eff92e93James Kung public static int getDaysInMonth(int month, int year) { 553e9818e0267619fecebd55095ab26c53eff92e93James Kung switch (month) { 563e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.JANUARY: 573e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.MARCH: 583e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.MAY: 593e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.JULY: 603e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.AUGUST: 613e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.OCTOBER: 623e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.DECEMBER: 633e9818e0267619fecebd55095ab26c53eff92e93James Kung return 31; 643e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.APRIL: 653e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.JUNE: 663e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.SEPTEMBER: 673e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.NOVEMBER: 683e9818e0267619fecebd55095ab26c53eff92e93James Kung return 30; 693e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.FEBRUARY: 703e9818e0267619fecebd55095ab26c53eff92e93James Kung return (year % 4 == 0) ? 29 : 28; 713e9818e0267619fecebd55095ab26c53eff92e93James Kung default: 723e9818e0267619fecebd55095ab26c53eff92e93James Kung throw new IllegalArgumentException("Invalid Month"); 733e9818e0267619fecebd55095ab26c53eff92e93James Kung } 743e9818e0267619fecebd55095ab26c53eff92e93James Kung } 753e9818e0267619fecebd55095ab26c53eff92e93James Kung 763e9818e0267619fecebd55095ab26c53eff92e93James Kung /** 773e9818e0267619fecebd55095ab26c53eff92e93James Kung * Takes a number of weeks since the epoch and calculates the Julian day of 783e9818e0267619fecebd55095ab26c53eff92e93James Kung * the Monday for that week. 793e9818e0267619fecebd55095ab26c53eff92e93James Kung * 803e9818e0267619fecebd55095ab26c53eff92e93James Kung * This assumes that the week containing the {@link Time#EPOCH_JULIAN_DAY} 813e9818e0267619fecebd55095ab26c53eff92e93James Kung * is considered week 0. It returns the Julian day for the Monday 823e9818e0267619fecebd55095ab26c53eff92e93James Kung * {@code week} weeks after the Monday of the week containing the epoch. 833e9818e0267619fecebd55095ab26c53eff92e93James Kung * 843e9818e0267619fecebd55095ab26c53eff92e93James Kung * @param week Number of weeks since the epoch 853e9818e0267619fecebd55095ab26c53eff92e93James Kung * @return The julian day for the Monday of the given week since the epoch 863e9818e0267619fecebd55095ab26c53eff92e93James Kung */ 873e9818e0267619fecebd55095ab26c53eff92e93James Kung public static int getJulianMondayFromWeeksSinceEpoch(int week) { 883e9818e0267619fecebd55095ab26c53eff92e93James Kung return MONDAY_BEFORE_JULIAN_EPOCH + week * 7; 893e9818e0267619fecebd55095ab26c53eff92e93James Kung } 903e9818e0267619fecebd55095ab26c53eff92e93James Kung 913e9818e0267619fecebd55095ab26c53eff92e93James Kung /** 923e9818e0267619fecebd55095ab26c53eff92e93James Kung * Returns the week since {@link Time#EPOCH_JULIAN_DAY} (Jan 1, 1970) 933e9818e0267619fecebd55095ab26c53eff92e93James Kung * adjusted for first day of week. 943e9818e0267619fecebd55095ab26c53eff92e93James Kung * 953e9818e0267619fecebd55095ab26c53eff92e93James Kung * This takes a julian day and the week start day and calculates which 963e9818e0267619fecebd55095ab26c53eff92e93James Kung * week since {@link Time#EPOCH_JULIAN_DAY} that day occurs in, starting 973e9818e0267619fecebd55095ab26c53eff92e93James Kung * at 0. *Do not* use this to compute the ISO week number for the year. 983e9818e0267619fecebd55095ab26c53eff92e93James Kung * 993e9818e0267619fecebd55095ab26c53eff92e93James Kung * @param julianDay The julian day to calculate the week number for 1003e9818e0267619fecebd55095ab26c53eff92e93James Kung * @param firstDayOfWeek Which week day is the first day of the week, 1013e9818e0267619fecebd55095ab26c53eff92e93James Kung * see {@link Time#SUNDAY} 1023e9818e0267619fecebd55095ab26c53eff92e93James Kung * @return Weeks since the epoch 1033e9818e0267619fecebd55095ab26c53eff92e93James Kung */ 1043e9818e0267619fecebd55095ab26c53eff92e93James Kung public static int getWeeksSinceEpochFromJulianDay(int julianDay, int firstDayOfWeek) { 1053e9818e0267619fecebd55095ab26c53eff92e93James Kung int diff = Time.THURSDAY - firstDayOfWeek; 1063e9818e0267619fecebd55095ab26c53eff92e93James Kung if (diff < 0) { 1073e9818e0267619fecebd55095ab26c53eff92e93James Kung diff += 7; 1083e9818e0267619fecebd55095ab26c53eff92e93James Kung } 1093e9818e0267619fecebd55095ab26c53eff92e93James Kung int refDay = Time.EPOCH_JULIAN_DAY - diff; 1103e9818e0267619fecebd55095ab26c53eff92e93James Kung return (julianDay - refDay) / 7; 111b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein } 112b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein 113b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein /** 114b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein * Render an animator to pulsate a view in place. 115b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein * @param labelToAnimate the view to pulsate. 116b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein * @return The animator object. Use .start() to begin. 117b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein */ 1182e00aa34c051111529290cf23c6ba940c2c0c142James Kung public static ObjectAnimator getPulseAnimator(View labelToAnimate, float decreaseRatio, 1192e00aa34c051111529290cf23c6ba940c2c0c142James Kung float increaseRatio) { 120b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein Keyframe k0 = Keyframe.ofFloat(0f, 1f); 1212e00aa34c051111529290cf23c6ba940c2c0c142James Kung Keyframe k1 = Keyframe.ofFloat(0.275f, decreaseRatio); 1222e00aa34c051111529290cf23c6ba940c2c0c142James Kung Keyframe k2 = Keyframe.ofFloat(0.69f, increaseRatio); 123b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein Keyframe k3 = Keyframe.ofFloat(1f, 1f); 124b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein 125b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein PropertyValuesHolder scaleX = PropertyValuesHolder.ofKeyframe("scaleX", k0, k1, k2, k3); 126b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein PropertyValuesHolder scaleY = PropertyValuesHolder.ofKeyframe("scaleY", k0, k1, k2, k3); 127b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein ObjectAnimator pulseAnimator = 128b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein ObjectAnimator.ofPropertyValuesHolder(labelToAnimate, scaleX, scaleY); 129b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein pulseAnimator.setDuration(PULSE_ANIMATOR_DURATION); 130b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein 131b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein return pulseAnimator; 132b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein } 133b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein} 134