DeviceTransferFragment Kotlin rewrite.

This commit is contained in:
Nicholas Tinsley 2024-05-01 15:23:31 -04:00 committed by Greyson Parrelli
parent 03d8f72c41
commit 41935120e5
2 changed files with 238 additions and 0 deletions

View file

@ -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"
}
}

View 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>