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