1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2013 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpackage org.chromium.base;
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.annotation.TargetApi;
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.app.Activity;
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.app.ActivityManager;
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.app.PendingIntent;
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.ContentResolver;
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.Context;
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.Intent;
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.pm.PackageManager;
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.res.ColorStateList;
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.res.Configuration;
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.res.Resources;
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.res.Resources.NotFoundException;
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.graphics.Bitmap;
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.graphics.Color;
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.graphics.ColorFilter;
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.graphics.Rect;
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.graphics.drawable.Drawable;
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.os.Build;
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.os.PowerManager;
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.os.Process;
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.os.StatFs;
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.os.UserManager;
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.provider.Settings;
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.view.View;
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.view.ViewGroup.MarginLayoutParams;
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.view.Window;
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.view.WindowManager;
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.widget.TextView;
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport java.lang.reflect.Method;
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/**
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Utility class to use new APIs that were added after ICS (API level 14).
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez@TargetApi(Build.VERSION_CODES.LOLLIPOP)
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpublic class ApiCompatibilityUtils {
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    private ApiCompatibilityUtils() {
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * Returns true if view's layout direction is right-to-left.
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     *
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @param view the View whose layout is being considered
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static boolean isLayoutRtl(View view) {
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // All layouts are LTR before JB MR1.
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return false;
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see Configuration#getLayoutDirection()
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static int getLayoutDirection(Configuration configuration) {
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return configuration.getLayoutDirection();
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // All layouts are LTR before JB MR1.
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return View.LAYOUT_DIRECTION_LTR;
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @return True if the running version of the Android supports printing.
74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static boolean isPrintingSupported() {
76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @return True if the running version of the Android supports elevation. Elevation of a view
81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * determines the visual appearance of its shadow.
82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static boolean isElevationSupported() {
84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.View#setLayoutDirection(int)
89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setLayoutDirection(View view, int layoutDirection) {
91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            view.setLayoutDirection(layoutDirection);
93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Do nothing. RTL layouts aren't supported before JB MR1.
95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.View#setTextAlignment(int)
100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setTextAlignment(View view, int textAlignment) {
102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            view.setTextAlignment(textAlignment);
104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Do nothing. RTL text isn't supported before JB MR1.
106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.View#setTextDirection(int)
111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setTextDirection(View view, int textDirection) {
113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            view.setTextDirection(textDirection);
115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Do nothing. RTL text isn't supported before JB MR1.
117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * See {@link android.view.View#setLabelFor(int)}.
122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setLabelFor(View labelView, int id) {
124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            labelView.setLabelFor(id);
126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Do nothing. #setLabelFor() isn't supported before JB MR1.
128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
130645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
131645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
132645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.ViewGroup.MarginLayoutParams#setMarginEnd(int)
133645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
134645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setMarginEnd(MarginLayoutParams layoutParams, int end) {
135645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
136645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            layoutParams.setMarginEnd(end);
137645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
138645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            layoutParams.rightMargin = end;
139645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
140645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
141645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
142645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
143645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.ViewGroup.MarginLayoutParams#getMarginEnd()
144645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
145645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static int getMarginEnd(MarginLayoutParams layoutParams) {
146645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
147645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return layoutParams.getMarginEnd();
148645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
149645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return layoutParams.rightMargin;
150645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
151645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
152645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
153645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
154645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.ViewGroup.MarginLayoutParams#setMarginStart(int)
155645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
156645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setMarginStart(MarginLayoutParams layoutParams, int start) {
157645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
158645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            layoutParams.setMarginStart(start);
159645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
160645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            layoutParams.leftMargin = start;
161645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
162645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
163645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
164645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
165645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.ViewGroup.MarginLayoutParams#getMarginStart()
166645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
167645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static int getMarginStart(MarginLayoutParams layoutParams) {
168645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
169645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return layoutParams.getMarginStart();
170645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
171645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return layoutParams.leftMargin;
172645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
173645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
174645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
175645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
176645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.View#setPaddingRelative(int, int, int, int)
177645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
178645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setPaddingRelative(View view, int start, int top, int end, int bottom) {
179645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
180645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            view.setPaddingRelative(start, top, end, bottom);
181645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
182645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Before JB MR1, all layouts are left-to-right, so start == left, etc.
183645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            view.setPadding(start, top, end, bottom);
184645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
185645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
186645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
187645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
188645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.View#getPaddingStart()
189645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
190645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static int getPaddingStart(View view) {
191645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
192645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return view.getPaddingStart();
193645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
194645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Before JB MR1, all layouts are left-to-right, so start == left.
195645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return view.getPaddingLeft();
196645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
197645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
198645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
199645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
200645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.View#getPaddingEnd()
201645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
202645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static int getPaddingEnd(View view) {
203645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
204645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return view.getPaddingEnd();
205645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
206645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Before JB MR1, all layouts are left-to-right, so end == right.
207645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return view.getPaddingRight();
208645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
209645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
210645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
211645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
212645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.widget.TextView#setCompoundDrawablesRelative(Drawable, Drawable, Drawable,
213645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     *      Drawable)
214645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
215645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setCompoundDrawablesRelative(TextView textView, Drawable start, Drawable top,
216645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            Drawable end, Drawable bottom) {
217645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR1) {
218645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // On JB MR1, due to a platform bug, setCompoundDrawablesRelative() is a no-op if the
219645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // view has ever been measured. As a workaround, use setCompoundDrawables() directly.
220645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // See: http://crbug.com/368196 and http://crbug.com/361709
221645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            boolean isRtl = isLayoutRtl(textView);
222645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            textView.setCompoundDrawables(isRtl ? end : start, top, isRtl ? start : end, bottom);
223645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
224645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            textView.setCompoundDrawablesRelative(start, top, end, bottom);
225645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
226645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            textView.setCompoundDrawables(start, top, end, bottom);
227645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
228645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
229645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
230645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
231645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.widget.TextView#setCompoundDrawablesRelativeWithIntrinsicBounds(Drawable,
232645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     *      Drawable, Drawable, Drawable)
233645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
234645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setCompoundDrawablesRelativeWithIntrinsicBounds(TextView textView,
235645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            Drawable start, Drawable top, Drawable end, Drawable bottom) {
236645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR1) {
237645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Work around the platform bug described in setCompoundDrawablesRelative() above.
238645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            boolean isRtl = isLayoutRtl(textView);
239645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            textView.setCompoundDrawablesWithIntrinsicBounds(isRtl ? end : start, top,
240645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    isRtl ? start : end, bottom);
241645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
242645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            textView.setCompoundDrawablesRelativeWithIntrinsicBounds(start, top, end, bottom);
243645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
244645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            textView.setCompoundDrawablesWithIntrinsicBounds(start, top, end, bottom);
245645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
246645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
247645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
248645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
249645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.widget.TextView#setCompoundDrawablesRelativeWithIntrinsicBounds(int, int, int,
250645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     *      int)
251645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
252645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setCompoundDrawablesRelativeWithIntrinsicBounds(TextView textView,
253645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            int start, int top, int end, int bottom) {
254645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR1) {
255645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Work around the platform bug described in setCompoundDrawablesRelative() above.
256645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            boolean isRtl = isLayoutRtl(textView);
257645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            textView.setCompoundDrawablesWithIntrinsicBounds(isRtl ? end : start, top,
258645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    isRtl ? start : end, bottom);
259645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
260645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            textView.setCompoundDrawablesRelativeWithIntrinsicBounds(start, top, end, bottom);
261645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
262645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            textView.setCompoundDrawablesWithIntrinsicBounds(start, top, end, bottom);
263645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
264645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
265645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
266645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    // These methods have a new name, and the old name is deprecated.
267645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
268645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
269645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.app.PendingIntent#getCreatorPackage()
270645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
271645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("deprecation")
272645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static String getCreatorPackage(PendingIntent intent) {
273645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
274645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return intent.getCreatorPackage();
275645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
276645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return intent.getTargetPackage();
277645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
278645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
279645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
280645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
281645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.provider.Settings.Global#DEVICE_PROVISIONED
282645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
283645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
284645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static boolean isDeviceProvisioned(Context context) {
285645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) return true;
286645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (context == null) return true;
287645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (context.getContentResolver() == null) return true;
288645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return Settings.Global.getInt(
289645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0) != 0;
290645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
291645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
292645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
293645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.app.Activity#finishAndRemoveTask()
294645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
295645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void finishAndRemoveTask(Activity activity) {
296645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
297645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            activity.finishAndRemoveTask();
298645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
299645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // crbug.com/395772 : Fallback for Activity.finishAndRemoveTask() failing.
300645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            new FinishAndRemoveTaskWithRetry(activity).run();
301645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
302645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            activity.finish();
303645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
304645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
305645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
306645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
307645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * Set elevation if supported.
308645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
309645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
310645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static boolean setElevation(View view, float elevationValue) {
311645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (!isElevationSupported()) return false;
312645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
313645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        view.setElevation(elevationValue);
314645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return true;
315645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
316645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
317645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    private static class FinishAndRemoveTaskWithRetry implements Runnable {
318645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        private static final long RETRY_DELAY_MS = 500;
319645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        private static final long MAX_TRY_COUNT = 3;
320645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        private final Activity mActivity;
321645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        private int mTryCount;
322645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
323645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        FinishAndRemoveTaskWithRetry(Activity activity) {
324645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mActivity = activity;
325645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
326645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
327645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        @Override
328645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public void run() {
329645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mActivity.finishAndRemoveTask();
330645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mTryCount++;
331645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            if (!mActivity.isFinishing()) {
332645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                if (mTryCount < MAX_TRY_COUNT) {
333645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    ThreadUtils.postOnUiThreadDelayed(this, RETRY_DELAY_MS);
334645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                } else {
335645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    mActivity.finish();
336645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                }
337645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
338645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
339645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
340645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
341645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
342645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @return Whether the screen of the device is interactive.
343645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
344645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("deprecation")
345645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static boolean isInteractive(Context context) {
346645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        PowerManager manager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
347645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
348645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return manager.isInteractive();
349645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
350645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return manager.isScreenOn();
351645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
352645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
353645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
354645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("deprecation")
355645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static int getActivityNewDocumentFlag() {
356645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
357645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
358645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
359645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
360645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
361645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
362645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
363645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
364645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.provider.Settings.Secure#SKIP_FIRST_USE_HINTS
365645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
366645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static boolean shouldSkipFirstUseHints(ContentResolver contentResolver) {
367645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
368645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return Settings.Secure.getInt(
369645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    contentResolver, Settings.Secure.SKIP_FIRST_USE_HINTS, 0) != 0;
370645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
371645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return false;
372645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
373645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
374645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
375645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
376645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @param activity Activity that should get the task description update.
377645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @param title Title of the activity.
378645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @param icon Icon of the activity.
379645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @param color Color of the activity. It must be a fully opaque color.
380645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
381645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setTaskDescription(Activity activity, String title, Bitmap icon, int color) {
382645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        // TaskDescription requires an opaque color.
383645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assert Color.alpha(color) == 255;
384645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
385645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
386645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            ActivityManager.TaskDescription description =
387645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    new ActivityManager.TaskDescription(title, icon, color);
388645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            activity.setTaskDescription(description);
389645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
390645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
391645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
392645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
393645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.view.Window#setStatusBarColor(int color).
394645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
395645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setStatusBarColor(Window window, int statusBarColor) {
396645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
397645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // If both system bars are black, we can remove these from our layout,
398645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // removing or shrinking the SurfaceFlinger overlay required for our views.
399645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            if (statusBarColor == Color.BLACK && window.getNavigationBarColor() == Color.BLACK) {
400645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                window.clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
401645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            } else {
402645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
403645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
404645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            window.setStatusBarColor(statusBarColor);
405645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
406645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
407645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
408645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
409645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.content.res.Resources#getDrawable(int id).
410645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
411645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("deprecation")
412645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static Drawable getDrawable(Resources res, int id) throws NotFoundException {
413645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
414645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return res.getDrawable(id, null);
415645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
416645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return res.getDrawable(id);
417645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
418645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
419645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
420645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
421645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.content.res.Resources#getDrawableForDensity(int id, int density).
422645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
423645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("deprecation")
424645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static Drawable getDrawableForDensity(Resources res, int id, int density) {
425645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
426645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return res.getDrawableForDensity(id, density, null);
427645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
428645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return res.getDrawableForDensity(id, density);
429645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
430645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
431645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
432645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
433645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.app.Activity#finishAfterTransition().
434645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
435645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void finishAfterTransition(Activity activity) {
436645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
437645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            activity.finishAfterTransition();
438645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
439645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            activity.finish();
440645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
441645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
442645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
443645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
444645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.content.pm.PackageManager#getUserBadgedIcon(Drawable, android.os.UserHandle).
445645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
446645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static Drawable getUserBadgedIcon(Context context, int id) {
447645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        Drawable drawable = getDrawable(context.getResources(), id);
448645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
449645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            PackageManager packageManager = context.getPackageManager();
450645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            drawable = packageManager.getUserBadgedIcon(drawable, Process.myUserHandle());
451645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
452645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return drawable;
453645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
454645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
455645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
456645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.content.pm.PackageManager#getUserBadgedDrawableForDensity(Drawable drawable,
457645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * UserHandle user, Rect badgeLocation, int badgeDensity).
458645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
459645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static Drawable getUserBadgedDrawableForDensity(
460645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            Context context, Drawable drawable, Rect badgeLocation, int density) {
461645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
462645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            PackageManager packageManager = context.getPackageManager();
463645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return packageManager.getUserBadgedDrawableForDensity(
464645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    drawable, Process.myUserHandle(), badgeLocation, density);
465645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
466645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return drawable;
467645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
468645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
469645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
470645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.content.res.Resources#getColor(int id).
471645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
472645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("deprecation")
473645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static int getColor(Resources res, int id) throws NotFoundException {
474645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
475645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return res.getColor(id, null);
476645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
477645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return res.getColor(id);
478645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
479645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
480645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
481645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
482645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.graphics.drawable.Drawable#getColorFilter().
483645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
484645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("NewApi")
485645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static ColorFilter getColorFilter(Drawable drawable) {
486645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
487645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return drawable.getColorFilter();
488645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
489645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return null;
490645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
491645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
492645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
493645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
494645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.content.res.Resources#getColorStateList(int id).
495645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
496645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("deprecation")
497645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static ColorStateList getColorStateList(Resources res, int id) throws NotFoundException {
498645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
499645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return res.getColorStateList(id, null);
500645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
501645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return res.getColorStateList(id);
502645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
503645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
504645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
505645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
506645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see android.widget.TextView#setTextAppearance(int id).
507645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
508645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("deprecation")
509645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void setTextAppearance(TextView view, int id) {
510645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
511645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            view.setTextAppearance(id);
512645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
513645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            view.setTextAppearance(view.getContext(), id);
514645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
515645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
516645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
517645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
518645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * See {@link android.os.StatFs#getBlockCount()}.
519645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
520645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("deprecation")
521645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static long getBlockCount(StatFs statFs) {
522645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
523645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return statFs.getBlockCountLong();
524645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
525645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return statFs.getBlockCount();
526645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
527645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
528645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
529645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
530645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * See {@link android.os.StatFs#getBlockSize()}.
531645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
532645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SuppressWarnings("deprecation")
533645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static long getBlockSize(StatFs statFs) {
534645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
535645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return statFs.getBlockSizeLong();
536645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
537645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return statFs.getBlockSize();
538645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
539645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
540645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
541645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
542645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @param context The Android context, used to retrieve the UserManager system service.
543645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @return Whether the device is running in demo mode.
544645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
545645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static boolean isDemoUser(Context context) {
546645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        // UserManager#isDemoUser() is only available in Android versions greater than N.
547645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (!BuildInfo.isGreaterThanN()) return false;
548645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
549645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        try {
550645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
551645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            Method isDemoUserMethod = UserManager.class.getMethod("isDemoUser");
552645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            boolean isDemoUser = (boolean) isDemoUserMethod.invoke(userManager);
553645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return isDemoUser;
554645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } catch (RuntimeException e) {
555645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Ignore to avoid crashing on startup.
556645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } catch (Exception e) {
557645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Ignore.
558645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
559645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
560645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        return false;
561645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
562645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
563