Skip to content

Commit a9010b9

Browse files
authored
Merge pull request #57 from SSUDevelog/feature/#56-recent-search
Feature/#56 recent search
2 parents 428e3e3 + f9a0009 commit a9010b9

33 files changed

+463
-48
lines changed

app/build.gradle.kts

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ dependencies {
8282
implementation(AndroidX.NAVIGATION_CONPONENT_FRAGMENT)
8383
implementation(AndroidX.NAVIGATION_CONPONENT_UI)
8484
implementation(AndroidX.CONSTRAINT_LAYOUT)
85+
implementation(AndroidX.ROOM_RUNTIME)
86+
kapt(AndroidX.ROOM_COMPILER)
8587

8688
// Matrial Design
8789
implementation(Google.MATERIAL)

app/src/main/java/com/velogandroid/di/DataSourceModule.kt

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.velogandroid.di
22

3-
import com.data_remote.datasource.TagDataSourceImpl
43
import com.data_remote.datasource.SignDataSourceImpl
54
import com.data_remote.datasource.SubscribeDataSourceImpl
6-
import com.velogm.data.datasource.TagDataSource
5+
import com.data_remote.datasource.TagDataSourceImpl
6+
import com.velogm.data.datasource.SearchDataSource
7+
import com.velogm.data.datasource.SharedPreferencesDataSource
78
import com.velogm.data.datasource.SignDataSource
89
import com.velogm.data.datasource.SubscribeDataSource
10+
import com.velogm.data.datasource.TagDataSource
11+
import com.velogm.data_local.datasource.SearchDataSourceImpl
12+
import com.velogm.data_local.datasource.SharedPreferencesDataSourceImpl
913
import dagger.Binds
1014
import dagger.Module
1115
import dagger.hilt.InstallIn
@@ -28,4 +32,11 @@ abstract class DataSourceModule {
2832
@Binds
2933
abstract fun providesSubscribeDataSource(DataSourceImpl: SubscribeDataSourceImpl): SubscribeDataSource
3034

35+
@Singleton
36+
@Binds
37+
abstract fun providesSearchDataSource(DataSourceImpl: SearchDataSourceImpl): SearchDataSource
38+
39+
@Singleton
40+
@Binds
41+
abstract fun providesSharedPreferencesDataSource(DataSourceImpl: SharedPreferencesDataSourceImpl): SharedPreferencesDataSource
3142
}

app/src/main/java/com/velogandroid/di/Qualifier.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ import javax.inject.Qualifier
77
annotation class VelogRetrofit
88
@Qualifier
99
@Retention(AnnotationRetention.BINARY)
10-
annotation class Token
10+
annotation class Token
11+

app/src/main/java/com/velogandroid/di/RepoModule.kt

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.velogandroid.di
22

33
import com.velogm.data.repositoryimpl.AuthRepositoryImpl
4-
import com.velogm.data.repositoryimpl.TagRepositoryImpl
4+
import com.velogm.data.repositoryimpl.SearchRepositoryImpl
55
import com.velogm.data.repositoryimpl.SignRepositoryImpl
66
import com.velogm.data.repositoryimpl.SubscribeRepositoryImpl
7+
import com.velogm.data.repositoryimpl.TagRepositoryImpl
78
import com.velogm.domain.repository.AuthRepository
8-
import com.velogm.domain.repository.TagRepository
9+
import com.velogm.domain.repository.SearchRepository
910
import com.velogm.domain.repository.SignRepository
1011
import com.velogm.domain.repository.SubscribeRepository
12+
import com.velogm.domain.repository.TagRepository
1113
import dagger.Binds
1214
import dagger.Module
1315
import dagger.hilt.InstallIn
@@ -42,4 +44,9 @@ abstract class RepositoryModule {
4244
RepositoryImpl: SubscribeRepositoryImpl,
4345
): SubscribeRepository
4446

47+
@Binds
48+
@Singleton
49+
abstract fun bindsSearchRepository(
50+
RepositoryImpl: SearchRepositoryImpl,
51+
): SearchRepository
4552
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.velogandroid.di
2+
3+
import android.content.Context
4+
import androidx.room.Room
5+
import com.velogm.data_local.datasource.AppDatabase
6+
import com.velogm.data_local.datasource.dao.RecentSearchWordDao
7+
import dagger.Module
8+
import dagger.Provides
9+
import dagger.hilt.InstallIn
10+
import dagger.hilt.android.qualifiers.ApplicationContext
11+
import dagger.hilt.components.SingletonComponent
12+
import javax.inject.Singleton
13+
14+
@Module
15+
@InstallIn(SingletonComponent::class)
16+
object RoomModule {
17+
@Singleton
18+
@Provides
19+
fun provideDataBase(
20+
@ApplicationContext context: Context
21+
): AppDatabase =
22+
Room.databaseBuilder(context, AppDatabase::class.java, "velog_search.db").build()
23+
24+
@Provides
25+
@Singleton
26+
fun providesRoomDao(appDatabase: AppDatabase): RecentSearchWordDao =
27+
appDatabase.recentSearchWordDao()
28+
29+
}

app/src/main/java/com/velogandroid/di/UseCaseModule.kt

+19
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.velogandroid.di
22

3+
import com.velogm.domain.repository.SearchRepository
34
import com.velogm.domain.repository.SignRepository
45
import com.velogm.domain.repository.SubscribeRepository
56
import com.velogm.domain.repository.TagRepository
@@ -85,4 +86,22 @@ class UseCaseModule {
8586
fun provideAddFollowerUseCase(repository: SubscribeRepository): AddFollowerUseCase {
8687
return AddFollowerUseCase(repository)
8788
}
89+
90+
@Singleton
91+
@Provides
92+
fun provideGetRecentSearchWordUseCase(repository: SearchRepository): GetRecentSearchWordUseCase {
93+
return GetRecentSearchWordUseCase(repository)
94+
}
95+
96+
@Singleton
97+
@Provides
98+
fun provideAddRecentWordUseCase(repository: SearchRepository): AddRecentSearchWordUseCase {
99+
return AddRecentSearchWordUseCase(repository)
100+
}
101+
102+
@Singleton
103+
@Provides
104+
fun provideDeleteRecentWordUseCase(repository: SearchRepository): DeleteRecentSearchWordUseCase {
105+
return DeleteRecentSearchWordUseCase(repository)
106+
}
88107
}

buildSrc/src/main/java/Dependencies.kt

+8-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ object AndroidX {
1717
const val NAVIGATION_CONPONENT_UI =
1818
"androidx.navigation:navigation-ui-ktx:${Versions.NAV_VERSION}"
1919

20-
const val CONSTRAINT_LAYOUT = "androidx.constraintlayout:constraintlayout:${Versions.CONSTRAINT_VERSION}"
20+
const val CONSTRAINT_LAYOUT =
21+
"androidx.constraintlayout:constraintlayout:${Versions.CONSTRAINT_VERSION}"
22+
23+
const val ROOM_RUNTIME = "androidx.room:room-runtime:${Versions.ROOM_VERSION}"
24+
const val ROOM_COMPILER = "androidx.room:room-compiler:${Versions.ROOM_VERSION}"
25+
const val ROOM_KTX = "androidx.room:room-ktx:${Versions.ROOM_VERSION}"
2126
}
2227

2328
object TestDependencies {
@@ -33,7 +38,8 @@ object Google {
3338
const val HILT_ANDROID_COMPILER = "com.google.dagger:hilt-android-compiler:${Versions.HILT}"
3439
const val GOOGLE_PLAY =
3540
"com.google.android.gms:play-services-auth:${Versions.GOOGLE_PLAY_VERSION}"
36-
const val GOOGLE_FIREBASE_BOM = "com.google.firebase:firebase-bom:${Versions.GOOGLE_FIREBASE_BOM}"
41+
const val GOOGLE_FIREBASE_BOM =
42+
"com.google.firebase:firebase-bom:${Versions.GOOGLE_FIREBASE_BOM}"
3743
const val GOOGLE_FIREBASE_ANALYTICS = "com.google.firebase:firebase-analytics-ktx"
3844
const val GOOGLE_FIREBASE_MESSAGING = "com.google.firebase:firebase-messaging"
3945
}

buildSrc/src/main/java/Versions.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,11 @@ object Versions {
3838
const val ZXING_VERSION = "4.3.0"
3939

4040
const val CONSTRAINT_VERSION = "2.0.0-beta1"
41-
41+
4242
const val GOOGLE_PLAY_VERSION = "20.6.0"
4343
const val GOOGLE_SERVICE_VERSION = "4.4.0"
4444
const val GOOGLE_FIREBASE_BOM = "32.1.1"
4545

46+
const val ROOM_VERSION = "2.5.0"
47+
4648
}

data-local/build.gradle.kts

+4
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,13 @@ android {
3939
dependencies {
4040

4141
implementation(project(":domain"))
42+
implementation(project(":data"))
4243
// AndroidX
4344
implementation(AndroidX.APP_COMPAT)
4445
implementation(AndroidX.CORE_KTX)
46+
implementation(AndroidX.ROOM_RUNTIME)
47+
implementation(AndroidX.ROOM_KTX)
48+
kapt(AndroidX.ROOM_COMPILER)
4549
// Matrial Design
4650
implementation(Google.MATERIAL)
4751
// Test Dependency
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.velogm.data_local.datasource
2+
3+
import androidx.room.Database
4+
import androidx.room.RoomDatabase
5+
import com.velogm.data.dto.response.RecentSearchWordDto
6+
import com.velogm.data_local.datasource.dao.RecentSearchWordDao
7+
8+
@Database(entities = [RecentSearchWordDto::class], version = 1)
9+
10+
abstract class AppDatabase : RoomDatabase() {
11+
abstract fun recentSearchWordDao(): RecentSearchWordDao
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.velogm.data_local.datasource
2+
3+
import android.content.SharedPreferences
4+
import com.velogm.data.datasource.SearchDataSource
5+
import com.velogm.data.dto.response.RecentSearchWordDto
6+
import com.velogm.data_local.datasource.dao.RecentSearchWordDao
7+
import javax.inject.Inject
8+
9+
class SearchDataSourceImpl @Inject constructor(
10+
private val dao: RecentSearchWordDao, private val prefs: SharedPreferences
11+
) : SearchDataSource {
12+
override suspend fun getRecentSearchWord(): List<RecentSearchWordDto> {
13+
return dao.load(prefs.getString("AccessToken", "") ?: "")
14+
}
15+
16+
override suspend fun addRecentSearchWord(word: String) {
17+
dao.insert(
18+
RecentSearchWordDto(
19+
prefs.getString("AccessToken", "") ?: "", recentSearchWord = word
20+
)
21+
)
22+
}
23+
24+
override suspend fun deleteRecentSearchWord() {
25+
dao.deleteByToken(prefs.getString("AccessToken", "") ?: "")
26+
}
27+
}

data-local/src/main/java/com/velogm/data_local/datasource/SharedPreferencesDataSource.kt renamed to data-local/src/main/java/com/velogm/data_local/datasource/SharedPreferencesDataSourceImpl.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,27 @@ package com.velogm.data_local.datasource
22

33
import android.content.SharedPreferences
44
import androidx.core.content.edit
5+
import com.velogm.data.datasource.SharedPreferencesDataSource
56
import javax.inject.Inject
67
import javax.inject.Singleton
78

89
@Singleton
9-
class SharedPreferencesDataSource @Inject constructor(
10+
class SharedPreferencesDataSourceImpl @Inject constructor(
1011
private val prefs: SharedPreferences,
11-
) {
12-
var accessToken: String?
12+
) : SharedPreferencesDataSource {
13+
override var accessToken: String?
1314
get() = prefs.getString("AccessToken", null)
1415
set(value) = prefs.edit { putString("AccessToken", value) }
1516

16-
var refreshToken: String?
17+
override var refreshToken: String?
1718
get() = prefs.getString("RefreshToken", null)
1819
set(value) = prefs.edit { putString("RefreshToken", value) }
1920

20-
var checkLogin: Boolean
21+
override var checkLogin: Boolean
2122
get() = prefs.getBoolean("CheckLogin", false)
2223
set(value) = prefs.edit { putBoolean("CheckLogin", value) }
2324

24-
var withdrawal: Boolean
25+
override var withdrawal: Boolean
2526
get() = prefs.getBoolean("CheckWithdrawal", false)
2627
set(value) = prefs.edit { putBoolean("CheckWithdrawal", value) }
2728

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.velogm.data_local.datasource.dao
2+
3+
import androidx.room.Dao
4+
import androidx.room.Insert
5+
import androidx.room.OnConflictStrategy
6+
import androidx.room.Query
7+
import com.velogm.data.dto.response.RecentSearchWordDto
8+
9+
@Dao
10+
interface RecentSearchWordDao {
11+
12+
@Insert(onConflict = OnConflictStrategy.REPLACE)
13+
suspend fun insert(recentSearchWordDto: RecentSearchWordDto)
14+
15+
@Query("SELECT * FROM recent_search_word Where access_token = (:token)")
16+
suspend fun load(token: String): List<RecentSearchWordDto>
17+
18+
@Query("DELETE FROM recent_search_word WHERE access_token = :token")
19+
suspend fun deleteByToken(token: String)
20+
}

data/build.gradle.kts

+3-1
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ android {
3838

3939
dependencies {
4040
implementation(project(":domain"))
41-
implementation(project(":data-local"))
4241
// AndroidX
4342
implementation(AndroidX.APP_COMPAT)
4443
implementation(AndroidX.CORE_KTX)
44+
implementation(AndroidX.ROOM_RUNTIME)
45+
implementation(AndroidX.ROOM_KTX)
46+
kapt(AndroidX.ROOM_COMPILER)
4547
// Matrial Design
4648
implementation(Google.MATERIAL)
4749
// Test Dependency
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.velogm.data.datasource
2+
3+
import com.velogm.data.dto.response.RecentSearchWordDto
4+
5+
interface SearchDataSource {
6+
suspend fun getRecentSearchWord(): List<RecentSearchWordDto>
7+
suspend fun addRecentSearchWord(word: String)
8+
9+
suspend fun deleteRecentSearchWord()
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.velogm.data.datasource
2+
3+
interface SharedPreferencesDataSource {
4+
var accessToken: String?
5+
var refreshToken: String?
6+
var checkLogin: Boolean
7+
var withdrawal: Boolean
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.velogm.data.dto.response
2+
3+
import androidx.room.ColumnInfo
4+
import androidx.room.Entity
5+
import androidx.room.PrimaryKey
6+
import com.velogm.domain.model.RecentSearchWord
7+
8+
@Entity(
9+
tableName = "recent_search_word"
10+
)
11+
data class RecentSearchWordDto(
12+
@ColumnInfo(name = "access_token") val accessToken: String,
13+
@PrimaryKey @ColumnInfo(name = "word") val recentSearchWord: String
14+
) {
15+
fun toRecentSearchWordEntity() = RecentSearchWord(
16+
recentSearchWord
17+
)
18+
}

data/src/main/java/com/velogm/data/repositoryimpl/AuthRepositoryImpl.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.velogm.data.repositoryimpl
22

3-
import com.velogm.data_local.datasource.SharedPreferencesDataSource
3+
import com.velogm.data.datasource.SharedPreferencesDataSource
44
import com.velogm.domain.repository.AuthRepository
55
import javax.inject.Inject
66

77
class AuthRepositoryImpl @Inject constructor(
8-
private val sharedPrefDataSource: SharedPreferencesDataSource,
8+
private val sharedPrefDataSource: SharedPreferencesDataSource
99
) : AuthRepository {
1010
override fun saveAccessToken(a: String) {
1111
sharedPrefDataSource.accessToken = a

0 commit comments

Comments
 (0)