diff --git a/.editorconfig b/.editorconfig index 870b62582..8d8363c74 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,9 +13,5 @@ insert_final_newline = true indent_size = 2 trim_trailing_whitespace = false -[Makefile] -indent_style = tab -indent_size = 8 - [*.{js,json,css,scss,sass,html,handlebars,tpl}] indent_size = 2 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index be2bda339..5cf084950 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: name: ${{ matrix.variant }} runs-on: ubuntu-latest container: - image: koreader/koandroid:0.9.1-22.04 + image: benoitpierre/koandroid:0.10.0-22.04 steps: diff --git a/README.md b/README.md index 7792d25bc..8d445bfe2 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ A good number of Android native API headers are readily presented via FFI alread Have a look at KOReader's [llapp_main.lua](https://github.com/koreader/koreader/blob/master/platform/android/llapp_main.lua) file. You can use it as a starting point for your own app. -The real starting point, called from JNI/C, is the run() function in android.lua. It sets up a few things, namely FFI definitions for the Android native API (since it uses that itself for a few things) and some wrapper functions for logging. Also, it registers the "android" module in package.loaded, so you can access it in your own code via require("android"). It also registers a new package loader which can load Lua code from the activity's asset store, so you can use require() for Lua code stored there. +The real starting point, called from JNI/C, is the run() function in android.lua. It sets up a few things, namely FFI definitions for the Android native API (since it uses that itself for a few things) and some wrapper functions for logging. Also, it registers the "android" module in `package.loaded`, so you can access it in your own code via require("android"). It also registers a new package loader which can load Lua code from the activity's asset store, so you can use require() for Lua code stored there. ## Disclaimer diff --git a/app/build.gradle b/app/build.gradle index e3c32d4e6..b08accd24 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,20 +1,18 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' android { - namespace 'org.koreader.launcher' - ndkVersion '23.2.8568313' - ndkPath System.getenv('ANDROID_NDK_HOME') - compileSdk rootProject.ext.compileSdk + namespace = 'org.koreader.launcher' + ndkVersion = '23.2.8568313' + ndkPath = System.getenv('ANDROID_NDK_HOME') + compileSdk = rootProject.ext.compileSdk def baseVersionCode = versCode as Integer - aaptOptions { - noCompress '7z' - } defaultConfig { - applicationId "org.koreader.launcher" - versionName versName + applicationId = "org.koreader.launcher" + versionName = versName minSdkVersion rootProject.ext.minSdk targetSdkVersion rootProject.ext.targetSdk @@ -45,25 +43,27 @@ android { buildTypes { release { - minifyEnabled true - shrinkResources true + minifyEnabled = true + shrinkResources = true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { - applicationIdSuffix ".debug" - minifyEnabled false - debuggable true + applicationIdSuffix = ".debug" + minifyEnabled = false + debuggable = true } } compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = '17' + kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_17 + } } flavorDimensions = [ 'ABI', 'CHANNEL' ] @@ -102,7 +102,7 @@ android { packagingOptions { jniLibs { - useLegacyPackaging true + useLegacyPackaging = true } resources { excludes += '/kotlin/**.kotlin_builtins' @@ -117,14 +117,19 @@ android { disable 'GradleDependency' disable 'QueryAllPackagesPermission' disable 'SameParameterValue' - htmlReport false - xmlReport false + htmlReport = false + xmlReport = false } + androidResources { + noCompress '7z' + } +} - applicationVariants.configureEach { variant -> - variant.outputs.configureEach { - outputFileName = "NativeActivity.apk" - } +androidComponents { + onVariants(selector().all()) { + outputs.forEach { + it.outputFileName.set("NativeActivity.apk") + } } } diff --git a/app/src/debug/res/mipmap-anydpi-v26/icon.xml b/app/src/debug/res/mipmap-anydpi-v26/icon.xml index 999ffb5f2..dd18cd564 100644 --- a/app/src/debug/res/mipmap-anydpi-v26/icon.xml +++ b/app/src/debug/res/mipmap-anydpi-v26/icon.xml @@ -1,5 +1,7 @@ - + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 69bf958c4..c1c963557 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,19 +11,23 @@ + + + - - + tools:ignore="AllFilesAccessPolicy,ScopedStorage" /> + + android:configChanges="colorMode|density|fontScale|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode"> diff --git a/app/src/main/java/org/koreader/launcher/ApkUpdater.kt b/app/src/main/java/org/koreader/launcher/ApkUpdater.kt index 9283a2e92..285faaa1f 100644 --- a/app/src/main/java/org/koreader/launcher/ApkUpdater.kt +++ b/app/src/main/java/org/koreader/launcher/ApkUpdater.kt @@ -1,5 +1,6 @@ package org.koreader.launcher +import android.annotation.SuppressLint import android.app.DownloadManager import android.content.Context import android.content.Intent @@ -8,6 +9,7 @@ import android.os.Build import android.util.Log import androidx.core.content.FileProvider import java.io.File +import androidx.core.net.toUri class ApkUpdater { @@ -27,7 +29,7 @@ class ApkUpdater { if (file.exists()) { DOWNLOAD_EXISTS } else { - val request = DownloadManager.Request(Uri.parse(url)) + val request = DownloadManager.Request(url.toUri()) request.setMimeType("application/vnd.android.package-archive") request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN) request.setDestinationInExternalFilesDir(context, null, name) @@ -56,6 +58,7 @@ class ApkUpdater { } } + @SuppressLint("RequestInstallPackagesPolicy") fun install(context: Context) { if (MainApp.OTA_UPDATES) { downloadPath?.let { apk -> diff --git a/app/src/main/java/org/koreader/launcher/CrashReportActivity.kt b/app/src/main/java/org/koreader/launcher/CrashReportActivity.kt index 9156ef1ef..1b318d6e6 100644 --- a/app/src/main/java/org/koreader/launcher/CrashReportActivity.kt +++ b/app/src/main/java/org/koreader/launcher/CrashReportActivity.kt @@ -15,8 +15,8 @@ class CrashReportActivity : AppCompatActivity() { intent?.extras?.let { bundle -> binding = CrashReportBinding.inflate(layoutInflater) setContentView(binding.root) - binding.title.text = bundle.get("title").toString() - binding.reason.text = bundle.get("reason").toString() + binding.title.text = bundle.getString("title") + binding.reason.text = bundle.getString("reason") if (binding.reason.text.equals("")) { binding.reason.visibility = View.GONE } diff --git a/app/src/main/java/org/koreader/launcher/LuaInterface.kt b/app/src/main/java/org/koreader/launcher/LuaInterface.kt index bcf0f8951..13bfcc90f 100644 --- a/app/src/main/java/org/koreader/launcher/LuaInterface.kt +++ b/app/src/main/java/org/koreader/launcher/LuaInterface.kt @@ -1,3 +1,5 @@ +@file:Suppress("SameReturnValue") + package org.koreader.launcher import androidx.annotation.WorkerThread diff --git a/app/src/main/java/org/koreader/launcher/MainActivity.kt b/app/src/main/java/org/koreader/launcher/MainActivity.kt index 8256a34ff..54c3af981 100644 --- a/app/src/main/java/org/koreader/launcher/MainActivity.kt +++ b/app/src/main/java/org/koreader/launcher/MainActivity.kt @@ -2,8 +2,6 @@ package org.koreader.launcher import android.Manifest import android.annotation.SuppressLint -import android.annotation.TargetApi -import android.app.Activity import android.app.NativeActivity import android.content.ClipboardManager import android.content.ClipData @@ -24,9 +22,9 @@ import androidx.core.content.ContextCompat import org.koreader.launcher.device.Device import org.koreader.launcher.dialog.LightDialog import org.koreader.launcher.extensions.* -import java.io.File import java.util.Locale import java.util.concurrent.CountDownLatch +import androidx.core.net.toUri class MainActivity : NativeActivity(), LuaInterface, ActivityCompat.OnRequestPermissionsResultCallback { @@ -178,6 +176,7 @@ class MainActivity : NativeActivity(), LuaInterface, drawSplashScreen(holder) } + @SuppressLint("ObsoleteSdkInt") @RequiresApi(Build.VERSION_CODES.P) override fun onAttachedToWindow() { Log.d(TAG_SURFACE, "onAttachedToWindow()") @@ -226,9 +225,9 @@ class MainActivity : NativeActivity(), LuaInterface, } /* Called on activity result, available from KitKat onwards */ - @TargetApi(19) + @RequiresApi(19) override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { - if (requestCode == ACTION_SAF_FILEPICKER_ID && resultCode == Activity.RESULT_OK) { + if (requestCode == ACTION_SAF_FILEPICKER_ID && resultCode == RESULT_OK) { val importPath = lastImportedPath ?: return resultData?.let { val clipData = it.clipData @@ -277,7 +276,7 @@ class MainActivity : NativeActivity(), LuaInterface, @Suppress("NewApi") override fun canIgnoreBatteryOptimizations(): Boolean { return if (MainApp.isAtLeastApi(Build.VERSION_CODES.M)) { - val pm = applicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager + val pm = applicationContext.getSystemService(POWER_SERVICE) as PowerManager pm.isIgnoringBatteryOptimizations(packageName) } else false } @@ -359,7 +358,7 @@ class MainActivity : NativeActivity(), LuaInterface, val result = Box() runOnUiThread { result.value = try { - val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager val clipData: ClipData? = clipboard.primaryClip clipData?.getItemAt(0)?.text?.toString()?.trim() ?: "" } catch (e: Exception) { @@ -521,7 +520,7 @@ class MainActivity : NativeActivity(), LuaInterface, } override fun hasClipboardText(): Boolean { - val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager return clipboard.primaryClip?.let { (it.itemCount > 0) }?: false @@ -629,7 +628,7 @@ class MainActivity : NativeActivity(), LuaInterface, } override fun openLink(url: String): Boolean { - val webpage = Uri.parse(url) + val webpage = url.toUri() val intent = Intent(Intent.ACTION_VIEW, webpage) return try { startActivity(intent) @@ -692,7 +691,7 @@ class MainActivity : NativeActivity(), LuaInterface, override fun setClipboardText(text: String) { runOnUiThread { - val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager clipboard.setPrimaryClip(ClipData.newPlainText("KOReader_clipboard", text)) } } diff --git a/app/src/main/java/org/koreader/launcher/MainApp.kt b/app/src/main/java/org/koreader/launcher/MainApp.kt index 91af61fc7..bacda6f27 100644 --- a/app/src/main/java/org/koreader/launcher/MainApp.kt +++ b/app/src/main/java/org/koreader/launcher/MainApp.kt @@ -1,5 +1,6 @@ package org.koreader.launcher +import android.annotation.SuppressLint import android.app.Application import android.content.Context import android.content.Intent @@ -10,6 +11,7 @@ import java.io.BufferedReader import java.io.File import java.io.InputStreamReader +@Suppress("HasPlatformType") class MainApp : Application() { companion object { const val NAME = BuildConfig.APP_NAME @@ -89,6 +91,7 @@ class MainApp : Application() { } } + @SuppressLint("DefaultUncaughtExceptionDelegation") @Suppress("DEPRECATION") override fun onCreate() { super.onCreate() diff --git a/app/src/main/java/org/koreader/launcher/TestActivity.kt b/app/src/main/java/org/koreader/launcher/TestActivity.kt index 55f28aa96..be4f38880 100644 --- a/app/src/main/java/org/koreader/launcher/TestActivity.kt +++ b/app/src/main/java/org/koreader/launcher/TestActivity.kt @@ -1,5 +1,6 @@ package org.koreader.launcher +import android.annotation.SuppressLint import android.graphics.Point import android.text.method.LinkMovementMethod import android.util.Log @@ -151,6 +152,7 @@ class TestActivity: AppCompatActivity() { Log.i(tag, MARKER_END) } + @SuppressLint("DefaultLocale") override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { val msg = String.format("Pressed: %d", keyCode) Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() diff --git a/app/src/main/java/org/koreader/launcher/device/DeviceInfo.kt b/app/src/main/java/org/koreader/launcher/device/DeviceInfo.kt index ee7dd4e98..f97432af9 100644 --- a/app/src/main/java/org/koreader/launcher/device/DeviceInfo.kt +++ b/app/src/main/java/org/koreader/launcher/device/DeviceInfo.kt @@ -10,7 +10,7 @@ import android.os.Build import android.util.Log import java.util.Locale -@Suppress("detekt:all") +@Suppress("detekt:all", "LocalVariableName") object DeviceInfo { private const val TAG = "DeviceInfo" @@ -509,7 +509,7 @@ object DeviceInfo { // Onyx Note Air 4C BRAND == "onyx" && MODEL == "noteair4c" -> Id.ONYX_NOTE_AIR_4C - + // Onyx Note Air 5C BRAND == "onyx" && MODEL == "noteair5c" -> Id.ONYX_NOTE_AIR_5C diff --git a/app/src/main/java/org/koreader/launcher/device/EPDFactory.kt b/app/src/main/java/org/koreader/launcher/device/EPDFactory.kt index 165b01ca2..07f7375db 100644 --- a/app/src/main/java/org/koreader/launcher/device/EPDFactory.kt +++ b/app/src/main/java/org/koreader/launcher/device/EPDFactory.kt @@ -1,6 +1,8 @@ /* generic EPD Controller for Android devices, * based on https://github.com/unwmun/refreshU */ +@file:Suppress("EmptyMethod") + package org.koreader.launcher.device import android.util.Log diff --git a/app/src/main/java/org/koreader/launcher/device/EPDInterface.kt b/app/src/main/java/org/koreader/launcher/device/EPDInterface.kt index 3b5698126..aee27205e 100644 --- a/app/src/main/java/org/koreader/launcher/device/EPDInterface.kt +++ b/app/src/main/java/org/koreader/launcher/device/EPDInterface.kt @@ -1,6 +1,8 @@ /* generic EPD Controller for Android devices, * based on https://github.com/unwmun/refreshU */ +@file:Suppress("EmptyMethod") + package org.koreader.launcher.device interface EPDInterface { diff --git a/app/src/main/java/org/koreader/launcher/device/epd/rockchip/RK30xxEPDController.kt b/app/src/main/java/org/koreader/launcher/device/epd/rockchip/RK30xxEPDController.kt index fa376b9c5..3b85a8320 100644 --- a/app/src/main/java/org/koreader/launcher/device/epd/rockchip/RK30xxEPDController.kt +++ b/app/src/main/java/org/koreader/launcher/device/epd/rockchip/RK30xxEPDController.kt @@ -46,7 +46,7 @@ abstract class RK30xxEPDController { init { try { @Suppress("UNCHECKED_CAST") - eInkEnum = Class.forName("android.view.View\$EINK_MODE") as Class> + eInkEnum = Class.forName($$"android.view.View$EINK_MODE") as Class> updateEpdMethod = View::class.java.getMethod("requestEpdMode", eInkEnum, Boolean::class.javaPrimitiveType) } catch (e: ClassNotFoundException) { diff --git a/app/src/main/java/org/koreader/launcher/device/lights/BoyueS62RootController.kt b/app/src/main/java/org/koreader/launcher/device/lights/BoyueS62RootController.kt index d97e82287..8b494f449 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/BoyueS62RootController.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/BoyueS62RootController.kt @@ -53,7 +53,7 @@ class BoyueS62RootController : LightsInterface { } override fun setBrightness(activity: Activity, brightness: Int) { - if (brightness < BRIGHTNESS_MIN || brightness > BRIGHTNESS_MAX) { + if (brightness !in BRIGHTNESS_MIN..BRIGHTNESS_MAX) { Log.w(TAG, "brightness value out of range: $brightness") return } diff --git a/app/src/main/java/org/koreader/launcher/device/lights/GenericController.kt b/app/src/main/java/org/koreader/launcher/device/lights/GenericController.kt index bf90c48aa..b8f82cf7a 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/GenericController.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/GenericController.kt @@ -60,7 +60,7 @@ class GenericController : LightsInterface { val level: Float? = when (brightness) { 0 -> 0.0f else -> { - if ((brightness < BRIGHTNESS_MIN || brightness > BRIGHTNESS_MAX)) + if ((brightness !in BRIGHTNESS_MIN..BRIGHTNESS_MAX)) null else (brightness - BRIGHTNESS_MIN) * 1.0f / (BRIGHTNESS_MAX - BRIGHTNESS_MIN) diff --git a/app/src/main/java/org/koreader/launcher/device/lights/OnyxAdbLightsController.kt b/app/src/main/java/org/koreader/launcher/device/lights/OnyxAdbLightsController.kt index dc324de40..cd8a71720 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/OnyxAdbLightsController.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/OnyxAdbLightsController.kt @@ -1,4 +1,4 @@ -@file:Suppress("SameParameterValue", "UNUSED_PARAMETER") +@file:Suppress("SameParameterValue") package org.koreader.launcher.device.lights @@ -82,6 +82,7 @@ class OnyxAdbLightsController : LightsInterface { } } +@Suppress("RedundantSuppression") object FrontLightAdb { private const val TAG = "Lights" @@ -163,18 +164,22 @@ object FrontLightAdb { } } + @Suppress("unused") fun getWarmth(context: Context?): Int { return getValue(getLightValueMethod, warmthType) } + @Suppress("unused") fun getBrightness(context: Context?): Int { return getValue(getLightValueMethod, brightnessType) } + @Suppress("unused") fun setWarmth(value: Int, context: Context?) { setValue(setLightValueMethod, warmthType, value) } + @Suppress("unused") fun setBrightness(value: Int, context: Context?) { setValue(setLightValueMethod, brightnessType, value) } diff --git a/app/src/main/java/org/koreader/launcher/device/lights/OnyxC67Controller.kt b/app/src/main/java/org/koreader/launcher/device/lights/OnyxC67Controller.kt index 00ae99a94..7f4f6564c 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/OnyxC67Controller.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/OnyxC67Controller.kt @@ -45,7 +45,7 @@ class OnyxC67Controller : LightsInterface { } override fun setBrightness(activity: Activity, brightness: Int) { - if (brightness < BRIGHTNESS_MIN || brightness > BRIGHTNESS_MAX) { + if (brightness !in BRIGHTNESS_MIN..BRIGHTNESS_MAX) { Log.w(TAG, "brightness value of of range: $brightness") return } diff --git a/app/src/main/java/org/koreader/launcher/device/lights/OnyxColorController.kt b/app/src/main/java/org/koreader/launcher/device/lights/OnyxColorController.kt index 62e69845e..7e539955a 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/OnyxColorController.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/OnyxColorController.kt @@ -8,7 +8,7 @@ import org.koreader.launcher.extensions.write import java.io.File /* Controller for some Onyx Color devices. - * Tested on a Onyx Nova3 Color. + * Tested on an Onyx Nova3 Color. * * Thanks to @ilyats */ @@ -52,7 +52,7 @@ class OnyxColorController : LightsInterface { } override fun setBrightness(activity: Activity, brightness: Int) { - if (brightness < BRIGHTNESS_MIN || brightness > BRIGHTNESS_MAX) { + if (brightness !in BRIGHTNESS_MIN..BRIGHTNESS_MAX) { Log.w(TAG, "brightness value of of range: $brightness") return } diff --git a/app/src/main/java/org/koreader/launcher/device/lights/OnyxSdkLightsController.kt b/app/src/main/java/org/koreader/launcher/device/lights/OnyxSdkLightsController.kt index dbe6d545c..eeaceceea 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/OnyxSdkLightsController.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/OnyxSdkLightsController.kt @@ -40,7 +40,7 @@ class OnyxSdkLightsController : LightsInterface { } override fun setBrightness(activity: Activity, brightness: Int) { - if (brightness < MIN || brightness > BRIGHTNESS_MAX) { + if (brightness !in MIN..BRIGHTNESS_MAX) { Log.w(TAG, "brightness value of of range: $brightness") return } @@ -49,7 +49,7 @@ class OnyxSdkLightsController : LightsInterface { } override fun setWarmth(activity: Activity, warmth: Int) { - if (warmth < MIN || warmth > WARMTH_MAX) { + if (warmth !in MIN..WARMTH_MAX) { Log.w(TAG, "warmth value of of range: $warmth") return } diff --git a/app/src/main/java/org/koreader/launcher/device/lights/OnyxWarmthController.kt b/app/src/main/java/org/koreader/launcher/device/lights/OnyxWarmthController.kt index 9a1a7bfd7..fdfe7f59e 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/OnyxWarmthController.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/OnyxWarmthController.kt @@ -42,7 +42,7 @@ class OnyxWarmthController : LightsInterface { } override fun setBrightness(activity: Activity, brightness: Int) { - if (brightness < MIN || brightness > BRIGHTNESS_MAX) { + if (brightness !in MIN..BRIGHTNESS_MAX) { Log.w(TAG, "brightness value of of range: $brightness") return } @@ -51,7 +51,7 @@ class OnyxWarmthController : LightsInterface { } override fun setWarmth(activity: Activity, warmth: Int) { - if (warmth < MIN || warmth > WARMTH_MAX) { + if (warmth !in MIN..WARMTH_MAX) { Log.w(TAG, "warmth value of of range: $warmth") return } diff --git a/app/src/main/java/org/koreader/launcher/device/lights/TolinoB300Controller.kt b/app/src/main/java/org/koreader/launcher/device/lights/TolinoB300Controller.kt index 3c32767a8..aa6030a76 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/TolinoB300Controller.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/TolinoB300Controller.kt @@ -1,11 +1,15 @@ +@file:Suppress("SameParameterValue") + package org.koreader.launcher.device.lights import android.app.Activity +import android.os.Build import android.provider.Settings import android.util.Log import android.widget.Toast import android.os.Looper import android.os.Handler +import androidx.annotation.RequiresApi import org.koreader.launcher.device.Ioctl import org.koreader.launcher.device.LightsInterface import org.koreader.launcher.device.DeviceInfo @@ -33,6 +37,7 @@ class TolinoB300Controller : Ioctl(), LightsInterface { } } + @RequiresApi(Build.VERSION_CODES.M) private fun ensureWriteSettingsPermission(activity: Activity): Boolean { if (!Settings.System.canWrite(activity.applicationContext)) { showToastOnUiThread( @@ -87,9 +92,10 @@ class TolinoB300Controller : Ioctl(), LightsInterface { } } + @RequiresApi(Build.VERSION_CODES.M) override fun setBrightness(activity: Activity, brightness: Int) { if (!ensureWriteSettingsPermission(activity)) return - if (brightness < MIN || brightness > BRIGHTNESS_MAX) { + if (brightness !in MIN..BRIGHTNESS_MAX) { Log.w(TAG, "brightness value of of range: $brightness") return } @@ -105,9 +111,10 @@ class TolinoB300Controller : Ioctl(), LightsInterface { } } + @RequiresApi(Build.VERSION_CODES.M) override fun setWarmth(activity: Activity, warmth: Int) { if (!ensureWriteSettingsPermission(activity)) return - if (warmth < MIN || warmth > WARMTH_MAX) { + if (warmth !in MIN..WARMTH_MAX) { Log.w(TAG, "warmth value of of range: $warmth") return } diff --git a/app/src/main/java/org/koreader/launcher/device/lights/TolinoNtxController.kt b/app/src/main/java/org/koreader/launcher/device/lights/TolinoNtxController.kt index b9a9b93a4..2e4b07477 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/TolinoNtxController.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/TolinoNtxController.kt @@ -67,7 +67,7 @@ class TolinoNtxController : Ioctl(), LightsInterface { } override fun setBrightness(activity: Activity, brightness: Int) { - if (brightness < MIN || brightness > BRIGHTNESS_MAX) { + if (brightness !in MIN..BRIGHTNESS_MAX) { Log.w(TAG, "brightness value of of range: $brightness") return } @@ -81,7 +81,7 @@ class TolinoNtxController : Ioctl(), LightsInterface { } override fun setWarmth(activity: Activity, warmth: Int) { - if (warmth < MIN || warmth > WARMTH_MAX) { + if (warmth !in MIN..WARMTH_MAX) { Log.w(TAG, "warmth value of of range: $warmth") return } diff --git a/app/src/main/java/org/koreader/launcher/device/lights/TolinoNtxNoWarmthController.kt b/app/src/main/java/org/koreader/launcher/device/lights/TolinoNtxNoWarmthController.kt index 81afaba65..962135ea1 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/TolinoNtxNoWarmthController.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/TolinoNtxNoWarmthController.kt @@ -55,7 +55,7 @@ class TolinoNtxNoWarmthController : Ioctl(), LightsInterface { } override fun setBrightness(activity: Activity, brightness: Int) { - if (brightness < MIN || brightness > BRIGHTNESS_MAX) { + if (brightness !in MIN..BRIGHTNESS_MAX) { Log.w(TAG, "brightness value of of range: $brightness") return } diff --git a/app/src/main/java/org/koreader/launcher/device/lights/TolinoRootController.kt b/app/src/main/java/org/koreader/launcher/device/lights/TolinoRootController.kt index 0cbee1c76..d4a9bc377 100644 --- a/app/src/main/java/org/koreader/launcher/device/lights/TolinoRootController.kt +++ b/app/src/main/java/org/koreader/launcher/device/lights/TolinoRootController.kt @@ -66,7 +66,7 @@ class TolinoRootController : LightsInterface { setBrightness(activity, startBrightness + (BRIGHTNESS_MAX/100+1)) // we have to wait until the android changes seep through to the file, - // 50ms is to less, 60ms seems to work, so use 80 to have some safety + // 50ms is too less, 60ms seems to work, so use 80 to have some safety Thread.sleep(80) val actualBrightnessFromFile = try { @@ -106,7 +106,7 @@ class TolinoRootController : LightsInterface { } override fun setBrightness(activity: Activity, brightness: Int) { - if (brightness < MIN || brightness > BRIGHTNESS_MAX) { + if (brightness !in MIN..BRIGHTNESS_MAX) { Log.w(TAG, "brightness value of of range: $brightness") return } @@ -120,7 +120,7 @@ class TolinoRootController : LightsInterface { } override fun setWarmth(activity: Activity, warmth: Int) { - if (warmth < MIN || warmth > WARMTH_MAX) { + if (warmth !in MIN..WARMTH_MAX) { Log.w(TAG, "warmth value of of range: $warmth") return } diff --git a/app/src/main/java/org/koreader/launcher/dialog/LightDialog.kt b/app/src/main/java/org/koreader/launcher/dialog/LightDialog.kt index 9bebbde5f..23bbbf13c 100644 --- a/app/src/main/java/org/koreader/launcher/dialog/LightDialog.kt +++ b/app/src/main/java/org/koreader/launcher/dialog/LightDialog.kt @@ -2,7 +2,6 @@ package org.koreader.launcher.dialog import android.app.Activity import android.app.AlertDialog -import android.graphics.Color import android.view.Gravity import android.view.View import android.view.ViewGroup @@ -11,6 +10,7 @@ import android.widget.RelativeLayout import android.widget.SeekBar import android.widget.TextView import org.koreader.launcher.device.LightsInterface +import androidx.core.graphics.toColorInt class LightDialog { @@ -61,7 +61,7 @@ class LightDialog { val linearLayout = LinearLayout(activity) linearLayout.orientation = LinearLayout.VERTICAL if (hasTitle) { - divider.setBackgroundColor(Color.parseColor("#B3B3B3")) + divider.setBackgroundColor("#B3B3B3".toColorInt()) val param = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 3) param.setMargins(0, 0, 0, 10) divider.layoutParams = param diff --git a/app/src/main/java/org/koreader/launcher/dialog/ToolTip.kt b/app/src/main/java/org/koreader/launcher/dialog/ToolTip.kt index 28a6f3015..da1d2a743 100644 --- a/app/src/main/java/org/koreader/launcher/dialog/ToolTip.kt +++ b/app/src/main/java/org/koreader/launcher/dialog/ToolTip.kt @@ -3,7 +3,6 @@ package org.koreader.launcher.dialog import android.annotation.SuppressLint import android.content.Context import android.graphics.Color -import android.graphics.drawable.ColorDrawable import android.view.Gravity import android.view.LayoutInflater import android.view.View @@ -11,6 +10,7 @@ import android.view.ViewGroup import android.widget.PopupWindow import android.widget.TextView import org.koreader.launcher.R +import androidx.core.graphics.drawable.toDrawable @SuppressLint("InflateParams") class ToolTip(context: Context) { @@ -23,7 +23,7 @@ class ToolTip(context: Context) { ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT ) - popupWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + popupWindow.setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) popupWindow.isOutsideTouchable = true } diff --git a/app/src/main/java/org/koreader/launcher/extensions/ActivityExtensions.kt b/app/src/main/java/org/koreader/launcher/extensions/ActivityExtensions.kt index 20d7f6b86..7a439322e 100644 --- a/app/src/main/java/org/koreader/launcher/extensions/ActivityExtensions.kt +++ b/app/src/main/java/org/koreader/launcher/extensions/ActivityExtensions.kt @@ -271,7 +271,7 @@ private fun startDictionaryActivity(context: Context, intent: Intent, domain: St try { val pm = context.packageManager val act = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) - if (act.size > 0) { + if (act.isNotEmpty()) { context.startActivity(intent) } } catch (e: Exception) { diff --git a/app/src/main/java/org/koreader/launcher/extensions/FileExtensions.kt b/app/src/main/java/org/koreader/launcher/extensions/FileExtensions.kt index c72b65fd1..cda18d914 100644 --- a/app/src/main/java/org/koreader/launcher/extensions/FileExtensions.kt +++ b/app/src/main/java/org/koreader/launcher/extensions/FileExtensions.kt @@ -1,37 +1,7 @@ package org.koreader.launcher.extensions -import android.annotation.SuppressLint -import android.os.Build -import android.system.Os import java.io.* -@SuppressLint("DiscouragedPrivateApi") -fun File.symlink(link: String): Boolean { - if (!this.exists()) return false - try { - File(link).delete() - } catch (e: IOException) { - e.printStackTrace() - } - - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Os.symlink(this.absolutePath, link) - return true - } - val libcore = Class.forName("libcore.io.Libcore") - val field = libcore.getDeclaredField("os") - field.isAccessible = true - val os = field.get(null) - os.javaClass.getMethod("symlink", String::class.java, - String::class.java).invoke(os, this.absolutePath, link) - return true - } catch (e: Exception) { - e.printStackTrace() - return false - } -} - fun File.read(): Int { return try { this.readText().replace("\n", "").toInt() diff --git a/app/src/main/java/org/koreader/launcher/extensions/UriExtensions.kt b/app/src/main/java/org/koreader/launcher/extensions/UriExtensions.kt index 9db0f4204..24a999646 100644 --- a/app/src/main/java/org/koreader/launcher/extensions/UriExtensions.kt +++ b/app/src/main/java/org/koreader/launcher/extensions/UriExtensions.kt @@ -1,5 +1,6 @@ package org.koreader.launcher.extensions +import android.annotation.SuppressLint import android.content.ContentResolver import android.content.Context import android.net.Uri @@ -21,6 +22,7 @@ fun Uri.absolutePath(context: Context): String? { } } +@SuppressLint("Range") fun Uri.toFile(context: Context, path: String): String? { if (this.scheme != ContentResolver.SCHEME_CONTENT) { Log.e(TAG, "unsupported scheme") diff --git a/app/src/main/res/layout/tooltip_layout.xml b/app/src/main/res/layout/tooltip_layout.xml index a3918e170..933143a09 100644 --- a/app/src/main/res/layout/tooltip_layout.xml +++ b/app/src/main/res/layout/tooltip_layout.xml @@ -1,6 +1,8 @@