diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..3eb9350 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Flashlight Tiramisu \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..a2d7c21 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..54d5acd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..22ce8c2 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + + +android { + namespace 'com.pdb82.flashlighttiramisu' + compileSdk 33 + + defaultConfig { + applicationId "com.pdb82.flashlighttiramisu" + minSdk 33 + targetSdk 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation 'com.google.android.material:material:1.7.0-alpha03' + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# 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 \ No newline at end of file diff --git a/app/release/app-release.apk b/app/release/app-release.apk new file mode 100644 index 0000000..9578e11 Binary files /dev/null and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..d44b51f --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.pdb82.flashlighttiramisu", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/pdb82/flashlighttiramisu/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/pdb82/flashlighttiramisu/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..c4ddc7e --- /dev/null +++ b/app/src/androidTest/java/com/pdb82/flashlighttiramisu/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.pdb82.flashlighttiramisu + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.pdb82.flashlighttiramisu", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..41c7a11 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..a0386ae Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/com/pdb82/flashlighttiramisu/DynamicColor.kt b/app/src/main/java/com/pdb82/flashlighttiramisu/DynamicColor.kt new file mode 100644 index 0000000..55b9740 --- /dev/null +++ b/app/src/main/java/com/pdb82/flashlighttiramisu/DynamicColor.kt @@ -0,0 +1,11 @@ +package com.pdb82.flashlighttiramisu + +import android.app.Application +import com.google.android.material.color.DynamicColors + +class DynamicColor : Application() { + override fun onCreate() { + DynamicColors.applyToActivitiesIfAvailable(this) + super.onCreate() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pdb82/flashlighttiramisu/MainActivity.kt b/app/src/main/java/com/pdb82/flashlighttiramisu/MainActivity.kt new file mode 100644 index 0000000..5f16a36 --- /dev/null +++ b/app/src/main/java/com/pdb82/flashlighttiramisu/MainActivity.kt @@ -0,0 +1,88 @@ +package com.pdb82.flashlighttiramisu + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Color +import android.hardware.camera2.CameraAccessException +import android.hardware.camera2.CameraCharacteristics +import android.hardware.camera2.CameraManager +import android.hardware.camera2.CameraMetadata +import android.net.Uri +import android.os.Build +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.view.View +import android.widget.Button +import android.widget.SeekBar +import android.widget.TextView +import android.widget.Toast +import androidx.cardview.widget.CardView +import androidx.core.view.WindowCompat + +class MainActivity : AppCompatActivity() { + + private val cameraManager by lazy { getSystemService(Context.CAMERA_SERVICE) as CameraManager } + + override fun onCreate(savedInstanceState: Bundle?) { + WindowCompat.setDecorFitsSystemWindows(window, false) + window.statusBarColor = Color.TRANSPARENT + + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + val seekBar = findViewById(R.id.seekBar) + val errorText = findViewById(R.id.textView) + val card = findViewById(R.id.card) + + val list = cameraManager.cameraIdList + val outCameraId = list[0] + val cameraCharacteristics = cameraManager.getCameraCharacteristics(outCameraId) + + val torchMaxLevel = + cameraCharacteristics[CameraCharacteristics.FLASH_INFO_STRENGTH_MAXIMUM_LEVEL] ?: -1 + + if (torchMaxLevel > 1) { + seekBar.max = torchMaxLevel + seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) { + if (p1 == 0) { + cameraManager.setTorchMode(outCameraId, false) + } else { + cameraManager.turnOnTorchWithStrengthLevel(outCameraId, p1) + } + } + + override fun onStartTrackingTouch(p0: SeekBar?) { + } + + override fun onStopTrackingTouch(p0: SeekBar?) { + } + }) + } else { + errorText.visibility = View.VISIBLE + card.visibility = View.VISIBLE + errorText.text = "Device not supported" + seekBar.isEnabled = false + } + + + val button_en = findViewById