mirror of https://github.com/iSoron/uhabits.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
4.9 KiB
136 lines
4.9 KiB
/*
|
|
* Copyright (C) 2013 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.datetimepicker;
|
|
|
|
import java.util.Calendar;
|
|
|
|
import android.animation.Keyframe;
|
|
import android.animation.ObjectAnimator;
|
|
import android.animation.PropertyValuesHolder;
|
|
import android.annotation.SuppressLint;
|
|
import android.text.format.Time;
|
|
import android.view.View;
|
|
|
|
/**
|
|
* Utility helper functions for time and date pickers.
|
|
*/
|
|
public class Utils {
|
|
|
|
public static final int MONDAY_BEFORE_JULIAN_EPOCH = Time.EPOCH_JULIAN_DAY - 3;
|
|
public static final int PULSE_ANIMATOR_DURATION = 544;
|
|
|
|
// Alpha level for time picker selection.
|
|
public static final int SELECTED_ALPHA = 51;
|
|
public static final int SELECTED_ALPHA_THEME_DARK = 102;
|
|
// Alpha level for fully opaque.
|
|
public static final int FULL_ALPHA = 255;
|
|
|
|
|
|
static final String SHARED_PREFS_NAME = "com.android.calendar_preferences";
|
|
|
|
/**
|
|
* Try to speak the specified text, for accessibility. Only available on JB or later.
|
|
* @param text Text to announce.
|
|
*/
|
|
@SuppressLint("NewApi")
|
|
public static void tryAccessibilityAnnounce(View view, CharSequence text) {
|
|
if (view != null && text != null) {
|
|
view.announceForAccessibility(text);
|
|
}
|
|
}
|
|
|
|
public static int getDaysInMonth(int month, int year) {
|
|
switch (month) {
|
|
case Calendar.JANUARY:
|
|
case Calendar.MARCH:
|
|
case Calendar.MAY:
|
|
case Calendar.JULY:
|
|
case Calendar.AUGUST:
|
|
case Calendar.OCTOBER:
|
|
case Calendar.DECEMBER:
|
|
return 31;
|
|
case Calendar.APRIL:
|
|
case Calendar.JUNE:
|
|
case Calendar.SEPTEMBER:
|
|
case Calendar.NOVEMBER:
|
|
return 30;
|
|
case Calendar.FEBRUARY:
|
|
return (year % 4 == 0) ? 29 : 28;
|
|
default:
|
|
throw new IllegalArgumentException("Invalid Month");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Takes a number of weeks since the epoch and calculates the Julian day of
|
|
* the Monday for that week.
|
|
*
|
|
* This assumes that the week containing the {@link Time#EPOCH_JULIAN_DAY}
|
|
* is considered week 0. It returns the Julian day for the Monday
|
|
* {@code week} weeks after the Monday of the week containing the epoch.
|
|
*
|
|
* @param week Number of weeks since the epoch
|
|
* @return The julian day for the Monday of the given week since the epoch
|
|
*/
|
|
public static int getJulianMondayFromWeeksSinceEpoch(int week) {
|
|
return MONDAY_BEFORE_JULIAN_EPOCH + week * 7;
|
|
}
|
|
|
|
/**
|
|
* Returns the week since {@link Time#EPOCH_JULIAN_DAY} (Jan 1, 1970)
|
|
* adjusted for first day of week.
|
|
*
|
|
* This takes a julian day and the week start day and calculates which
|
|
* week since {@link Time#EPOCH_JULIAN_DAY} that day occurs in, starting
|
|
* at 0. *Do not* use this to compute the ISO week number for the year.
|
|
*
|
|
* @param julianDay The julian day to calculate the week number for
|
|
* @param firstDayOfWeek Which week day is the first day of the week,
|
|
* see {@link Time#SUNDAY}
|
|
* @return Weeks since the epoch
|
|
*/
|
|
public static int getWeeksSinceEpochFromJulianDay(int julianDay, int firstDayOfWeek) {
|
|
int diff = Time.THURSDAY - firstDayOfWeek;
|
|
if (diff < 0) {
|
|
diff += 7;
|
|
}
|
|
int refDay = Time.EPOCH_JULIAN_DAY - diff;
|
|
return (julianDay - refDay) / 7;
|
|
}
|
|
|
|
/**
|
|
* Render an animator to pulsate a view in place.
|
|
* @param labelToAnimate the view to pulsate.
|
|
* @return The animator object. Use .start() to begin.
|
|
*/
|
|
public static ObjectAnimator getPulseAnimator(View labelToAnimate, float decreaseRatio,
|
|
float increaseRatio) {
|
|
Keyframe k0 = Keyframe.ofFloat(0f, 1f);
|
|
Keyframe k1 = Keyframe.ofFloat(0.275f, decreaseRatio);
|
|
Keyframe k2 = Keyframe.ofFloat(0.69f, increaseRatio);
|
|
Keyframe k3 = Keyframe.ofFloat(1f, 1f);
|
|
|
|
PropertyValuesHolder scaleX = PropertyValuesHolder.ofKeyframe("scaleX", k0, k1, k2, k3);
|
|
PropertyValuesHolder scaleY = PropertyValuesHolder.ofKeyframe("scaleY", k0, k1, k2, k3);
|
|
ObjectAnimator pulseAnimator =
|
|
ObjectAnimator.ofPropertyValuesHolder(labelToAnimate, scaleX, scaleY);
|
|
pulseAnimator.setDuration(PULSE_ANIMATOR_DURATION);
|
|
|
|
return pulseAnimator;
|
|
}
|
|
}
|