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" /> + + + +