• 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.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