Fix NavigationActivity onCreate method
Add Splash, Login classes (refactor)
This commit is contained in:
parent
e07467b93b
commit
7507a9cf16
10 changed files with 158 additions and 21 deletions
|
@ -0,0 +1,18 @@
|
||||||
|
package com.keylesspalace.tusky.core.extensions
|
||||||
|
|
||||||
|
import android.R.id
|
||||||
|
import android.text.method.LinkMovementMethod
|
||||||
|
import android.text.util.Linkify
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
|
||||||
|
fun AlertDialog.Builder.dialogWithLink(message: String, positiveButton: String) {
|
||||||
|
val dialog = AlertDialog.Builder(context)
|
||||||
|
.setMessage(message)
|
||||||
|
.setPositiveButton(positiveButton, null)
|
||||||
|
.show()
|
||||||
|
|
||||||
|
val text = dialog.window?.findViewById<TextView>(id.message)
|
||||||
|
text?.autoLinkMask = Linkify.ALL
|
||||||
|
text?.movementMethod = LinkMovementMethod.getInstance()
|
||||||
|
}
|
|
@ -20,7 +20,6 @@
|
||||||
package com.keylesspalace.tusky.core.navigation
|
package com.keylesspalace.tusky.core.navigation
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.PersistableBundle
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import com.keylesspalace.tusky.core.di.HuskyServices
|
import com.keylesspalace.tusky.core.di.HuskyServices
|
||||||
import com.keylesspalace.tusky.core.extensions.viewBinding
|
import com.keylesspalace.tusky.core.extensions.viewBinding
|
||||||
|
@ -40,8 +39,8 @@ class NavigationActivity : AppCompatActivity(), SimpleStateChanger.NavigationHan
|
||||||
private val binding by viewBinding(ActivityNavigationBinding::inflate)
|
private val binding by viewBinding(ActivityNavigationBinding::inflate)
|
||||||
private lateinit var fragmentStateChanger: DefaultFragmentStateChanger
|
private lateinit var fragmentStateChanger: DefaultFragmentStateChanger
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState, persistentState)
|
super.onCreate(savedInstanceState)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
initNavigation()
|
initNavigation()
|
||||||
|
@ -60,8 +59,6 @@ class NavigationActivity : AppCompatActivity(), SimpleStateChanger.NavigationHan
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initNavigation() {
|
private fun initNavigation() {
|
||||||
Timber.d("Init setup navigation")
|
|
||||||
|
|
||||||
fragmentStateChanger = DefaultFragmentStateChanger(
|
fragmentStateChanger = DefaultFragmentStateChanger(
|
||||||
supportFragmentManager,
|
supportFragmentManager,
|
||||||
binding.fragmentContainer.id
|
binding.fragmentContainer.id
|
||||||
|
|
|
@ -23,5 +23,5 @@ import com.zhuinden.simplestackextensions.fragments.DefaultFragmentKey
|
||||||
|
|
||||||
abstract class BaseKey : DefaultFragmentKey() {
|
abstract class BaseKey : DefaultFragmentKey() {
|
||||||
|
|
||||||
override fun getFragmentTag(): String = this.javaClass.simpleName
|
override fun getFragmentTag(): String = this.javaClass.name
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,5 +23,5 @@ import com.zhuinden.simplestackextensions.services.DefaultServiceProvider
|
||||||
|
|
||||||
abstract class BaseServiceKey : BaseKey(), DefaultServiceProvider.HasServices {
|
abstract class BaseServiceKey : BaseKey(), DefaultServiceProvider.HasServices {
|
||||||
|
|
||||||
override fun getScopeTag(): String = this.javaClass.simpleName
|
override fun getScopeTag(): String = this.javaClass.name
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.keylesspalace.tusky.refactor_features.login.view.fragments
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.View
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import com.keylesspalace.tusky.R
|
||||||
|
import com.keylesspalace.tusky.core.extensions.dialogWithLink
|
||||||
|
import com.keylesspalace.tusky.core.extensions.viewBinding
|
||||||
|
import com.keylesspalace.tusky.core.extensions.viewObserve
|
||||||
|
import com.keylesspalace.tusky.core.ui.fragment.BaseFragment
|
||||||
|
import com.keylesspalace.tusky.databinding.ActivityLoginBinding
|
||||||
|
import com.keylesspalace.tusky.refactor_features.login.view.viewmodel.LoginViewModel
|
||||||
|
import com.zhuinden.simplestackextensions.fragmentsktx.lookup
|
||||||
|
|
||||||
|
class LoginFragment : BaseFragment(R.layout.activity_login) {
|
||||||
|
|
||||||
|
private val binding by viewBinding(ActivityLoginBinding::bind)
|
||||||
|
private val viewModel by lazy { lookup<LoginViewModel>() }
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
initObservers()
|
||||||
|
initListeners()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initObservers() {
|
||||||
|
with(viewModel) {
|
||||||
|
viewObserve(verifyUrl, ::handleVerifyUrl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initListeners() {
|
||||||
|
binding.whatsAnInstanceTextView.setOnClickListener {
|
||||||
|
AlertDialog.Builder(requireActivity()).dialogWithLink(
|
||||||
|
getString(R.string.dialog_whats_an_instance),
|
||||||
|
getString(R.string.action_close)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleVerifyUrl(isValid: Boolean?) {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.keylesspalace.tusky.refactor_features.login.view.navigation
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import com.keylesspalace.tusky.core.ui.navigation.BaseServiceKey
|
||||||
|
import com.keylesspalace.tusky.refactor_features.login.view.fragments.LoginFragment
|
||||||
|
import com.keylesspalace.tusky.refactor_features.login.view.viewmodel.LoginViewModel
|
||||||
|
import com.zhuinden.simplestack.ServiceBinder
|
||||||
|
import com.zhuinden.simplestackextensions.servicesktx.add
|
||||||
|
import kotlinx.android.parcel.Parcelize
|
||||||
|
|
||||||
|
@Parcelize
|
||||||
|
class LoginKey : BaseServiceKey() {
|
||||||
|
|
||||||
|
override fun instantiateFragment(): Fragment {
|
||||||
|
return LoginFragment()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun bindServices(serviceBinder: ServiceBinder) {
|
||||||
|
serviceBinder.add(LoginViewModel())
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.keylesspalace.tusky.refactor_features.login.view.viewmodel
|
||||||
|
|
||||||
|
import androidx.lifecycle.LiveData
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import com.keylesspalace.tusky.core.ui.viewmodel.BaseViewModel
|
||||||
|
import com.zhuinden.statebundle.StateBundle
|
||||||
|
import timber.log.Timber
|
||||||
|
|
||||||
|
class LoginViewModel : BaseViewModel() {
|
||||||
|
|
||||||
|
private val mVerifyUrl = MutableLiveData<Boolean>()
|
||||||
|
val verifyUrl: LiveData<Boolean>
|
||||||
|
get() = mVerifyUrl
|
||||||
|
|
||||||
|
override fun toBundle(): StateBundle {
|
||||||
|
val stateBundle = StateBundle()
|
||||||
|
|
||||||
|
stateBundle.putBoolean(LoginViewModelKeys.Bundle.VERIFY_URL, mVerifyUrl.value ?: false)
|
||||||
|
|
||||||
|
Timber.d("TO BUNDLE")
|
||||||
|
|
||||||
|
return stateBundle
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun fromBundle(bundle: StateBundle?) {
|
||||||
|
bundle?.let {
|
||||||
|
mVerifyUrl.value = it.getBoolean(LoginViewModelKeys.Bundle.VERIFY_URL)
|
||||||
|
|
||||||
|
Timber.d("FROM BUNDLE")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun verifyUrl(url: String?) {
|
||||||
|
mVerifyUrl.value = false
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package com.keylesspalace.tusky.refactor_features.login.view.viewmodel
|
||||||
|
|
||||||
|
sealed class LoginViewModelKeys {
|
||||||
|
|
||||||
|
object Bundle {
|
||||||
|
const val VERIFY_URL = "verifyUrl"
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,16 +1,26 @@
|
||||||
package com.keylesspalace.tusky.refactor_features.splash.view.fragments
|
package com.keylesspalace.tusky.refactor_features.splash.view.fragments
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.View
|
||||||
import com.keylesspalace.tusky.R
|
import com.keylesspalace.tusky.R
|
||||||
import com.keylesspalace.tusky.core.extensions.viewBinding
|
import com.keylesspalace.tusky.core.extensions.viewBinding
|
||||||
import com.keylesspalace.tusky.core.ui.fragment.BaseFragment
|
import com.keylesspalace.tusky.core.ui.fragment.BaseFragment
|
||||||
import com.keylesspalace.tusky.databinding.FragmentSplashBinding
|
import com.keylesspalace.tusky.databinding.FragmentSplashBinding
|
||||||
|
import com.keylesspalace.tusky.refactor_features.login.view.navigation.LoginKey
|
||||||
import com.keylesspalace.tusky.refactor_features.splash.view.viewmodel.SplashViewModel
|
import com.keylesspalace.tusky.refactor_features.splash.view.viewmodel.SplashViewModel
|
||||||
|
import com.zhuinden.simplestack.History
|
||||||
|
import com.zhuinden.simplestack.StateChange
|
||||||
|
import com.zhuinden.simplestackextensions.fragmentsktx.backstack
|
||||||
import com.zhuinden.simplestackextensions.fragmentsktx.lookup
|
import com.zhuinden.simplestackextensions.fragmentsktx.lookup
|
||||||
|
|
||||||
|
|
||||||
class SplashFragment : BaseFragment(R.layout.fragment_splash) {
|
class SplashFragment : BaseFragment(R.layout.fragment_splash) {
|
||||||
|
|
||||||
private val binding by viewBinding(FragmentSplashBinding::bind)
|
private val binding by viewBinding(FragmentSplashBinding::bind)
|
||||||
private val viewModel: SplashViewModel by lazy { lookup() }
|
private val viewModel by lazy { lookup<SplashViewModel>() }
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
backstack.setHistory(History.single(LoginKey()), StateChange.FORWARD)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,11 +23,11 @@
|
||||||
android:padding="16dp">
|
android:padding="16dp">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
|
android:id="@+id/loginLogo"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="50dp"
|
android:layout_marginBottom="50dp"
|
||||||
android:contentDescription="@null"
|
android:contentDescription="@null"
|
||||||
android:id="@+id/loginLogo"
|
|
||||||
app:srcCompat="@drawable/elephant_friend" />
|
app:srcCompat="@drawable/elephant_friend" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
@ -57,14 +57,15 @@
|
||||||
android:id="@+id/extendedSettings"
|
android:id="@+id/extendedSettings"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:visibility="gone"
|
android:orientation="vertical"
|
||||||
android:orientation="vertical">
|
android:visibility="gone">
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
style="@style/TuskyTextInput"
|
style="@style/TuskyTextInput"
|
||||||
android:layout_width="250dp"
|
android:layout_width="250dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/hint_appname"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
|
android:hint="@string/hint_appname"
|
||||||
app:errorEnabled="true">
|
app:errorEnabled="true">
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputEditText
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
@ -79,8 +80,8 @@
|
||||||
style="@style/TuskyTextInput"
|
style="@style/TuskyTextInput"
|
||||||
android:layout_width="250dp"
|
android:layout_width="250dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/hint_website"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
|
android:hint="@string/hint_website"
|
||||||
app:errorEnabled="true">
|
app:errorEnabled="true">
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputEditText
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
@ -97,6 +98,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/loginButton"
|
android:id="@+id/loginButton"
|
||||||
style="@style/TuskyButton"
|
style="@style/TuskyButton"
|
||||||
|
@ -109,10 +111,10 @@
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/settingsButton"
|
android:id="@+id/settingsButton"
|
||||||
style="@style/TuskyButton"
|
style="@style/TuskyButton"
|
||||||
android:padding="4dp"
|
|
||||||
android:layout_width="32dp"
|
android:layout_width="32dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
|
android:padding="4dp"
|
||||||
app:icon="@drawable/ic_settings" />
|
app:icon="@drawable/ic_settings" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -146,6 +148,7 @@
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
<androidx.appcompat.widget.Toolbar
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
|
Loading…
Reference in a new issue