From df3f4dea620827a857b9ec93bf9e9bb94d3c9289 Mon Sep 17 00:00:00 2001 From: roynatech2544 Date: Sun, 1 May 2022 10:12:35 +0900 Subject: [PATCH] universal7885: Add aidl for interacting with EKCamera Also address deprecation --- .../apps/CameraLightSensor/Android.bp | 1 + .../CameraLightSensorService.kt | 90 ++++++++++--------- .../cameralightsensor/IAutoBrightness.aidl | 6 ++ 3 files changed, 53 insertions(+), 44 deletions(-) create mode 100644 universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/IAutoBrightness.aidl diff --git a/universal7885-common/apps/CameraLightSensor/Android.bp b/universal7885-common/apps/CameraLightSensor/Android.bp index 2e9772c..c3b0912 100644 --- a/universal7885-common/apps/CameraLightSensor/Android.bp +++ b/universal7885-common/apps/CameraLightSensor/Android.bp @@ -2,6 +2,7 @@ android_app { name: "CameraLightSensor", srcs: [ "src/**/*.kt", + "src/**/I*.aidl", ], platform_apis: true, privileged: true, diff --git a/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/CameraLightSensorService.kt b/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/CameraLightSensorService.kt index 98a1bd6..7c94f39 100755 --- a/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/CameraLightSensorService.kt +++ b/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/CameraLightSensorService.kt @@ -2,10 +2,7 @@ package com.eurekateam.cameralightsensor import android.annotation.SuppressLint import android.app.* -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter +import android.content.* import android.content.pm.ServiceInfo import android.database.ContentObserver import android.graphics.Bitmap @@ -13,6 +10,8 @@ import android.graphics.BitmapFactory import android.graphics.Color import android.graphics.ImageFormat import android.hardware.camera2.* +import android.hardware.camera2.params.OutputConfiguration +import android.hardware.camera2.params.SessionConfiguration import android.media.Image import android.media.ImageReader import android.os.* @@ -20,25 +19,29 @@ import android.provider.Settings import android.provider.Settings.SettingNotFoundException import android.util.Log import androidx.core.app.NotificationCompat +import java.util.concurrent.Executors import java.util.concurrent.ScheduledThreadPoolExecutor import java.util.concurrent.TimeUnit class CameraLightSensorService : Service() { private lateinit var screenStateFilter: IntentFilter - lateinit var mContext: Context - private var cameraDevice: CameraDevice? = null - private var session: CameraCaptureSession? = null - private lateinit var manager: CameraManager + private lateinit var mContext: Context + private lateinit var cameraDevice: CameraDevice + private lateinit var mSession: CameraCaptureSession + private val manager: CameraManager by lazy { + getSystemService(CAMERA_SERVICE) as CameraManager + } private lateinit var mCameraHandler: Handler + private val mExecutor = Executors.newSingleThreadExecutor() private fun pushNotification(): Notification { val nm = mContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager val channel = NotificationChannel( - mContext.basePackageName, "CameraLightSensor", + mContext.packageName, "CameraLightSensor", NotificationManager.IMPORTANCE_NONE ) channel.isBlockable = true nm.createNotificationChannel(channel) - val builder = NotificationCompat.Builder(mContext, mContext.basePackageName) + val builder = NotificationCompat.Builder(mContext, mContext.packageName) val notificationIntent = Intent(mContext, CameraLightSensorService::class.java) val contentIntent = PendingIntent.getActivity( mContext, 50, @@ -48,7 +51,7 @@ class CameraLightSensorService : Service() { builder.setContentIntent(contentIntent) builder.setSmallIcon(R.drawable.ic_brightness) builder.setContentTitle("Camera Light Sensor Service") - builder.setChannelId(mContext.basePackageName) + builder.setChannelId(mContext.packageName) return builder.build() } @@ -58,6 +61,7 @@ class CameraLightSensorService : Service() { mRegistered = false imageReader.close() stopForeground(true) + unbindService(mConnection) super.onDestroy() } @@ -65,6 +69,18 @@ class CameraLightSensorService : Service() { return null } + private var mIAutoBrightness: IAutoBrightness? = null + + private val mConnection = object : ServiceConnection { + override fun onServiceConnected(p0: ComponentName?, service: IBinder?) { + mIAutoBrightness = IAutoBrightness.Stub.asInterface(service) + } + + override fun onServiceDisconnected(p0: ComponentName?) { + mIAutoBrightness = null + } + } + private val mScreenStateReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == Intent.ACTION_USER_PRESENT) { @@ -141,17 +157,17 @@ class CameraLightSensorService : Service() { private var sessionStateCallback: CameraCaptureSession.StateCallback = object : CameraCaptureSession.StateCallback() { override fun onReady(session: CameraCaptureSession) { - this@CameraLightSensorService.session = session + this@CameraLightSensorService.mSession = session try { if (createCaptureRequest() == null) return try { - session.capture(createCaptureRequest(), null, mCameraHandler) + session.capture(createCaptureRequest()!!, null, mCameraHandler) } catch (e: CameraAccessException) { e.printStackTrace() } catch (e: IllegalStateException) { Log.w(TAG, "onReady: Session is NULL") } - cameraDevice!!.close() + cameraDevice.close() session.close() } catch (e: Exception) { Log.e(TAG, "Camera is in use") @@ -179,30 +195,16 @@ class CameraLightSensorService : Service() { @SuppressLint("MissingPermission") fun readyCamera() { - manager = getSystemService(CAMERA_SERVICE) as CameraManager + if (mIAutoBrightness != null){ + if (!mIAutoBrightness!!.CameraIsFree()) return + } try { - val pickedCamera = getCamera(manager) - manager.openCamera(pickedCamera, cameraStateCallback, mCameraHandler) + manager.openCamera("1", cameraStateCallback, mCameraHandler) imageReader.setOnImageAvailableListener(onImageAvailableListener, mCameraHandler) if (DEBUG) Log.d(TAG, "imageReader created") - } catch (e: CameraAccessException) { - Log.e(TAG, e.message) - } - } - - private fun getCamera(manager: CameraManager?): String? { - try { - for (cameraId in manager!!.cameraIdList) { - val characteristics = manager.getCameraCharacteristics(cameraId) - val cOrientation = characteristics.get(CameraCharacteristics.LENS_FACING) - if (cOrientation == CAMERA_CHOICE) { - return cameraId - } - } } catch (e: CameraAccessException) { e.printStackTrace() } - return null } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { @@ -210,6 +212,9 @@ class CameraLightSensorService : Service() { mCameraHandlerThread.start() mCameraHandler = Handler(mCameraHandlerThread.looper) mContext = this + bindService(Intent(mContext, IAutoBrightness::class.java).apply { + setClassName("com.eurekateam.camera", "CameraAIDL") + }, mConnection, Context.BIND_AUTO_CREATE) @Suppress("SameParameterValue") startForeground(50, pushNotification(), ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA) mRegistered = false @@ -241,13 +246,11 @@ class CameraLightSensorService : Service() { fun actOnReadyCameraDevice() { try { - cameraDevice!!.createCaptureSession( - listOf(imageReader.surface), - sessionStateCallback, - mCameraHandler - ) + cameraDevice.createCaptureSession( + SessionConfiguration(SessionConfiguration.SESSION_REGULAR, + listOf(OutputConfiguration(imageReader.surface)), mExecutor, sessionStateCallback)) } catch (e: CameraAccessException) { - Log.e(TAG, e.message) + e.printStackTrace() } } @@ -261,13 +264,13 @@ class CameraLightSensorService : Service() { adjustBrightness(brightness) } - protected fun createCaptureRequest(): CaptureRequest? { + fun createCaptureRequest(): CaptureRequest? { return try { - val builder = cameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_RECORD) - builder.addTarget(imageReader!!.surface) + val builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD) + builder.addTarget(imageReader.surface) builder.build() } catch (e: CameraAccessException) { - Log.e(TAG, e.message) + e.printStackTrace() null } } @@ -318,9 +321,8 @@ class CameraLightSensorService : Service() { companion object { private val imageReader = ImageReader.newInstance(50, 50, ImageFormat.JPEG, 2 /* images buffered */) - protected val TAG: String = CameraLightSensorService::class.java.simpleName + val TAG: String = CameraLightSensorService::class.java.simpleName const val DEBUG = false - const val CAMERA_CHOICE = CameraCharacteristics.LENS_FACING_FRONT private var mPoolExecutor: ScheduledThreadPoolExecutor? = null private var mRegistered = false } diff --git a/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/IAutoBrightness.aidl b/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/IAutoBrightness.aidl new file mode 100644 index 0000000..986d7f2 --- /dev/null +++ b/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/IAutoBrightness.aidl @@ -0,0 +1,6 @@ +// IAutoBrightness.aidl +package com.eurekateam.cameralightsensor; + +interface IAutoBrightness { + boolean CameraIsFree(); +} \ No newline at end of file