Some kind of a preliminary widget menu

This commit is contained in:
ottoptj 2024-11-03 07:35:31 +02:00
commit 757c55fa29
9 changed files with 196 additions and 3 deletions

View file

@ -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")
}

View file

@ -8,7 +8,8 @@
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<queries>
@ -28,11 +29,14 @@
android:supportsRtl="true"
android:theme="@style/Theme.YamLauncher"
tools:targetApi="34">
<activity
android:name=".widgets.WidgetsActivity"
android:exported="false" />
<activity
android:name=".settings.SettingsActivity"
android:theme="@style/SettingsTheme"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/SettingsTheme"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".MainActivity"
@ -51,6 +55,7 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service
android:name=".tasks.ScreenLockService"
android:exported="false"

View file

@ -60,6 +60,7 @@ import eu.ottop.yamlauncher.utils.PermissionUtils
import eu.ottop.yamlauncher.utils.StringUtils
import eu.ottop.yamlauncher.utils.UIUtils
import eu.ottop.yamlauncher.utils.WeatherSystem
import eu.ottop.yamlauncher.widgets.WidgetsActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@ -161,6 +162,10 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
}
}
setupApps()
binding.widgets.setOnClickListener {
startActivity(Intent(this@MainActivity, WidgetsActivity::class.java))
}
}
private fun setMainVariables() {

View file

@ -0,0 +1,38 @@
package eu.ottop.yamlauncher.widgets
import android.appwidget.AppWidgetProviderInfo
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import eu.ottop.yamlauncher.R
class WidgetAdapter(
private val widgetItems: List<WidgetItem>,
private val onWidgetSelected: (AppWidgetProviderInfo) -> Unit
) : RecyclerView.Adapter<WidgetAdapter.WidgetViewHolder>() {
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
}

View file

@ -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
)

View file

@ -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<WidgetItem> {
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<AppWidgetProviderInfo> {
val appWidgetManager = AppWidgetManager.getInstance(context)
return appWidgetManager.installedProviders
}
}

View file

@ -190,6 +190,22 @@
android:layout_height="0dp"
android:layout_weight="0.22" />
<TextView
android:id="@+id/widgets"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.09"
android:autoSizeTextType="uniform"
android:clickable="false"
android:drawablePadding="3dp"
android:gravity="center_vertical"
android:paddingHorizontal="20dp"
android:shadowColor="#00FFFFFF"
android:shadowRadius="10"
android:text="Widgets"
android:textAppearance="@android:style/TextAppearance.DeviceDefault"
android:textColor="#F3F3F3"
android:visibility="visible" />
<TextView
android:id="@+id/app1"
android:layout_width="match_parent"

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".widgets.WidgetsActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="160dp"
android:layout_marginTop="341dp"
android:layout_marginEnd="160dp"
android:layout_marginBottom="342dp"
android:clickable="false"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- res/layout/widget_item.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp">
<ImageView
android:id="@+id/widget_icon"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:layout_gravity="center"
android:contentDescription=""
android:paddingBottom="10dp" />
<TextView
android:id="@+id/widget_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingBottom="20dp"
android:textAlignment="center"
android:textAllCaps="false"
android:textSize="16sp" />
</LinearLayout>