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