From e887b652bf672e7d724d13149b5876d5a2f6590a Mon Sep 17 00:00:00 2001 From: Yukihiro Murata Date: Fri, 25 Jan 2019 18:13:28 +0900 Subject: [PATCH 01/17] add preference screen /resisted listener --- .../settings/ui/SettingsFragment.kt | 21 ++++++++++++-- .../settings/src/main/res/xml/preferences.xml | 28 +++++++++++++++++-- .../android/src/main/res/values/styles.xml | 4 +++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt index 5485a6fd0..b9c6cb977 100644 --- a/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt +++ b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt @@ -1,11 +1,28 @@ package io.github.droidkaigi.confsched2019.settings.ui +import android.content.SharedPreferences import android.os.Bundle import androidx.preference.PreferenceFragmentCompat import io.github.droidkaigi.confsched2019.settings.R -class SettingsFragment : PreferenceFragmentCompat() { +class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.preferences, rootKey) + addPreferencesFromResource(R.xml.preferences) + } + + override fun onResume() { + super.onResume() + + preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + + override fun onPause() { + super.onPause() + + preferenceScreen.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + } } diff --git a/feature/settings/src/main/res/xml/preferences.xml b/feature/settings/src/main/res/xml/preferences.xml index 532b9f74b..1363d7f0e 100644 --- a/feature/settings/src/main/res/xml/preferences.xml +++ b/feature/settings/src/main/res/xml/preferences.xml @@ -1,3 +1,27 @@ - - + + + + + + + + diff --git a/frontend/android/src/main/res/values/styles.xml b/frontend/android/src/main/res/values/styles.xml index 16391462f..d30b2b322 100644 --- a/frontend/android/src/main/res/values/styles.xml +++ b/frontend/android/src/main/res/values/styles.xml @@ -5,6 +5,10 @@ @style/Widget.App.Toolbar.Button.Navigation + + From bb5032183e9c8cb4c0640fcbb1b365244924921f Mon Sep 17 00:00:00 2001 From: Yukihiro Murata Date: Thu, 31 Jan 2019 14:47:26 +0900 Subject: [PATCH 02/17] 0131_1445 --- .../settings/ui/SettingsFragment.kt | 48 +++++++++++ .../settings/ui/SettingsStore.kt | 19 +++++ .../ui/actioncreator/SettingsActionCreator.kt | 80 +++++++++++++++++++ .../settings/src/main/res/values/bools.xml | 7 ++ .../settings/src/main/res/values/strings.xml | 23 ++++++ .../settings/src/main/res/xml/preferences.xml | 45 ++++++----- .../droidkaigi/confsched2019/action/Action.kt | 4 + 7 files changed, 207 insertions(+), 19 deletions(-) create mode 100644 feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsStore.kt create mode 100644 feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/ui/actioncreator/SettingsActionCreator.kt create mode 100644 feature/settings/src/main/res/values/bools.xml diff --git a/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt index b9c6cb977..047036212 100644 --- a/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt +++ b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt @@ -4,6 +4,13 @@ import android.content.SharedPreferences import android.os.Bundle import androidx.preference.PreferenceFragmentCompat import io.github.droidkaigi.confsched2019.settings.R +import android.content.res.TypedArray +import android.os.Parcel +import android.os.Parcelable + + + + class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -23,6 +30,47 @@ class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedP } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + val changedValue = sharedPreferences?.getBoolean( + key, false + ) +//処理をここに書こう。 + } +} + +protected fun onGetDefaultValue(a: TypedArray, index: Int): Any { + return a.getInteger(index, DEFAULT_VALUE) +} + +private class SavedState : BaseSavedState { + // Member that holds the setting's value + // Change this data type to match the type saved by your Preference + internal var value: Int = 0 + + constructor(superState: Parcelable) : super(superState) {} + + constructor(source: Parcel) : super(source) { + // Get the current preference's value + value = source.readInt() // Change this to read the appropriate data type + } + + fun writeToParcel(dest: Parcel, flags: Int) { + super.writeToParcel(dest, flags) + // Write the preference's value + dest.writeInt(value) // Change this to write the appropriate data type + } + + companion object { + + // Standard creator object using an instance of this class + val CREATOR: Parcelable.Creator = object : Parcelable.Creator { + + override fun createFromParcel(`in`: Parcel): SavedState { + return SavedState(`in`) + } + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } } diff --git a/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsStore.kt b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsStore.kt new file mode 100644 index 000000000..0e1324595 --- /dev/null +++ b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsStore.kt @@ -0,0 +1,19 @@ +package io.github.droidkaigi.confsched2019.settings.ui + +import androidx.lifecycle.ViewModel +import io.github.droidkaigi.confsched2019.action.Action +import io.github.droidkaigi.confsched2019.dispatcher.Dispatcher +import kotlinx.coroutines.channels.map +import javax.inject.Inject + + +class SettingsStore @Inject constructor( + dispatcher: Dispatcher +) : ViewModel() { + val query get() = settingsResult.value?.query + + val settingsResult = dispatcher + .subscribe() + .map { it.settingsResult } + .toLiveData(SettingsResult.EMPTY) +} diff --git a/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/ui/actioncreator/SettingsActionCreator.kt b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/ui/actioncreator/SettingsActionCreator.kt new file mode 100644 index 000000000..9aabb4e6c --- /dev/null +++ b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/ui/actioncreator/SettingsActionCreator.kt @@ -0,0 +1,80 @@ +package io.github.droidkaigi.confsched2019.settings.ui.ui.actioncreator + +import androidx.lifecycle.Lifecycle +import io.github.droidkaigi.confsched2019.action.Action +import io.github.droidkaigi.confsched2019.di.PageScope +import io.github.droidkaigi.confsched2019.dispatcher.Dispatcher +import io.github.droidkaigi.confsched2019.ext.android.coroutineScope +import io.github.droidkaigi.confsched2019.util.SessionAlarm +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import javax.inject.Inject + +@PageScope +class SettingsActionCreator @Inject constructor( + override val dispatcher: Dispatcher, + private val settingsRepository: SettingsRepository, + @PageScope private val lifecycle: Lifecycle, + private val settingsAlarm: SettingsAlarm +) : CoroutineScope by lifecycle.coroutineScope, + ErrorHandler { + fun refresh() = launch { + try { + Timber.debug { "SettingsContentsActionCreator: refresh start" } + dispatcher.dispatchLoadingState(LoadingState.LOADING) + Timber.debug { "SettingsContentsActionCreator: At first, load db data" } + // At first, load db data + val settingsContents = settingsRepository.settingsContents() + dispatcher.dispatch(Action.SettingsContentsLoaded(settingsContents)) + + // fetch api data + Timber.debug { "SettingsContentsActionCreator: fetch api data" } + settingsRepository.refresh() + + // reload db data + Timber.debug { "SettingsContentsActionCreator: reload db data" } + val refreshedSettingsContents = settingsRepository.settingsContents() + dispatcher.dispatch(Action.SettingsContentsLoaded(refreshedSettingsContents)) + Timber.debug { "SettingsContentsActionCreator: refresh end" } + dispatcher.dispatchLoadingState(LoadingState.LOADED) + } catch (e: Exception) { + onError(e) + dispatcher.dispatchLoadingState(LoadingState.INITIALIZED) + } + } + + fun load() { + launch { + try { + dispatcher.dispatchLoadingState(LoadingState.LOADING) + val settingsContents = settingsRepository.settingsContents() + dispatcher.dispatch(Action.SettingsContentsLoaded(settingsContents)) + dispatcher.dispatchLoadingState(LoadingState.LOADED) + } catch (e: Exception) { + onError(e) + dispatcher.dispatchLoadingState(LoadingState.INITIALIZED) + } + } + } + + fun toggleFavorite(session: Session) { + launch { + try { + settingsRepository.toggleFavorite(session) + settingsAlarm.toggleRegister(session) + val settingsContents = settingsRepository.settingsContents() + dispatcher.dispatch(Action.SettingsContentsLoaded(settingsContents)) + } catch (e: Exception) { + dispatcher.dispatch( + Action.Error(ErrorMessage.of( + R.string.settings_favorite_connection_error, e) + ) + ) + } + } + } + + private suspend fun Dispatcher.dispatchLoadingState(loadingState: LoadingState) { + dispatch(Action.SettingsLoadingStateChanged(loadingState)) + } +} diff --git a/feature/settings/src/main/res/values/bools.xml b/feature/settings/src/main/res/values/bools.xml new file mode 100644 index 000000000..5b91c5ed0 --- /dev/null +++ b/feature/settings/src/main/res/values/bools.xml @@ -0,0 +1,7 @@ + + + true + true + true + true + diff --git a/feature/settings/src/main/res/values/strings.xml b/feature/settings/src/main/res/values/strings.xml index 045e125f3..b57fcc6c4 100644 --- a/feature/settings/src/main/res/values/strings.xml +++ b/feature/settings/src/main/res/values/strings.xml @@ -1,3 +1,26 @@ + Sharing Settings for Tweet + share_setting + + Session Title + session_title + ex.What will be changed on tests in multi-module projects + Hidden + + Session URL + session_url + ex.https://droidkaigi.jp/2019/.. + Hidden + + Event Hashtag + event_hashtag + #droidkaigi + Hidden + + Room Hashtag + room_hashtag + ex.#hallA,#room1 + Hidden + diff --git a/feature/settings/src/main/res/xml/preferences.xml b/feature/settings/src/main/res/xml/preferences.xml index 1363d7f0e..06b7d6603 100644 --- a/feature/settings/src/main/res/xml/preferences.xml +++ b/feature/settings/src/main/res/xml/preferences.xml @@ -1,27 +1,34 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + android:key="@string/session_title_key" + android:title="@string/session_title_title" + android:summary="@string/session_title_summary_true" + android:defaultValue="@bool/session_title_default" /> + android:key="@string/session_url_key" + android:title="@string/session_url_title" + android:summary="@string/session_url_summary_true" + android:defaultValue="@bool/session_url_default" /> + android:key="@string/event_hashtag_key" + android:title="@string/event_hashtag_title" + android:summary="@string/event_hashtag_summary_true" + android:defaultValue="@bool/event_hashtag_default" /> - + android:key="@string/room_hashtag_key" + android:title="@string/room_hashtag_title" + android:summary="@string/room_hashtag_summary_true" + android:defaultValue="@bool/room_hashtag_default" /> + + + + diff --git a/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt b/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt index 441583954..2b0db5ec6 100644 --- a/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt +++ b/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt @@ -30,6 +30,10 @@ sealed class Action { val sessions: List ) : Action() + data class SettingsChanged( + val //mapを使ってkeyとvalueの組み合わせを入れる + ) + data class SessionPageSelected(val sessionPage: SessionPage) : Action() class SystemPropertyLoaded(val system: SystemProperty) : Action() From 6756ef3a789bed8d9b912d1b7ff10c98a367d8da Mon Sep 17 00:00:00 2001 From: neonankiti Date: Thu, 31 Jan 2019 16:24:39 +0900 Subject: [PATCH 03/17] create setting sample --- .../settings/ui/SettingsFragment.kt | 66 +++++-------------- .../settings/ui/SettingsStore.kt | 14 ++-- .../actioncreator/PreferenceActionCreator.kt | 20 ++++++ .../droidkaigi/confsched2019/action/Action.kt | 13 ++-- 4 files changed, 56 insertions(+), 57 deletions(-) create mode 100644 feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/PreferenceActionCreator.kt diff --git a/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt index 047036212..808137e97 100644 --- a/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt +++ b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsFragment.kt @@ -8,69 +8,39 @@ import android.content.res.TypedArray import android.os.Parcel import android.os.Parcelable +class SettingsFragment : PreferenceFragmentCompat(), + SharedPreferences.OnSharedPreferenceChangeListener { + @Inject lateinit var preferenceActionCreator: PreferenceActionCreator - - - -class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.preferences) } - override fun onResume() { - super.onResume() - + override fun onCreate() { preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this) + SettingsStore.settingsResult.changed(viewLifecycleOwner) { settingsResult -> + // TODO 流れてきたら更新 xmlに記載しているswitchのidを取得して、bindする。 + // 対応するswitchのon offを変更する。 + } } - override fun onPause() { - super.onPause() - + override fun onDestory() { + // TODO: ここで、現状のswitchのon, offをSharedPreferenceに保存してあげる。 preferenceScreen.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + super.onDestroy() } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { val changedValue = sharedPreferences?.getBoolean( key, false ) -//処理をここに書こう。 - } -} - -protected fun onGetDefaultValue(a: TypedArray, index: Int): Any { - return a.getInteger(index, DEFAULT_VALUE) -} - -private class SavedState : BaseSavedState { - // Member that holds the setting's value - // Change this data type to match the type saved by your Preference - internal var value: Int = 0 - - constructor(superState: Parcelable) : super(superState) {} - - constructor(source: Parcel) : super(source) { - // Get the current preference's value - value = source.readInt() // Change this to read the appropriate data type - } - - fun writeToParcel(dest: Parcel, flags: Int) { - super.writeToParcel(dest, flags) - // Write the preference's value - dest.writeInt(value) // Change this to write the appropriate data type + // TODO: SettingContentsChangedをインスタンス化し、submitする。 + // 以下を行う際には、既存の4つの値のうち、変更されたものだけを更新して配列をコンストラクタの引数として渡す。 + // SettingContentsChanged(listof(true, true, true, false))みたいな感じ。実際は変数で置く。 + // NOTE: 実際にpreferenceActionCreator.submit()で行なっている処理は、dispatcherがactionを伝えること。 + preferenceActionCreator.submit(SettingContentsChanged()) + //処理をここに書こう。 } - companion object { - - // Standard creator object using an instance of this class - val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - - override fun createFromParcel(`in`: Parcel): SavedState { - return SavedState(`in`) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } - } - } + data class Step(val value: Int) } diff --git a/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsStore.kt b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsStore.kt index 0e1324595..a7a266d02 100644 --- a/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsStore.kt +++ b/feature/settings/src/main/java/io/github/droidkaigi/confsched2019/settings/ui/SettingsStore.kt @@ -6,14 +6,18 @@ import io.github.droidkaigi.confsched2019.dispatcher.Dispatcher import kotlinx.coroutines.channels.map import javax.inject.Inject - class SettingsStore @Inject constructor( dispatcher: Dispatcher ) : ViewModel() { - val query get() = settingsResult.value?.query + // val query get() = settingsResult.value?.query val settingsResult = dispatcher - .subscribe() - .map { it.settingsResult } - .toLiveData(SettingsResult.EMPTY) + // subscribeのあとに帰ってくるdataの形は、 + // data class SettingContentsLoaded( + // val contents: List + // ) : Action() + .subscribe() + // mapは変換するという意味。Actoin..SettingContentsLoadedから利用したいcontentsを取得して、伝搬したい。 + .map { it.contents } + .toLiveData(SettinlsResult.EMPTY) } diff --git a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/PreferenceActionCreator.kt b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/PreferenceActionCreator.kt new file mode 100644 index 000000000..c0a71bbb6 --- /dev/null +++ b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/PreferenceActionCreator.kt @@ -0,0 +1,20 @@ +package io.github.droidkaigi.confsched2019.system.actioncreator + +import io.github.droidkaigi.confsched2019.action.Action +import io.github.droidkaigi.confsched2019.dispatcher.Dispatcher +import io.github.droidkaigi.confsched2019.model.SystemProperty +import io.github.droidkaigi.confsched2019.model.defaultLang +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.plus +import javax.inject.Inject + +class PreferenceActionCreator @Inject constructor(val dispatcher: Dispatcher) { + // TOOD コンパイルエラーが出るようであれば、他のActionCreatorのようにScopeを追加する。 + + fun submit(action: Action) { + dispatcher.dispatch(action) + } + +} diff --git a/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt b/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt index fb9ada350..850edab0e 100644 --- a/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt +++ b/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt @@ -30,10 +30,6 @@ sealed class Action { val sessions: List ) : Action() - data class SettingsChanged( - val //mapを使ってkeyとvalueの組み合わせを入れる - ) - data class SessionPageSelected(val sessionPage: SessionPage) : Action() data class SessionPageReselected(val sessionPage: SessionPage) : Action() class SystemPropertyLoaded(val system: SystemProperty) : Action() @@ -86,4 +82,13 @@ sealed class Action { data class SessionSurveyLoaded(val sessionFeedback: SessionFeedback) : Action() class FloorMapLoadingStateChanged(val loadingState: LoadingState) : Action() + + data class SettingContentsChanged(val contents: List) : Action() + + // Sessionがあるディレクトリと同じ場所に書く。valueは適切な名前に変更する。 + data class SettingContent(val value: Boolean) { + companion object { + val EMPTY = SettingContent(false) + } + } } From c0b7f38f7a7cc6cc4089f8eb1c750c30faf6385d Mon Sep 17 00:00:00 2001 From: Yukihiro Murata Date: Thu, 31 Jan 2019 23:13:13 +0900 Subject: [PATCH 04/17] =?UTF-8?q?=E5=B8=B0=E3=82=8B=E5=89=8D=E3=81=AE?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/codeStyles/Project.xml | 27 ++++++++- .../settings/ui/SettingsFragment.kt | 1 - .../settings/ui/SettingsStore.kt | 4 +- .../settings/src/main/res/xml/preferences.xml | 56 +++++++++---------- .../droidkaigi/confsched2019/action/Action.kt | 14 +++-- 5 files changed, 62 insertions(+), 40 deletions(-) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 77ad2de94..7c9a47618 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -30,6 +30,31 @@