blob: f8272ce884ab52e946bcbf1267d1dd495141fae1 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.compat;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.hardware.biometrics.BiometricManager;
import android.net.NetworkCapabilities;
import android.net.TransportInfo;
import android.net.Uri;
import android.os.Build;
import android.os.FileUtils;
import android.os.PowerManager;
import android.provider.MediaStore;
import android.telephony.CellInfo;
import android.telephony.TelephonyManager;
import android.view.MotionEvent;
import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresPermission;
import org.chromium.base.Callback;
import org.chromium.base.task.AsyncTask;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executor;
/**
* Utility class to use new APIs that were added in Q (API level 29). These need to exist in a
* separate class so that Android framework can successfully verify classes without
* encountering the new APIs.
*/
@RequiresApi(Build.VERSION_CODES.Q)
public final class ApiHelperForQ {
private ApiHelperForQ() {}
/** See {@link TelephonyManager.requestCellInfoUpdate() }. */
@RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
public static void requestCellInfoUpdate(
TelephonyManager telephonyManager, Callback<List<CellInfo>> callback) {
telephonyManager.requestCellInfoUpdate(
AsyncTask.THREAD_POOL_EXECUTOR,
new TelephonyManager.CellInfoCallback() {
@Override
@SuppressLint("Override")
public void onCellInfo(List<CellInfo> cellInfos) {
callback.onResult(cellInfos);
}
});
}
public static boolean bindIsolatedService(
Context context,
Intent intent,
int flags,
String instanceName,
Executor executor,
ServiceConnection connection) {
return context.bindIsolatedService(intent, flags, instanceName, executor, connection);
}
public static void updateServiceGroup(
Context context, ServiceConnection connection, int group, int importance) {
context.updateServiceGroup(connection, group, importance);
}
/** See {@link MotionEvent#getClassification() }. */
public static int getClassification(MotionEvent event) {
return event.getClassification();
}
/** See {@link Context#getSystemService(Class<T>) }. */
public static BiometricManager getBiometricManagerSystemService(Context context) {
return context.getSystemService(BiometricManager.class);
}
/** See {@link Service#startForegroung(int, Notification, int) }. */
public static void startForeground(
Service service, int id, Notification notification, int foregroundServiceType) {
service.startForeground(id, notification, foregroundServiceType);
}
/** See {@link FileUtils#copy(InputStream, OutputStream) }. */
public static long copy(InputStream in, OutputStream out) throws IOException {
return FileUtils.copy(in, out);
}
/** See {@link MediaStore#setIncludePending(Uri) }. */
public static Uri setIncludePending(Uri uri) {
return MediaStore.setIncludePending(uri);
}
/** See {@link MediaStore#getExternalVolumeNames(Context) }. */
public static Set<String> getExternalVolumeNames(Context context) {
return MediaStore.getExternalVolumeNames(context);
}
/** See {@link BiometricManager#canAuthenticate() }. */
@RequiresPermission(android.Manifest.permission.USE_BIOMETRIC)
public static int canAuthenticate(BiometricManager manager) {
return manager.canAuthenticate();
}
/** See {@link NetworkCapabilities#getTransportInfo() } */
public static TransportInfo getTransportInfo(NetworkCapabilities networkCapabilities) {
return networkCapabilities.getTransportInfo();
}
/** See {@link PowerManager#getCurrentThermalStatus() }. */
public static int getCurrentThermalStatus(PowerManager powerManager) {
return powerManager.getCurrentThermalStatus();
}
}