Skip to content

Commit 41b1eba

Browse files
authored
Refactor/test repositories (#48)
2 parents 21a42da + b1cc8ac commit 41b1eba

28 files changed

+806
-67
lines changed

app/src/main/java/ir/mehdiyari/krypt/app/MainViewModel.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@ import dagger.hilt.android.lifecycle.HiltViewModel
66
import ir.mehdiyari.krypt.app.user.CurrentUserManager
77
import ir.mehdiyari.krypt.app.user.UserKeyProvider
88
import ir.mehdiyari.krypt.app.user.UsernameProvider
9-
import ir.mehdiyari.krypt.data.repositories.AccountsRepository
10-
import ir.mehdiyari.krypt.data.repositories.SettingsRepository
9+
import ir.mehdiyari.krypt.data.repositories.account.AccountsRepository
10+
import ir.mehdiyari.krypt.data.repositories.settings.SettingsRepository
1111
import ir.mehdiyari.krypt.di.qualifiers.DispatcherDefault
1212
import ir.mehdiyari.krypt.ui.settings.AutoLockItemsEnum
13-
import ir.mehdiyari.krypt.app.di.SplashDelay
1413
import kotlinx.coroutines.CoroutineDispatcher
1514
import kotlinx.coroutines.Job
1615
import kotlinx.coroutines.delay
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package ir.mehdiyari.krypt.data.repositories.account
2+
3+
interface AccountsRepository {
4+
5+
suspend fun addAccount(
6+
name: String,
7+
password: String,
8+
passwordConfig: String
9+
): Pair<Boolean, Throwable?>
10+
11+
suspend fun getAllAccountsName(): List<String>
12+
13+
suspend fun isAccountExists(): Boolean
14+
15+
suspend fun login(
16+
accountName: String,
17+
password: String
18+
): Boolean
19+
20+
suspend fun validatePassword(
21+
password: String
22+
): Boolean
23+
24+
suspend fun deleteCurrentAccount()
25+
}

app/src/main/java/ir/mehdiyari/krypt/data/repositories/AccountsRepository.kt app/src/main/java/ir/mehdiyari/krypt/data/repositories/account/AccountsRepositoryImpl.kt

+11-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ir.mehdiyari.krypt.data.repositories
1+
package ir.mehdiyari.krypt.data.repositories.account
22

33
import ir.mehdiyari.krypt.app.user.CurrentUserManager
44
import ir.mehdiyari.krypt.app.user.UserKeyProvider
@@ -22,16 +22,17 @@ import javax.inject.Inject
2222
import javax.inject.Singleton
2323

2424
@Singleton
25-
class AccountsRepository @Inject constructor(
25+
class AccountsRepositoryImpl @Inject constructor(
2626
private val accountsDao: AccountsDao,
2727
private val symmetricHelper: SymmetricHelper,
2828
private val kryptKeyGenerator: KryptKeyGenerator,
2929
private val currentUserManager: CurrentUserManager,
3030
private val usernameProvider: UsernameProvider,
3131
private val userKeyProvider: UserKeyProvider,
3232
private val hashingUtils: HashingUtils,
33-
) {
34-
suspend fun addAccount(
33+
) : AccountsRepository {
34+
35+
override suspend fun addAccount(
3536
name: String,
3637
password: String,
3738
passwordConfig: String
@@ -66,11 +67,12 @@ class AccountsRepository @Inject constructor(
6667
return true to null
6768
}
6869

69-
suspend fun getAllAccountsName(): List<String> = accountsDao.getAccounts().map { it.name }
70+
override suspend fun getAllAccountsName(): List<String> =
71+
accountsDao.getAccounts().map { it.name }
7072

71-
suspend fun isAccountExists(): Boolean = accountsDao.isAnyAccountExist()
73+
override suspend fun isAccountExists(): Boolean = accountsDao.isAnyAccountExist()
7274

73-
suspend fun login(
75+
override suspend fun login(
7476
accountName: String,
7577
password: String
7678
): Boolean {
@@ -111,7 +113,7 @@ class AccountsRepository @Inject constructor(
111113
}
112114
}
113115

114-
suspend fun validatePassword(
116+
override suspend fun validatePassword(
115117
password: String
116118
): Boolean {
117119
val account =
@@ -127,7 +129,7 @@ class AccountsRepository @Inject constructor(
127129
return SecretKeySpec(keyBytes, "AES") == userKeyProvider.getKey()
128130
}
129131

130-
suspend fun deleteCurrentAccount() {
132+
override suspend fun deleteCurrentAccount() {
131133
accountsDao.deleteCurrentAccount(usernameProvider.getUsername()!!)
132134
}
133135
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ir.mehdiyari.krypt.data.repositories.files
2+
3+
import java.io.File
4+
import javax.inject.Inject
5+
6+
class FileWrapper @Inject constructor() {
7+
fun delete(filePath: String) = File(filePath).delete()
8+
9+
fun length(filePath: String) = File(filePath).length()
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package ir.mehdiyari.krypt.data.repositories.files
2+
3+
import ir.mehdiyari.krypt.data.file.FileEntity
4+
import ir.mehdiyari.krypt.data.file.FileTypeEnum
5+
6+
interface FilesRepository {
7+
suspend fun getAllFilesTypeCounts(): List<Pair<FileTypeEnum, Long>>
8+
9+
suspend fun insertFiles(
10+
files: List<FileEntity>
11+
)
12+
13+
suspend fun getMediasCount(): Long
14+
15+
suspend fun getLastEncryptedMediaThumbnail(): String?
16+
17+
suspend fun getLastEncryptedPhotoThumbnail(): String?
18+
19+
suspend fun getLastEncryptedVideoThumbnail(): String?
20+
21+
suspend fun getAllEncryptedMedia(): List<FileEntity>
22+
23+
suspend fun mapThumbnailsAndNameToFileEntity(medias: Array<String>): List<FileEntity>
24+
25+
suspend fun deleteEncryptedFilesFromKryptDBAndFileSystem(files: List<FileEntity>)
26+
27+
suspend fun getAllTextFiles(): List<FileEntity>
28+
29+
suspend fun getFileById(id: Long): FileEntity?
30+
31+
suspend fun getAllFiles(): List<FileEntity>
32+
33+
suspend fun getAllFilesSize(): Long
34+
35+
suspend fun getAllImages(): List<FileEntity>
36+
37+
suspend fun getAllVideos(): List<FileEntity>
38+
39+
suspend fun getPhotosCount(): Long
40+
41+
suspend fun getAudiosCount(): Long
42+
43+
suspend fun getVideosCount(): Long
44+
45+
suspend fun getFileByThumbPath(thumbFileName: String): FileEntity?
46+
47+
suspend fun getAllAudioFiles(): List<FileEntity>
48+
49+
suspend fun updateFile(fileEntity: FileEntity): Unit
50+
51+
suspend fun getAudioById(id: Long): FileEntity?
52+
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ir.mehdiyari.krypt.data.repositories
1+
package ir.mehdiyari.krypt.data.repositories.files
22

33
import ir.mehdiyari.krypt.app.user.UsernameProvider
44
import ir.mehdiyari.krypt.data.backup.BackupDao
@@ -9,20 +9,20 @@ import ir.mehdiyari.krypt.di.qualifiers.DispatcherIO
99
import ir.mehdiyari.krypt.utils.FilesUtilities
1010
import kotlinx.coroutines.CoroutineDispatcher
1111
import kotlinx.coroutines.withContext
12-
import java.io.File
1312
import javax.inject.Inject
1413
import javax.inject.Singleton
1514

1615
@Singleton
17-
class FilesRepository @Inject constructor(
16+
class FilesRepositoryImpl @Inject constructor(
1817
private val filedDao: FilesDao,
1918
private val backupDao: BackupDao,
2019
private val usernameProvider: UsernameProvider,
2120
private val filesUtilities: FilesUtilities,
21+
private val fileWrapper: FileWrapper,
2222
@DispatcherIO private val ioDispatcher: CoroutineDispatcher
23-
) {
23+
) : FilesRepository {
2424

25-
suspend fun getAllFilesTypeCounts(): List<Pair<FileTypeEnum, Long>> =
25+
override suspend fun getAllFilesTypeCounts(): List<Pair<FileTypeEnum, Long>> =
2626
mutableListOf<Pair<FileTypeEnum, Long>>().apply {
2727
FileTypeEnum.values().forEach { fileType ->
2828
add(
@@ -39,29 +39,29 @@ class FilesRepository @Inject constructor(
3939
}.toList()
4040

4141

42-
suspend fun insertFiles(
42+
override suspend fun insertFiles(
4343
files: List<FileEntity>
4444
) {
4545
filedDao.insertFiles(files.map {
4646
it.copy(accountName = usernameProvider.getUsername()!!)
4747
})
4848
}
4949

50-
suspend fun getMediasCount(): Long = filedDao.getFilesCountBasedOnType(
50+
override suspend fun getMediasCount(): Long = filedDao.getFilesCountBasedOnType(
5151
usernameProvider.getUsername()!!,
5252
FileTypeEnum.Photo
5353
) + filedDao.getFilesCountBasedOnType(
5454
usernameProvider.getUsername()!!,
5555
FileTypeEnum.Video
5656
)
5757

58-
suspend fun getLastEncryptedMediaThumbnail(): String? =
58+
override suspend fun getLastEncryptedMediaThumbnail(): String? =
5959
internalGetLastThumb(FileTypeEnum.Photo, FileTypeEnum.Video)
6060

61-
suspend fun getLastEncryptedPhotoThumbnail(): String? =
61+
override suspend fun getLastEncryptedPhotoThumbnail(): String? =
6262
internalGetLastThumb(FileTypeEnum.Photo)
6363

64-
suspend fun getLastEncryptedVideoThumbnail(): String? =
64+
override suspend fun getLastEncryptedVideoThumbnail(): String? =
6565
internalGetLastThumb(FileTypeEnum.Video)
6666

6767
private suspend fun internalGetLastThumb(
@@ -73,12 +73,12 @@ class FilesRepository @Inject constructor(
7373
it.metaData.isNotBlank()
7474
}?.metaData
7575

76-
suspend fun getAllEncryptedMedia(): List<FileEntity> =
76+
override suspend fun getAllEncryptedMedia(): List<FileEntity> =
7777
filedDao.getAllMedia(
7878
usernameProvider.getUsername()!!
7979
)
8080

81-
suspend fun mapThumbnailsAndNameToFileEntity(medias: Array<String>): List<FileEntity> =
81+
override suspend fun mapThumbnailsAndNameToFileEntity(medias: Array<String>): List<FileEntity> =
8282
mutableListOf<FileEntity>().apply {
8383
getAllEncryptedMedia().filter {
8484
medias.any { currentMedia ->
@@ -92,32 +92,32 @@ class FilesRepository @Inject constructor(
9292
}.also(this::addAll)
9393
}
9494

95-
suspend fun deleteEncryptedFilesFromKryptDBAndFileSystem(files: List<FileEntity>) {
95+
override suspend fun deleteEncryptedFilesFromKryptDBAndFileSystem(files: List<FileEntity>) {
9696
filedDao.deleteFiles(files)
9797
files.forEach {
98-
File(it.filePath).delete()
98+
fileWrapper.delete(it.filePath)
9999
if (
100100
it.metaData.isNotBlank()
101101
&& (it.type == FileTypeEnum.Photo || it.type == FileTypeEnum.Video)
102102
) {
103-
File(it.metaData).delete()
103+
fileWrapper.delete(it.metaData)
104104
}
105105
}
106106
}
107107

108-
suspend fun getAllTextFiles(): List<FileEntity> =
108+
override suspend fun getAllTextFiles(): List<FileEntity> =
109109
filedDao.getAllFilesOfCurrentAccountBasedOnType(
110110
usernameProvider.getUsername()!!,
111111
FileTypeEnum.Text
112112
)
113113

114-
suspend fun getFileById(id: Long): FileEntity? =
114+
override suspend fun getFileById(id: Long): FileEntity? =
115115
filedDao.getFileById(usernameProvider.getUsername()!!, id)
116116

117-
suspend fun getAllFiles(): List<FileEntity> =
117+
override suspend fun getAllFiles(): List<FileEntity> =
118118
filedDao.getAllFiles(usernameProvider.getUsername()!!)
119119

120-
suspend fun getAllFilesSize(): Long {
120+
override suspend fun getAllFilesSize(): Long {
121121
var total = 0L
122122
(try {
123123
mutableListOf<String>().apply {
@@ -127,56 +127,56 @@ class FilesRepository @Inject constructor(
127127
} catch (t: Throwable) {
128128
null
129129
})?.map {
130-
File(it).length()
130+
fileWrapper.length(it)
131131
}?.forEach {
132132
total += it
133133
}
134134

135135
return total
136136
}
137137

138-
suspend fun getAllImages(): List<FileEntity> = filedDao.getAllMedia(
138+
override suspend fun getAllImages(): List<FileEntity> = filedDao.getAllMedia(
139139
usernameProvider.getUsername()!!, listOf(FileTypeEnum.Photo)
140140
)
141141

142-
suspend fun getAllVideos(): List<FileEntity> = filedDao.getAllMedia(
142+
override suspend fun getAllVideos(): List<FileEntity> = filedDao.getAllMedia(
143143
usernameProvider.getUsername()!!, listOf(FileTypeEnum.Video)
144144
)
145145

146-
suspend fun getPhotosCount(): Long = filedDao.getFilesCountBasedOnType(
146+
override suspend fun getPhotosCount(): Long = filedDao.getFilesCountBasedOnType(
147147
usernameProvider.getUsername()!!,
148148
FileTypeEnum.Photo
149149
)
150150

151-
suspend fun getAudiosCount(): Long = withContext(ioDispatcher) {
151+
override suspend fun getAudiosCount(): Long = withContext(ioDispatcher) {
152152
filedDao.getFilesCountBasedOnType(
153153
usernameProvider.getUsername()!!,
154154
FileTypeEnum.Audio
155155
)
156156
}
157157

158-
suspend fun getVideosCount(): Long = filedDao.getFilesCountBasedOnType(
158+
override suspend fun getVideosCount(): Long = filedDao.getFilesCountBasedOnType(
159159
usernameProvider.getUsername()!!,
160160
FileTypeEnum.Video
161161
)
162162

163-
suspend fun getFileByThumbPath(thumbFileName: String): FileEntity? =
163+
override suspend fun getFileByThumbPath(thumbFileName: String): FileEntity? =
164164
filedDao.getMediaFileByPath(
165165
usernameProvider.getUsername()!!, thumbFileName
166166
)
167167

168-
suspend fun getAllAudioFiles(): List<FileEntity> = withContext(ioDispatcher) {
168+
override suspend fun getAllAudioFiles(): List<FileEntity> = withContext(ioDispatcher) {
169169
filedDao.getAllFilesOfCurrentAccountBasedOnType(
170170
usernameProvider.getUsername()!!,
171171
FileTypeEnum.Audio
172172
)
173173
}
174174

175-
suspend fun updateFile(fileEntity: FileEntity): Unit = withContext(ioDispatcher) {
175+
override suspend fun updateFile(fileEntity: FileEntity): Unit = withContext(ioDispatcher) {
176176
filedDao.updateFile(fileEntity)
177177
}
178178

179-
suspend fun getAudioById(id: Long): FileEntity? = withContext(ioDispatcher) {
179+
override suspend fun getAudioById(id: Long): FileEntity? = withContext(ioDispatcher) {
180180
filedDao.getFileById(usernameProvider.getUsername()!!, id)
181181
}
182182
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package ir.mehdiyari.krypt.data.repositories.settings
2+
3+
import ir.mehdiyari.krypt.ui.settings.AutoLockItemsEnum
4+
5+
interface SettingsRepository {
6+
fun storeLockAutomatically(autoLockItemsEnum: AutoLockItemsEnum)
7+
fun getLockAutomaticallyValue(): AutoLockItemsEnum
8+
}

0 commit comments

Comments
 (0)