1 // Copyright 2018 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.base.compat; 6 7 import android.animation.ValueAnimator; 8 import android.app.Activity; 9 import android.app.Notification; 10 import android.content.BroadcastReceiver; 11 import android.content.ClipData; 12 import android.content.ClipData.Item; 13 import android.content.ClipDescription; 14 import android.content.ContentResolver; 15 import android.content.Context; 16 import android.content.Intent; 17 import android.content.IntentFilter; 18 import android.content.pm.PackageManager; 19 import android.content.res.Configuration; 20 import android.net.ConnectivityManager; 21 import android.net.ConnectivityManager.NetworkCallback; 22 import android.net.NetworkRequest; 23 import android.os.Build; 24 import android.os.Handler; 25 import android.view.Display; 26 import android.view.View; 27 import android.view.Window; 28 import android.view.autofill.AutofillManager; 29 30 import androidx.annotation.RequiresApi; 31 32 import org.chromium.base.StrictModeContext; 33 34 /** 35 * Utility class to use new APIs that were added in O (API level 26). These need to exist in a 36 * separate class so that Android framework can successfully verify classes without 37 * encountering the new APIs. 38 */ 39 @RequiresApi(Build.VERSION_CODES.O) 40 public final class ApiHelperForO { ApiHelperForO()41 private ApiHelperForO() {} 42 43 /** See {@link Display#isWideColorGamut() }. */ isWideColorGamut(Display display)44 public static boolean isWideColorGamut(Display display) { 45 return display.isWideColorGamut(); 46 } 47 48 /** See {@link Window#setColorMode(int) }. */ setColorMode(Window window, int colorMode)49 public static void setColorMode(Window window, int colorMode) { 50 window.setColorMode(colorMode); 51 } 52 53 /** See {@link Configuration#isScreenWideColorGamut() }. */ isScreenWideColorGamut(Configuration configuration)54 public static boolean isScreenWideColorGamut(Configuration configuration) { 55 return configuration.isScreenWideColorGamut(); 56 } 57 58 /** See {@link PackageManager#isInstantApp() }. */ isInstantApp(PackageManager packageManager)59 public static boolean isInstantApp(PackageManager packageManager) { 60 return packageManager.isInstantApp(); 61 } 62 63 /** See {@link View#setDefaultFocusHighlightEnabled(boolean) }. */ setDefaultFocusHighlightEnabled(View view, boolean enabled)64 public static void setDefaultFocusHighlightEnabled(View view, boolean enabled) { 65 view.setDefaultFocusHighlightEnabled(enabled); 66 } 67 68 /** See {@link ClipDescription#getTimestamp()}. */ getTimestamp(ClipDescription clipDescription)69 public static long getTimestamp(ClipDescription clipDescription) { 70 return clipDescription.getTimestamp(); 71 } 72 73 /** 74 * See {@link Context.createContextForSplit(String) }. Be careful about adding new uses of 75 * this, most split Contexts should be created through {@link 76 * BundleUtils.createIsolatedSplitContext(Context, String) since it has workarounds for 77 * framework bugs. 78 */ createContextForSplit(Context context, String name)79 public static Context createContextForSplit(Context context, String name) 80 throws PackageManager.NameNotFoundException { 81 try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) { 82 return context.createContextForSplit(name); 83 } 84 } 85 86 /** See {@link AutofillManager#cancel()}. */ cancelAutofillSession(Activity activity)87 public static void cancelAutofillSession(Activity activity) { 88 // The AutofillManager has to be retrieved from an activity context. 89 // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/app/Application.java;l=624;drc=5d123b67756dffcfdebdb936ab2de2b29c799321 90 AutofillManager afm = activity.getSystemService(AutofillManager.class); 91 if (afm != null) { 92 afm.cancel(); 93 } 94 } 95 96 /** See {@link AutofillManager#notifyValueChanged(View)}. */ notifyValueChangedForAutofill(View view)97 public static void notifyValueChangedForAutofill(View view) { 98 final AutofillManager afm = view.getContext().getSystemService(AutofillManager.class); 99 if (afm != null) { 100 afm.notifyValueChanged(view); 101 } 102 } 103 104 /** 105 * See {@link ConnectivityManager#registerNetworkCallback(NetworkRequest, 106 * ConnectivityManager.NetworkCallback, Handler) }. 107 */ registerNetworkCallback(ConnectivityManager connectivityManager, NetworkRequest networkRequest, NetworkCallback networkCallback, Handler handler)108 public static void registerNetworkCallback(ConnectivityManager connectivityManager, 109 NetworkRequest networkRequest, NetworkCallback networkCallback, Handler handler) { 110 connectivityManager.registerNetworkCallback(networkRequest, networkCallback, handler); 111 } 112 113 /** See {@link ValueAnimator#areAnimatorsEnabled()}. */ areAnimatorsEnabled()114 public static boolean areAnimatorsEnabled() { 115 return ValueAnimator.areAnimatorsEnabled(); 116 } 117 118 /** See {@link Notification.Builder#setChannelId(String)}. */ setChannelId( Notification.Builder builder, String channelId)119 public static Notification.Builder setChannelId( 120 Notification.Builder builder, String channelId) { 121 return builder.setChannelId(channelId); 122 } 123 124 /** See {@link Notification.Builder#setTimeoutAfter(long)}. */ setTimeoutAfter(Notification.Builder builder, long ms)125 public static Notification.Builder setTimeoutAfter(Notification.Builder builder, long ms) { 126 return builder.setTimeoutAfter(ms); 127 } 128 129 /** 130 * See {@link 131 * ConnectivityManager#registerDefaultNetworkCallback(ConnectivityManager.NetworkCallback, 132 * Handler) }. 133 */ registerDefaultNetworkCallback(ConnectivityManager connectivityManager, NetworkCallback networkCallback, Handler handler)134 public static void registerDefaultNetworkCallback(ConnectivityManager connectivityManager, 135 NetworkCallback networkCallback, Handler handler) { 136 connectivityManager.registerDefaultNetworkCallback(networkCallback, handler); 137 } 138 139 /** See {@link Notification#getChannelId()}. */ getNotificationChannelId(Notification notification)140 public static String getNotificationChannelId(Notification notification) { 141 return notification.getChannelId(); 142 } 143 144 /** 145 * See {@link Context#registerReceiver(BroadcastReceiver, IntentFilter, String, Handler, int)} 146 */ registerReceiver(Context context, BroadcastReceiver receiver, IntentFilter filter, String permission, Handler scheduler, int flags)147 public static Intent registerReceiver(Context context, BroadcastReceiver receiver, 148 IntentFilter filter, String permission, Handler scheduler, int flags) { 149 return context.registerReceiver(receiver, filter, permission, scheduler, flags); 150 } 151 152 /** 153 * See {@link ClipData#addItem(ContentResolver, Item)}. 154 */ addItem(ClipData clipData, ContentResolver contentResolver, Item item)155 public static void addItem(ClipData clipData, ContentResolver contentResolver, Item item) { 156 clipData.addItem(contentResolver, item); 157 } 158 } 159