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