diff --git a/app/src/main/java/net/pokeranalytics/android/model/dao/SessionDao.kt b/app/src/main/java/net/pokeranalytics/android/model/dao/SessionDao.kt new file mode 100644 index 00000000..8ac9dc5c --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/dao/SessionDao.kt @@ -0,0 +1,76 @@ +package net.pokeranalytics.android.model.dao + +import io.realm.Realm +import io.realm.RealmResults +import io.realm.Sort +import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.util.data.sessionDao + +/** + * Session Dao + */ +class SessionDao(realmDb: Realm) { + + var realm: Realm = realmDb + + /** + * Create or update session + */ + fun createOrUpdateSession(session: Session): Session { + realm.beginTransaction() + val sessionToSave = realm.copyToRealmOrUpdate(session) + realm.commitTransaction() + return realm.copyFromRealm(sessionToSave) + } + + /** + * Create or update sessions + */ + fun createOrUpdateSessions(sessions: List): List { + + realm.beginTransaction() + + // Update + val sessionsToSave = realm.copyToRealmOrUpdate(sessions) + // Remove sessions not updated + realm.where(Session::class.java).equalTo("isUpdating", true).findAll().deleteAllFromRealm() + + realm.commitTransaction() + + return realm.copyFromRealm(sessionsToSave) + } + + /** + * Find all sessions + */ + fun findAllSessions(): RealmResults { + return realm.where(Session::class.java).findAll().sort("updatedAt", Sort.DESCENDING) + } + + /** + * Find session by id + */ + fun findSessionById(sessionId: Int): Session? { + return realm.where(Session::class.java).equalTo("id", sessionId).findFirst() + } + + /** + * Delete session + */ + fun deleteSession(sessionId: Int) { + realm.beginTransaction() + realm.sessionDao().findSessionById(sessionId)?.deleteFromRealm() + realm.commitTransaction() + } + + /** + * Delete all sessions + */ + fun deleteAllSessions() { + realm.beginTransaction() + realm.sessionDao().findAllSessions().deleteAllFromRealm() + realm.commitTransaction() + } + + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index c9e24cef..4eb0615b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -5,16 +5,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProviders import net.pokeranalytics.android.R import net.pokeranalytics.android.util.PokerAnalyticsFragment +import net.pokeranalytics.android.util.data.SessionViewModel class HistoryFragment : PokerAnalyticsFragment() { companion object { - /** - * Create new instance - */ fun newInstance(): HistoryFragment { val fragment = HistoryFragment() val bundle = Bundle() @@ -23,12 +22,25 @@ class HistoryFragment : PokerAnalyticsFragment() { } } + private lateinit var sessionViewModel: SessionViewModel + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_history, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + sessionViewModel = ViewModelProviders.of(this).get(SessionViewModel::class.java) + + initData() + } + + /** + * Init data + */ + private fun initData() { + val sessions = sessionViewModel.getAllSessions() } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/SessionViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/SessionViewModel.kt new file mode 100644 index 00000000..e8d06001 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/SessionViewModel.kt @@ -0,0 +1,77 @@ +package net.pokeranalytics.android.util.data + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import io.realm.OrderedRealmCollectionChangeListener +import io.realm.Realm +import io.realm.RealmResults +import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.util.data.sessionDao + +/** + * Session View Model + */ +class SessionViewModel(application: Application) : AndroidViewModel(application) { + + private var realm = Realm.getDefaultInstance() + private var results: RealmResults + private val observablePlaces = MutableLiveData>() + + private var realmChangeListener = OrderedRealmCollectionChangeListener> { t, changeSet -> + observablePlaces.value = realm.copyFromRealm(t) + } + + init { + results = realm.sessionDao().findAllSessions() + } + + override fun onCleared() { + super.onCleared() + results.removeChangeListener(realmChangeListener) + realm.close() + } + + /** + * Get all sessions + */ + fun getAllSessions(): LiveData> { + results.addChangeListener(realmChangeListener) + observablePlaces.value = realm.copyFromRealm(results) + return observablePlaces + } + + /** + * Get session by id + */ + fun getSessionById(id: Int): Session? { + if (!realm.isClosed) { + val session = realm.sessionDao().findSessionById(id) + if (session != null) { + return realm.copyFromRealm(session) + } + } + return null + } + /** + * Create or update a session + */ + fun createOrUpdateSession(session: Session): Session? { + if (!realm.isClosed) { + return realm.sessionDao().createOrUpdateSession(session) + } + + return null + } + + /** + * Delete a session + */ + fun deleteSession(sessionId: Int) { + if (!realm.isClosed) { + realm.sessionDao().deleteSession(sessionId) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/data/LiveRealmData.kt b/app/src/main/java/net/pokeranalytics/android/util/data/LiveRealmData.kt new file mode 100644 index 00000000..3edd4d69 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/util/data/LiveRealmData.kt @@ -0,0 +1,21 @@ +package net.pokeranalytics.android.util.data + +import androidx.lifecycle.LiveData +import io.realm.RealmChangeListener +import io.realm.RealmModel +import io.realm.RealmResults + + +class LiveRealmData(private val results: RealmResults) : LiveData>() { + private val listener = RealmChangeListener> { results -> value = results } + + override fun onActive() { + results.addChangeListener(listener) + value = results + } + + override fun onInactive() { + results.removeChangeListener(listener) + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/data/Realm+Dao.kt b/app/src/main/java/net/pokeranalytics/android/util/data/Realm+Dao.kt new file mode 100644 index 00000000..744a5050 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/util/data/Realm+Dao.kt @@ -0,0 +1,12 @@ +@file:JvmName("RealmUtils") // pretty name for utils class if called from +package net.pokeranalytics.android.util.data + +import io.realm.Realm +import io.realm.RealmModel +import io.realm.RealmResults +import net.pokeranalytics.android.model.dao.SessionDao +import net.pokeranalytics.android.util.data.LiveRealmData + +fun Realm.sessionDao(): SessionDao = SessionDao(this) + +fun RealmResults.asLiveData() = LiveRealmData(this) \ No newline at end of file