Integrate keysbackup banner

This commit is contained in:
Benoit Marty 2019-06-11 15:45:40 +02:00
parent 5621f0661e
commit 4827b76b80
5 changed files with 84 additions and 5 deletions

View File

@ -20,20 +20,26 @@ import android.os.Bundle
import android.os.Parcelable import android.os.Parcelable
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.core.view.forEachIndexed import androidx.core.view.forEachIndexed
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.ViewModelProviders
import com.airbnb.mvrx.args import com.airbnb.mvrx.args
import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState import com.airbnb.mvrx.withState
import com.google.android.material.bottomnavigation.BottomNavigationItemView import com.google.android.material.bottomnavigation.BottomNavigationItemView
import com.google.android.material.bottomnavigation.BottomNavigationMenuView import com.google.android.material.bottomnavigation.BottomNavigationMenuView
import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupState
import im.vector.riotredesign.R import im.vector.riotredesign.R
import im.vector.riotredesign.core.platform.ToolbarConfigurable import im.vector.riotredesign.core.platform.ToolbarConfigurable
import im.vector.riotredesign.core.platform.VectorBaseFragment import im.vector.riotredesign.core.platform.VectorBaseFragment
import im.vector.riotredesign.core.ui.views.KeysBackupBanner
import im.vector.riotredesign.features.home.room.list.RoomListFragment import im.vector.riotredesign.features.home.room.list.RoomListFragment
import im.vector.riotredesign.features.home.room.list.RoomListParams import im.vector.riotredesign.features.home.room.list.RoomListParams
import im.vector.riotredesign.features.home.room.list.UnreadCounterBadgeView import im.vector.riotredesign.features.home.room.list.UnreadCounterBadgeView
import im.vector.riotredesign.features.workers.signout.SignOutViewModel
import kotlinx.android.parcel.Parcelize import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.fragment_home_detail.* import kotlinx.android.synthetic.main.fragment_home_detail.*
import org.koin.android.ext.android.inject




@Parcelize @Parcelize
@ -50,7 +56,7 @@ private const val INDEX_CATCHUP = 0
private const val INDEX_PEOPLE = 1 private const val INDEX_PEOPLE = 1
private const val INDEX_ROOMS = 2 private const val INDEX_ROOMS = 2


class HomeDetailFragment : VectorBaseFragment() { class HomeDetailFragment : VectorBaseFragment(), KeysBackupBanner.Delegate {


private val params: HomeDetailParams by args() private val params: HomeDetailParams by args()
private val unreadCounterBadgeViews = arrayListOf<UnreadCounterBadgeView>() private val unreadCounterBadgeViews = arrayListOf<UnreadCounterBadgeView>()
@ -59,6 +65,8 @@ class HomeDetailFragment : VectorBaseFragment() {
private val viewModel: HomeDetailViewModel by fragmentViewModel() private val viewModel: HomeDetailViewModel by fragmentViewModel()
private lateinit var navigationViewModel: HomeNavigationViewModel private lateinit var navigationViewModel: HomeNavigationViewModel


private val session by inject<Session>()

override fun getLayoutResId(): Int { override fun getLayoutResId(): Int {
return R.layout.fragment_home_detail return R.layout.fragment_home_detail
} }
@ -73,6 +81,41 @@ class HomeDetailFragment : VectorBaseFragment() {
switchDisplayMode(currentDisplayMode) switchDisplayMode(currentDisplayMode)
setupBottomNavigationView() setupBottomNavigationView()
setupToolbar() setupToolbar()
setupKeysBackupBanner()
}

private fun setupKeysBackupBanner() {
// Keys backup banner
// Use the SignOutViewModel, it observe the keys backup state and this is what we need here
val model = ViewModelProviders.of(this).get(SignOutViewModel::class.java)

model.init(session)

model.keysBackupState.observe(this, Observer { keysBackupState ->
when (keysBackupState) {
null ->
homeKeysBackupBanner.render(KeysBackupBanner.State.Hidden, false)
KeysBackupState.Disabled ->
homeKeysBackupBanner.render(KeysBackupBanner.State.Setup(model.getNumberOfKeysToBackup()), false)
KeysBackupState.NotTrusted,
KeysBackupState.WrongBackUpVersion ->
// In this case, getCurrentBackupVersion() should not return ""
homeKeysBackupBanner.render(KeysBackupBanner.State.Recover(model.getCurrentBackupVersion()), false)
KeysBackupState.WillBackUp,
KeysBackupState.BackingUp ->
homeKeysBackupBanner.render(KeysBackupBanner.State.BackingUp, false)
KeysBackupState.ReadyToBackUp ->
if (model.canRestoreKeys()) {
homeKeysBackupBanner.render(KeysBackupBanner.State.Update(model.getCurrentBackupVersion()), false)
} else {
homeKeysBackupBanner.render(KeysBackupBanner.State.Hidden, false)
}
else ->
homeKeysBackupBanner.render(KeysBackupBanner.State.Hidden, false)
}
})

homeKeysBackupBanner.delegate = this
} }




@ -140,6 +183,17 @@ class HomeDetailFragment : VectorBaseFragment() {
.commit() .commit()
} }


/* ==========================================================================================
* KeysBackupBanner Listener
* ========================================================================================== */

override fun setupKeysBackup() {
navigator.openKeysBackupSetup(requireActivity(), false)
}

override fun recoverKeysBackup() {
navigator.openKeysBackupManager(requireActivity())
}


override fun invalidate() = withState(viewModel) { override fun invalidate() = withState(viewModel) {
unreadCounterBadgeViews[INDEX_CATCHUP].render(UnreadCounterBadgeView.State(it.notificationCountCatchup, it.notificationHighlightCatchup)) unreadCounterBadgeViews[INDEX_CATCHUP].render(UnreadCounterBadgeView.State(it.notificationCountCatchup, it.notificationHighlightCatchup))

View File

@ -19,6 +19,8 @@ package im.vector.riotredesign.features.navigation
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import im.vector.matrix.android.api.session.room.model.roomdirectory.PublicRoom import im.vector.matrix.android.api.session.room.model.roomdirectory.PublicRoom
import im.vector.riotredesign.features.crypto.keysbackup.settings.KeysBackupManageActivity
import im.vector.riotredesign.features.crypto.keysbackup.setup.KeysBackupSetupActivity
import im.vector.riotredesign.features.debug.DebugMenuActivity import im.vector.riotredesign.features.debug.DebugMenuActivity
import im.vector.riotredesign.features.home.room.detail.RoomDetailActivity import im.vector.riotredesign.features.home.room.detail.RoomDetailActivity
import im.vector.riotredesign.features.home.room.detail.RoomDetailArgs import im.vector.riotredesign.features.home.room.detail.RoomDetailArgs
@ -53,4 +55,12 @@ class DefaultNavigator : Navigator {
override fun openDebug(context: Context) { override fun openDebug(context: Context) {
context.startActivity(Intent(context, DebugMenuActivity::class.java)) context.startActivity(Intent(context, DebugMenuActivity::class.java))
} }

override fun openKeysBackupSetup(context: Context, showManualExport: Boolean) {
context.startActivity(KeysBackupSetupActivity.intent(context, showManualExport))
}

override fun openKeysBackupManager(context: Context) {
context.startActivity(KeysBackupManageActivity.intent(context))
}
} }

View File

@ -31,4 +31,7 @@ interface Navigator {


fun openDebug(context: Context) fun openDebug(context: Context)


fun openKeysBackupSetup(context: Context, showManualExport: Boolean)

fun openKeysBackupManager(context: Context)
} }

View File

@ -44,13 +44,24 @@


</androidx.appcompat.widget.Toolbar> </androidx.appcompat.widget.Toolbar>


<im.vector.riotredesign.core.ui.views.KeysBackupBanner
android:id="@+id/homeKeysBackupBanner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?vctr_list_header_background_color"
android:minHeight="67dp"
app:layout_constraintBottom_toTopOf="@+id/roomListContainer"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/groupToolbar" />

<FrameLayout <FrameLayout
android:id="@+id/roomListContainer" android:id="@+id/roomListContainer"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:background="?riotx_header_panel_background" android:background="?riotx_header_panel_background"
app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView" app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
app:layout_constraintTop_toBottomOf="@+id/groupToolbar" /> app:layout_constraintTop_toBottomOf="@+id/homeKeysBackupBanner" />


<com.google.android.material.bottomnavigation.BottomNavigationView <com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNavigationView" android:id="@+id/bottomNavigationView"

View File

@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?vctr_list_header_background_color" android:background="?vctr_list_header_background_color"
android:minHeight="67dp"> android:minHeight="67dp"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">


<ImageView <ImageView
android:id="@+id/view_keys_backup_banner_picto" android:id="@+id/view_keys_backup_banner_picto"
@ -101,4 +102,4 @@
android:background="?vctr_line_divider" android:background="?vctr_line_divider"
app:layout_constraintBottom_toBottomOf="parent" /> app:layout_constraintBottom_toBottomOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout> </merge>