Skip to content

Commit bdced08

Browse files
committed
feat: long press activity to copy full path to clipboard
1 parent 05a1b9b commit bdced08

File tree

2 files changed

+27
-22
lines changed

2 files changed

+27
-22
lines changed

app/src/main/java/com/appcontrolx/ui/adapter/AppActivityAdapter.kt

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
package 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
37
import android.view.LayoutInflater
48
import android.view.View
59
import android.view.ViewGroup
10+
import android.widget.Toast
611
import androidx.recyclerview.widget.DiffUtil
712
import androidx.recyclerview.widget.LinearLayoutManager
813
import androidx.recyclerview.widget.ListAdapter
914
import androidx.recyclerview.widget.RecyclerView
15+
import com.appcontrolx.R
1016
import com.appcontrolx.databinding.ItemAppActivityGroupBinding
1117
import com.appcontrolx.databinding.ItemActivitySimpleBinding
1218
import 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
}

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@
263263
<string name="tools_section_apps">Apps</string>
264264
<string name="tools_unknown_sources">Manage Unknown Sources</string>
265265
<string name="tools_manage_apps">Manage Apps (AOSP)</string>
266+
<string name="copied_to_clipboard">Copied to clipboard</string>
266267
<string name="tools_extra_dim">Extra Dim</string>
267268
<string name="tools_extra_dim_desc">Reduce screen brightness below minimum</string>
268269
<string name="tools_notification_log">Notification Log</string>

0 commit comments

Comments
 (0)