Utils.java revision 2e00aa34c051111529290cf23c6ba940c2c0c142
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; 22b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzsteinimport android.os.Build; 233e9818e0267619fecebd55095ab26c53eff92e93James Kungimport android.text.format.Time; 24b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzsteinimport android.view.View; 25b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein 263e9818e0267619fecebd55095ab26c53eff92e93James Kungimport java.util.Calendar; 273e9818e0267619fecebd55095ab26c53eff92e93James Kung 283e9818e0267619fecebd55095ab26c53eff92e93James Kung/** 293e9818e0267619fecebd55095ab26c53eff92e93James Kung * Utility helper functions for time and date pickers. 303e9818e0267619fecebd55095ab26c53eff92e93James Kung */ 31b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzsteinpublic class Utils { 323e9818e0267619fecebd55095ab26c53eff92e93James Kung 333e9818e0267619fecebd55095ab26c53eff92e93James Kung public static final int MONDAY_BEFORE_JULIAN_EPOCH = Time.EPOCH_JULIAN_DAY - 3; 342e00aa34c051111529290cf23c6ba940c2c0c142James Kung public static final int PULSE_ANIMATOR_DURATION = 544; 353e9818e0267619fecebd55095ab26c53eff92e93James Kung 363e9818e0267619fecebd55095ab26c53eff92e93James Kung static final String SHARED_PREFS_NAME = "com.android.calendar_preferences"; 373e9818e0267619fecebd55095ab26c53eff92e93James Kung 38b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein public static boolean isJellybeanOrLater() { 393e9818e0267619fecebd55095ab26c53eff92e93James Kung return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 403e9818e0267619fecebd55095ab26c53eff92e93James Kung } 413e9818e0267619fecebd55095ab26c53eff92e93James Kung 423e9818e0267619fecebd55095ab26c53eff92e93James Kung public static int getDaysInMonth(int month, int year) { 433e9818e0267619fecebd55095ab26c53eff92e93James Kung switch (month) { 443e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.JANUARY: 453e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.MARCH: 463e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.MAY: 473e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.JULY: 483e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.AUGUST: 493e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.OCTOBER: 503e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.DECEMBER: 513e9818e0267619fecebd55095ab26c53eff92e93James Kung return 31; 523e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.APRIL: 533e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.JUNE: 543e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.SEPTEMBER: 553e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.NOVEMBER: 563e9818e0267619fecebd55095ab26c53eff92e93James Kung return 30; 573e9818e0267619fecebd55095ab26c53eff92e93James Kung case Calendar.FEBRUARY: 583e9818e0267619fecebd55095ab26c53eff92e93James Kung return (year % 4 == 0) ? 29 : 28; 593e9818e0267619fecebd55095ab26c53eff92e93James Kung default: 603e9818e0267619fecebd55095ab26c53eff92e93James Kung throw new IllegalArgumentException("Invalid Month"); 613e9818e0267619fecebd55095ab26c53eff92e93James Kung } 623e9818e0267619fecebd55095ab26c53eff92e93James Kung } 633e9818e0267619fecebd55095ab26c53eff92e93James Kung 643e9818e0267619fecebd55095ab26c53eff92e93James Kung /** 653e9818e0267619fecebd55095ab26c53eff92e93James Kung * Takes a number of weeks since the epoch and calculates the Julian day of 663e9818e0267619fecebd55095ab26c53eff92e93James Kung * the Monday for that week. 673e9818e0267619fecebd55095ab26c53eff92e93James Kung * 683e9818e0267619fecebd55095ab26c53eff92e93James Kung * This assumes that the week containing the {@link Time#EPOCH_JULIAN_DAY} 693e9818e0267619fecebd55095ab26c53eff92e93James Kung * is considered week 0. It returns the Julian day for the Monday 703e9818e0267619fecebd55095ab26c53eff92e93James Kung * {@code week} weeks after the Monday of the week containing the epoch. 713e9818e0267619fecebd55095ab26c53eff92e93James Kung * 723e9818e0267619fecebd55095ab26c53eff92e93James Kung * @param week Number of weeks since the epoch 733e9818e0267619fecebd55095ab26c53eff92e93James Kung * @return The julian day for the Monday of the given week since the epoch 743e9818e0267619fecebd55095ab26c53eff92e93James Kung */ 753e9818e0267619fecebd55095ab26c53eff92e93James Kung public static int getJulianMondayFromWeeksSinceEpoch(int week) { 763e9818e0267619fecebd55095ab26c53eff92e93James Kung return MONDAY_BEFORE_JULIAN_EPOCH + week * 7; 773e9818e0267619fecebd55095ab26c53eff92e93James Kung } 783e9818e0267619fecebd55095ab26c53eff92e93James Kung 793e9818e0267619fecebd55095ab26c53eff92e93James Kung /** 803e9818e0267619fecebd55095ab26c53eff92e93James Kung * Returns the week since {@link Time#EPOCH_JULIAN_DAY} (Jan 1, 1970) 813e9818e0267619fecebd55095ab26c53eff92e93James Kung * adjusted for first day of week. 823e9818e0267619fecebd55095ab26c53eff92e93James Kung * 833e9818e0267619fecebd55095ab26c53eff92e93James Kung * This takes a julian day and the week start day and calculates which 843e9818e0267619fecebd55095ab26c53eff92e93James Kung * week since {@link Time#EPOCH_JULIAN_DAY} that day occurs in, starting 853e9818e0267619fecebd55095ab26c53eff92e93James Kung * at 0. *Do not* use this to compute the ISO week number for the year. 863e9818e0267619fecebd55095ab26c53eff92e93James Kung * 873e9818e0267619fecebd55095ab26c53eff92e93James Kung * @param julianDay The julian day to calculate the week number for 883e9818e0267619fecebd55095ab26c53eff92e93James Kung * @param firstDayOfWeek Which week day is the first day of the week, 893e9818e0267619fecebd55095ab26c53eff92e93James Kung * see {@link Time#SUNDAY} 903e9818e0267619fecebd55095ab26c53eff92e93James Kung * @return Weeks since the epoch 913e9818e0267619fecebd55095ab26c53eff92e93James Kung */ 923e9818e0267619fecebd55095ab26c53eff92e93James Kung public static int getWeeksSinceEpochFromJulianDay(int julianDay, int firstDayOfWeek) { 933e9818e0267619fecebd55095ab26c53eff92e93James Kung int diff = Time.THURSDAY - firstDayOfWeek; 943e9818e0267619fecebd55095ab26c53eff92e93James Kung if (diff < 0) { 953e9818e0267619fecebd55095ab26c53eff92e93James Kung diff += 7; 963e9818e0267619fecebd55095ab26c53eff92e93James Kung } 973e9818e0267619fecebd55095ab26c53eff92e93James Kung int refDay = Time.EPOCH_JULIAN_DAY - diff; 983e9818e0267619fecebd55095ab26c53eff92e93James Kung return (julianDay - refDay) / 7; 99b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein } 100b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein 101b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein /** 102b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein * Render an animator to pulsate a view in place. 103b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein * @param labelToAnimate the view to pulsate. 104b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein * @return The animator object. Use .start() to begin. 105b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein */ 1062e00aa34c051111529290cf23c6ba940c2c0c142James Kung public static ObjectAnimator getPulseAnimator(View labelToAnimate, float decreaseRatio, 1072e00aa34c051111529290cf23c6ba940c2c0c142James Kung float increaseRatio) { 108b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein Keyframe k0 = Keyframe.ofFloat(0f, 1f); 1092e00aa34c051111529290cf23c6ba940c2c0c142James Kung Keyframe k1 = Keyframe.ofFloat(0.275f, decreaseRatio); 1102e00aa34c051111529290cf23c6ba940c2c0c142James Kung Keyframe k2 = Keyframe.ofFloat(0.69f, increaseRatio); 111b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein Keyframe k3 = Keyframe.ofFloat(1f, 1f); 112b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein 113b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein PropertyValuesHolder scaleX = PropertyValuesHolder.ofKeyframe("scaleX", k0, k1, k2, k3); 114b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein PropertyValuesHolder scaleY = PropertyValuesHolder.ofKeyframe("scaleY", k0, k1, k2, k3); 115b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein ObjectAnimator pulseAnimator = 116b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein ObjectAnimator.ofPropertyValuesHolder(labelToAnimate, scaleX, scaleY); 117b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein pulseAnimator.setDuration(PULSE_ANIMATOR_DURATION); 118b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein 119b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein return pulseAnimator; 120b612bb9493d006667f767c59278f8d0925dbd9f6Sam Blitzstein } 121b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzstein} 122