├── app
├── .gitignore
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── values
│ │ │ │ ├── strings.xml
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ ├── mipmap-hdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-anydpi-v26
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ ├── layout
│ │ │ │ └── activity_main.xml
│ │ │ ├── drawable-v24
│ │ │ │ └── ic_launcher_foreground.xml
│ │ │ └── drawable
│ │ │ │ └── ic_launcher_background.xml
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ │ └── com
│ │ │ └── github
│ │ │ └── brkckr
│ │ │ └── candelasample
│ │ │ └── MainActivity.kt
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── github
│ │ │ └── brkckr
│ │ │ └── candelasample
│ │ │ └── ExampleUnitTest.kt
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── github
│ │ └── brkckr
│ │ └── candelasample
│ │ └── ExampleInstrumentedTest.kt
├── proguard-rules.pro
└── build.gradle
├── candela
├── consumer-rules.pro
├── .gitignore
├── src
│ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── github
│ │ │ │ └── brkckr
│ │ │ │ └── candela
│ │ │ │ ├── ProgressListener.kt
│ │ │ │ └── Candela.kt
│ │ └── res
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ └── attrs.xml
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── github
│ │ │ └── brkckr
│ │ │ └── candela
│ │ │ └── ExampleUnitTest.kt
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── github
│ │ └── brkckr
│ │ └── candela
│ │ └── ExampleInstrumentedTest.kt
├── proguard-rules.pro
└── build.gradle
├── settings.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .idea
├── codeStyles
│ ├── codeStyleConfig.xml
│ └── Project.xml
├── vcs.xml
├── misc.xml
├── runConfigurations.xml
└── gradle.xml
├── .gitignore
├── gradle.properties
├── gradlew.bat
├── README.md
└── gradlew
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/candela/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/candela/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name='Candela'
2 | include ':app'
3 | include ':candela'
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Candela
3 |
4 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/brkckr/Candela/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/candela/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
--------------------------------------------------------------------------------
/candela/src/main/java/com/github/brkckr/candela/ProgressListener.kt:
--------------------------------------------------------------------------------
1 | package com.github.brkckr.candela
2 |
3 | interface ProgressListener {
4 | fun onProgressChange(progress:Int)
5 | }
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #6200EE
4 | #3700B3
5 | #03DAC5
6 |
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | .DS_Store
11 | /build
12 | /captures
13 | .externalNativeBuild
14 | .cxx
15 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun May 03 08:25:22 EET 2020
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
7 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/candela/src/test/java/com/github/brkckr/candela/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.brkckr.candela
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/test/java/com/github/brkckr/candelasample/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.brkckr.candelasample
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/candela/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | @android:color/black
4 | #fbfbfb
5 | #4b4b4b
6 |
7 | #FFFFFF
8 | #212121
9 | #FCB514
10 | #FCB514
11 | #A32638
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
14 |
15 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
--------------------------------------------------------------------------------
/candela/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/candela/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/candela/src/androidTest/java/com/github/brkckr/candela/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.brkckr.candela
2 |
3 | import androidx.test.platform.app.InstrumentationRegistry
4 | import androidx.test.ext.junit.runners.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22 | assertEquals("com.github.brkckr.candela.test", appContext.packageName)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/github/brkckr/candelasample/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.brkckr.candelasample
2 |
3 | import androidx.test.platform.app.InstrumentationRegistry
4 | import androidx.test.ext.junit.runners.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22 | assertEquals("com.github.brkckr.candelasample", appContext.packageName)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx1536m
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app's APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Automatically convert third-party libraries to use AndroidX
19 | android.enableJetifier=true
20 | # Kotlin code style for this project: "official" or "obsolete":
21 | kotlin.code.style=official
22 |
--------------------------------------------------------------------------------
/candela/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 |
5 | apply plugin: 'com.github.dcendents.android-maven'
6 | group='com.github.brkckr'
7 |
8 | android {
9 | compileSdkVersion 29
10 | buildToolsVersion "29.0.0"
11 |
12 | defaultConfig {
13 | minSdkVersion 21
14 | targetSdkVersion 29
15 | versionCode 1
16 | versionName "1.0.0"
17 |
18 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
19 | consumerProguardFiles 'consumer-rules.pro'
20 | }
21 |
22 | buildTypes {
23 | release {
24 | minifyEnabled false
25 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
26 | }
27 | }
28 | }
29 |
30 | dependencies {
31 | implementation fileTree(dir: 'libs', include: ['*.jar'])
32 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
33 | implementation 'androidx.appcompat:appcompat:1.1.0'
34 | implementation 'androidx.core:core-ktx:1.2.0'
35 | testImplementation 'junit:junit:4.12'
36 | androidTestImplementation 'androidx.test.ext:junit:1.1.1'
37 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
38 | }
39 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 |
5 | android {
6 | compileSdkVersion 29
7 | buildToolsVersion "29.0.0"
8 |
9 | defaultConfig {
10 | applicationId "com.github.brkckr.candelasample"
11 | minSdkVersion 21
12 | targetSdkVersion 29
13 | versionCode 1
14 | versionName "1.0"
15 |
16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
17 | }
18 |
19 | buildTypes {
20 | release {
21 | minifyEnabled false
22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
23 | }
24 | }
25 |
26 | }
27 |
28 | dependencies {
29 | implementation fileTree(dir: 'libs', include: ['*.jar'])
30 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
31 | implementation 'androidx.appcompat:appcompat:1.1.0'
32 | implementation 'androidx.core:core-ktx:1.2.0'
33 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
34 | testImplementation 'junit:junit:4.12'
35 | androidTestImplementation 'androidx.test.ext:junit:1.1.1'
36 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
37 |
38 | implementation project(':candela')
39 | }
40 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
15 |
18 |
21 |
22 |
23 |
24 |
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/brkckr/candelasample/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.github.brkckr.candelasample
2 |
3 | import android.content.Intent
4 | import android.net.Uri
5 | import android.os.Build
6 | import android.os.Bundle
7 | import android.provider.Settings
8 | import androidx.annotation.RequiresApi
9 | import androidx.appcompat.app.AppCompatActivity
10 | import com.github.brkckr.candela.ProgressListener
11 | import kotlinx.android.synthetic.main.activity_main.*
12 |
13 | class MainActivity : AppCompatActivity()
14 | {
15 | var currentProgress = 0;
16 | var maxProgress = 0;
17 |
18 | @RequiresApi(Build.VERSION_CODES.M)
19 | override fun onCreate(savedInstanceState: Bundle?)
20 | {
21 | super.onCreate(savedInstanceState)
22 | setContentView(R.layout.activity_main)
23 |
24 | checkPermission()
25 |
26 | candela.setCurrentProgress(200)
27 | currentProgress = candela.getCurrentProgress()
28 | maxProgress = candela.getMaxProgress()
29 |
30 | setBrightness(currentProgress)
31 |
32 | candela.setSunlightStrokeWidth(10)
33 |
34 | candela.setProgressListener(object : ProgressListener {
35 | override fun onProgressChange(progress: Int) {
36 | setBrightness(progress)
37 | }
38 | })
39 | }
40 |
41 | @RequiresApi(Build.VERSION_CODES.M)
42 | private fun checkPermission()
43 | {
44 | if (Settings.System.canWrite(this))
45 | {
46 | // change setting here
47 | } else {
48 | //Migrate to Setting write permission screen.
49 | val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
50 | intent.setData(Uri.parse("package:" + getPackageName()))
51 | startActivity(intent)
52 | }
53 | }
54 |
55 | private fun setBrightness(brightness: Int) {
56 | Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 1)
57 | val layoutpars = window.attributes
58 |
59 | layoutpars.screenBrightness = brightness.toFloat() / maxProgress.toFloat()
60 |
61 | window.attributes = layoutpars
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | Candela
4 |
5 |
6 | iOS style brightness control view. 🔆 🔅
7 |
8 | 
9 |
10 | ## How To Install
11 |
12 | To get a Git project into your build:
13 |
14 | * Step 1. Add the JitPack repository to your build file
15 |
16 | Add it in your root build.gradle at the end of repositories:
17 |
18 | allprojects {
19 | repositories {
20 | ...
21 | maven { url 'https://jitpack.io' }
22 | }
23 | }
24 |
25 | * Step 2. Add the dependency
26 |
27 | ```
28 | dependencies {
29 | implementation 'com.github.brkckr:Candela:1.0.0'
30 | }
31 | ```
32 | ## How To Use
33 |
34 | From Xml:
35 |
36 | ```
37 |
51 |
52 | ```
53 |
54 |
55 | From Activity:
56 | ```
57 | candela.setProgressListener(object : ProgressListener {
58 | override fun onProgressChange(progress: Int) {
59 | //setBrightness(progress)
60 | }
61 | })
62 | ```
63 |
64 |
65 | ## Attributes
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 | Name | Description | Type | Default | Range
80 | :--|:--|:-:|:--|:-:
81 | colorEmpty | Empty color of the view | Color | #212121 | -
82 | colorFill | Fill color of the view | Color | #FFFFFF | -
83 | colorSun | Color of the sun | Color | #FCB514 | -
84 | colorSunlight | Color of the sunlight | Color | #FCB514 | -
85 | cornerRadius | Corner radius of the view | Integer | 50 |-
86 | currentProgress | Current progress of the view | Integer | 0 | -
87 | maxProgress | Maximum progress of the view | Integer | 255 |-
88 | sunlightStrokeWidth | Width of the sunlight stroke | Integer | 8 | -
89 | isSunlightRounded | Is sunlight rounded? | Boolean | True | True or False
90 | isTouchEnabled | Is touch enabled | Boolean | True | True or False
91 |
92 | ## Credits
93 |
94 | While creating this one, I may have gotten some inspiration from the libraries below. :yum::innocent:
95 |
96 | - [HueSeekBar](https://github.com/iammert/HueSeekBar)
97 | - [BoxedVerticalSeekBar](https://github.com/alpbak/BoxedVerticalSeekBar)
98 |
99 | ## License
100 |
101 | MIT
102 |
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | xmlns:android
17 |
18 | ^$
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | xmlns:.*
28 |
29 | ^$
30 |
31 |
32 | BY_NAME
33 |
34 |
35 |
36 |
37 |
38 |
39 | .*:id
40 |
41 | http://schemas.android.com/apk/res/android
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | .*:name
51 |
52 | http://schemas.android.com/apk/res/android
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | name
62 |
63 | ^$
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 | style
73 |
74 | ^$
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 | .*
84 |
85 | ^$
86 |
87 |
88 | BY_NAME
89 |
90 |
91 |
92 |
93 |
94 |
95 | .*
96 |
97 | http://schemas.android.com/apk/res/android
98 |
99 |
100 | ANDROID_ATTRIBUTE_ORDER
101 |
102 |
103 |
104 |
105 |
106 |
107 | .*
108 |
109 | .*
110 |
111 |
112 | BY_NAME
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/candela/src/main/java/com/github/brkckr/candela/Candela.kt:
--------------------------------------------------------------------------------
1 | package com.github.brkckr.candela
2 |
3 | import android.content.Context
4 | import android.graphics.*
5 | import android.util.AttributeSet
6 | import android.view.MotionEvent
7 | import android.view.View
8 |
9 | class Candela : View
10 | {
11 | /**
12 | * colors
13 | */
14 | private var colorEmpty = resources.getColor(R.color.color_empty)
15 | private var colorFill = resources.getColor(R.color.color_fill)
16 | private var colorSun = resources.getColor(R.color.color_sun)
17 | private var colorSunlight = resources.getColor(R.color.color_sunlight)
18 |
19 | /**
20 | * paints
21 | */
22 | private val paintFill: Paint = Paint().apply {
23 | isAntiAlias = true
24 | style = Paint.Style.FILL
25 | setColor(colorEmpty)
26 | }
27 |
28 | private val paintEmpty: Paint = Paint().apply {
29 | isAntiAlias = true
30 | style = Paint.Style.FILL
31 | setColor(colorFill)
32 | }
33 |
34 | private val paintSun: Paint = Paint().apply {
35 | isAntiAlias = true
36 | style = Paint.Style.FILL
37 | setColor(colorSun)
38 | }
39 |
40 | private val paintSunlight: Paint = Paint().apply {
41 | isAntiAlias = true
42 | style = Paint.Style.FILL
43 | setColor(colorSunlight)
44 | }
45 |
46 | /**
47 | * progress
48 | */
49 | private var currentProgress: Int = 50
50 | private var maxProgress: Int = 255
51 |
52 | /**
53 | * dimensions
54 | */
55 | private var viewHeight: Int = 0
56 | private var viewWidth: Int = 0
57 | private var cornerRadius: Int = 10
58 | private var sunlightStrokeWidth: Int = 0
59 |
60 | /**
61 | * flags
62 | */
63 | private var isSunlightRounded: Boolean = true
64 | private var isTouchEnabled: Boolean = true
65 |
66 | /**
67 | * radius of the circle called as sun
68 | */
69 | private var sunRadius: Float = 0F
70 |
71 | /**
72 | * x and y coordinatescenter of sun
73 | */
74 | private lateinit var sunCoordinateArray: FloatArray
75 |
76 | /**
77 | * the length of the sunlight
78 | */
79 | private var sunlightLength: Float = 0.toFloat()
80 |
81 | /**
82 | * the length of the empty space between sun and sunlight;
83 | */
84 | private var emptySpaceLength: Float = 0.toFloat()
85 |
86 | /**
87 | * sizes of the sunlightLength+emptySpaceLength from center of sun
88 | * the distance between the center of the circle and the beginning of sunlight.
89 | */
90 | private var hypotenuse: Int = 0
91 | private var edge: Int = 0
92 |
93 | private var isMeasured: Boolean = false
94 |
95 | /**
96 | * listener
97 | */
98 | private var progressListener: ProgressListener? = null
99 |
100 | /**
101 | * initializes style values and objects
102 | *
103 | * @param context
104 | * @param attrs
105 | */
106 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
107 | val typedArray = context.obtainStyledAttributes(attrs, R.styleable.Candela)
108 |
109 | colorEmpty = typedArray.getColor(R.styleable.Candela_colorEmpty, resources.getColor(R.color.color_empty))
110 | colorFill = typedArray.getColor(R.styleable.Candela_colorFill, resources.getColor(R.color.color_fill))
111 | colorSun = typedArray.getColor(R.styleable.Candela_colorSun, resources.getColor(R.color.color_sun))
112 | colorSunlight = typedArray.getColor(R.styleable.Candela_colorSunlight, resources.getColor(R.color.color_sunlight))
113 |
114 | maxProgress = typedArray.getInt(R.styleable.Candela_maxProgress, 255)
115 | currentProgress = typedArray.getInt(R.styleable.Candela_currentProgress, 0)
116 | cornerRadius = typedArray.getInt(R.styleable.Candela_cornerRadius, 50)
117 |
118 | sunlightStrokeWidth = typedArray.getInt(R.styleable.Candela_sunlightStrokeWidth, 8)
119 | isTouchEnabled = typedArray.getBoolean(R.styleable.Candela_isTouchEnabled, true)
120 | isSunlightRounded = typedArray.getBoolean(R.styleable.Candela_isSunlightRounded, true)
121 |
122 | typedArray.recycle()
123 |
124 | // init paints
125 | paintEmpty.setColor(colorEmpty)
126 |
127 | paintFill.setColor(colorFill)
128 |
129 | paintSun.setColor(colorSun)
130 |
131 | paintSunlight.setColor(colorSunlight)
132 | if (isSunlightRounded) paintSunlight.setStrokeCap(Paint.Cap.ROUND)
133 | }
134 |
135 | override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
136 | viewWidth = MeasureSpec.getSize(widthMeasureSpec)
137 | viewHeight = MeasureSpec.getSize(heightMeasureSpec)
138 |
139 | if (!isMeasured) {
140 | sunRadius = calculateSunRadius()
141 | sunCoordinateArray = calculateSunCoordinates(sunRadius)
142 | sunlightLength = calculateSunlightLength(sunRadius)
143 | emptySpaceLength = calculateEmptySpaceLength(sunRadius)
144 |
145 | hypotenuse = (sunRadius + emptySpaceLength).toInt()
146 |
147 | // measure of one of the edges of an isosceles triangle
148 | // formula -> Math.pow(h,2) = Math.pow(edge1, 2) + Math.pow(edge2, 2);
149 | // so it is isosceles triangle, means edge1's length == edge2's length
150 | // then formula becomes -> Math.pow(h,2) = 2*Math.pow(edge, 2);
151 | edge = Math.sqrt((hypotenuse * hypotenuse / 2).toDouble()).toInt()
152 |
153 | isMeasured = true
154 | }
155 |
156 | super.onMeasure(widthMeasureSpec, heightMeasureSpec)
157 | }
158 |
159 | override fun onDraw(canvas: Canvas)
160 | {
161 | super.onDraw(canvas)
162 |
163 | //calculates horizontal position in pixel
164 | val positionProgress = (viewHeight * (this.maxProgress - this.currentProgress) / this.maxProgress).toFloat()
165 |
166 | //draws empty progress
167 | drawEmptyProgress(canvas)
168 |
169 | //draws fill progress
170 | drawFillProgress(canvas, positionProgress)
171 |
172 | //draws sun
173 | drawSun(canvas, paintSun, sunRadius, this.currentProgress)
174 |
175 | //draws 8 sunlight
176 | drawAllSunlight(canvas, hypotenuse, edge)
177 | }
178 |
179 | override fun onTouchEvent(event: MotionEvent): Boolean
180 | {
181 | val y = event.getY()
182 |
183 | when (event.getAction()) {
184 | MotionEvent.ACTION_DOWN -> if (isTouchEnabled) {
185 | this.currentProgress = calculateCurrentProgress(y)
186 | checkCurrentProgress()
187 | progressListener?.onProgressChange(this.currentProgress)
188 | invalidate()
189 | }
190 | MotionEvent.ACTION_MOVE -> {
191 | this.currentProgress = calculateCurrentProgress(y)
192 | checkCurrentProgress()
193 | progressListener?.onProgressChange(this.currentProgress)
194 | invalidate()
195 | }
196 | }
197 |
198 | return true
199 | }
200 |
201 | private fun drawEmptyProgress(canvas: Canvas)
202 | {
203 | val path = Path()
204 | path.addRoundRect(
205 | RectF(0F, 0F, viewWidth.toFloat(), viewHeight.toFloat()),
206 | cornerRadius.toFloat(),
207 | cornerRadius.toFloat(),
208 | Path.Direction.CCW
209 | )
210 | canvas.clipPath(path, Region.Op.INTERSECT)
211 | canvas.drawRect(0F, 0F, viewWidth.toFloat(), viewHeight.toFloat(), paintEmpty)
212 | }
213 |
214 | private fun drawFillProgress(canvas: Canvas, positionProgress: Float)
215 | {
216 | canvas.drawRect(0F, positionProgress, viewWidth.toFloat(), viewHeight.toFloat(), paintFill)
217 | }
218 |
219 | /**
220 | * draws a sun
221 | *
222 | * @param canvas : our strong canvas
223 | * @param paint : paint for sun
224 | * @param radius : radius of circle(sun)
225 | * @param currentProgress : current progress of the Candela.
226 | */
227 | private fun drawSun(canvas: Canvas, paint: Paint, radius: Float, currentProgress: Int) {
228 | //I want the size of the sun to change according to currentProgress.
229 | //the smallest form of the sun will be drawn when currentProgress is 0.
230 | //when currentProgress is 0, I want to draw it with the half radius
231 | //so when currentProgress is 0, the sun will still stay on the screen.
232 | var minRadius = radius / 2
233 | var maxRadius = radius
234 | var difference = maxRadius - minRadius
235 |
236 | // changes radius according to currentProgress
237 | var abc = minRadius + difference * currentProgress / this.maxProgress
238 |
239 | // draws circle to the already calculated coordinates
240 | canvas.drawCircle(sunCoordinateArray[0], sunCoordinateArray[1], abc, paint)
241 | }
242 |
243 | /**
244 | * draws all the sunlight around the sun
245 | * performs 8 drawing operations at 45(360/8) degree intervals.
246 | */
247 | private fun drawAllSunlight(canvas: Canvas, hypotenuse: Int, edge: Int)
248 | {
249 | // starts to draw 8 sunlight on the screen according to the clockwise direction.
250 | drawSunlight(canvas, paintSunlight, 0.0, 0, -hypotenuse, this.currentProgress)
251 | drawSunlight(canvas, paintSunlight, 1.0, edge, -edge, this.currentProgress)
252 | drawSunlight(canvas, paintSunlight, 2.0, hypotenuse, 0, this.currentProgress)
253 | drawSunlight(canvas, paintSunlight, 3.0, edge, edge, this.currentProgress)
254 | drawSunlight(canvas, paintSunlight, 4.0, 0, +hypotenuse, this.currentProgress)
255 | drawSunlight(canvas, paintSunlight, 5.0, -edge, edge, this.currentProgress)
256 | drawSunlight(canvas, paintSunlight, 6.0, -hypotenuse, 0, this.currentProgress)
257 | drawSunlight(canvas, paintSunlight, 7.0, -edge, -edge, this.currentProgress)
258 | }
259 |
260 | /**
261 | * draws a simple line according to the angle
262 | *
263 | * @param canvas ´ : our beloved canvas
264 | * @param paint : sunlightPaint already init
265 | * @param location : from 0-7, according to clockwise
266 | * @param dx : The difference between x value of the center of the sun and x value of the starting point of sunlight
267 | * @param dy : The difference between y value of the center of the sun and y value of the starting point of sunlight
268 | * @param currentProgress : current progress of the view.
269 | */
270 | private fun drawSunlight(
271 | canvas: Canvas,
272 | paint: Paint,
273 | location: Double,
274 | dx: Int,
275 | dy: Int,
276 | currentProgress: Int
277 | ) {
278 | // gets the angle
279 | val angle = Math.PI * location / 4 - Math.PI / 2
280 |
281 | // sets the stroke
282 | paint.setStrokeWidth(sunlightStrokeWidth.toFloat())
283 |
284 | // calculates start points
285 | val startX = sunCoordinateArray[0] + dx
286 | val startY = sunCoordinateArray[1] + dy
287 |
288 | // // calculates end points
289 | val stopX = (sunCoordinateArray[0] + (Math.cos(angle) * sunlightLength)).toFloat()
290 | val stopY = (sunCoordinateArray[1] + (Math.sin(angle) * sunlightLength)).toFloat()
291 |
292 | if (isSunlightRounded) paint.setStrokeCap(Paint.Cap.ROUND)
293 |
294 | // draws line
295 | canvas.drawLine(
296 | startX,
297 | startY,
298 | startX + (stopX - startX) * currentProgress / this.maxProgress,
299 | startY + (stopY - startY) * currentProgress / this.maxProgress,
300 | paint
301 | )
302 | }
303 |
304 | /**
305 | * calculates current progress
306 | */
307 | private fun calculateCurrentProgress(y: Float): Int
308 | {
309 | return (this.maxProgress - (this.maxProgress * y / viewHeight).toInt())
310 | }
311 |
312 | private fun checkCurrentProgress()
313 | {
314 | if (this.currentProgress < 0) currentProgress = 0
315 | if (this.currentProgress > this.maxProgress) currentProgress = this.maxProgress
316 | }
317 |
318 | fun setProgressListener(progressListener: ProgressListener) {
319 | this.progressListener = progressListener
320 | }
321 |
322 | fun setCurrentProgress(currentProgress: Int) {
323 | this.currentProgress = currentProgress
324 | }
325 |
326 | fun getCurrentProgress() : Int {
327 | return this.currentProgress
328 | }
329 |
330 | fun setMaxProgress(maxProgress: Int)
331 | {
332 | if(maxProgress< currentProgress) this.maxProgress = currentProgress
333 |
334 | this.maxProgress = maxProgress
335 | }
336 |
337 | fun getMaxProgress() : Int {
338 | return this.maxProgress
339 | }
340 |
341 | fun setCornerRadius(cornerRadius: Int) {
342 | this.cornerRadius = cornerRadius
343 | postInvalidate()
344 | }
345 |
346 | fun setSunlightStrokeWidth(sunlightStrokeWidth: Int) {
347 | this.sunlightLength = sunlightStrokeWidth.toFloat()
348 | postInvalidate()
349 | }
350 |
351 | /**
352 | * gets the radius of sun
353 | *
354 | * @return
355 | */
356 | private fun calculateSunRadius(): Float {
357 | return (viewWidth / 10 * 2).toFloat()
358 | }
359 |
360 | /**
361 | * gets the coordinates of the center point of the sun.
362 | *
363 | * @return coordinates array as float
364 | */
365 | private fun calculateSunCoordinates(sunRadius: Float): FloatArray {
366 | val coordinateArray = FloatArray(2)
367 | coordinateArray[0] = (viewWidth / 2).toFloat()
368 | coordinateArray[1] = viewHeight * 9 / 10 - sunRadius
369 | return coordinateArray
370 | }
371 |
372 | /**
373 | * gets the length of the sunlight.
374 | *
375 | * @param sunRadius : radius of sun.
376 | * @return : length of the sunlight.
377 | */
378 | private fun calculateSunlightLength(sunRadius: Float): Float {
379 | return sunRadius * 3 / 2
380 | }
381 |
382 | private fun calculateEmptySpaceLength(sunRadius: Float): Float {
383 | return sunRadius * 1 / 4
384 | }
385 | }
--------------------------------------------------------------------------------