Skip to content

Commit 3db20b6

Browse files
committed
rewrite Manage Favorites activity to use a recyclerview
1 parent 554507f commit 3db20b6

File tree

5 files changed

+149
-74
lines changed

5 files changed

+149
-74
lines changed

app/src/main/kotlin/com/simplemobiletools/filemanager/activities/FavoritesActivity.kt

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,29 @@ import android.os.Bundle
44
import android.view.Menu
55
import android.view.MenuItem
66
import com.simplemobiletools.commons.dialogs.FilePickerDialog
7-
import com.simplemobiletools.commons.extensions.applyColorFilter
87
import com.simplemobiletools.commons.extensions.beVisibleIf
8+
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
99
import com.simplemobiletools.filemanager.R
10+
import com.simplemobiletools.filemanager.adapters.ManageFavoritesAdapter
1011
import com.simplemobiletools.filemanager.extensions.config
1112
import kotlinx.android.synthetic.main.activity_favorites.*
12-
import kotlinx.android.synthetic.main.item_favorite.view.*
1313

14-
class FavoritesActivity : SimpleActivity() {
14+
class FavoritesActivity : SimpleActivity(), RefreshRecyclerViewListener {
1515
override fun onCreate(savedInstanceState: Bundle?) {
1616
super.onCreate(savedInstanceState)
1717
setContentView(R.layout.activity_favorites)
1818
updateFavorites()
1919
}
2020

2121
private fun updateFavorites() {
22-
favorites_holder.removeAllViews()
23-
val favorites = config.favorites
24-
favorites_placeholder.beVisibleIf(favorites.isEmpty())
25-
favorites_placeholder.setTextColor(config.textColor)
22+
val favorites = ArrayList<String>()
23+
config.favorites.mapTo(favorites, { it })
24+
manage_favorites_placeholder.beVisibleIf(favorites.isEmpty())
25+
manage_favorites_placeholder.setTextColor(config.textColor)
2626

27-
for (favorite in favorites) {
28-
layoutInflater.inflate(R.layout.item_favorite, null, false).apply {
29-
favorite_title.apply {
30-
text = favorite
31-
setTextColor(config.textColor)
32-
}
33-
favorite_icon.apply {
34-
applyColorFilter(config.textColor)
35-
setOnClickListener {
36-
config.removeFavorite(favorite)
37-
updateFavorites()
38-
}
39-
}
40-
favorites_holder.addView(this)
41-
}
42-
}
27+
val adapter = ManageFavoritesAdapter(this, favorites, this, manage_favorites_list) {}
28+
adapter.setupDragListener(true)
29+
manage_favorites_list.adapter = adapter
4330
}
4431

4532
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
@@ -55,6 +42,10 @@ class FavoritesActivity : SimpleActivity() {
5542
return true
5643
}
5744

45+
override fun refreshItems() {
46+
updateFavorites()
47+
}
48+
5849
private fun addFavorite() {
5950
FilePickerDialog(this, pickFile = false, showHidden = config.shouldShowHidden) {
6051
config.addFavorite(it)
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.simplemobiletools.filemanager.adapters
2+
3+
import android.util.SparseArray
4+
import android.view.Menu
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import com.simplemobiletools.commons.activities.BaseSimpleActivity
8+
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
9+
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
10+
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
11+
import com.simplemobiletools.commons.views.MyRecyclerView
12+
import com.simplemobiletools.filemanager.R
13+
import com.simplemobiletools.filemanager.extensions.config
14+
import kotlinx.android.synthetic.main.item_manage_favorite.view.*
15+
16+
class ManageFavoritesAdapter(activity: BaseSimpleActivity, var favorites: ArrayList<String>, val listener: RefreshRecyclerViewListener?,
17+
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
18+
19+
private val config = activity.config
20+
21+
init {
22+
selectableItemCount = favorites.size
23+
}
24+
25+
override fun getActionMenuId() = R.menu.cab_delete_only
26+
27+
override fun prepareActionMode(menu: Menu) {}
28+
29+
override fun prepareItemSelection(view: View) {}
30+
31+
override fun markItemSelection(select: Boolean, view: View?) {
32+
view?.manage_favorite_holder?.isSelected = select
33+
}
34+
35+
override fun actionItemPressed(id: Int) {
36+
when (id) {
37+
R.id.cab_delete -> askConfirmDelete()
38+
}
39+
}
40+
41+
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = createViewHolder(R.layout.item_manage_favorite, parent)
42+
43+
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
44+
val favorite = favorites[position]
45+
val view = holder.bindView(favorite) {
46+
setupView(it, favorite)
47+
}
48+
bindViewHolder(holder, position, view)
49+
}
50+
51+
override fun getItemCount() = favorites.size
52+
53+
private fun setupView(view: View, favorite: String) {
54+
view.apply {
55+
manage_favorite_title.apply {
56+
text = favorite
57+
setTextColor(config.textColor)
58+
}
59+
}
60+
}
61+
62+
private fun askConfirmDelete() {
63+
ConfirmationDialog(activity) {
64+
deleteSelection()
65+
}
66+
}
67+
68+
private fun deleteSelection() {
69+
val removeFavorites = ArrayList<String>(selectedPositions.size)
70+
71+
selectedPositions.sortedDescending().forEach {
72+
val favorite = favorites[it]
73+
removeFavorites.add(favorite)
74+
notifyItemRemoved(it)
75+
itemViews.put(it, null)
76+
config.removeFavorite(favorite)
77+
}
78+
79+
favorites.removeAll(removeFavorites)
80+
selectedPositions.clear()
81+
82+
val newItems = SparseArray<View>()
83+
(0 until itemViews.size())
84+
.filter { itemViews[it] != null }
85+
.forEachIndexed { curIndex, i -> newItems.put(curIndex, itemViews[i]) }
86+
87+
itemViews = newItems
88+
selectableItemCount = favorites.size
89+
finishActMode()
90+
if (favorites.isEmpty()) {
91+
listener?.refreshItems()
92+
}
93+
}
94+
}
Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,27 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<ScrollView
2+
<RelativeLayout
33
xmlns:android="http://schemas.android.com/apk/res/android"
4-
android:id="@+id/favorites_scrollview"
4+
xmlns:app="http://schemas.android.com/apk/res-auto"
5+
android:id="@+id/manage_favorites_wrapper"
56
android:layout_width="match_parent"
67
android:layout_height="wrap_content">
78

8-
<RelativeLayout
9-
android:id="@+id/favorites_wrapper"
9+
<com.simplemobiletools.commons.views.MyRecyclerView
10+
android:id="@+id/manage_favorites_list"
1011
android:layout_width="match_parent"
11-
android:layout_height="wrap_content">
12+
android:layout_height="match_parent"
13+
android:clipToPadding="false"
14+
app:layoutManager="android.support.v7.widget.LinearLayoutManager"/>
1215

13-
<LinearLayout
14-
android:id="@+id/favorites_holder"
15-
android:layout_width="match_parent"
16-
android:layout_height="wrap_content"
17-
android:orientation="vertical"/>
16+
<com.simplemobiletools.commons.views.MyTextView
17+
android:id="@+id/manage_favorites_placeholder"
18+
android:layout_width="match_parent"
19+
android:layout_height="wrap_content"
20+
android:gravity="center_horizontal"
21+
android:paddingLeft="@dimen/big_margin"
22+
android:paddingRight="@dimen/big_margin"
23+
android:paddingTop="@dimen/activity_margin"
24+
android:text="@string/favorites_activity_placeholder"
25+
android:visibility="gone"/>
1826

19-
<com.simplemobiletools.commons.views.MyTextView
20-
android:id="@+id/favorites_placeholder"
21-
android:layout_width="match_parent"
22-
android:layout_height="wrap_content"
23-
android:gravity="center_horizontal"
24-
android:paddingLeft="@dimen/big_margin"
25-
android:paddingRight="@dimen/big_margin"
26-
android:paddingTop="@dimen/activity_margin"
27-
android:text="@string/favorites_activity_placeholder"
28-
android:visibility="gone"/>
29-
</RelativeLayout>
30-
</ScrollView>
27+
</RelativeLayout>

app/src/main/res/layout/item_favorite.xml

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RelativeLayout
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:id="@+id/manage_favorite_holder"
5+
android:layout_width="match_parent"
6+
android:layout_height="wrap_content"
7+
android:background="?attr/selectableItemBackground"
8+
android:clickable="true"
9+
android:focusable="true"
10+
android:foreground="@drawable/selector"
11+
android:padding="@dimen/activity_margin">
12+
13+
<com.simplemobiletools.commons.views.MyTextView
14+
android:id="@+id/manage_favorite_title"
15+
android:layout_width="match_parent"
16+
android:layout_height="wrap_content"
17+
android:layout_centerVertical="true"
18+
android:layout_marginLeft="@dimen/medium_margin"
19+
android:layout_marginRight="@dimen/medium_margin"
20+
android:layout_marginTop="@dimen/medium_margin"/>
21+
22+
</RelativeLayout>

0 commit comments

Comments
 (0)