• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 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.annotation.SuppressLint;
8 import android.app.Notification;
9 import android.app.Service;
10 import android.content.Context;
11 import android.content.Intent;
12 import android.content.ServiceConnection;
13 import android.hardware.biometrics.BiometricManager;
14 import android.net.NetworkCapabilities;
15 import android.net.TransportInfo;
16 import android.net.Uri;
17 import android.os.Build;
18 import android.os.FileUtils;
19 import android.os.PowerManager;
20 import android.provider.MediaStore;
21 import android.telephony.CellInfo;
22 import android.telephony.TelephonyManager;
23 import android.view.MotionEvent;
24 
25 import androidx.annotation.RequiresApi;
26 import androidx.annotation.RequiresPermission;
27 
28 import org.chromium.base.Callback;
29 import org.chromium.base.task.AsyncTask;
30 
31 import java.io.IOException;
32 import java.io.InputStream;
33 import java.io.OutputStream;
34 import java.util.List;
35 import java.util.Set;
36 import java.util.concurrent.Executor;
37 
38 /**
39  * Utility class to use new APIs that were added in Q (API level 29). These need to exist in a
40  * separate class so that Android framework can successfully verify classes without
41  * encountering the new APIs.
42  */
43 @RequiresApi(Build.VERSION_CODES.Q)
44 public final class ApiHelperForQ {
ApiHelperForQ()45     private ApiHelperForQ() {}
46 
47     /** See {@link TelephonyManager.requestCellInfoUpdate() }. */
48     @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
requestCellInfoUpdate( TelephonyManager telephonyManager, Callback<List<CellInfo>> callback)49     public static void requestCellInfoUpdate(
50             TelephonyManager telephonyManager, Callback<List<CellInfo>> callback) {
51         telephonyManager.requestCellInfoUpdate(
52                 AsyncTask.THREAD_POOL_EXECUTOR,
53                 new TelephonyManager.CellInfoCallback() {
54                     @Override
55                     @SuppressLint("Override")
56                     public void onCellInfo(List<CellInfo> cellInfos) {
57                         callback.onResult(cellInfos);
58                     }
59                 });
60     }
61 
bindIsolatedService( Context context, Intent intent, int flags, String instanceName, Executor executor, ServiceConnection connection)62     public static boolean bindIsolatedService(
63             Context context,
64             Intent intent,
65             int flags,
66             String instanceName,
67             Executor executor,
68             ServiceConnection connection) {
69         return context.bindIsolatedService(intent, flags, instanceName, executor, connection);
70     }
71 
updateServiceGroup( Context context, ServiceConnection connection, int group, int importance)72     public static void updateServiceGroup(
73             Context context, ServiceConnection connection, int group, int importance) {
74         context.updateServiceGroup(connection, group, importance);
75     }
76 
77     /** See {@link MotionEvent#getClassification() }. */
getClassification(MotionEvent event)78     public static int getClassification(MotionEvent event) {
79         return event.getClassification();
80     }
81 
82     /** See {@link Context#getSystemService(Class<T>) }. */
getBiometricManagerSystemService(Context context)83     public static BiometricManager getBiometricManagerSystemService(Context context) {
84         return context.getSystemService(BiometricManager.class);
85     }
86 
87     /** See {@link Service#startForegroung(int, Notification, int) }. */
startForeground( Service service, int id, Notification notification, int foregroundServiceType)88     public static void startForeground(
89             Service service, int id, Notification notification, int foregroundServiceType) {
90         service.startForeground(id, notification, foregroundServiceType);
91     }
92 
93     /** See {@link FileUtils#copy(InputStream, OutputStream) }. */
copy(InputStream in, OutputStream out)94     public static long copy(InputStream in, OutputStream out) throws IOException {
95         return FileUtils.copy(in, out);
96     }
97 
98     /** See {@link MediaStore#setIncludePending(Uri) }. */
setIncludePending(Uri uri)99     public static Uri setIncludePending(Uri uri) {
100         return MediaStore.setIncludePending(uri);
101     }
102 
103     /** See {@link MediaStore#getExternalVolumeNames(Context) }. */
getExternalVolumeNames(Context context)104     public static Set<String> getExternalVolumeNames(Context context) {
105         return MediaStore.getExternalVolumeNames(context);
106     }
107 
108     /** See {@link BiometricManager#canAuthenticate() }. */
109     @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC)
canAuthenticate(BiometricManager manager)110     public static int canAuthenticate(BiometricManager manager) {
111         return manager.canAuthenticate();
112     }
113 
114     /** See {@link NetworkCapabilities#getTransportInfo() } */
getTransportInfo(NetworkCapabilities networkCapabilities)115     public static TransportInfo getTransportInfo(NetworkCapabilities networkCapabilities) {
116         return networkCapabilities.getTransportInfo();
117     }
118 
119     /** See {@link PowerManager#getCurrentThermalStatus() }. */
getCurrentThermalStatus(PowerManager powerManager)120     public static int getCurrentThermalStatus(PowerManager powerManager) {
121         return powerManager.getCurrentThermalStatus();
122     }
123 }
124