From c2ab19d46478cea5f6d5a16e5ba3366083708b78 Mon Sep 17 00:00:00 2001 From: bskjon Date: Fri, 3 May 2024 01:21:48 +0200 Subject: [PATCH] Dropdown --- app/src/main/AndroidManifest.xml | 4 +- .../no/iktdev/demoapplication/MainActivity.kt | 4 + .../iktdev/demoapplication/SettingActivity.kt | 12 ++ .../demoapplication/SettingActivity2.kt | 103 +++++++++++++++++- app/src/main/res/layout/activity_setting2.xml | 55 +++++++++- build.gradle | 4 +- .../setting/model/DropdownComponentItems.kt | 36 ++++++ .../no/iktdev/setting/model/DropdownItem.kt | 2 +- 8 files changed, 212 insertions(+), 8 deletions(-) create mode 100644 library/setting/src/main/java/no/iktdev/setting/model/DropdownComponentItems.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0fc33c3..f7e9628 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,7 +18,9 @@ android:exported="false" /> + android:exported="false" + android:theme="@style/SettingLibrary.SettingActivity" /> + ( + DropdownItem("Stringy", "Potatis"), + DropdownItem("Inti", 0), + DropdownItem("Intifffffffffssssssssssf", 1) + ))) .build() ) return external + listOf( diff --git a/app/src/main/java/no/iktdev/demoapplication/SettingActivity2.kt b/app/src/main/java/no/iktdev/demoapplication/SettingActivity2.kt index 6fff290..4e5d187 100644 --- a/app/src/main/java/no/iktdev/demoapplication/SettingActivity2.kt +++ b/app/src/main/java/no/iktdev/demoapplication/SettingActivity2.kt @@ -2,10 +2,109 @@ package no.iktdev.demoapplication import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.view.LayoutInflater +import android.widget.LinearLayout +import android.widget.Toast +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import no.iktdev.demoapplication.databinding.ActivitySetting2Binding +import no.iktdev.demoapplication.databinding.ActivitySettingBinding +import no.iktdev.setting.ReactiveSettingsReceiver +import no.iktdev.setting.model.ComponentData +import no.iktdev.setting.model.DropdownComponentItems +import no.iktdev.setting.model.DropdownItem +import no.iktdev.setting.model.SettingComponentDescriptorBase +import no.iktdev.setting.model.SettingComponentType +import no.iktdev.setting.model.builder.ActionableComponentDataBuilder +import no.iktdev.setting.model.builder.LaunchableComponentDataBuilder +import no.iktdev.setting.model.builder.SettingComponentDescriptorBuilder +import no.iktdev.setting.ui.ThemeType +import no.iktdev.setting.ui.Theming +import no.iktdev.setting.ui.activities.SettingsActivity +import no.iktdev.setting.ui.activities.SettingsRenderActivity + +class SettingActivity2 : SettingsRenderActivity() { + lateinit var binding: ActivitySetting2Binding + private var reactiveSettingsReceiver: ReactiveSettingsReceiver? = null + -class SettingActivity2 : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivitySetting2Binding.inflate(LayoutInflater.from(this)) + setContentView(binding.root) + toolbar = binding.toolbar + setCollapsingToolbar(binding.appBar, binding.toolbarLayout, binding.toolbarTitle) super.onCreate(savedInstanceState) - setContentView(R.layout.activity_setting2) + reactiveSettingsReceiver = + ReactiveSettingsReceiver(this, object : ReactiveSettingsReceiver.Listener { + override fun onReactiveGroupSettingsChanged( + group: String, + key: String, + payload: Any? + ) { + super.onReactiveGroupSettingsChanged(group, key, payload) + Toast.makeText( + this@SettingActivity2, + "${this@SettingActivity2::class.java.simpleName} Setting group: $group got changed value for key $key with value $payload", + Toast.LENGTH_LONG + ).show() + } + }) + titleChange.observe(this) { + title = it + binding.toolbarLayout.title = title + binding.toolbarTitle.text = title + binding.toolbarTitleLarge.text = title + } + } + + + override fun preCreatedSettingItems(): List { + val external = arrayListOf( + SettingComponentDescriptorBuilder(this) + .setGroupName(R.string.setting_title) + .setTitle(R.string.setting_title) + .setType(SettingComponentType.POPOUT_SELECT) + .setIcon(no.iktdev.setting.R.drawable.ic_android_black_24dp) + .setSetting(Settings.ValueSelector.SelectSomethingElse()) + .setPayload( + DropdownComponentItems( + arrayListOf( + DropdownItem("Stringy", "Potatis"), + DropdownItem("Inti", 0), + DropdownItem("Intifffffffffssssssssssf", 1) + ) + ) + ) + .build() + ) + return external + listOf( + SettingComponentDescriptorBuilder(this) + .setGroupName(R.string.setting_group_title_launchy) + .setTitle("I will crash") + .setIcon(no.iktdev.setting.R.drawable.ic_android_black_24dp) + .setType(SettingComponentType.CLICKABLE) + .setPayload( + ActionableComponentDataBuilder() + .setTitle("Fancy Section") + .setActivityClass(SettingActivity::class.java) + .applyPayload(SettingsActivity.componentPassKey, external) + .build() + ) + .build(), + ) + } + + override fun themes(): List { + return listOf( + Theming(ThemeType.NORMAL, no.iktdev.setting.R.style.SettingComponents), + Theming(ThemeType.START, no.iktdev.setting.R.style.SettingComponents_Top), + Theming(ThemeType.END, no.iktdev.setting.R.style.SettingComponents_Bottom), + Theming(ThemeType.SINGLE, no.iktdev.setting.R.style.SettingComponents_Single), + ) + } + + override fun getRenderContainer(): LinearLayout { + return binding.content.renderContainer } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setting2.xml b/app/src/main/res/layout/activity_setting2.xml index 83bf99d..629037f 100644 --- a/app/src/main/res/layout/activity_setting2.xml +++ b/app/src/main/res/layout/activity_setting2.xml @@ -1,8 +1,59 @@ - - \ No newline at end of file + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index c468d9b..7e11d6e 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'com.android.application' version '7.4.1' apply false id 'com.android.library' version '7.4.1' apply false - id 'org.jetbrains.kotlin.android' version '1.7.20' apply false + id 'org.jetbrains.kotlin.android' version '1.8.10' apply false } ext { @@ -10,7 +10,7 @@ ext { androidMinSdk = 21 javaVersion = JavaVersion.VERSION_11 - kotlinJvmTarget = '11' + kotlinJvmTarget = '17' coreLibraries = [ kotlin : 'androidx.core:core-ktx:1.9.0' diff --git a/library/setting/src/main/java/no/iktdev/setting/model/DropdownComponentItems.kt b/library/setting/src/main/java/no/iktdev/setting/model/DropdownComponentItems.kt new file mode 100644 index 0000000..3359b6c --- /dev/null +++ b/library/setting/src/main/java/no/iktdev/setting/model/DropdownComponentItems.kt @@ -0,0 +1,36 @@ +package no.iktdev.setting.model + +import android.os.Bundle +import android.os.Parcel +import android.os.Parcelable +import java.io.Serializable + +class DropdownComponentItems( + override val value: ArrayList +) : ComponentData(value), Parcelable { + + constructor(parcel: Parcel) : this( + ArrayList().apply { + parcel.readList(this, DropdownItem::class.java.classLoader) + } + ) + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeList(value) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): DropdownComponentItems { + return DropdownComponentItems(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } + +} \ No newline at end of file diff --git a/library/setting/src/main/java/no/iktdev/setting/model/DropdownItem.kt b/library/setting/src/main/java/no/iktdev/setting/model/DropdownItem.kt index 1aaaac7..c5ebf7c 100644 --- a/library/setting/src/main/java/no/iktdev/setting/model/DropdownItem.kt +++ b/library/setting/src/main/java/no/iktdev/setting/model/DropdownItem.kt @@ -8,7 +8,7 @@ import java.io.Serializable * @param value Should only be value of primitive type (int, string, boolean, float etc..) * @param payload Value that can be assigned if you want to inform host activity of the item selected */ -class DropdownItem(val displayValue: String, override var value: Any?, val payload: Serializable? = null) : ComponentData(), Parcelable { +data class DropdownItem(val displayValue: String, override var value: Any?, val payload: Serializable? = null) : ComponentData(), Parcelable { constructor(parcel: Parcel) : this( parcel.readString() ?: "", parcel.readValue(ClassLoader.getSystemClassLoader()),