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