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