Loading app/src/main/java/at/bitfire/davdroid/settings/SettingsManager.kt +2 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ class SettingsManager private constructor( /** * Requests all providers to reload their settings. */ @AnyThread fun forceReload() { for (provider in providers) provider.forceReload() Loading @@ -73,6 +74,7 @@ class SettingsManager private constructor( * Notifies registered listeners about changes in the configuration. * Should be called by config providers when settings have changed. */ @AnyThread fun onSettingsChanged() { synchronized(observers) { for (observer in observers.mapNotNull { it.get() }) Loading app/src/main/java/at/bitfire/davdroid/settings/SettingsProvider.kt +2 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ package at.bitfire.davdroid.settings import androidx.annotation.AnyThread import java.io.Writer /** Loading @@ -30,6 +31,7 @@ interface SettingsProvider { fun close() @AnyThread fun forceReload() fun contains(key: String): Boolean Loading app/src/main/java/at/bitfire/davdroid/ui/AboutActivity.kt +48 −33 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter import androidx.fragment.app.viewModels import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import androidx.recyclerview.widget.LinearLayoutManager Loading Loading @@ -68,7 +69,7 @@ class AboutActivity: AppCompatActivity() { } override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.about_davdroid, menu) menuInflater.inflate(R.menu.activity_about, menu) return true } Loading Loading @@ -141,51 +142,25 @@ class AboutActivity: AppCompatActivity() { class LanguagesFragment: Fragment() { val model by viewModels<TextFileModel>() val model by viewModels<TranslationsModel>() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) = inflater.inflate(R.layout.about_languages, container, false)!! override fun onViewCreated(view: View, savedInstanceState: Bundle?) { model.initialize("translators.json", false) model.plainText.observe(viewLifecycleOwner, { json -> val jsonTranslations = JSONObject(json) translators.adapter = TranslationsAdapter(jsonTranslations) model.translations.observe(viewLifecycleOwner, { translations -> translators.adapter = TranslationsAdapter(translations) }) translators.layoutManager = LinearLayoutManager(requireActivity()) } class Translation( val language: String, val translators: Array<String> ) class TranslationsAdapter( jsonTranslations: JSONObject val translations: List<TranslationsModel.Translation> ): RecyclerView.Adapter<TranslationsAdapter.ViewHolder>() { class ViewHolder(val cardView: CardView): RecyclerView.ViewHolder(cardView) private val translations = LinkedList<Translation>() init { for (langCode in jsonTranslations.keys()) { val jsonTranslators = jsonTranslations.getJSONArray(langCode) val translators = Array<String>(jsonTranslators.length()) { idx -> jsonTranslators.getString(idx) } val langTag = langCode.replace('_', '-') val language = Locale.forLanguageTag(langTag).displayName translations += Translation(language, translators) } // sort translations by localized language name val collator = Collator.getInstance() translations.sortWith({ o1, o2 -> collator.compare(o1.language, o2.language) }) } class ViewHolder(val cardView: CardView): RecyclerView.ViewHolder(cardView) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val tv = LayoutInflater.from(parent.context).inflate(R.layout.about_translation, parent, false) as CardView Loading @@ -210,7 +185,7 @@ class AboutActivity: AppCompatActivity() { } class TextFileModel( open class TextFileModel( application: Application ): AndroidViewModel(application) { Loading @@ -237,4 +212,44 @@ class AboutActivity: AppCompatActivity() { } class TranslationsModel( application: Application ): TextFileModel(application) { class Translation( val language: String, val translators: Array<String> ) val translations = object: MediatorLiveData<List<Translation>>() { init { addSource(plainText) { rawJson -> // parse JSON val jsonTranslations = JSONObject(rawJson) val result = LinkedList<Translation>() for (langCode in jsonTranslations.keys()) { val jsonTranslators = jsonTranslations.getJSONArray(langCode) val translators = Array<String>(jsonTranslators.length()) { idx -> jsonTranslators.getString(idx) } val langTag = langCode.replace('_', '-') val language = Locale.forLanguageTag(langTag).displayName result += Translation(language, translators) } // sort translations by localized language name val collator = Collator.getInstance() result.sortWith({ o1, o2 -> collator.compare(o1.language, o2.language) }) postValue(result) } } } } } app/src/main/java/at/bitfire/davdroid/ui/AccountsActivity.kt +2 −1 Original line number Diff line number Diff line Loading @@ -68,7 +68,6 @@ class AccountsActivity: AppCompatActivity(), NavigationView.OnNavigationItemSele } fab.show() accountsDrawerHandler.initMenu(this, drawer_layout.nav_view.menu) val toggle = ActionBarDrawerToggle( this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) drawer_layout.addDrawerListener(toggle) Loading @@ -85,6 +84,8 @@ class AccountsActivity: AppCompatActivity(), NavigationView.OnNavigationItemSele override fun onResume() { super.onResume() accountsDrawerHandler.initMenu(this, drawer_layout.nav_view.menu) onStatusChanged(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS) syncStatusObserver = ContentResolver.addStatusChangeListener(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, this) } Loading app/src/main/res/layout/about_translation.xml +2 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,8 @@ xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" app:contentPadding="@dimen/card_padding" android:layout_marginBottom="16dp"> android:layout_marginTop="8dp" android:layout_marginBottom="8dp"> <LinearLayout android:layout_width="match_parent" Loading Loading
app/src/main/java/at/bitfire/davdroid/settings/SettingsManager.kt +2 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ class SettingsManager private constructor( /** * Requests all providers to reload their settings. */ @AnyThread fun forceReload() { for (provider in providers) provider.forceReload() Loading @@ -73,6 +74,7 @@ class SettingsManager private constructor( * Notifies registered listeners about changes in the configuration. * Should be called by config providers when settings have changed. */ @AnyThread fun onSettingsChanged() { synchronized(observers) { for (observer in observers.mapNotNull { it.get() }) Loading
app/src/main/java/at/bitfire/davdroid/settings/SettingsProvider.kt +2 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ package at.bitfire.davdroid.settings import androidx.annotation.AnyThread import java.io.Writer /** Loading @@ -30,6 +31,7 @@ interface SettingsProvider { fun close() @AnyThread fun forceReload() fun contains(key: String): Boolean Loading
app/src/main/java/at/bitfire/davdroid/ui/AboutActivity.kt +48 −33 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter import androidx.fragment.app.viewModels import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import androidx.recyclerview.widget.LinearLayoutManager Loading Loading @@ -68,7 +69,7 @@ class AboutActivity: AppCompatActivity() { } override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.about_davdroid, menu) menuInflater.inflate(R.menu.activity_about, menu) return true } Loading Loading @@ -141,51 +142,25 @@ class AboutActivity: AppCompatActivity() { class LanguagesFragment: Fragment() { val model by viewModels<TextFileModel>() val model by viewModels<TranslationsModel>() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) = inflater.inflate(R.layout.about_languages, container, false)!! override fun onViewCreated(view: View, savedInstanceState: Bundle?) { model.initialize("translators.json", false) model.plainText.observe(viewLifecycleOwner, { json -> val jsonTranslations = JSONObject(json) translators.adapter = TranslationsAdapter(jsonTranslations) model.translations.observe(viewLifecycleOwner, { translations -> translators.adapter = TranslationsAdapter(translations) }) translators.layoutManager = LinearLayoutManager(requireActivity()) } class Translation( val language: String, val translators: Array<String> ) class TranslationsAdapter( jsonTranslations: JSONObject val translations: List<TranslationsModel.Translation> ): RecyclerView.Adapter<TranslationsAdapter.ViewHolder>() { class ViewHolder(val cardView: CardView): RecyclerView.ViewHolder(cardView) private val translations = LinkedList<Translation>() init { for (langCode in jsonTranslations.keys()) { val jsonTranslators = jsonTranslations.getJSONArray(langCode) val translators = Array<String>(jsonTranslators.length()) { idx -> jsonTranslators.getString(idx) } val langTag = langCode.replace('_', '-') val language = Locale.forLanguageTag(langTag).displayName translations += Translation(language, translators) } // sort translations by localized language name val collator = Collator.getInstance() translations.sortWith({ o1, o2 -> collator.compare(o1.language, o2.language) }) } class ViewHolder(val cardView: CardView): RecyclerView.ViewHolder(cardView) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val tv = LayoutInflater.from(parent.context).inflate(R.layout.about_translation, parent, false) as CardView Loading @@ -210,7 +185,7 @@ class AboutActivity: AppCompatActivity() { } class TextFileModel( open class TextFileModel( application: Application ): AndroidViewModel(application) { Loading @@ -237,4 +212,44 @@ class AboutActivity: AppCompatActivity() { } class TranslationsModel( application: Application ): TextFileModel(application) { class Translation( val language: String, val translators: Array<String> ) val translations = object: MediatorLiveData<List<Translation>>() { init { addSource(plainText) { rawJson -> // parse JSON val jsonTranslations = JSONObject(rawJson) val result = LinkedList<Translation>() for (langCode in jsonTranslations.keys()) { val jsonTranslators = jsonTranslations.getJSONArray(langCode) val translators = Array<String>(jsonTranslators.length()) { idx -> jsonTranslators.getString(idx) } val langTag = langCode.replace('_', '-') val language = Locale.forLanguageTag(langTag).displayName result += Translation(language, translators) } // sort translations by localized language name val collator = Collator.getInstance() result.sortWith({ o1, o2 -> collator.compare(o1.language, o2.language) }) postValue(result) } } } } }
app/src/main/java/at/bitfire/davdroid/ui/AccountsActivity.kt +2 −1 Original line number Diff line number Diff line Loading @@ -68,7 +68,6 @@ class AccountsActivity: AppCompatActivity(), NavigationView.OnNavigationItemSele } fab.show() accountsDrawerHandler.initMenu(this, drawer_layout.nav_view.menu) val toggle = ActionBarDrawerToggle( this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) drawer_layout.addDrawerListener(toggle) Loading @@ -85,6 +84,8 @@ class AccountsActivity: AppCompatActivity(), NavigationView.OnNavigationItemSele override fun onResume() { super.onResume() accountsDrawerHandler.initMenu(this, drawer_layout.nav_view.menu) onStatusChanged(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS) syncStatusObserver = ContentResolver.addStatusChangeListener(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, this) } Loading
app/src/main/res/layout/about_translation.xml +2 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,8 @@ xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" app:contentPadding="@dimen/card_padding" android:layout_marginBottom="16dp"> android:layout_marginTop="8dp" android:layout_marginBottom="8dp"> <LinearLayout android:layout_width="match_parent" Loading