From f06a2ed53164ec02feda0d18e675e6d31e5f2a42 Mon Sep 17 00:00:00 2001
From: liviaarumsari <13521094@mahasiswa.itb.ac.id>
Date: Fri, 5 Apr 2024 12:31:45 +0700
Subject: [PATCH] feat: add preference data store helper

---
 .../abe/data/local/IPreferenceDataStore.kt    | 12 +++++
 .../local/PreferenceDataStoreConstants.kt     |  8 +++
 .../data/local/PreferenceDataStoreHelper.kt   | 53 +++++++++++++++++++
 3 files changed, 73 insertions(+)
 create mode 100644 app/src/main/java/com/example/abe/data/local/IPreferenceDataStore.kt
 create mode 100644 app/src/main/java/com/example/abe/data/local/PreferenceDataStoreConstants.kt
 create mode 100644 app/src/main/java/com/example/abe/data/local/PreferenceDataStoreHelper.kt

diff --git a/app/src/main/java/com/example/abe/data/local/IPreferenceDataStore.kt b/app/src/main/java/com/example/abe/data/local/IPreferenceDataStore.kt
new file mode 100644
index 0000000..fdaef47
--- /dev/null
+++ b/app/src/main/java/com/example/abe/data/local/IPreferenceDataStore.kt
@@ -0,0 +1,12 @@
+package com.example.abe.data.local
+
+import androidx.datastore.preferences.core.Preferences
+import kotlinx.coroutines.flow.Flow
+
+interface IPreferenceDataStore {
+    suspend fun <T> getPreference(key: Preferences.Key<T>,defaultValue: T):Flow<T>
+    suspend fun <T> getFirstPreference(key: Preferences.Key<T>,defaultValue: T):T
+    suspend fun <T> putPreference(key: Preferences.Key<T>,value:T)
+    suspend fun <T> removePreference(key: Preferences.Key<T>)
+    suspend fun <T> clearAllPreference()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/abe/data/local/PreferenceDataStoreConstants.kt b/app/src/main/java/com/example/abe/data/local/PreferenceDataStoreConstants.kt
new file mode 100644
index 0000000..576322b
--- /dev/null
+++ b/app/src/main/java/com/example/abe/data/local/PreferenceDataStoreConstants.kt
@@ -0,0 +1,8 @@
+package com.example.abe.data.local
+
+import androidx.datastore.preferences.core.stringPreferencesKey
+
+object PreferenceDataStoreConstants {
+    val TOKEN = stringPreferencesKey("TOKEN")
+    val USER = stringPreferencesKey("USER")
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/abe/data/local/PreferenceDataStoreHelper.kt b/app/src/main/java/com/example/abe/data/local/PreferenceDataStoreHelper.kt
new file mode 100644
index 0000000..45416a3
--- /dev/null
+++ b/app/src/main/java/com/example/abe/data/local/PreferenceDataStoreHelper.kt
@@ -0,0 +1,53 @@
+package com.example.abe.data.local
+
+import android.content.Context
+import androidx.datastore.preferences.core.Preferences
+import androidx.datastore.preferences.core.edit
+import androidx.datastore.preferences.core.emptyPreferences
+import androidx.datastore.preferences.preferencesDataStore
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.catch
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.map
+import java.io.IOException
+
+private val Context.dataStore by preferencesDataStore(
+    name = "PreferenceDataStore"
+)
+class PreferenceDataStoreHelper(context: Context):IPreferenceDataStore {
+
+    private val dataSource = context.dataStore
+
+    override suspend fun <T> getPreference(key: Preferences.Key<T>, defaultValue: T):
+            Flow<T> = dataSource.data.catch { exception ->
+        if (exception is IOException){
+            emit(emptyPreferences())
+        }else{
+            throw exception
+        }
+    }.map { preferences->
+        val result = preferences[key]?: defaultValue
+        result
+    }
+
+    override suspend fun <T> getFirstPreference(key: Preferences.Key<T>, defaultValue: T) :
+            T = dataSource.data.first()[key] ?: defaultValue
+
+    override suspend fun <T> putPreference(key: Preferences.Key<T>, value: T) {
+        dataSource.edit {   preferences ->
+            preferences[key] = value
+        }
+    }
+
+    override suspend fun <T> removePreference(key: Preferences.Key<T>) {
+        dataSource.edit { preferences ->
+            preferences.remove(key)
+        }
+    }
+
+    override suspend fun <T> clearAllPreference() {
+        dataSource.edit { preferences ->
+            preferences.clear()
+        }
+    }
+}
\ No newline at end of file
-- 
GitLab