Skip to content

Commit fe850f6

Browse files
authored
url delete feature implemented, with minor fixes
url delete feature implemented, with minor fixes
2 parents 55e7e02 + cc9e14e commit fe850f6

File tree

20 files changed

+483
-105
lines changed

20 files changed

+483
-105
lines changed

app/src/main/java/com/github/code/gambit/data/entity/network/UrlNetworkEntity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class UrlNetworkEntity(
2323

2424
@SerializedName("visible")
2525
@Expose
26-
var visible: String,
26+
var visible: Boolean,
2727

2828
@SerializedName("clicks_left")
2929
@Expose

app/src/main/java/com/github/code/gambit/data/mapper/network/UrlNetworkMapper.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ constructor() : EntityMapper<UrlNetworkEntity, Url> {
1515
fileId = entity.pk,
1616
hash = entity.hash,
1717
timestamp = entity.sk.split("#")[1],
18-
visible = entity.visible == "true",
18+
visible = entity.visible,
1919
clicksLeft = entity.clicks_left
2020
)
2121
}
@@ -24,7 +24,7 @@ constructor() : EntityMapper<UrlNetworkEntity, Url> {
2424
return UrlNetworkEntity(
2525
hash = domainModel.hash,
2626
gs1_pk = domainModel.id,
27-
visible = domainModel.visible.toString(),
27+
visible = domainModel.visible,
2828
clicks_left = domainModel.clicksLeft
2929
)
3030
}

app/src/main/java/com/github/code/gambit/data/remote/NetworkDataSource.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ interface NetworkDataSource {
1313

1414
suspend fun getUrls(fileId: String): List<Url>
1515
suspend fun generateUrl(url: Url): Url
16-
suspend fun updateUrl(fileId: String, urlId: String, url: Url): Url
17-
suspend fun deleteUrl(fileId: String, urlId: String): Url
16+
suspend fun updateUrl(url: Url): Url
17+
suspend fun deleteUrl(url: Url): Url
1818

1919
suspend fun getUser(): User
2020
suspend fun updateUser(user: User): User

app/src/main/java/com/github/code/gambit/data/remote/NetworkDataSourceImpl.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,19 @@ class NetworkDataSourceImpl(
4545
}
4646

4747
override suspend fun generateUrl(url: Url): Url {
48-
val id = urlService.generateUrl(url.fileId, urlNetworkMapper.mapToEntity(url))
49-
url.id = id
50-
return url
48+
val networkEntity = urlService.generateUrl(url.fileId, urlNetworkMapper.mapToEntity(url))
49+
return urlNetworkMapper.mapFromEntity(networkEntity)
5150
}
5251

53-
override suspend fun updateUrl(fileId: String, urlId: String, url: Url): Url {
52+
override suspend fun updateUrl(url: Url): Url {
53+
val fileId = url.fileId
54+
val urlId = url.timestamp
5455
return urlNetworkMapper.mapFromEntity(urlService.updateUrl(fileId, urlId, urlNetworkMapper.mapToEntity(url)))
5556
}
5657

57-
override suspend fun deleteUrl(fileId: String, urlId: String): Url {
58+
override suspend fun deleteUrl(url: Url): Url {
59+
val fileId = url.fileId
60+
val urlId = url.timestamp
5861
return urlNetworkMapper.mapFromEntity(urlService.deleteUrl(fileId, urlId))
5962
}
6063

app/src/main/java/com/github/code/gambit/data/remote/services/ApiService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ interface ApiService {
5353
suspend fun getUrls(@Path(AppConstant.API_PATH.FILE_ID) fileId: String): ListResponse<UrlNetworkEntity>
5454

5555
@POST("file/{${AppConstant.API_PATH.FILE_ID}}/url")
56-
suspend fun generateUrl(@Path(AppConstant.API_PATH.FILE_ID) fileId: String, @Body urlNetworkEntity: UrlNetworkEntity): Response<String>
56+
suspend fun generateUrl(@Path(AppConstant.API_PATH.FILE_ID) fileId: String, @Body urlNetworkEntity: UrlNetworkEntity): Response<UrlNetworkEntity>
5757

5858
@PUT("file/{${AppConstant.API_PATH.FILE_ID}}/url/{${AppConstant.API_PATH.URL_ID}}")
5959
suspend fun updateUrl(

app/src/main/java/com/github/code/gambit/data/remote/services/url/UrlService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.github.code.gambit.data.entity.network.UrlNetworkEntity
55
interface UrlService {
66

77
suspend fun getUrls(fileId: String): List<UrlNetworkEntity>
8-
suspend fun generateUrl(fileId: String, urlNetworkEntity: UrlNetworkEntity): String
8+
suspend fun generateUrl(fileId: String, urlNetworkEntity: UrlNetworkEntity): UrlNetworkEntity
99
suspend fun updateUrl(fileId: String, urlId: String, urlNetworkEntity: UrlNetworkEntity): UrlNetworkEntity
1010
suspend fun deleteUrl(fileId: String, urlId: String): UrlNetworkEntity
1111
}

app/src/main/java/com/github/code/gambit/data/remote/services/url/UrlServiceImpl.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.github.code.gambit.data.remote.services.url
33
import com.github.code.gambit.data.entity.network.UrlNetworkEntity
44
import com.github.code.gambit.data.remote.apiRequest
55
import com.github.code.gambit.data.remote.services.ApiService
6+
import com.github.code.gambit.utility.extention.getAbsoluteId
67
import com.github.code.gambit.utility.sharedpreference.LastEvaluatedKeyManager
78

89
class UrlServiceImpl(val apiService: ApiService, private val lekManager: LastEvaluatedKeyManager) : UrlService {
@@ -13,16 +14,16 @@ class UrlServiceImpl(val apiService: ApiService, private val lekManager: LastEva
1314
}
1415
}
1516

16-
override suspend fun generateUrl(fileId: String, urlNetworkEntity: UrlNetworkEntity): String {
17+
override suspend fun generateUrl(fileId: String, urlNetworkEntity: UrlNetworkEntity): UrlNetworkEntity {
1718
val id = fileId.split("#")[1]
1819
return apiRequest { apiService.generateUrl(id, urlNetworkEntity) }
1920
}
2021

2122
override suspend fun updateUrl(fileId: String, urlId: String, urlNetworkEntity: UrlNetworkEntity): UrlNetworkEntity {
22-
return apiRequest { apiService.updateUrl(fileId, urlId, urlNetworkEntity) }
23+
return apiRequest { apiService.updateUrl(fileId.getAbsoluteId(), urlId.getAbsoluteId(), urlNetworkEntity) }
2324
}
2425

2526
override suspend fun deleteUrl(fileId: String, urlId: String): UrlNetworkEntity {
26-
return apiRequest { apiService.deleteUrl(fileId, urlId) }
27+
return apiRequest { apiService.deleteUrl(fileId.getAbsoluteId(), urlId.getAbsoluteId()) }
2728
}
2829
}

app/src/main/java/com/github/code/gambit/repositories/home/HomeRepository.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ interface HomeRepository {
1414
suspend fun deleteFile(file: File): Flow<ServiceResult<Boolean>>
1515
suspend fun generateUrl(file: File): Flow<ServiceResult<Url>>
1616
suspend fun getUrls(fileId: String): Flow<ServiceResult<List<Url>>>
17+
suspend fun updateUrl(url: Url): Flow<ServiceResult<Url>>
18+
suspend fun deleteUrl(url: Url): Flow<ServiceResult<Url>>
1719
}

app/src/main/java/com/github/code/gambit/repositories/home/HomeRepositoryImpl.kt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ constructor(
9595
val data: Url
9696
try {
9797
data = networkDataSource.generateUrl(url)
98-
// cacheDataSource.insertUrls(listOf(data))
98+
cacheDataSource.insertUrls(listOf(data))
9999
emit(ServiceResult.Success(data))
100100
} catch (internet: NoInternetException) {
101101
emit(ServiceResult.Error(internet))
@@ -121,4 +121,26 @@ constructor(
121121
}
122122
}
123123
}
124+
125+
override suspend fun updateUrl(url: Url): Flow<ServiceResult<Url>> {
126+
return flow {
127+
try {
128+
val data = networkDataSource.updateUrl(url)
129+
emit(ServiceResult.Success(data))
130+
} catch (exception: Exception) {
131+
emit(ServiceResult.Error(exception))
132+
}
133+
}
134+
}
135+
136+
override suspend fun deleteUrl(url: Url): Flow<ServiceResult<Url>> {
137+
return flow {
138+
try {
139+
val data = networkDataSource.deleteUrl(url)
140+
emit(ServiceResult.Success(data))
141+
} catch (exception: Exception) {
142+
emit(ServiceResult.Error(exception))
143+
}
144+
}
145+
}
124146
}

app/src/main/java/com/github/code/gambit/ui/fragment/home/FileListAdapter.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,25 @@ class FileListAdapter(val context: Context) :
107107
notifyUrlListUpdated(urls[0].fileId)
108108
}
109109

110+
fun updateUrl(url: Url) {
111+
val file = getFile(url)
112+
file?.urls?.find { it.id == url.id }?.apply {
113+
this.clicksLeft = url.clicksLeft
114+
this.visible = url.visible
115+
}
116+
notifyUrlListUpdated(file?.id)
117+
}
118+
119+
fun deleteUrl(url: Url) {
120+
val file = getFile(url)
121+
file?.let {
122+
it.urls.find { it.id == url.id }?.apply {
123+
it.urls.remove(this)
124+
notifyDataSetChanged()
125+
}
126+
}
127+
}
128+
110129
private fun getFile(url: Url) = getDataList.find { it.id == url.fileId }
111130

112131
private fun getUrlAdapter(fileId: String?): UrlListAdapter? = map[fileId]

app/src/main/java/com/github/code/gambit/ui/fragment/home/main/HomeFragment.kt

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.github.code.gambit.ui.fragment.home.filtercomponent.Filter
2525
import com.github.code.gambit.ui.fragment.home.filtercomponent.FilterComponent
2626
import com.github.code.gambit.ui.fragment.home.filtercomponent.FilterType
2727
import com.github.code.gambit.ui.fragment.home.searchcomponent.FileSearchComponent
28+
import com.github.code.gambit.ui.fragment.home.urlcomponent.UrlComponent
2829
import com.github.code.gambit.utility.extention.copyToClipboard
2930
import com.github.code.gambit.utility.extention.exitFullscreen
3031
import com.github.code.gambit.utility.extention.hide
@@ -78,6 +79,7 @@ class HomeFragment : Fragment(R.layout.fragment_home), FileUrlClickCallback, Bot
7879

7980
private lateinit var fileSearchComponent: FileSearchComponent
8081
private lateinit var filterComponent: FilterComponent
82+
private lateinit var urlComponent: UrlComponent
8183

8284
private val customDateFormat = SimpleDateFormat("dd MMM YY", Locale.getDefault())
8385

@@ -89,6 +91,7 @@ class HomeFragment : Fragment(R.layout.fragment_home), FileUrlClickCallback, Bot
8991
activity?.window?.exitFullscreen()
9092
lekManager.flush()
9193
registerFilterComponents()
94+
registerUrlComponent()
9295
binding.linearProgress.hide()
9396
binding.filterButton.setOnClickListener {
9497
showFilter()
@@ -129,11 +132,23 @@ class HomeFragment : Fragment(R.layout.fragment_home), FileUrlClickCallback, Bot
129132
viewModel.setEvent(HomeEvent.GetFiles)
130133
}
131134

135+
private fun registerUrlComponent() {
136+
urlComponent = UrlComponent.bind(
137+
requireContext(), {},
138+
{ url ->
139+
viewModel.setEvent(HomeEvent.UpdateUrl(url))
140+
}
141+
) { url ->
142+
viewModel.setEvent(HomeEvent.UpdateUrl(url, true))
143+
}
144+
}
145+
132146
private fun registerEventCallbacks() {
133147
viewModel.homeState.observe(viewLifecycleOwner) {
134148
when (it) {
135149
is HomeState.Error -> {
136150
binding.linearProgress.hide()
151+
urlComponent.hide()
137152
longToast(it.message)
138153
}
139154
is HomeState.FilesLoaded -> {
@@ -162,7 +177,8 @@ class HomeFragment : Fragment(R.layout.fragment_home), FileUrlClickCallback, Bot
162177
}
163178
HomeState.LoadingUrl -> shortToast("Loading Url")
164179
is HomeState.UrlGenerated -> {
165-
stopShimmer()
180+
binding.linearProgress.hide()
181+
copyToClipboard(it.url.id)
166182
Timber.tag("home").i("${it.url.id}, ${it.url.fileId}")
167183
adapter.addUrl(it.url)
168184
}
@@ -202,6 +218,24 @@ class HomeFragment : Fragment(R.layout.fragment_home), FileUrlClickCallback, Bot
202218
adapter.remove(it.file)
203219
binding.linearProgress.hide()
204220
}
221+
is HomeState.UrlUpdateResult -> {
222+
if (it.delete) {
223+
if (it.success && it.updatedUrl != null) {
224+
it.updatedUrl.clicksLeft = 0
225+
adapter.deleteUrl(it.updatedUrl)
226+
longToast("Url deleted")
227+
} else {
228+
longToast("Delete of url failed")
229+
}
230+
} else {
231+
if (it.success && it.updatedUrl != null) {
232+
adapter.updateUrl(it.updatedUrl)
233+
} else {
234+
longToast("Update of url failed")
235+
}
236+
}
237+
urlComponent.hide()
238+
}
205239
}
206240
}
207241
}
@@ -427,7 +461,7 @@ class HomeFragment : Fragment(R.layout.fragment_home), FileUrlClickCallback, Bot
427461
}
428462

429463
override fun onUrlClick(url: Url, file: File) {
430-
Timber.tag("home").i("UrlClick: ${file.name}, ${url.id}")
464+
urlComponent.show(url, file)
431465
}
432466

433467
override fun onItemClick(item: File) {

app/src/main/java/com/github/code/gambit/ui/fragment/home/main/HomeViewModel.kt

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.github.code.gambit.ui.fragment.home.filtercomponent.Filter
1212
import dagger.hilt.android.lifecycle.HiltViewModel
1313
import kotlinx.coroutines.flow.collect
1414
import kotlinx.coroutines.launch
15+
import timber.log.Timber
1516
import java.lang.Exception
1617
import javax.inject.Inject
1718

@@ -50,6 +51,13 @@ constructor(private val homeRepository: HomeRepository) : ViewModel() {
5051
_homeState.postValue(HomeState.Loading())
5152
deleteFile(event.file)
5253
}
54+
is HomeEvent.UpdateUrl -> {
55+
if (event.delete) {
56+
updateUrl(event.updatedUrl, true)
57+
} else {
58+
updateUrl(event.updatedUrl)
59+
}
60+
}
5361
}
5462
}
5563
}
@@ -103,15 +111,44 @@ constructor(private val homeRepository: HomeRepository) : ViewModel() {
103111
}
104112
}
105113

114+
private suspend fun updateUrl(url: Url, delete: Boolean = false) {
115+
if (delete) {
116+
homeRepository.deleteUrl(url).collect {
117+
when (it) {
118+
is ServiceResult.Error -> {
119+
_homeState.postValue(
120+
HomeState.UrlUpdateResult(false, null, true)
121+
)
122+
Timber.tag("error").i(it.exception)
123+
postError(it.exception)
124+
}
125+
is ServiceResult.Success -> _homeState.postValue(
126+
HomeState.UrlUpdateResult(true, it.data, true)
127+
)
128+
}
129+
}
130+
return
131+
}
132+
homeRepository.updateUrl(url).collect {
133+
when (it) {
134+
is ServiceResult.Error -> {
135+
_homeState.postValue(HomeState.UrlUpdateResult(false, null))
136+
Timber.tag("error").i(it.exception)
137+
postError(it.exception)
138+
}
139+
is ServiceResult.Success -> _homeState.postValue(
140+
HomeState.UrlUpdateResult(true, it.data)
141+
)
142+
}
143+
}
144+
}
145+
106146
private suspend fun searchFile(searchString: String) {
107147
homeRepository.searchFile(searchString).collect {
108148
when (it) {
109149
is ServiceResult.Error -> postError(it.exception)
110150
is ServiceResult.Success -> _homeState.postValue(
111-
HomeState.FilesLoaded(
112-
it.data,
113-
true
114-
)
151+
HomeState.FilesLoaded(it.data, true)
115152
)
116153
}
117154
}
@@ -128,6 +165,7 @@ sealed class HomeEvent {
128165
data class DeleteFile(val file: File) : HomeEvent()
129166
data class GetUrls(val file: File) : HomeEvent()
130167
data class GenerateUrl(val file: File) : HomeEvent()
168+
data class UpdateUrl(val updatedUrl: Url, val delete: Boolean = false) : HomeEvent()
131169
data class SearchFile(val searchString: String) : HomeEvent()
132170
}
133171

@@ -139,5 +177,11 @@ sealed class HomeState {
139177
data class FilterResult(val files: List<File>, val filter: Filter) : HomeState()
140178
data class UrlsLoaded(val urls: List<Url>) : HomeState()
141179
data class UrlGenerated(val url: Url) : HomeState()
180+
data class UrlUpdateResult(
181+
val success: Boolean,
182+
val updatedUrl: Url?,
183+
val delete: Boolean = false
184+
) : HomeState()
185+
142186
data class Error(val message: String) : HomeState()
143187
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.github.code.gambit.ui.fragment.home.urlcomponent
2+
3+
import android.content.Context
4+
import com.github.code.gambit.data.model.File
5+
import com.github.code.gambit.data.model.Url
6+
7+
interface UrlComponent {
8+
companion object {
9+
fun bind(
10+
context: Context,
11+
onCancel: () -> Unit = {},
12+
onUpdate: (url: Url) -> Unit,
13+
onDelete: (url: Url) -> Unit
14+
): UrlComponent {
15+
return UrlComponentImpl(context).apply {
16+
this.addOnCancelCallback(onCancel)
17+
this.addOnUpdateCallback(onUpdate)
18+
this.addOnDeleteCallback(onDelete)
19+
}
20+
}
21+
}
22+
23+
fun show(url: Url, file: File)
24+
fun hide()
25+
}

0 commit comments

Comments
 (0)