diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 9fe5206..5acebac 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -50,4 +50,6 @@ dependencies {
implementation("com.google.android.material:material:1.12.0")
implementation("androidx.recyclerview:recyclerview:1.3.2")
implementation("androidx.preference:preference-ktx:1.2.1")
+ implementation("androidx.activity:activity:1.9.2")
+ implementation("androidx.constraintlayout:constraintlayout:2.1.4")
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b9ce09f..ffa8c5d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,7 +8,8 @@
-
@@ -28,12 +29,15 @@
android:supportsRtl="true"
android:theme="@style/Theme.YamLauncher"
tools:targetApi="34">
+
+ android:theme="@style/SettingsTheme"
+ tools:ignore="DiscouragedApi,LockedOrientationActivity" />
+
,
+ private val onWidgetSelected: (AppWidgetProviderInfo) -> Unit
+) : RecyclerView.Adapter() {
+
+ inner class WidgetViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ val iconView: ImageView = view.findViewById(R.id.widget_icon)
+ val labelView: TextView = view.findViewById(R.id.widget_label)
+
+ fun bind(item: WidgetItem) {
+ iconView.setImageDrawable(item.icon)
+ labelView.text = item.label
+ itemView.setOnClickListener { onWidgetSelected(item.widgetInfo) }
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WidgetViewHolder {
+ val view = LayoutInflater.from(parent.context).inflate(R.layout.widget_item, parent, false)
+ return WidgetViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: WidgetViewHolder, position: Int) {
+ holder.bind(widgetItems[position])
+ }
+
+ override fun getItemCount() = widgetItems.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/eu/ottop/yamlauncher/widgets/WidgetItem.kt b/app/src/main/java/eu/ottop/yamlauncher/widgets/WidgetItem.kt
new file mode 100644
index 0000000..0674fe5
--- /dev/null
+++ b/app/src/main/java/eu/ottop/yamlauncher/widgets/WidgetItem.kt
@@ -0,0 +1,10 @@
+package eu.ottop.yamlauncher.widgets
+
+import android.appwidget.AppWidgetProviderInfo
+import android.graphics.drawable.Drawable
+
+data class WidgetItem(
+ val label: String,
+ val icon: Drawable?,
+ val widgetInfo: AppWidgetProviderInfo
+)
\ No newline at end of file
diff --git a/app/src/main/java/eu/ottop/yamlauncher/widgets/WidgetsActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/widgets/WidgetsActivity.kt
new file mode 100644
index 0000000..e837646
--- /dev/null
+++ b/app/src/main/java/eu/ottop/yamlauncher/widgets/WidgetsActivity.kt
@@ -0,0 +1,67 @@
+package eu.ottop.yamlauncher.widgets
+
+import android.app.PendingIntent
+import android.appwidget.AppWidgetHost
+import android.appwidget.AppWidgetManager
+import android.appwidget.AppWidgetProviderInfo
+import android.content.ComponentName
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.os.Bundle
+import android.util.DisplayMetrics
+import android.view.ViewGroup
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import eu.ottop.yamlauncher.R
+import eu.ottop.yamlauncher.databinding.ActivityMainBinding
+import eu.ottop.yamlauncher.databinding.ActivityWidgetsBinding
+
+class WidgetsActivity : AppCompatActivity() {
+
+ private lateinit var binding: ActivityWidgetsBinding
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityWidgetsBinding.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
+ }
+ binding.button.setOnClickListener {
+ showWidgetSelectionRecyclerDialog(this) {println("hi")}
+ }
+
+ }
+
+ fun showWidgetSelectionRecyclerDialog(context: Context, onWidgetSelected: (AppWidgetProviderInfo) -> Unit) {
+ val dialog = AlertDialog.Builder(context).create()
+ val recyclerView = RecyclerView(context).apply {
+ layoutManager = GridLayoutManager(this@WidgetsActivity, 2)
+ adapter = WidgetAdapter(prepareWidgetItems(context), onWidgetSelected)
+ }
+ dialog.setView(recyclerView)
+ dialog.show()
+ }
+
+ fun prepareWidgetItems(context: Context): List {
+ val widgets = getAvailableWidgets(context)
+ return widgets.map { widgetInfo ->
+ val icon = widgetInfo.loadPreviewImage(this, DisplayMetrics.DENSITY_DEFAULT) ?: widgetInfo.loadIcon(this, DisplayMetrics.DENSITY_DEFAULT)
+ WidgetItem(widgetInfo.loadLabel(packageManager), icon, widgetInfo)
+ }
+ }
+
+ fun getAvailableWidgets(context: Context): List {
+ val appWidgetManager = AppWidgetManager.getInstance(context)
+ return appWidgetManager.installedProviders
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index c483218..85c1b79 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -190,6 +190,22 @@
android:layout_height="0dp"
android:layout_weight="0.22" />
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/widget_item.xml b/app/src/main/res/layout/widget_item.xml
new file mode 100644
index 0000000..7aefef3
--- /dev/null
+++ b/app/src/main/res/layout/widget_item.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
\ No newline at end of file