1+ package app.akilesh.qacc
2+
3+ import android.content.Context
4+ import android.content.res.ColorStateList
5+ import android.graphics.Color
6+ import android.util.Log
7+ import android.view.LayoutInflater
8+ import android.view.View
9+ import android.view.ViewGroup
10+ import androidx.appcompat.widget.AppCompatImageView
11+ import androidx.core.content.res.ResourcesCompat
12+ import androidx.recyclerview.widget.RecyclerView
13+ import app.akilesh.qacc.model.Accent
14+ import com.google.android.material.button.MaterialButton
15+ import com.google.android.material.textview.MaterialTextView
16+ import com.topjohnwu.superuser.Shell
17+
18+ class AccentListAdapter internal constructor(
19+ private val context : Context
20+ ): RecyclerView.Adapter<AccentListAdapter.AccentViewHolder>() {
21+ private val inflater: LayoutInflater = LayoutInflater .from(context)
22+ private var accents = mutableListOf<Accent >()
23+
24+
25+ inner class AccentViewHolder (itemView : View ): RecyclerView.ViewHolder(itemView) {
26+ val name: MaterialTextView = itemView.findViewById(R .id.name)
27+ val color: AppCompatImageView = itemView.findViewById(R .id.color)
28+ val button: MaterialButton = itemView.findViewById(R .id.enable_or_disable_accent)
29+ }
30+
31+ override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ): AccentViewHolder {
32+ val itemView = inflater.inflate(R .layout.recyclerview_item, parent, false )
33+ return AccentViewHolder (itemView)
34+ }
35+
36+ override fun onBindViewHolder (holder : AccentViewHolder , position : Int ) {
37+ val current = accents[position]
38+ val text = current.name + " - " + current.color
39+ val color = Color .parseColor(current.color)
40+ val colorStateList = ColorStateList .valueOf(color)
41+ holder.name.text = text
42+ holder.color.setColorFilter(color)
43+
44+ if (isOverlayInstalled(current.pkgName)) {
45+
46+ if (isOverlayEnabled(current.pkgName)) {
47+ holder.button.strokeColor = colorStateList
48+ holder.button.strokeWidth = 3
49+ holder.button.text = context.resources.getString(R .string.disable_accent)
50+ holder.button.icon = ResourcesCompat .getDrawable(context.resources, R .drawable.ic_check_circle_unchecked, context.theme)
51+ }
52+ else {
53+ holder.button.text = context.resources.getString(R .string.enable_accent)
54+ holder.button.icon = ResourcesCompat .getDrawable(context.resources, R .drawable.ic_check_circle_checked, context.theme)
55+ }
56+
57+ holder.button.iconTint = colorStateList
58+ holder.button.rippleColor = colorStateList
59+ holder.button.setOnClickListener {
60+ if (holder.button.text == " Enable" )
61+ Shell .su(" cmd overlay enable-exclusive --category ${current.pkgName} " ).exec()
62+ else
63+ Shell .su(" cmd overlay disable ${current.pkgName} " ).exec()
64+ }
65+ }
66+ else {
67+ holder.button.strokeWidth = 0
68+ holder.button.text = context.resources.getString(R .string.overlay_not_installed)
69+ holder.button.isClickable = false
70+ holder.button.icon = null
71+ }
72+ }
73+
74+ internal fun setAccents (accents : MutableList <Accent >) {
75+ this .accents = accents
76+ notifyDataSetChanged()
77+ }
78+
79+ internal fun getAccentAndRemoveAt (position : Int ): Accent {
80+ val current = accents[position]
81+ accents.removeAt(position)
82+ notifyItemRemoved(position)
83+ return current
84+ }
85+ override fun getItemCount () = accents.size
86+
87+ private fun isOverlayInstalled (pkgName : String ): Boolean {
88+ return try {
89+ context.packageManager.getPackageInfo(pkgName, 0 )
90+ true
91+ } catch (e: Exception ) {
92+ false
93+ }
94+ }
95+
96+ private fun isOverlayEnabled (pkgName : String ): Boolean {
97+ return Shell .su(" cmd overlay dump isenabled $pkgName " ).exec().out .component1() == " true"
98+ }
99+ }
0 commit comments