170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinpackage com.android.mediaframeworktest.integration;
370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinimport static org.junit.Assert.assertNotNull;
58ea56f68517ffa42bd5f43ab67f4ebfcfcb0cd23Lazar Trsicimport static android.system.OsConstants.*;
670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinimport android.content.Context;
870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinimport android.content.pm.FeatureInfo;
970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinimport android.content.pm.PackageManager;
1070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinimport android.hardware.ICameraService;
1170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinimport android.os.IBinder;
1270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinimport android.os.ServiceManager;
1370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinimport android.util.Log;
1470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
1570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkinpublic class CameraBinderTestUtils {
1670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    private final ICameraService mCameraService;
1770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    private int mGuessedNumCameras;
1870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
1970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    static final String CAMERA_SERVICE_BINDER_NAME = "media.camera";
2070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
21d7bf1778df666e82268d1e4549d248ce3dfc9665Igor Murashkin    public static final int NO_ERROR = 0;
2270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    private final Context mContext;
2370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
2470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    public CameraBinderTestUtils(Context context) {
2570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
2670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        mContext = context;
2770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
2870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        guessNumCameras();
2970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
3070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        IBinder cameraServiceBinder = ServiceManager
3170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin                .getService(CameraBinderTestUtils.CAMERA_SERVICE_BINDER_NAME);
3270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        assertNotNull("Camera service IBinder should not be null", cameraServiceBinder);
3370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
3470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        this.mCameraService = ICameraService.Stub.asInterface(cameraServiceBinder);
3570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        assertNotNull("Camera service should not be null", getCameraService());
3670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    }
3770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
3870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    private void guessNumCameras() {
3970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
4070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        /**
4170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin         * Why do we need this? This way we have no dependency on getNumCameras
4270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin         * actually working. On most systems there are only 0, 1, or 2 cameras,
4370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin         * and this covers that 'usual case'. On other systems there might be 3+
4470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin         * cameras, but this will at least check the first 2.
4570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin         */
4670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        this.mGuessedNumCameras = 0;
4770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
4870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        // Front facing camera
4970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        if (CameraBinderTestUtils.isFeatureAvailable(mContext,
5070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin                PackageManager.FEATURE_CAMERA_FRONT)) {
5170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            this.mGuessedNumCameras = getGuessedNumCameras() + 1;
5270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        }
5370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
5470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        // Back facing camera
5570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        if (CameraBinderTestUtils.isFeatureAvailable(mContext,
5670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin                PackageManager.FEATURE_CAMERA)) {
5770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            this.mGuessedNumCameras = getGuessedNumCameras() + 1;
5870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        }
5970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
6070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        // Any facing camera
6170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        if (getGuessedNumCameras() == 0
6270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin                && CameraBinderTestUtils.isFeatureAvailable(mContext,
6370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin                        PackageManager.FEATURE_CAMERA_ANY)) {
6470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            this.mGuessedNumCameras = getGuessedNumCameras() + 1;
6570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        }
6670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
6770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        Log.v(CameraBinderTest.TAG, "Guessing there are at least " + getGuessedNumCameras()
6870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin                + " cameras");
6970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    }
7070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
7170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    final static public boolean isFeatureAvailable(Context context, String feature) {
7270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        final PackageManager packageManager = context.getPackageManager();
7370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        final FeatureInfo[] featuresList = packageManager.getSystemAvailableFeatures();
7470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        for (FeatureInfo f : featuresList) {
7570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            if (f.name != null && f.name.equals(feature)) {
7670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin                return true;
7770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            }
7870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        }
7970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
8070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        return false;
8170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    }
8270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
8370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    ICameraService getCameraService() {
8470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        return mCameraService;
8570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    }
8670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
8770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    int getGuessedNumCameras() {
8870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        return mGuessedNumCameras;
8970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    }
9070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin}
91