• 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, new TelephonyManager.CellInfoCallback() {
53                     @Override
54                     @SuppressLint("Override")
55                     public void onCellInfo(List<CellInfo> cellInfos) {
56                         callback.onResult(cellInfos);
57                     }
58                 });
59     }
60 
bindIsolatedService(Context context, Intent intent, int flags, String instanceName, Executor executor, ServiceConnection connection)61     public static boolean bindIsolatedService(Context context, Intent intent, int flags,
62             String instanceName, Executor executor, ServiceConnection connection) {
63         return context.bindIsolatedService(intent, flags, instanceName, executor, connection);
64     }
65 
updateServiceGroup( Context context, ServiceConnection connection, int group, int importance)66     public static void updateServiceGroup(
67             Context context, ServiceConnection connection, int group, int importance) {
68         context.updateServiceGroup(connection, group, importance);
69     }
70 
71     /** See {@link MotionEvent#getClassification() }. */
getClassification(MotionEvent event)72     public static int getClassification(MotionEvent event) {
73         return event.getClassification();
74     }
75 
76     /** See {@link Context#getSystemService(Class<T>) }. */
getBiometricManagerSystemService(Context context)77     public static BiometricManager getBiometricManagerSystemService(Context context) {
78         return context.getSystemService(BiometricManager.class);
79     }
80 
81     /** See {@link Service#startForegroung(int, Notification, int) }. */
startForeground( Service service, int id, Notification notification, int foregroundServiceType)82     public static void startForeground(
83             Service service, int id, Notification notification, int foregroundServiceType) {
84         service.startForeground(id, notification, foregroundServiceType);
85     }
86 
87     /** See {@link FileUtils#copy(InputStream, OutputStream) }. */
copy(InputStream in, OutputStream out)88     public static long copy(InputStream in, OutputStream out) throws IOException {
89         return FileUtils.copy(in, out);
90     }
91 
92     /** See {@link MediaStore#setIncludePending(Uri) }. */
setIncludePending(Uri uri)93     public static Uri setIncludePending(Uri uri) {
94         return MediaStore.setIncludePending(uri);
95     }
96 
97     /** See {@link MediaStore#getExternalVolumeNames(Context) }. */
getExternalVolumeNames(Context context)98     public static Set<String> getExternalVolumeNames(Context context) {
99         return MediaStore.getExternalVolumeNames(context);
100     }
101 
102     /** See {@link BiometricManager#canAuthenticate() }. */
103     @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC)
canAuthenticate(BiometricManager manager)104     public static int canAuthenticate(BiometricManager manager) {
105         return manager.canAuthenticate();
106     }
107 
108     /** See {@link NetworkCapabilities#getTransportInfo() } */
getTransportInfo(NetworkCapabilities networkCapabilities)109     public static TransportInfo getTransportInfo(NetworkCapabilities networkCapabilities) {
110         return networkCapabilities.getTransportInfo();
111     }
112 
113     /** See {@link PowerManager#getCurrentThermalStatus() }. */
getCurrentThermalStatus(PowerManager powerManager)114     public static int getCurrentThermalStatus(PowerManager powerManager) {
115         return powerManager.getCurrentThermalStatus();
116     }
117 }
118