Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1b6e58b authored by Ravneet Dhanjal's avatar Ravneet Dhanjal Committed by Android (Google) Code Review
Browse files

Merge changes from topic "fallback_permission" into main

* changes:
  Camera: Avoid permission check if fallback impl is not enabled
  Camera: Check if fallback impl is granted camera permissions
parents fff43718 92521a31
Loading
Loading
Loading
Loading
+65 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.ServiceConnection;
import android.graphics.ImageFormat;
import android.hardware.camera2.CameraCharacteristics.Key;
@@ -278,6 +279,8 @@ public final class CameraExtensionCharacteristics {
        private final Object mLock = new Object();
        private final int PROXY_SERVICE_DELAY_MS = 2000;
        private ExtensionConnectionManager mConnectionManager = new ExtensionConnectionManager();
        private boolean mPermissionForFallbackEnabled = false;
        private boolean mIsFallbackEnabled = false;

        // Singleton, don't allow construction
        private CameraExtensionManagerGlobal() {}
@@ -325,6 +328,7 @@ public final class CameraExtensionCharacteristics {
                                "Choosing the fallback software implementation service: "
                                + serviceName);
                        intent.setClassName(packageName, serviceName);
                        mIsFallbackEnabled = true;
                    }
                }

@@ -436,6 +440,20 @@ public final class CameraExtensionCharacteristics {
                    releaseProxyConnectionLocked(ctx, extension);
                }

                if (Flags.concertMode() && ret && useFallback && mIsFallbackEnabled) {
                    try {
                        InitializeSessionHandler cb = new InitializeSessionHandler(ctx);
                        initializeSession(cb, extension);
                        ret = mPermissionForFallbackEnabled;
                    } catch (RemoteException e) {
                        Log.e(TAG, "Failed to initialize extension. Extension service does not"
                                + " respond!");
                        ret = false;
                    } finally {
                        releaseSession(extension);
                    }
                }

                return ret;
            }
        }
@@ -464,7 +482,6 @@ public final class CameraExtensionCharacteristics {
                if (!vendorImpl) {
                    unregisterClient(ctx, token, extension);
                    ret = registerClientHelper(ctx, token, extension, true /*useFallback*/);

                }
            }

@@ -508,6 +525,7 @@ public final class CameraExtensionCharacteristics {
                    try {
                        mConnectionManager.getProxy(extension).releaseSession();
                        mConnectionManager.setSessionInitialized(false);
                        mPermissionForFallbackEnabled = false; // Reset permission status
                    } catch (RemoteException e) {
                        Log.e(TAG, "Failed to release session! Extension service does"
                                + " not respond!");
@@ -556,6 +574,52 @@ public final class CameraExtensionCharacteristics {
            }
        }

        private class InitializeSessionHandler extends IInitializeSessionCallback.Stub {
            private Context mContext;

            public InitializeSessionHandler(Context context) {
                mContext = context;
            }

            @Override
            public void onSuccess() {
                // Verify that the camera permission is granted if using
                // the fallback implementation for an extension
                String[] callingUidPackages = mContext.getPackageManager()
                        .getPackagesForUid(Binder.getCallingUid());
                String fallbackPackageName = mContext.getResources()
                        .getString(FALLBACK_PACKAGE_NAME);

                if (!fallbackPackageName.isEmpty()
                        && Arrays.stream(callingUidPackages)
                        .anyMatch(fallbackPackageName::equals)) {
                    String[] cameraPermissions = {
                        android.Manifest.permission.SYSTEM_CAMERA,
                        android.Manifest.permission.CAMERA
                    };

                    boolean allPermissionsGranted = true;
                    for (String permission : cameraPermissions) {
                        int permissionResult = mContext.checkPermission(permission,
                                Binder.getCallingPid(), Binder.getCallingUid());
                        if (permissionResult != PackageManager.PERMISSION_GRANTED) {
                            Log.w(TAG, permission + " permission not granted for "
                                    + fallbackPackageName + ", permission check result: "
                                    + permissionResult);
                            allPermissionsGranted = false;
                        }
                    }

                    mPermissionForFallbackEnabled = allPermissionsGranted;
                }
            }

            @Override
            public void onFailure() {
                Log.e(TAG, "Failed to initialize proxy service session!");
            }
        }

        private class ExtensionConnectionManager {
            // Maps extension to ExtensionConnection
            private Map<Integer, ExtensionConnection> mConnections = new HashMap<>();