@@ -42,6 +42,7 @@ class R2Fragment : Fragment() {
4242 private val r2ViewModel: R2ViewModel by viewModels()
4343
4444 private lateinit var bucketAdapter: BucketAdapter
45+ private lateinit var objectAdapter: ObjectAdapter
4546 private var currentBucket: R2Bucket ? = null
4647 private var downloadData: ByteArray? = null
4748
@@ -78,9 +79,11 @@ class R2Fragment : Fragment() {
7879 super .onViewCreated(view, savedInstanceState)
7980
8081 setupAdapter()
82+ setupObjectAdapter()
8183 setupClickListeners()
8284 observeViewModel()
83-
85+ // 初始对象标题
86+ binding.objectTitleText.text = " 对象"
8487 accountViewModel.defaultAccount.value?.let { account ->
8588 r2ViewModel.loadBuckets(account)
8689 }
@@ -94,7 +97,10 @@ class R2Fragment : Fragment() {
9497 r2ViewModel.loadObjects(account, bucket.name)
9598 r2ViewModel.loadCustomDomains(account, bucket.name)
9699 }
97- showObjectsDialog(bucket)
100+ // 设置右侧对象标题为当前存储桶名
101+ binding.objectTitleText.text = " 对象(${bucket.name} )"
102+ // 清空对象列表等待新数据
103+ objectAdapter.submitList(emptyList())
98104 },
99105 onDeleteClick = { bucket ->
100106 showDeleteBucketDialog(bucket)
@@ -105,11 +111,32 @@ class R2Fragment : Fragment() {
105111 )
106112 binding.bucketRecyclerView.adapter = bucketAdapter
107113 }
114+
115+ private fun setupObjectAdapter () {
116+ objectAdapter = ObjectAdapter ()
117+ objectAdapter.setOnObjectClickListener { obj ->
118+ val bucket = r2ViewModel.selectedBucket.value
119+ val account = accountViewModel.defaultAccount.value
120+ if (bucket != null && account != null ) {
121+ showObjectDetailsDialog(account, bucket, obj, r2ViewModel.customDomains.value)
122+ }
123+ }
124+ binding.objectRecyclerView.adapter = objectAdapter
125+ }
108126
109127 private fun setupClickListeners () {
110128 binding.fabAddBucket.setOnClickListener {
111129 showAddBucketDialog()
112130 }
131+ binding.fabAddObject.setOnClickListener {
132+ // 仅允许在选中存储桶时上传
133+ val bucket = r2ViewModel.selectedBucket.value
134+ if (bucket != null ) {
135+ selectFileToUpload(bucket)
136+ } else {
137+ Snackbar .make(binding.root, " 请先选择存储桶" , Snackbar .LENGTH_SHORT ).show()
138+ }
139+ }
113140 }
114141
115142 private fun observeViewModel () {
@@ -122,6 +149,21 @@ class R2Fragment : Fragment() {
122149 if (buckets.isEmpty()) View .VISIBLE else View .GONE
123150 }
124151 }
152+
153+ launch {
154+ r2ViewModel.objects.collect { objects ->
155+ objectAdapter.submitList(objects)
156+ binding.objectEmptyText.visibility =
157+ if (objects.isEmpty()) View .VISIBLE else View .GONE
158+ }
159+ }
160+
161+ launch {
162+ r2ViewModel.selectedBucket.collect { bucket ->
163+ // 选中存储桶时显示fabAddObject,否则隐藏
164+ binding.fabAddObject.visibility = if (bucket != null ) View .VISIBLE else View .GONE
165+ }
166+ }
125167
126168 launch {
127169 r2ViewModel.loadingState.collect { isLoading ->
@@ -283,14 +325,9 @@ class R2Fragment : Fragment() {
283325 MaterialAlertDialogBuilder (requireContext())
284326 .setTitle(title)
285327 .setMessage(message)
286- .setPositiveButton(" 返回" ) { _, _ ->
287- // Return to objects list
288- showObjectsListDialog(account, bucket)
289- }
328+ .setPositiveButton(" 返回" , null )
290329 .setNeutralButton(if (customUrl != null ) " 复制自定义域 URL" else " 复制 URL" ) { _, _ ->
291330 copyToClipboard(customUrl ? : defaultUrl, if (customUrl != null ) " 自定义域 URL 已复制" else " URL 已复制" )
292- // Return to objects list after copying
293- showObjectsListDialog(account, bucket)
294331 }
295332 .setNegativeButton(" 更多" ) { _, _ ->
296333 // Show more options
@@ -307,33 +344,27 @@ class R2Fragment : Fragment() {
307344 } else {
308345 options.add(" 复制 URL" )
309346 }
310- options.add(" 下载" )
311347 options.add(" 删除" )
312-
348+
313349 MaterialAlertDialogBuilder (requireContext())
314350 .setTitle(" 操作" )
315351 .setItems(options.toTypedArray()) { _, which ->
316352 var index = 0
317353 when {
318354 customUrl != null && which == index++ -> {
319355 copyToClipboard(customUrl, " 自定义域 URL 已复制" )
320- showObjectsListDialog(account, bucket)
321356 }
322357 which == index++ -> {
323358 copyToClipboard(if (customUrl != null ) defaultUrl else defaultUrl, if (customUrl != null ) " 默认 URL 已复制" else " URL 已复制" )
324- showObjectsListDialog(account, bucket)
325- }
326- which == index++ -> {
327- downloadObject(bucket, obj)
328- showObjectsListDialog(account, bucket)
329359 }
330360 which == index -> {
331361 showDeleteObjectDialog(bucket, obj)
332362 }
333363 }
334364 }
335365 .setNegativeButton(" 返回" ) { _, _ ->
336- showObjectsListDialog(account, bucket)
366+ // 返回对象详情弹窗
367+ showObjectDetailsDialog(account, bucket, obj, r2ViewModel.customDomains.value)
337368 }
338369 .show()
339370 }
0 commit comments