11package com.appcontrolx.ui.adapter
22
3+ import android.content.ClipData
4+ import android.content.ClipboardManager
5+ import android.content.Context
6+ import android.view.HapticFeedbackConstants
37import android.view.LayoutInflater
48import android.view.View
59import android.view.ViewGroup
10+ import android.widget.Toast
611import androidx.recyclerview.widget.DiffUtil
712import androidx.recyclerview.widget.LinearLayoutManager
813import androidx.recyclerview.widget.ListAdapter
914import androidx.recyclerview.widget.RecyclerView
15+ import com.appcontrolx.R
1016import com.appcontrolx.databinding.ItemAppActivityGroupBinding
1117import com.appcontrolx.databinding.ItemActivitySimpleBinding
1218import com.appcontrolx.ui.ActivityLauncherBottomSheet.ActivityItem
@@ -42,40 +48,31 @@ class AppActivityAdapter(
4248 }
4349
4450 fun bind (group : AppActivityGroup ) {
45- // App icon
4651 if (group.appIcon != null ) {
4752 binding.ivAppIcon.setImageDrawable(group.appIcon)
4853 }
4954
5055 binding.tvAppName.text = group.appName
5156 binding.tvActivityCount.text = " ${group.activities.size} activities"
52-
53- // Expand/collapse icon
5457 binding.ivExpand.rotation = if (group.isExpanded) 180f else 0f
55-
56- // Activities list visibility
5758 binding.rvActivities.visibility = if (group.isExpanded) View .VISIBLE else View .GONE
5859
5960 if (group.isExpanded) {
6061 activityAdapter.submitList(group.activities)
6162 }
6263
63- // Click to expand/collapse
6464 binding.headerLayout.setOnClickListener {
6565 onAppClick(group)
6666 }
6767 }
6868 }
6969
7070 class DiffCallback : DiffUtil .ItemCallback <AppActivityGroup >() {
71- override fun areItemsTheSame (oldItem : AppActivityGroup , newItem : AppActivityGroup ): Boolean {
72- return oldItem.packageName == newItem.packageName
73- }
71+ override fun areItemsTheSame (oldItem : AppActivityGroup , newItem : AppActivityGroup ) =
72+ oldItem.packageName == newItem.packageName
7473
75- override fun areContentsTheSame (oldItem : AppActivityGroup , newItem : AppActivityGroup ): Boolean {
76- return oldItem.packageName == newItem.packageName &&
77- oldItem.isExpanded == newItem.isExpanded
78- }
74+ override fun areContentsTheSame (oldItem : AppActivityGroup , newItem : AppActivityGroup ) =
75+ oldItem.packageName == newItem.packageName && oldItem.isExpanded == newItem.isExpanded
7976 }
8077}
8178
@@ -99,28 +96,35 @@ class ActivitySimpleAdapter(
9996 ) : RecyclerView.ViewHolder(binding.root) {
10097
10198 fun bind (item : ActivityItem ) {
102- // Show activity short name (e.g., "ManageExternalSourcesActivity")
10399 binding.tvActivityName.text = item.shortName
104100
105- // Show full path (e.g., " com.android.settings$ManageExternalSourcesActivity" )
106- val fullPath = " ${ item.packageName} \$ ${item.shortName} "
101+ // Full activity path (e.g., com.android.settings/.Settings $ManageExternalSourcesActivity)
102+ val fullPath = item.activityName
107103 binding.tvFullPath.text = fullPath
108104
109105 binding.tvExported.visibility = if (item.isExported) View .VISIBLE else View .GONE
110106
107+ // Tap to launch
111108 binding.root.setOnClickListener {
112109 onItemClick(item)
113110 }
111+
112+ // Long press to copy full path
113+ binding.root.setOnLongClickListener { view ->
114+ view.performHapticFeedback(HapticFeedbackConstants .LONG_PRESS )
115+ val clipboard = view.context.getSystemService(Context .CLIPBOARD_SERVICE ) as ClipboardManager
116+ clipboard.setPrimaryClip(ClipData .newPlainText(" Activity" , fullPath))
117+ Toast .makeText(view.context, R .string.copied_to_clipboard, Toast .LENGTH_SHORT ).show()
118+ true
119+ }
114120 }
115121 }
116122
117123 class DiffCallback : DiffUtil .ItemCallback <ActivityItem >() {
118- override fun areItemsTheSame (oldItem : ActivityItem , newItem : ActivityItem ): Boolean {
119- return oldItem.activityName == newItem.activityName
120- }
124+ override fun areItemsTheSame (oldItem : ActivityItem , newItem : ActivityItem ) =
125+ oldItem.activityName == newItem.activityName
121126
122- override fun areContentsTheSame (oldItem : ActivityItem , newItem : ActivityItem ): Boolean {
123- return oldItem == newItem
124- }
127+ override fun areContentsTheSame (oldItem : ActivityItem , newItem : ActivityItem ) =
128+ oldItem == newItem
125129 }
126130}
0 commit comments