diff --git a/universal7885-common/apps/CameraLightSensor/Android.bp b/universal7885-common/apps/CameraLightSensor/Android.bp
new file mode 100644
index 0000000..fc3d95b
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/Android.bp
@@ -0,0 +1,9 @@
+android_app {
+ name: "CameraLightSensor",
+ srcs: [
+ "src/**/*.java",
+ ],
+ platform_apis: true,
+ privileged: true,
+ certificate: "platform",
+}
diff --git a/universal7885-common/apps/CameraLightSensor/AndroidManifest.xml b/universal7885-common/apps/CameraLightSensor/AndroidManifest.xml
new file mode 100644
index 0000000..b11f68a
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/AndroidManifest.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/universal7885-common/apps/CameraLightSensor/java/com/eurekateam/cameralightsensor/BootReceiver.java b/universal7885-common/apps/CameraLightSensor/java/com/eurekateam/cameralightsensor/BootReceiver.java
new file mode 100644
index 0000000..f5eb17c
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/java/com/eurekateam/cameralightsensor/BootReceiver.java
@@ -0,0 +1,13 @@
+package com.eurekateam.cameralightsensor;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+public class BootReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final Intent i = new Intent(context, CameraLightSensorService.class);
+ context.startService(i);
+ }
+}
diff --git a/universal7885-common/apps/CameraLightSensor/java/com/eurekateam/cameralightsensor/CameraLightSensorService.java b/universal7885-common/apps/CameraLightSensor/java/com/eurekateam/cameralightsensor/CameraLightSensorService.java
new file mode 100644
index 0000000..13ebacd
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/java/com/eurekateam/cameralightsensor/CameraLightSensorService.java
@@ -0,0 +1,69 @@
+package com.eurekateam.cameralightsensor;
+
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.IBinder;
+import android.provider.Settings;
+import android.util.Log;
+
+public class CameraLightSensorService extends Service {
+ private static final String TAG = "CameraLightSensor";
+ private static final boolean DEBUG = false;
+ final Intent i = new Intent(getApplicationContext(), CameraListener.class);
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ IntentFilter screenStateFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
+ screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
+ registerReceiver(mScreenStateReceiver, screenStateFilter);
+ }
+
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ if (DEBUG) Log.d(TAG, "Starting service");
+ return START_STICKY;
+ }
+ @Override
+ public void onDestroy() {
+ if (DEBUG) Log.d(TAG, "Destroying service");
+ super.onDestroy();
+ this.unregisterReceiver(mScreenStateReceiver);
+ }
+ private final BroadcastReceiver mScreenStateReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
+ try {
+ onDisplayOn();
+ } catch (Settings.SettingNotFoundException e) {
+ e.printStackTrace();
+ }
+ } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
+ onDisplayOff();
+ }
+ }
+ };
+ private void onDisplayOn() throws Settings.SettingNotFoundException {
+ if(Settings.System.getInt(getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE ) == 1){
+ Log.d(TAG, "AutoBrightness Mode Enabled. Starting...");
+ getApplicationContext().startService(i);
+ }else{
+ Log.d(TAG, "AutoBrightness Mode Disabled, Not Starting Service...");
+ }
+ }
+ private void onDisplayOff(){
+ Log.d(TAG, "Screen is off. Stopping Service...");
+ getApplicationContext().stopService(i);
+ }
+}
diff --git a/universal7885-common/apps/CameraLightSensor/java/com/eurekateam/cameralightsensor/CameraListener.java b/universal7885-common/apps/CameraLightSensor/java/com/eurekateam/cameralightsensor/CameraListener.java
new file mode 100644
index 0000000..7af1ac0
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/java/com/eurekateam/cameralightsensor/CameraListener.java
@@ -0,0 +1,105 @@
+package com.eurekateam.cameralightsensor;
+
+import android.app.Service;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.ImageFormat;
+import android.graphics.Rect;
+import android.graphics.YuvImage;
+import android.hardware.Camera;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.provider.Settings;
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class CameraListener extends Service {
+
+ private final String TAG = CameraListener.class.getSimpleName();
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ return START_STICKY;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Handler mHandler = new Handler(Looper.getMainLooper());
+ AtomicInteger prev = new AtomicInteger(Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 50));
+ mHandler.postDelayed(() -> {
+ int current = calculateBrightnessEstimate(getPreviewBitmap());
+ Log.i(TAG, ": Current Brigtness: " + current);
+ if(prev.get() > current) {
+ while (prev.get() - current > 0) {
+ Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, current);
+ current += 2;
+ }
+ }else{
+ while (prev.get() - current < 0) {
+ Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, current);
+ current -= 2;
+ }
+ }
+ prev.set(current);
+ },1000);
+ }
+
+ private int findFrontFacingCamera() {
+ return 2;
+ }
+
+ private Bitmap getPreviewBitmap() {
+ AtomicReference bitmap = null;
+ Camera mCamera = Camera.open(findFrontFacingCamera());
+ mCamera.setPreviewCallback((data, camera) -> {
+ if (camera != null) {
+ Camera.Parameters parameters = camera.getParameters();
+ int imageFormat = parameters.getPreviewFormat();
+ if (imageFormat == ImageFormat.NV21) {
+ int w = parameters.getPreviewSize().width;
+ int h = parameters.getPreviewSize().height;
+
+ YuvImage yuvImage = new YuvImage(data, imageFormat, w, h, null);
+ Rect rect = new Rect(0, 0, w, h);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ yuvImage.compressToJpeg(rect, 100, outputStream);
+
+ bitmap.set(BitmapFactory.decodeByteArray(outputStream.toByteArray(), 0, outputStream.size()));
+ } else if (imageFormat == ImageFormat.JPEG || imageFormat == ImageFormat.RGB_565) {
+ bitmap.set(BitmapFactory.decodeByteArray(data, 0, data.length));
+ }
+ }
+ }
+ );
+ mCamera.stopPreview();
+ mCamera.release();
+ return bitmap.get();
+ }
+ private int calculateBrightnessEstimate(Bitmap bitmap) {
+ 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 += 5) {
+ int color = pixels[i];
+ R += Color.red(color);
+ G += Color.green(color);
+ B += Color.blue(color);
+ n++;
+ }
+ return (R + B + G) / (n * 3);
+ }
+}
diff --git a/universal7885-common/apps/CameraLightSensor/res/drawable-v24/ic_launcher_foreground.xml b/universal7885-common/apps/CameraLightSensor/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/universal7885-common/apps/CameraLightSensor/res/drawable/ic_launcher_background.xml b/universal7885-common/apps/CameraLightSensor/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-anydpi-v26/ic_launcher.xml b/universal7885-common/apps/CameraLightSensor/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-anydpi-v26/ic_launcher_round.xml b/universal7885-common/apps/CameraLightSensor/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-hdpi/ic_launcher.webp b/universal7885-common/apps/CameraLightSensor/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
Binary files /dev/null and b/universal7885-common/apps/CameraLightSensor/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-hdpi/ic_launcher_round.webp b/universal7885-common/apps/CameraLightSensor/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
Binary files /dev/null and b/universal7885-common/apps/CameraLightSensor/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-mdpi/ic_launcher.webp b/universal7885-common/apps/CameraLightSensor/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
Binary files /dev/null and b/universal7885-common/apps/CameraLightSensor/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-mdpi/ic_launcher_round.webp b/universal7885-common/apps/CameraLightSensor/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..62b611d
Binary files /dev/null and b/universal7885-common/apps/CameraLightSensor/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-xhdpi/ic_launcher.webp b/universal7885-common/apps/CameraLightSensor/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
Binary files /dev/null and b/universal7885-common/apps/CameraLightSensor/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-xhdpi/ic_launcher_round.webp b/universal7885-common/apps/CameraLightSensor/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1b9a695
Binary files /dev/null and b/universal7885-common/apps/CameraLightSensor/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-xxhdpi/ic_launcher.webp b/universal7885-common/apps/CameraLightSensor/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
Binary files /dev/null and b/universal7885-common/apps/CameraLightSensor/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-xxhdpi/ic_launcher_round.webp b/universal7885-common/apps/CameraLightSensor/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9287f50
Binary files /dev/null and b/universal7885-common/apps/CameraLightSensor/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-xxxhdpi/ic_launcher.webp b/universal7885-common/apps/CameraLightSensor/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
Binary files /dev/null and b/universal7885-common/apps/CameraLightSensor/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/universal7885-common/apps/CameraLightSensor/res/mipmap-xxxhdpi/ic_launcher_round.webp b/universal7885-common/apps/CameraLightSensor/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9126ae3
Binary files /dev/null and b/universal7885-common/apps/CameraLightSensor/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/universal7885-common/apps/CameraLightSensor/res/values-night/themes.xml b/universal7885-common/apps/CameraLightSensor/res/values-night/themes.xml
new file mode 100644
index 0000000..2fc2bce
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/universal7885-common/apps/CameraLightSensor/res/values/colors.xml b/universal7885-common/apps/CameraLightSensor/res/values/colors.xml
new file mode 100644
index 0000000..f8c6127
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/universal7885-common/apps/CameraLightSensor/res/values/strings.xml b/universal7885-common/apps/CameraLightSensor/res/values/strings.xml
new file mode 100644
index 0000000..a2a4d20
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ CameraLightSensor
+
\ No newline at end of file
diff --git a/universal7885-common/apps/CameraLightSensor/res/values/themes.xml b/universal7885-common/apps/CameraLightSensor/res/values/themes.xml
new file mode 100644
index 0000000..a27548d
--- /dev/null
+++ b/universal7885-common/apps/CameraLightSensor/res/values/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file