srctree

Robin Linden parent 5c64c54f c114b46d
Add a settings page

inlinesplit
atox/build.gradle.kts added: 105, removed: 19, total 86
@@ -48,6 +48,8 @@ dependencies {
 
implementation(Libraries.appcompat)
implementation(Libraries.constraintlayout)
implementation(Libraries.preference)
 
implementation(Libraries.material)
implementation(Libraries.ktxCoroutinesCore)
implementation(Libraries.ktxCoroutinesAndroid)
 
atox/src/main/kotlin/di/ViewModelModule.kt added: 105, removed: 19, total 86
@@ -10,6 +10,7 @@ import ltd.evilcorp.atox.ui.chat.ChatViewModel
import ltd.evilcorp.atox.ui.contact_profile.ContactProfileViewModel
import ltd.evilcorp.atox.ui.contactlist.ContactListViewModel
import ltd.evilcorp.atox.ui.profile.ProfileViewModel
import ltd.evilcorp.atox.ui.settings.SettingsViewModel
import kotlin.reflect.KClass
 
@MustBeDocumented
@@ -49,4 +50,9 @@ abstract class ViewModelModule {
@IntoMap
@ViewModelKey(ProfileViewModel::class)
abstract fun bindProfileViewModel(vm: ProfileViewModel): ViewModel
 
@Binds
@IntoMap
@ViewModelKey(SettingsViewModel::class)
abstract fun bindSettingsViewModel(vm: SettingsViewModel): ViewModel
}
 
atox/src/main/kotlin/ui/contactlist/ContactListFragment.kt added: 105, removed: 19, total 86
@@ -213,9 +213,7 @@ class ContactListFragment : Fragment(), NavigationView.OnNavigationItemSelectedL
Toast.makeText(requireContext(), getText(R.string.tox_id_copied), Toast.LENGTH_SHORT).show()
}
R.id.add_contact -> findNavController().navigate(R.id.action_contactListFragment_to_addContactFragment)
R.id.settings -> {
// TODO(robinlinden): Settings activity
}
R.id.settings -> findNavController().navigate(R.id.action_contactListFragment_to_settingsFragment)
R.id.export_tox_save -> {
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
 
filename was Deleted added: 105, removed: 19, total 86
@@ -0,0 +1,39 @@
package ltd.evilcorp.atox.ui.settings
 
import android.content.SharedPreferences
import android.os.Bundle
import androidx.fragment.app.viewModels
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager
import ltd.evilcorp.atox.R
import ltd.evilcorp.atox.vmFactory
 
class SettingsFragment : PreferenceFragmentCompat(),
SharedPreferences.OnSharedPreferenceChangeListener {
 
private val vm: SettingsViewModel by viewModels { vmFactory }
 
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) =
setPreferencesFromResource(R.xml.preferences, rootKey)
 
override fun onResume() {
super.onResume()
PreferenceManager.getDefaultSharedPreferences(requireContext())
.registerOnSharedPreferenceChangeListener(this)
}
 
override fun onPause() {
super.onPause()
PreferenceManager.getDefaultSharedPreferences(requireContext())
.unregisterOnSharedPreferenceChangeListener(this)
}
 
override fun onSharedPreferenceChanged(preferences: SharedPreferences, key: String) {
when (key) {
"name" -> vm.setName(
preferences.getString(key, null) ?: getString(R.string.name_default)
)
"status_message" -> vm.setStatusMessage(preferences.getString(key, null) ?: "")
}
}
}
 
filename was Deleted added: 105, removed: 19, total 86
@@ -0,0 +1,12 @@
package ltd.evilcorp.atox.ui.settings
 
import androidx.lifecycle.ViewModel
import ltd.evilcorp.domain.feature.UserManager
import javax.inject.Inject
 
class SettingsViewModel @Inject constructor(
private val userManager: UserManager
) : ViewModel() {
fun setName(name: String) = userManager.setName(name)
fun setStatusMessage(message: String) = userManager.setStatusMessage(message)
}
 
atox/src/main/res/menu/activity_contact_list_drawer.xml added: 105, removed: 19, total 86
@@ -6,11 +6,7 @@
<item android:id="@+id/add_contact" android:title="@string/add_contact"/>
</group>
<group android:id="@+id/settings_section" android:checkableBehavior="single">
<!-- TODO(robinlinden): Re-enable once we have a settings menu. -->
<item android:id="@+id/settings"
android:icon="@drawable/settings"
android:title="@string/settings"
android:visible="false"/>
<item android:id="@+id/settings" android:title="@string/settings"/>
<item android:id="@+id/export_tox_save" android:title="@string/export_tox_save"/>
</group>
<group android:id="@+id/quit_section" android:checkableBehavior="single">
 
atox/src/main/res/navigation/nav_graph.xml added: 105, removed: 19, total 86
@@ -33,6 +33,13 @@
app:exitAnim="@anim/fade_out"
app:popEnterAnim="@anim/fade_out"
app:popExitAnim="@anim/fade_in"/>
 
<action android:id="@+id/action_contactListFragment_to_settingsFragment"
app:destination="@id/settingsFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/fade_out"
app:popEnterAnim="@anim/fade_in"
app:popExitAnim="@anim/slide_out_right"/>
</fragment>
 
<fragment android:id="@+id/chatFragment"
@@ -60,4 +67,8 @@
android:name="ltd.evilcorp.atox.ui.contact_profile.ContactProfileFragment"
android:label="contact_profile_fragment"
tools:layout="@layout/contact_profile_fragment"/>
 
<fragment android:id="@+id/settingsFragment"
android:name="ltd.evilcorp.atox.ui.settings.SettingsFragment"
android:label="SettingsFragment"/>
</navigation>
 
filename was Deleted added: 105, removed: 19, total 86
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<EditTextPreference app:key="name"
app:title="@string/name"
app:useSimpleSummaryProvider="true"/>
<EditTextPreference app:key="status_message"
app:title="@string/status_message"
app:useSimpleSummaryProvider="true"/>
</PreferenceScreen>
 
buildSrc/src/main/kotlin/Dependencies.kt added: 105, removed: 19, total 86
@@ -57,6 +57,8 @@ object Libraries {
const val roomRuntime = "androidx.room:room-runtime:${Version.room}"
const val roomCompiler = "androidx.room:room-compiler:${Version.room}"
 
const val preference = "androidx.preference:preference:1.1.0"
 
const val material = "com.google.android.material:material:1.1.0-beta02"
 
const val dagger = "com.google.dagger:dagger:${Version.dagger}"
 
domain/build.gradle.kts added: 105, removed: 19, total 86
@@ -48,6 +48,8 @@ dependencies {
 
implementation(Libraries.ktxCoroutinesCore)
 
implementation(Libraries.preference)
 
// For tox4j
// TODO(robinlinden): Fix tox4j build so we can update the scala dependencies
// noinspection GradleDependency
 
domain/src/main/kotlin/feature/UserManager.kt added: 105, removed: 19, total 86
@@ -1,5 +1,7 @@
package ltd.evilcorp.domain.feature
 
import android.content.Context
import androidx.preference.PreferenceManager
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
@@ -10,6 +12,7 @@ import ltd.evilcorp.domain.tox.Tox
import javax.inject.Inject
 
class UserManager @Inject constructor(
private val context: Context,
private val userRepository: UserRepository,
private val tox: Tox
) : CoroutineScope by GlobalScope {
@@ -30,6 +33,12 @@ class UserManager @Inject constructor(
} else {
userRepository.update(user)
}
 
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putString("name", name)
.putString("status_message", statusMessage).apply()
 
userRepository.update(user)
}
 
fun setName(name: String) = launch {