From f025ac12c19332c33a71b657121f68dda3d9e5ab Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Wed, 16 Apr 2025 15:31:45 +0200 Subject: [PATCH] add basic widget selection list --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 6 +- .../launcher/actions/LauncherAction.kt | 7 +- .../jrpie/android/launcher/ui/HomeActivity.kt | 2 +- .../ui/widgets/SelectWidgetActivity.kt | 105 ++++++++++++++++++ .../res/layout/activity_select_widget.xml | 73 ++++++++++++ app/src/main/res/layout/list_widgets_row.xml | 46 ++++++++ app/src/main/res/values/strings.xml | 1 + 8 files changed, 237 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/de/jrpie/android/launcher/ui/widgets/SelectWidgetActivity.kt create mode 100644 app/src/main/res/layout/activity_select_widget.xml create mode 100644 app/src/main/res/layout/list_widgets_row.xml diff --git a/app/build.gradle b/app/build.gradle index 1a0a6fb..eaf97f7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,6 +106,7 @@ dependencies { 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' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4ab7065..579d5c1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,7 +8,6 @@ tools:ignore="QueryAllPackagesPermission" /> - + - + \ No newline at end of file diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt index 6ba467e..0cc3dd4 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/LauncherAction.kt @@ -21,6 +21,8 @@ import de.jrpie.android.launcher.apps.togglePrivateSpaceLock import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.ui.list.ListActivity import de.jrpie.android.launcher.ui.settings.SettingsActivity +import de.jrpie.android.launcher.ui.tutorial.TutorialActivity +import de.jrpie.android.launcher.ui.widgets.SelectWidgetActivity import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -61,7 +63,10 @@ enum class LauncherAction( "choose_from_favorites", R.string.list_other_list_favorites, R.drawable.baseline_favorite_24, - { context -> openAppsList(context, favorite = true) }, + { context -> + context.startActivity(Intent(context.applicationContext, SelectWidgetActivity::class.java)) + }, + //openAppsList(context, favorite = true) }, true ), CHOOSE_FROM_PRIVATE_SPACE( diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index c7c017f..44947bb 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -83,7 +83,7 @@ class HomeActivity : UIObject, AppCompatActivity() { LauncherAction.SETTINGS.invoke(this) } - deleteAllWidgets(this) + // deleteAllWidgets(this) LauncherPreferences.internal().widgets().forEach { widget -> createAppWidgetView(this, widget)?.let { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/widgets/SelectWidgetActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/SelectWidgetActivity.kt new file mode 100644 index 0000000..98dcbe7 --- /dev/null +++ b/app/src/main/java/de/jrpie/android/launcher/ui/widgets/SelectWidgetActivity.kt @@ -0,0 +1,105 @@ +package de.jrpie.android.launcher.ui.widgets + +import android.app.Activity +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.actions.Action +import de.jrpie.android.launcher.actions.Gesture +import de.jrpie.android.launcher.actions.LauncherAction +import de.jrpie.android.launcher.databinding.ActivitySelectWidgetBinding +import de.jrpie.android.launcher.databinding.HomeBinding +import de.jrpie.android.launcher.ui.list.ListActivity +import de.jrpie.android.launcher.ui.list.other.OtherRecyclerAdapter +import de.jrpie.android.launcher.widgets.bindAppWidget +import de.jrpie.android.launcher.widgets.getAppWidgetProviders + +class SelectWidgetActivity : AppCompatActivity() { + lateinit var binding: ActivitySelectWidgetBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + enableEdgeToEdge() + // Initialise layout + binding = ActivitySelectWidgetBinding.inflate(layoutInflater) + + setContentView(binding.root) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + + val viewManager = LinearLayoutManager(this) + val viewAdapter = SelectWidgetRecyclerAdapter(this) + + binding.selectWidgetRecycler.apply { + // improve performance (since content changes don't change the layout size) + setHasFixedSize(true) + layoutManager = viewManager + adapter = viewAdapter + } + } +} + +class SelectWidgetRecyclerAdapter(val activity: Activity) : + RecyclerView.Adapter() { + + private val widgets = getAppWidgetProviders(activity).toTypedArray() + + inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + View.OnClickListener { + var textView: TextView = itemView.findViewById(R.id.list_widgets_row_name) + var iconView: ImageView = itemView.findViewById(R.id.list_widgets_row_icon) + var previewView: ImageView = itemView.findViewById(R.id.list_widgets_row_preview) + + + override fun onClick(v: View) { + val pos = bindingAdapterPosition + val content = widgets[pos] + + bindAppWidget(activity, content) + activity.finish() + } + + init { + itemView.setOnClickListener(this) + } + } + + override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { + val label = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + "${widgets[i].activityInfo.loadLabel(activity.packageManager)} ${widgets[i].loadDescription(activity)}" + } else { + widgets[i].label + } + val preview = widgets[i].loadPreviewImage(activity, 100) + val icon = widgets[i].loadIcon(activity, 100) + + viewHolder.textView.text = label + viewHolder.iconView.setImageDrawable(icon) + viewHolder.previewView.setImageDrawable(preview) + } + + override fun getItemCount(): Int { + return widgets.size + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inflater = LayoutInflater.from(parent.context) + val view: View = inflater.inflate(R.layout.list_widgets_row, parent, false) + return ViewHolder(view) + } +} diff --git a/app/src/main/res/layout/activity_select_widget.xml b/app/src/main/res/layout/activity_select_widget.xml new file mode 100644 index 0000000..463a317 --- /dev/null +++ b/app/src/main/res/layout/activity_select_widget.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_widgets_row.xml b/app/src/main/res/layout/list_widgets_row.xml new file mode 100644 index 0000000..120ea5b --- /dev/null +++ b/app/src/main/res/layout/list_widgets_row.xml @@ -0,0 +1,46 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ed2bb66..e225558 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -388,5 +388,6 @@ Open Source Licenses No app found to handle search. Can\'t open URL: no browser found. + Choose Widget