diff --git a/a20/AndroidProducts.mk b/a20/AndroidProducts.mk deleted file mode 100644 index 79f5667..0000000 --- a/a20/AndroidProducts.mk +++ /dev/null @@ -1,2 +0,0 @@ -PRODUCT_MAKEFILES := \ - $(LOCAL_DIR)/aosp_a20.mk diff --git a/a20/aosp_a20.mk b/a20/aosp_a20.mk deleted file mode 100644 index 05c2ff2..0000000 --- a/a20/aosp_a20.mk +++ /dev/null @@ -1,8 +0,0 @@ -# Auto-Generated by device/samsung/a20/setup.sh -$(call inherit-product, device/samsung/a20/full_a20.mk) -$(call inherit-product, vendor/aosp/config/common_full_phone.mk) -PRODUCT_NAME := aosp_a20 - -# Additional Props -TARGET_FACE_UNLOCK_SUPPORTED := true -TARGET_BOOT_ANIMATION_RES := 720 diff --git a/universal7885-common/apps/CameraLightSensor/Android.bp b/universal7885-common/apps/CameraLightSensor/Android.bp index 9f4e546..6c8e4e6 100644 --- a/universal7885-common/apps/CameraLightSensor/Android.bp +++ b/universal7885-common/apps/CameraLightSensor/Android.bp @@ -7,4 +7,7 @@ android_app { privileged: true, certificate: "platform", static_libs: [ "androidx.core_core" ], + optimize: { + proguard_flags_files: ["proguard.flags"], + }, } diff --git a/universal7885-common/apps/CameraLightSensor/AndroidManifest.xml b/universal7885-common/apps/CameraLightSensor/AndroidManifest.xml index 0ebe4f4..3053306 100755 --- a/universal7885-common/apps/CameraLightSensor/AndroidManifest.xml +++ b/universal7885-common/apps/CameraLightSensor/AndroidManifest.xml @@ -38,9 +38,5 @@ - - - \ No newline at end of file + diff --git a/universal7885-common/apps/CameraLightSensor/proguard.flags b/universal7885-common/apps/CameraLightSensor/proguard.flags new file mode 100755 index 0000000..25042b4 --- /dev/null +++ b/universal7885-common/apps/CameraLightSensor/proguard.flags @@ -0,0 +1,7 @@ +# Uncomment this to preserve the line number information for +# debugging stack traces. +-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +-renamesourcefileattribute SourceFile diff --git a/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/BootReceiver.java b/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/BootReceiver.java index 33b33fc..c15b565 100755 --- a/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/BootReceiver.java +++ b/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/BootReceiver.java @@ -12,8 +12,7 @@ public class BootReceiver extends BroadcastReceiver { final Intent i = new Intent(); i.setClassName("com.eurekateam.cameralightsensor", "com.eurekateam.cameralightsensor.CameraLightSensorService"); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(i); + context.startForegroundService(i); } } } diff --git a/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/Camera2Service.java b/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/Camera2Service.java deleted file mode 100755 index 704d399..0000000 --- a/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/Camera2Service.java +++ /dev/null @@ -1,328 +0,0 @@ -package com.eurekateam.cameralightsensor; - -import static com.eurekateam.cameralightsensor.CameraLightSensorService.DEBUG; - -import android.annotation.NonNull; -import android.annotation.SuppressLint; -import android.app.Notification; -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Color; -import android.graphics.ImageFormat; -import android.hardware.camera2.CameraAccessException; -import android.hardware.camera2.CameraCaptureSession; -import android.hardware.camera2.CameraCharacteristics; -import android.hardware.camera2.CameraDevice; -import android.hardware.camera2.CameraManager; -import android.hardware.camera2.CaptureRequest; -import android.media.Image; -import android.media.ImageReader; -import android.os.Handler; -import android.os.IBinder; -import android.os.Looper; -import android.provider.Settings; -import android.util.Log; - -import androidx.core.app.NotificationCompat; - -import java.nio.ByteBuffer; -import java.util.Collections; - -public class Camera2Service extends Service { - protected static final String TAG = Camera2Service.class.getSimpleName(); - protected static final int CAMERACHOICE = CameraCharacteristics.LENS_FACING_FRONT; - boolean destroy; - protected CameraDevice cameraDevice; - protected CameraCaptureSession session; - boolean isavail = true; - protected ImageReader imageReader; - private Context mContext; - private CameraManager manager; - private long mCaptureTime; - private final int DELAY = 5000; - - protected CameraDevice.StateCallback cameraStateCallback = new CameraDevice.StateCallback() { - @Override - public void onOpened(@NonNull CameraDevice camera) { - Log.d(TAG, "CameraDevice.StateCallback onOpened"); - cameraDevice = camera; - actOnReadyCameraDevice(); - } - - @Override - public void onDisconnected(@NonNull CameraDevice camera) { - Log.w(TAG, "CameraDevice.StateCallback onDisconnected"); - } - - @Override - public void onError(@NonNull CameraDevice camera, int error) { - Log.e(TAG, "CameraDevice.StateCallback onError " + error); - } - }; - - protected CameraCaptureSession.StateCallback sessionStateCallback = new CameraCaptureSession.StateCallback() { - - @Override - public void onReady(CameraCaptureSession session) { - if (!destroy) { - Camera2Service.this.session = session; - try { - if (createCaptureRequest() == null) return; - try { - session.capture(createCaptureRequest(), captureCallback, null); - } catch (CameraAccessException e) { - e.printStackTrace(); - } catch (IllegalStateException e) { - Log.w(TAG, "onReady: Session is NULL"); - } - } catch (Exception e) { - Log.e(TAG, "Camera is in use"); - e.printStackTrace(); - } - } - } - - - @Override - public void onConfigured(CameraCaptureSession session) { - - } - - @Override - public void onConfigureFailed(@NonNull CameraCaptureSession session) { - } - }; - - - protected ImageReader.OnImageAvailableListener onImageAvailableListener = reader -> { - if (DEBUG) Log.d(TAG, "onImageAvailable: Capturing"); - Image img = reader.acquireLatestImage(); - if (img != null) { - try { - processImage(img); - } catch (Settings.SettingNotFoundException | InterruptedException e) { - e.printStackTrace(); - } - img.close(); - if (DEBUG) - Log.d(TAG, "ImageReader.OnImageAvailableListener: Closing Camera and Sessions.."); - cameraDevice.close(); - session.close(); - } - }; - - @SuppressLint("MissingPermission") - public void readyCamera() { - manager = (CameraManager) getSystemService(CAMERA_SERVICE); - mCaptureTime = System.currentTimeMillis(); - try { - String pickedCamera = getCamera(manager); - manager.registerAvailabilityCallback(availabilityCallback, null); - manager.openCamera(pickedCamera, cameraStateCallback, null); - imageReader = ImageReader.newInstance(250, 250, ImageFormat.JPEG, 2 /* images buffered */); - imageReader.setOnImageAvailableListener(onImageAvailableListener, null); - if (DEBUG) Log.d(TAG, "imageReader created"); - } catch (CameraAccessException e) { - Log.e(TAG, e.getMessage()); - isavail = false; - } - } - - public String getCamera(CameraManager manager) { - try { - for (String cameraId : manager.getCameraIdList()) { - CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); - int cOrientation = characteristics.get(CameraCharacteristics.LENS_FACING); - if (cOrientation == CAMERACHOICE) { - return cameraId; - } - } - } catch (CameraAccessException e) { - e.printStackTrace(); - } - return null; - } - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - if(DEBUG) Log.d(TAG, "onStartCommand flags " + flags + " startId " + startId); - destroy = false; - isavail = true; - startForeground(50, PushNotification()); - readyCamera(); - return START_NOT_STICKY; - } - - public Notification PushNotification() - { - NotificationManager nm = (NotificationManager) mContext.getSystemService(NOTIFICATION_SERVICE); - NotificationChannel channel = new NotificationChannel( - mContext.getBasePackageName(), "CameraLightSensor", - NotificationManager.IMPORTANCE_LOW - ); - nm.createNotificationChannel(channel); - NotificationCompat.Builder builder = - new NotificationCompat.Builder(mContext, mContext.getBasePackageName()); - Intent notificationIntent = new Intent(mContext, Camera2Service.class); - PendingIntent contentIntent = PendingIntent.getActivity(mContext,50, - notificationIntent,PendingIntent.FLAG_IMMUTABLE); - - //set - builder.setContentIntent(contentIntent); - builder.setSmallIcon(R.drawable.ic_brightness); - builder.setContentTitle("Camera Light Sensor Service"); - builder.setChannelId(mContext.getBasePackageName()); - - return builder.build(); - } - - @Override - public void onCreate() { - if(DEBUG) Log.d(TAG, "onCreate service"); - mContext = getApplicationContext(); - startForeground(50, PushNotification()); - readyCamera(); - super.onCreate(); - } - - public void actOnReadyCameraDevice() { - try { - cameraDevice.createCaptureSession(Collections.singletonList(imageReader.getSurface()), sessionStateCallback, null); - } catch (CameraAccessException e) { - Log.e(TAG, e.getMessage()); - } - } - - @Override - public void onDestroy() { - cameraDevice.close(); - if (session != null && isavail) { - try { - session.abortCaptures(); - session.close(); - } catch (CameraAccessException e) { - Log.e(TAG, e.getMessage()); - } catch (IllegalStateException e2){ - Log.e(TAG, "Session Already Closed"); - } - - } - manager.unregisterAvailabilityCallback(availabilityCallback); - isavail = false; - destroy = true; - stopForeground(true); - } - - private void processImage(Image image) throws Settings.SettingNotFoundException, InterruptedException { - ByteBuffer buffer = image.getPlanes()[0].getBuffer(); - byte[] bytes = new byte[buffer.capacity()]; - buffer.get(bytes); - Bitmap bitmapImage = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null); - int brightness = calculateBrightnessEstimate(bitmapImage,5); - AdjustBrightness(brightness); - } - - protected CaptureRequest createCaptureRequest() { - try { - CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); - builder.addTarget(imageReader.getSurface()); - return builder.build(); - } catch (CameraAccessException e) { - Log.e(TAG, e.getMessage()); - return null; - } - } - CameraManager.AvailabilityCallback availabilityCallback = new CameraManager.AvailabilityCallback() { - @Override - public void onCameraOpened(String cameraId, String packageId) { - super.onCameraOpened(cameraId, packageId); - Log.i(TAG, "CameraManager.AvailabilityCallback: Camera " + cameraId - + " Opened by Package " + packageId); - if (packageId.equals(mContext.getBasePackageName())) return; - isavail = false; - } - - @Override - public void onCameraUnavailable(String cameraId) { - if (DEBUG) Log.i(TAG, "CameraManager.AvailabilityCallback : Camera NOT Available. "); - isavail = false; - super.onCameraUnavailable(cameraId); - } - - @Override - public void onCameraAvailable(String cameraId) { - if (DEBUG) Log.i(TAG, "CameraManager.AvailabilityCallback : Camera IS Available. "); - super.onCameraAvailable(cameraId); - } - - @Override - public void onCameraClosed(String cameraId) { - super.onCameraClosed(cameraId); - while (mCaptureTime + DELAY >= System.currentTimeMillis() && isavail) { - try { - Thread.sleep(1000); - if (DEBUG) Log.i(TAG, "CameraManager.AvailabilityCallback: " + - "Thread: Waiting..."); - isavail = false; - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - isavail = true; - Handler mHandler = new Handler(Looper.getMainLooper()); - mHandler.postDelayed(() -> { - if(isavail) readyCamera(); - },DELAY); - } - }; - CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() { - @Override - public void onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber) { - if (DEBUG) Log.d(TAG, "captureCallback: Closing Session"); - super.onCaptureSequenceCompleted(session, sequenceId, frameNumber); - cameraDevice.close(); - session.close(); - } - - }; - - @Override - public IBinder onBind(Intent intent) { - return null; - } - - public int calculateBrightnessEstimate(Bitmap bitmap, int pixelSpacing) { - int R = 0; int G = 0; int B = 0; - int height = bitmap.getHeight(); - int width = bitmap.getWidth(); - int n = 0; - int[] pixels = new int[width * height]; - bitmap.getPixels(pixels, 0, width, 0, 0, width, height); - for (int i = 0; i < pixels.length; i += pixelSpacing) { - int color = pixels[i]; - R += Color.red(color); - G += Color.green(color); - B += Color.blue(color); - n++; - } - return (R + B + G) / (n * 3); - } - private void AdjustBrightness(int brightness) throws Settings.SettingNotFoundException { - if (DEBUG) Log.i(TAG, "AdjustBrightness: Received Brightness Value " + brightness); - int oldbrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS); - if (DEBUG) Log.i(TAG, "AdjustBrightness: Oldval = " + oldbrightness + " Newval = " + - brightness + " Adjusting.."); - int newbrightness = brightness; - if (newbrightness > 255){ - newbrightness = 255; - }else if (newbrightness < 0){ - newbrightness = 0; - } - Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, newbrightness); - } -} diff --git a/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/CameraLightSensorService.java b/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/CameraLightSensorService.java index d00d06e..7a797f5 100755 --- a/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/CameraLightSensorService.java +++ b/universal7885-common/apps/CameraLightSensor/src/com/eurekateam/cameralightsensor/CameraLightSensorService.java @@ -1,49 +1,288 @@ package com.eurekateam.cameralightsensor; -import android.Manifest; -import android.app.Activity; +import android.annotation.NonNull; +import android.annotation.SuppressLint; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; import android.database.ContentObserver; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.ImageFormat; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CaptureRequest; +import android.media.Image; +import android.media.ImageReader; import android.net.Uri; -import android.os.Bundle; import android.os.Handler; +import android.os.IBinder; import android.os.Looper; import android.os.PowerManager; +import android.os.SystemClock; import android.provider.Settings; import android.util.Log; +import androidx.core.app.NotificationCompat; +import androidx.core.content.ContextCompat; -public class CameraLightSensorService extends Activity { - private static final String TAG = "CameraLightSensor"; - static final boolean DEBUG = false; - Intent i; +import java.nio.ByteBuffer; +import java.util.Collections; + +public class CameraLightSensorService extends Service { + protected static final String TAG = CameraLightSensorService.class.getSimpleName(); + static final boolean DEBUG = true; IntentFilter screenStateFilter; private Context mContext; public ContentResolver contentResolver; private boolean mRegistered; + protected static final int CAMERA_CHOICE = CameraCharacteristics.LENS_FACING_FRONT; + boolean destroy; + protected CameraDevice cameraDevice; + protected CameraCaptureSession session; + volatile boolean avail = true; + protected ImageReader imageReader; + private CameraManager manager; + private final static int DELAY = 5 * 1000; // 5 Seconds private boolean mServiceStarted; + volatile private boolean mLock; + private boolean mThreadRunning; + + public Notification PushNotification() + { + NotificationManager nm = (NotificationManager) mContext.getSystemService(NOTIFICATION_SERVICE); + NotificationChannel channel = new NotificationChannel( + mContext.getBasePackageName(), "CameraLightSensor", + NotificationManager.IMPORTANCE_LOW + ); + nm.createNotificationChannel(channel); + NotificationCompat.Builder builder = + new NotificationCompat.Builder(mContext, mContext.getBasePackageName()); + Intent notificationIntent = new Intent(mContext, CameraLightSensorService.class); + PendingIntent contentIntent = PendingIntent.getActivity(mContext,50, + notificationIntent,PendingIntent.FLAG_IMMUTABLE); + + //set + builder.setContentIntent(contentIntent); + builder.setSmallIcon(R.drawable.ic_brightness); + builder.setContentTitle("Camera Light Sensor Service"); + builder.setChannelId(mContext.getBasePackageName()); + + return builder.build(); + } @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - moveTaskToBack(true); + public void onDestroy() { + if (DEBUG) Log.d(TAG, "Destroying service"); + if(mRegistered) contentResolver.unregisterContentObserver(mSettingsObserver); + mRegistered = false; + cameraDevice.close(); + if (session != null && avail) { + try { + session.abortCaptures(); + session.close(); + } catch (CameraAccessException e) { + Log.e(TAG, e.getMessage()); + } catch (IllegalStateException e2){ + Log.e(TAG, "Session Already Closed"); + } + + } + manager.unregisterAvailabilityCallback(availabilityCallback); + avail = false; + destroy = true; + stopForeground(true); + super.onDestroy(); + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + private final BroadcastReceiver mScreenStateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { + onDisplayOn(); + mServiceStarted = true; + } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { + if (mServiceStarted) onDisplayOff(); + mServiceStarted = false; + } + } + }; + // Make a listener for settings + ContentObserver mSettingsObserver = new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange) { + super.onChange(selfChange); + Log.i(TAG, "observer: Brightness Settings Changed"); + try { + if(Settings.System.getInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE) + == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC){ + registerReceiver(mScreenStateReceiver, screenStateFilter); + mRegistered = true; + onDisplayOn(); + }else{ + if(mRegistered) unregisterReceiver(mScreenStateReceiver); + mRegistered = false; + onDisplayOff(); + } + } catch (Settings.SettingNotFoundException e) { + e.printStackTrace(); + } + } + @Override + public boolean deliverSelfNotifications() { + return true; + } + }; + + private void onDisplayOn() { + if(DEBUG) Log.d(TAG, "Screen is on. Starting Service..."); + avail = true; + readyCamera(); + } + private void onDisplayOff(){ + if(DEBUG) Log.d(TAG, "Screen is off. Stopping Service..."); + thread.interrupt(); + avail = false; + mThreadRunning = false; + } + public static void BatteryOptimization(Context context){ + Intent intent = new Intent(); + String packageName = context.getPackageName(); + PowerManager pm = (PowerManager) context.getSystemService(POWER_SERVICE); + if (!pm.isIgnoringBatteryOptimizations(packageName)) { + intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); + intent.setData(Uri.parse("package:" + packageName)); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + } + protected CameraDevice.StateCallback cameraStateCallback = new CameraDevice.StateCallback() { + @Override + public void onOpened(@NonNull CameraDevice camera) { + Log.d(TAG, "CameraDevice.StateCallback onOpened"); + cameraDevice = camera; + actOnReadyCameraDevice(); + } + + @Override + public void onDisconnected(@NonNull CameraDevice camera) { + Log.w(TAG, "CameraDevice.StateCallback onDisconnected"); + } + + @Override + public void onError(@NonNull CameraDevice camera, int error) { + Log.e(TAG, "CameraDevice.StateCallback onError " + error); + } + }; + + protected CameraCaptureSession.StateCallback sessionStateCallback = new CameraCaptureSession.StateCallback() { + + @Override + public void onReady(CameraCaptureSession session) { + if (!destroy) { + CameraLightSensorService.this.session = session; + try { + if (createCaptureRequest() == null) return; + try { + session.capture(createCaptureRequest(), captureCallback, null); + } catch (CameraAccessException e) { + e.printStackTrace(); + } catch (IllegalStateException e) { + Log.w(TAG, "onReady: Session is NULL"); + } + } catch (Exception e) { + Log.e(TAG, "Camera is in use"); + e.printStackTrace(); + } + } + } + + + @Override + public void onConfigured(CameraCaptureSession session) { + + } + + @Override + public void onConfigureFailed(@NonNull CameraCaptureSession session) { + } + }; + + + protected ImageReader.OnImageAvailableListener onImageAvailableListener = reader -> { + if (DEBUG) Log.d(TAG, "onImageAvailable: Capturing"); + Image img = reader.acquireLatestImage(); + if (img != null) { + try { + processImage(img); + } catch (Settings.SettingNotFoundException | InterruptedException e) { + e.printStackTrace(); + } + img.close(); + if (DEBUG) + Log.d(TAG, "ImageReader.OnImageAvailableListener: Closing Camera and Sessions.."); + cameraDevice.close(); + session.close(); + } + }; + + @SuppressLint("MissingPermission") + public void readyCamera() { + manager = (CameraManager) getSystemService(CAMERA_SERVICE); + try { + String pickedCamera = getCamera(manager); + manager.registerAvailabilityCallback(availabilityCallback, null); + manager.openCamera(pickedCamera, cameraStateCallback, null); + imageReader = ImageReader.newInstance(250, 250, ImageFormat.JPEG, 2 /* images buffered */); + imageReader.setOnImageAvailableListener(onImageAvailableListener, null); + if(!mThreadRunning){ + Thread mMyThread = new Thread(thread); + mMyThread.start(); + mThreadRunning = true; + } + if (DEBUG) Log.d(TAG, "imageReader created"); + } catch (CameraAccessException e) { + Log.e(TAG, e.getMessage()); + } + } + + public String getCamera(CameraManager manager) { + try { + for (String cameraId : manager.getCameraIdList()) { + CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); + int cOrientation = characteristics.get(CameraCharacteristics.LENS_FACING); + if (cOrientation == CAMERA_CHOICE) { + return cameraId; + } + } + } catch (CameraAccessException e) { + e.printStackTrace(); + } + return null; + } + @Override + public int onStartCommand(Intent intent, int flags, int startId) { mContext = getApplicationContext(); contentResolver = getContentResolver(); + startForeground(50, PushNotification(), ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA); BatteryOptimization(mContext); - i = new Intent(mContext, Camera2Service.class); - if (this.checkSelfPermission(Manifest.permission.CAMERA) == - PackageManager.PERMISSION_GRANTED) { - Log.d(TAG, "Permission Granted"); - } else { - // You can directly ask for the permission. - this.requestPermissions(new String[] { Manifest.permission.CAMERA }, - 1); - } mRegistered = false; screenStateFilter = new IntentFilter(Intent.ACTION_SCREEN_ON); screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); @@ -57,71 +296,132 @@ public class CameraLightSensorService extends Activity { e.printStackTrace(); } Uri setting = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE); - contentResolver.registerContentObserver(setting, false, observer); + contentResolver.registerContentObserver(setting, false, mSettingsObserver); + if(DEBUG) Log.d(TAG, "onStartCommand flags " + flags + " startId " + startId); + destroy = false; + avail = true; + startForeground(50, PushNotification()); + return START_NOT_STICKY; + } - } @Override - public void onDestroy() { - if (DEBUG) Log.d(TAG, "Destroying service"); - mRegistered = false; - contentResolver.unregisterContentObserver(observer); - super.onDestroy(); + public void onCreate() { + if(DEBUG) Log.d(TAG, "onCreate service"); + mContext = getApplicationContext(); + startForeground(50, PushNotification()); + super.onCreate(); } - private final BroadcastReceiver mScreenStateReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { - onDisplayOn(); - mServiceStarted = true; - } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { - if (mServiceStarted) onDisplayOff(); - mServiceStarted = false; - } + + public void actOnReadyCameraDevice() { + try { + cameraDevice.createCaptureSession(Collections.singletonList(imageReader.getSurface()), sessionStateCallback, null); + } catch (CameraAccessException e) { + Log.e(TAG, e.getMessage()); + mLock = false; } + } + private void processImage(Image image) throws Settings.SettingNotFoundException, InterruptedException { + ByteBuffer buffer = image.getPlanes()[0].getBuffer(); + byte[] bytes = new byte[buffer.capacity()]; + buffer.get(bytes); + Bitmap bitmapImage = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null); + int brightness = calculateBrightnessEstimate(bitmapImage,5); + AdjustBrightness(brightness); + } + + protected CaptureRequest createCaptureRequest() { + try { + CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); + builder.addTarget(imageReader.getSurface()); + return builder.build(); + } catch (CameraAccessException e) { + Log.e(TAG, e.getMessage()); + mLock = false; + return null; + } + } + CameraManager.AvailabilityCallback availabilityCallback = new CameraManager.AvailabilityCallback() { + @Override + public void onCameraOpened(String cameraId, String packageId) { + super.onCameraOpened(cameraId, packageId); + Log.i(TAG, "CameraManager.AvailabilityCallback: Camera " + cameraId + + " Opened by Package " + packageId); + mLock = true; + if (packageId.equals(mContext.getBasePackageName())) return; + avail = false; + } + + @Override + public void onCameraUnavailable(String cameraId) { + if (DEBUG) Log.i(TAG, "CameraManager.AvailabilityCallback : Camera NOT Available. "); + avail = false; + super.onCameraUnavailable(cameraId); + } + + @Override + public void onCameraAvailable(String cameraId) { + if (DEBUG) Log.i(TAG, "CameraManager.AvailabilityCallback : Camera IS Available. "); + avail = true; + mLock = false; + super.onCameraAvailable(cameraId); + } + + @Override + public void onCameraClosed(String cameraId) { + super.onCameraClosed(cameraId); + } + }; - // Make a listener - ContentObserver observer = new ContentObserver(new Handler(Looper.getMainLooper())) { + CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() { @Override - public void onChange(boolean selfChange) { - super.onChange(selfChange); - Log.i(TAG, "observer: Brightness Settings Changed"); - try { - if(Settings.System.getInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE) - == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC){ - registerReceiver(mScreenStateReceiver, screenStateFilter); - mRegistered = true; - mContext.startForegroundService(i); - }else{ - if(mRegistered) unregisterReceiver(mScreenStateReceiver); - mRegistered = false; - mContext.stopService(i); - } - } catch (Settings.SettingNotFoundException e) { - e.printStackTrace(); - } - } - @Override - public boolean deliverSelfNotifications() { - return true; + public void onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber) { + if (DEBUG) Log.d(TAG, "captureCallback: Closing Session"); + super.onCaptureSequenceCompleted(session, sequenceId, frameNumber); + cameraDevice.close(); + session.close(); } + }; - private void onDisplayOn() { - if(DEBUG) Log.d(TAG, "Screen is on. Starting Service..."); - mContext.startForegroundService(i); + + public int calculateBrightnessEstimate(Bitmap bitmap, int pixelSpacing) { + int R = 0; int G = 0; int B = 0; + int height = bitmap.getHeight(); + int width = bitmap.getWidth(); + int n = 0; + int[] pixels = new int[width * height]; + bitmap.getPixels(pixels, 0, width, 0, 0, width, height); + for (int i = 0; i < pixels.length; i += pixelSpacing) { + int color = pixels[i]; + R += Color.red(color); + G += Color.green(color); + B += Color.blue(color); + n++; + } + return (R + B + G) / (n * 3); } - private void onDisplayOff(){ - if(DEBUG) Log.d(TAG, "Screen is off. Stopping Service..."); - mContext.stopService(i); + private void AdjustBrightness(int brightness) throws Settings.SettingNotFoundException { + if (DEBUG) Log.i(TAG, "AdjustBrightness: Received Brightness Value " + brightness); + int oldbrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS); + if (DEBUG) Log.i(TAG, "AdjustBrightness: OldVal = " + oldbrightness + " NewVal = " + + brightness + " Adjusting.."); + int newbrightness = brightness; + if (newbrightness > 255){ + newbrightness = 255; + }else if (newbrightness < 0){ + newbrightness = 0; + } + Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, newbrightness); } - public static void BatteryOptimization(Context context){ - Intent intent = new Intent(); - String packageName = context.getPackageName(); - PowerManager pm = (PowerManager) context.getSystemService(POWER_SERVICE); - if (!pm.isIgnoringBatteryOptimizations(packageName)) { - intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); - intent.setData(Uri.parse("package:" + packageName)); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); + Thread thread = new Thread(() -> { + while (!Thread.currentThread().isInterrupted()) { + if (avail && !mLock) { + SystemClock.sleep(DELAY); + ContextCompat.getMainExecutor(mContext).execute(() -> { + if (avail) readyCamera(); + }); } - } + } + + }); } + diff --git a/universal7885-common/vendor_detect/prebuilt b/universal7885-common/vendor_detect/prebuilt deleted file mode 100755 index b950a27..0000000 Binary files a/universal7885-common/vendor_detect/prebuilt and /dev/null differ