• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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