diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 42f0a2b..0000000 --- a/app/build.gradle +++ /dev/null @@ -1,116 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-kapt' -apply plugin: 'kotlinx-serialization' - -android { - dataBinding { - enabled = true - } - - packaging { - resources.excludes.addAll( - [ - "META-INF/LICENSE.md", - "META-INF/NOTICE.md", - "META-INF/LICENSE-notice.md" - ] - ) - } - - defaultConfig { - applicationId "de.jrpie.android.launcher" - minSdkVersion 21 - targetSdkVersion 35 - compileSdk 35 - versionCode 46 - versionName "0.2.1" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } - kotlinOptions { - jvmTarget = '17' - } - - buildFeatures { - viewBinding true - } - - - buildTypes { - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - debug { - applicationIdSuffix = ".debug" - versionNameSuffix = "-debug" - } - } - - flavorDimensions += "distribution" - - productFlavors { - create("default") { - dimension = "distribution" - getIsDefault().set(true) - buildConfigField "boolean", "USE_ACCESSIBILITY_SERVICE", "true" - } - create("accrescent") { - dimension = "distribution" - applicationIdSuffix = ".accrescent" - versionNameSuffix = "+accrescent" - buildConfigField "boolean", "USE_ACCESSIBILITY_SERVICE", "false" - } - } - - sourceSets { - accrescent { - manifest.srcFile 'src/accrescent/AndroidManifest.xml' - } - } - - namespace 'de.jrpie.android.launcher' - buildFeatures { - buildConfig true - } - - dependenciesInfo { - // Disables dependency metadata when building APKs. - includeInApk = false - // Disables dependency metadata when building Android App Bundles. - includeInBundle = false - } - lint { - abortOnError false - } - - -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.activity:activity-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.7.0' - implementation 'androidx.core:core-ktx:1.15.0' - implementation 'androidx.constraintlayout:constraintlayout:2.2.0' - implementation 'androidx.gridlayout:gridlayout:1.0.0' - implementation 'androidx.palette:palette-ktx:1.0.0' - implementation 'androidx.recyclerview:recyclerview:1.4.0' - implementation 'androidx.preference:preference-ktx:1.2.1' - implementation 'com.google.android.material:material:1.12.0' - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3") - implementation "eu.jonahbauer:android-preference-annotations:1.1.2" - implementation 'androidx.activity:activity:1.10.1' - annotationProcessor "eu.jonahbauer:android-preference-annotations:1.1.2" - annotationProcessor "com.android.databinding:compiler:$android_plugin_version" - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.2.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' -} - diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..090f594 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,109 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) + alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.kotlin.serialization) +} + +android { + namespace = "de.jrpie.android.launcher" + compileSdk = 35 + + defaultConfig { + applicationId = "de.jrpie.android.launcher" + minSdk = 21 + targetSdk = 35 + versionCode = 46 + versionName = "0.2.1" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + debug { + applicationIdSuffix = ".debug" + versionNameSuffix = "-debug" + } + } + + val distributionDimension = "distribution" + + flavorDimensions += distributionDimension + + productFlavors { + create("default") { + dimension = distributionDimension + isDefault = true + buildConfigField("boolean", "USE_ACCESSIBILITY_SERVICE", "true") + } + create("accrescent") { + dimension = distributionDimension + applicationIdSuffix = ".accrescent" + versionNameSuffix = "+accrescent" + buildConfigField("boolean", "USE_ACCESSIBILITY_SERVICE", "false") + } + } + + sourceSets { + this.getByName("accrescent") { + this.java.srcDir("src/accrescent") + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = "17" + } + buildFeatures { + buildConfig = true + compose = true + dataBinding = true + viewBinding = true + } + + dependenciesInfo { + includeInApk = false + includeInBundle = false + } + + lint { + abortOnError = false + } +} + +dependencies { + implementation(libs.androidx.activity) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.activity.ktx) + implementation(libs.androidx.appcompat) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.material) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.runtime) + implementation(libs.androidx.compose.ui.graphics) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.gridlayout) + implementation(libs.androidx.palette.ktx) + implementation(libs.androidx.preference.ktx) + implementation(libs.androidx.recyclerview) + implementation(libs.google.material) + implementation(libs.kotlinx.serialization.json) + implementation(libs.jonahbauer.android.preference.annotations) + implementation(libs.androidx.ui.tooling.preview.android) + kapt(libs.jonahbauer.android.preference.annotations) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.test.ext.junit) +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 9e3e326..c1fba79 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -2,7 +2,7 @@ -dontobfuscate -dontoptimize # You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. +# proguardFiles setting in build.gradle.kts. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt index 759d8cd..afbcf24 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/meta/SettingsFragmentMeta.kt @@ -1,18 +1,37 @@ package de.jrpie.android.launcher.ui.settings.meta -import android.app.AlertDialog +import android.content.Context import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button -import android.widget.TextView +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Warning +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.DialogProperties import androidx.fragment.app.Fragment import de.jrpie.android.launcher.BuildConfig import de.jrpie.android.launcher.R import de.jrpie.android.launcher.copyToClipboard -import de.jrpie.android.launcher.databinding.SettingsMetaBinding import de.jrpie.android.launcher.getDeviceInfo import de.jrpie.android.launcher.openInBrowser import de.jrpie.android.launcher.openTutorial @@ -30,13 +49,21 @@ import de.jrpie.android.launcher.ui.UIObject */ class SettingsFragmentMeta : Fragment(), UIObject { - private lateinit var binding: SettingsMetaBinding override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = SettingsMetaBinding.inflate(inflater, container, false) - return binding.root + return ComposeView(requireContext()).apply { + setContent { + MaterialTheme { + SettingsMetaScreen( + context = requireContext(), + onResetConfirmed = { requireActivity().finish() } + ) + } + } + } } override fun onStart() { @@ -45,99 +72,180 @@ class SettingsFragmentMeta : Fragment(), UIObject { } override fun setOnClicks() { - - fun bindURL(view: View, urlRes: Int) { - view.setOnClickListener { - openInBrowser( - getString(urlRes), - requireContext() - ) - } - } - - binding.settingsMetaButtonViewTutorial.setOnClickListener { - openTutorial(requireContext()) - } - - // prompting for settings-reset confirmation - binding.settingsMetaButtonResetSettings.setOnClickListener { - AlertDialog.Builder(this.requireContext(), R.style.AlertDialogCustom) - .setTitle(getString(R.string.settings_meta_reset)) - .setMessage(getString(R.string.settings_meta_reset_confirm)) - .setPositiveButton( - android.R.string.ok - ) { _, _ -> - resetPreferences(this.requireContext()) - requireActivity().finish() - } - .setNegativeButton(android.R.string.cancel, null) - .setIcon(android.R.drawable.ic_dialog_alert) - .show() - } - - - // view code - bindURL(binding.settingsMetaButtonViewCode, R.string.settings_meta_link_github) - - // report a bug - binding.settingsMetaButtonReportBug.setOnClickListener { - val deviceInfo = getDeviceInfo() - AlertDialog.Builder(context, R.style.AlertDialogCustom).apply { - setView(R.layout.dialog_report_bug) - setTitle(R.string.dialog_report_bug_title) - setPositiveButton(R.string.dialog_report_bug_create_report) { _, _ -> - openInBrowser( - getString(R.string.settings_meta_report_bug_link), - requireContext() - ) - } - setNegativeButton(R.string.dialog_cancel) { _, _ -> } - }.create().also { it.show() }.apply { - val info = findViewById(R.id.dialog_report_bug_device_info) - val buttonClipboard = findViewById