Skip to content

Commit 8e33dec

Browse files
committed
Issue #43: Implement create new folder option from link create view AmrDeveloper 20 minutes ago
1 parent 4c12d10 commit 8e33dec

File tree

5 files changed

+44
-13
lines changed

5 files changed

+44
-13
lines changed

app/src/main/java/com/amrdeveloper/linkhub/ui/adapter/FolderArrayAdapter.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,15 @@ import com.amrdeveloper.linkhub.R
99
import com.amrdeveloper.linkhub.data.Folder
1010
import com.amrdeveloper.linkhub.databinding.ListItemFolderBinding
1111

12-
private const val layoutID = R.layout.list_item_folder
13-
1412
class FolderArrayAdapter(
1513
context: Context,
16-
) : ArrayAdapter<Folder>(context, layoutID) {
14+
) : ArrayAdapter<Folder>(context, R.layout.list_item_folder) {
1715

1816
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
19-
val view = convertView ?: LayoutInflater.from(context).inflate(layoutID, parent, false)
17+
val view = convertView ?: LayoutInflater.from(context).inflate(R.layout.list_item_folder, parent, false)
2018
val binding = ListItemFolderBinding.bind(view)
2119
val folder = getItem(position)
22-
if(folder != null) {
20+
if (folder != null) {
2321
binding.folderNameTxt.text = folder.name
2422
binding.folderPinImg.visibility = if(folder.isPinned) View.VISIBLE else View.INVISIBLE
2523
binding.folderIconImg.setImageResource(folder.folderColor.drawableId)

app/src/main/java/com/amrdeveloper/linkhub/ui/folder/FolderFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import androidx.navigation.fragment.navArgs
1111
import com.amrdeveloper.linkhub.R
1212
import com.amrdeveloper.linkhub.data.Folder
1313
import com.amrdeveloper.linkhub.databinding.FragmentFolderBinding
14+
import com.amrdeveloper.linkhub.util.CREATED_FOLDER_NAME_KEY
1415
import com.amrdeveloper.linkhub.util.UiPreferences
1516
import com.amrdeveloper.linkhub.util.showError
1617
import com.amrdeveloper.linkhub.util.showSnackBar
@@ -110,6 +111,7 @@ class FolderFragment : Fragment() {
110111
val folderColor = binding.folderColorSelector.getCurrentFolderColor()
111112
val folder = Folder(name, isPinned, folderColor = folderColor)
112113

114+
findNavController().previousBackStackEntry?.savedStateHandle?.set(CREATED_FOLDER_NAME_KEY, folder.name)
113115
folderViewModel.createNewFolder(folder)
114116
}
115117

app/src/main/java/com/amrdeveloper/linkhub/ui/link/LinkFragment.kt

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ import com.amrdeveloper.linkhub.data.Link
1515
import com.amrdeveloper.linkhub.databinding.FragmentLinkBinding
1616
import com.amrdeveloper.linkhub.ui.adapter.FolderArrayAdapter
1717
import com.amrdeveloper.linkhub.ui.widget.PinnedLinksWidget
18+
import com.amrdeveloper.linkhub.util.CREATED_FOLDER_NAME_KEY
19+
import com.amrdeveloper.linkhub.util.CREATE_FOLDER_ID
20+
import com.amrdeveloper.linkhub.util.FOLDER_NONE_ID
1821
import com.amrdeveloper.linkhub.util.UiPreferences
1922
import com.amrdeveloper.linkhub.util.showError
2023
import com.amrdeveloper.linkhub.util.showSnackBar
2124
import dagger.hilt.android.AndroidEntryPoint
25+
import timber.log.Timber
2226
import java.text.DateFormat
2327
import javax.inject.Inject
2428

@@ -79,11 +83,11 @@ class LinkFragment : Fragment() {
7983
binding.linkPinnedSwitch.isChecked = currentLink.isPinned
8084
val linkCreatedStamp = if (currentLink.createdTime == 0L) System.currentTimeMillis() else currentLink.createdTime
8185
val formattedCreationDate = dateFormatter.format(linkCreatedStamp)
82-
binding.linkCreatedStatus.text =getString(R.string.created_at)+" ${formattedCreationDate}"
86+
binding.linkCreatedStatus.text = getString(R.string.created_at) + " ${formattedCreationDate}"
8387
if (currentLink.isUpdated) {
8488
val linkUpdatedStamp = if (currentLink.createdTime == 0L) System.currentTimeMillis() else currentLink.lastUpdatedTime
8589
val formattedUpdateDate = dateFormatter.format(linkUpdatedStamp)
86-
binding.linkUpdatedStatus.text =getString(R.string.updated_at)+" ${formattedUpdateDate}"
90+
binding.linkUpdatedStatus.text = getString(R.string.updated_at) + " ${formattedUpdateDate}"
8791
}
8892
if (currentLink.folderId != -1) linkViewModel.getFolderWithId(currentLink.folderId)
8993
}
@@ -95,8 +99,19 @@ class LinkFragment : Fragment() {
9599
linkFolderID = it.id
96100
}
97101

98-
linkViewModel.folderLiveData.observe(viewLifecycleOwner) {
99-
folderMenuAdapter.addAll(it)
102+
linkViewModel.folderLiveData.observe(viewLifecycleOwner) { folders ->
103+
folderMenuAdapter.clear()
104+
folderMenuAdapter.add(Folder(getString(R.string.folder_create), false, id = CREATE_FOLDER_ID))
105+
folderMenuAdapter.add(Folder(getString(R.string.none), false, id = FOLDER_NONE_ID))
106+
folderMenuAdapter.addAll(folders)
107+
binding.folderNameMenu.text.clear()
108+
109+
// Check if user created a new folder for this link and suggest it as the current link folder
110+
val newFolderCreatedName = findNavController().currentBackStackEntry?.savedStateHandle?.get<String>(CREATED_FOLDER_NAME_KEY) ?: return@observe
111+
val lastCreatedFolder = folders.find { it.name == newFolderCreatedName } ?: return@observe
112+
binding.folderNameMenu.setText(newFolderCreatedName, false)
113+
linkFolderID = lastCreatedFolder.id
114+
findNavController().currentBackStackEntry?.savedStateHandle?.remove<String>(CREATED_FOLDER_NAME_KEY)
100115
}
101116

102117
linkViewModel.linkInfoLiveData.observe(viewLifecycleOwner) {
@@ -116,12 +131,20 @@ class LinkFragment : Fragment() {
116131

117132
private fun setupFolderListMenu() {
118133
binding.folderNameMenu.setOnItemClickListener { _, _, position, _ ->
119-
val folder = folderMenuAdapter.getItem(position)
120-
if (folder != null) linkFolderID = folder.id
134+
val folder = folderMenuAdapter.getItem(position) ?: return@setOnItemClickListener
135+
linkFolderID = when (folder.id) {
136+
CREATE_FOLDER_ID -> {
137+
binding.folderNameMenu.setSelection(position + 1)
138+
findNavController().navigate(R.id.action_linkFragment_to_folderFragment)
139+
FOLDER_NONE_ID
140+
}
141+
else -> {
142+
folder.id
143+
}
144+
}
121145
}
122146

123147
folderMenuAdapter = FolderArrayAdapter(requireContext())
124-
folderMenuAdapter.add(Folder(getString(R.string.none), false, id = -1))
125148
binding.folderNameMenu.setAdapter(folderMenuAdapter)
126149
}
127150

app/src/main/java/com/amrdeveloper/linkhub/util/Constants.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ const val REPOSITORY_CONTRIBUTORS_URL = "$REPOSITORY_URL/graphs/contributors"
88
const val REPOSITORY_SPONSORSHIP_URL = "https://github.com/sponsors/AmrDeveloper"
99

1010
const val WIDGET_REFRESH_ACTION = "${packageName}.action.REFRESH"
11-
const val WIDGET_ITEM_CLICK_ACTION = "${packageName}.action.ITEM_CLICK"
11+
const val WIDGET_ITEM_CLICK_ACTION = "${packageName}.action.ITEM_CLICK"
12+
13+
const val CREATED_FOLDER_NAME_KEY = "CREATED_FOLDER_NAME"
14+
const val FOLDER_NONE_ID = -1
15+
const val CREATE_FOLDER_ID = -2

app/src/main/res/navigation/nav_graph.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@
6363
android:defaultValue="@null"
6464
app:argType="com.amrdeveloper.linkhub.data.Link"
6565
app:nullable="true" />
66+
67+
<action
68+
android:id="@+id/action_linkFragment_to_folderFragment"
69+
app:destination="@id/folderFragment" />
6670
</fragment>
6771

6872
<fragment

0 commit comments

Comments
 (0)