DeviceTransferFragment Kotlin rewrite.
This commit is contained in:
parent
03d8f72c41
commit
41935120e5
2 changed files with 238 additions and 0 deletions
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* Copyright 2024 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.thoughtcrime.securesms.restore.devicetransfer
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.activity.OnBackPressedCallback
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.greenrobot.eventbus.Subscribe
|
||||
import org.greenrobot.eventbus.ThreadMode
|
||||
import org.signal.devicetransfer.DeviceToDeviceTransferService
|
||||
import org.signal.devicetransfer.TransferStatus
|
||||
import org.thoughtcrime.securesms.LoggingFragment
|
||||
import org.thoughtcrime.securesms.R
|
||||
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
||||
import org.thoughtcrime.securesms.databinding.FragmentDeviceTransferV2Binding
|
||||
import org.thoughtcrime.securesms.restore.RestoreViewModel
|
||||
import org.thoughtcrime.securesms.util.visible
|
||||
|
||||
sealed class DeviceTransferV2Fragment : LoggingFragment(R.layout.fragment_device_transfer_v2) {
|
||||
private val onBackPressed = OnBackPressed()
|
||||
private val transferModeListener = TransferModeListener()
|
||||
protected val navigationViewModel: RestoreViewModel by activityViewModels()
|
||||
protected val binding: FragmentDeviceTransferV2Binding by ViewBinderDelegate(FragmentDeviceTransferV2Binding::bind)
|
||||
|
||||
protected var transferFinished: Boolean = false
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
if (savedInstanceState != null) {
|
||||
transferFinished = savedInstanceState.getBoolean(TRANSFER_FINISHED_KEY)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
outState.putBoolean(TRANSFER_FINISHED_KEY, transferFinished)
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
binding.deviceTransferFragmentCancel.setOnClickListener {
|
||||
cancelActiveTransfer()
|
||||
}
|
||||
binding.deviceTransferFragmentTryAgain.setOnClickListener {
|
||||
EventBus.getDefault().unregister(transferModeListener)
|
||||
EventBus.getDefault().removeStickyEvent(TransferStatus::class.java)
|
||||
navigateToRestartTransfer()
|
||||
}
|
||||
|
||||
EventBus.getDefault().register(transferModeListener)
|
||||
|
||||
requireActivity().onBackPressedDispatcher.addCallback(
|
||||
viewLifecycleOwner,
|
||||
onBackPressed
|
||||
)
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
EventBus.getDefault().unregister(transferModeListener)
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
private fun cancelActiveTransfer() {
|
||||
MaterialAlertDialogBuilder(requireContext()).apply {
|
||||
setTitle(R.string.DeviceTransfer__stop_transfer)
|
||||
setMessage(R.string.DeviceTransfer__all_transfer_progress_will_be_lost)
|
||||
setPositiveButton(R.string.DeviceTransfer__stop_transfer) { _, _ ->
|
||||
EventBus.getDefault().unregister(transferModeListener)
|
||||
DeviceToDeviceTransferService.stop(requireContext())
|
||||
EventBus.getDefault().removeStickyEvent(TransferStatus::class.java)
|
||||
navigateAwayFromTransfer()
|
||||
}
|
||||
setNegativeButton(android.R.string.cancel, null)
|
||||
}
|
||||
.show()
|
||||
}
|
||||
|
||||
protected fun ignoreTransferStatusEvents() {
|
||||
EventBus.getDefault().unregister(transferModeListener)
|
||||
}
|
||||
|
||||
protected abstract fun navigateToRestartTransfer()
|
||||
|
||||
protected abstract fun navigateAwayFromTransfer()
|
||||
|
||||
protected abstract fun navigateToTransferComplete()
|
||||
|
||||
protected fun abort() {
|
||||
abort(R.string.DeviceTransfer__transfer_failed)
|
||||
}
|
||||
|
||||
protected fun abort(@StringRes errorMessage: Int) {
|
||||
EventBus.getDefault().unregister(transferModeListener)
|
||||
DeviceToDeviceTransferService.stop(requireContext())
|
||||
|
||||
binding.deviceTransferFragmentProgress.visible = false
|
||||
binding.deviceTransferFragmentAlert.visible = true
|
||||
binding.deviceTransferFragmentTryAgain.visible = true
|
||||
|
||||
binding.deviceTransferFragmentTitle.setText(R.string.DeviceTransfer__unable_to_transfer)
|
||||
binding.deviceTransferFragmentStatus.setText(errorMessage)
|
||||
binding.deviceTransferFragmentCancel.setText(R.string.DeviceTransfer__cancel)
|
||||
binding.deviceTransferFragmentCancel.setOnClickListener { navigateAwayFromTransfer() }
|
||||
|
||||
onBackPressed.isActiveTransfer = false
|
||||
}
|
||||
|
||||
private inner class TransferModeListener {
|
||||
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
|
||||
fun onEventMainThread(event: TransferStatus) {
|
||||
if (event.transferMode != TransferStatus.TransferMode.SERVICE_CONNECTED) {
|
||||
abort()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected inner class OnBackPressed : OnBackPressedCallback(true) {
|
||||
internal var isActiveTransfer = true
|
||||
|
||||
override fun handleOnBackPressed() {
|
||||
if (isActiveTransfer) {
|
||||
cancelActiveTransfer()
|
||||
} else {
|
||||
navigateAwayFromTransfer()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TRANSFER_FINISHED_KEY = "transfer_finished"
|
||||
}
|
||||
}
|
99
app/src/main/res/layout/fragment_device_transfer_v2.xml
Normal file
99
app/src/main/res/layout/fragment_device_transfer_v2.xml
Normal file
|
@ -0,0 +1,99 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:paddingStart="32dp"
|
||||
android:paddingTop="64dp"
|
||||
android:paddingEnd="32dp"
|
||||
android:paddingBottom="16dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/device_transfer_fragment_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:text="@string/DeviceTransfer__transferring_data"
|
||||
android:textAppearance="@style/Signal.Text.Headline.Registration"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/device_transfer_fragment_subtitle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:gravity="center"
|
||||
android:text="@string/DeviceTransfer__keep_both_devices_near_each_other"
|
||||
android:textAppearance="@style/TextAppearance.Signal.Body1"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/device_transfer_fragment_title" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/device_transfer_fragment_alert"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:srcCompat="@drawable/ic_warning_40"
|
||||
app:tint="@color/signal_alert_primary" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/device_transfer_fragment_progress"
|
||||
style="?android:attr/progressBarStyleLarge"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.constraintlayout.widget.Barrier
|
||||
android:id="@+id/device_Transfer_fragment_middle_content_barrier"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:barrierDirection="bottom"
|
||||
app:constraint_referenced_ids="device_transfer_fragment_alert,device_transfer_fragment_progress" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/device_transfer_fragment_status"
|
||||
style="@style/TextAppearance.Signal.Body1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/device_Transfer_fragment_middle_content_barrier"
|
||||
tools:text="Status" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/device_transfer_fragment_try_again"
|
||||
style="@style/Signal.Widget.Button.Large.Primary"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:text="@string/DeviceTransfer__try_again"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toTopOf="@+id/device_transfer_fragment_cancel"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/device_transfer_fragment_cancel"
|
||||
style="@style/Signal.Widget.Button.Medium.Secondary"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/DeviceTransfer__stop_transfer"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
Loading…
Add table
Reference in a new issue