From 5a84fa5a801ba2f3e89a1fc832e540cd26fa9dd1 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 17 Mar 2021 16:46:25 -0400 Subject: [PATCH] Fix device transfer stall if screen is locked during transfer. --- .../DeviceTransferFragment.java | 27 +++++++++++++++++++ .../newdevice/NewDeviceTransferFragment.java | 8 +++++- .../olddevice/OldDeviceClientTask.java | 2 ++ .../olddevice/OldDeviceTransferFragment.java | 9 ++++--- .../DeviceToDeviceTransferService.java | 5 ++-- 5 files changed, 45 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferFragment.java index e8ed84788..aee1d4a14 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferFragment.java @@ -27,6 +27,8 @@ import org.thoughtcrime.securesms.R; */ public abstract class DeviceTransferFragment extends LoggingFragment { + private static final String TRANSFER_FINISHED_KEY = "transfer_finished"; + private final OnBackPressed onBackPressed = new OnBackPressed(); private final TransferModeListener transferModeListener = new TransferModeListener(); @@ -36,11 +38,34 @@ public abstract class DeviceTransferFragment extends LoggingFragment { protected View progress; protected View alert; protected TextView status; + protected boolean transferFinished; public DeviceTransferFragment() { super(R.layout.device_transfer_fragment); } + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + transferFinished = savedInstanceState.getBoolean(TRANSFER_FINISHED_KEY); + } + } + + @Override + public void onStart() { + super.onStart(); + if (transferFinished) { + navigateToTransferComplete(); + } + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(TRANSFER_FINISHED_KEY, transferFinished); + } + @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { title = view.findViewById(R.id.device_transfer_fragment_title); @@ -93,6 +118,8 @@ public abstract class DeviceTransferFragment extends LoggingFragment { protected abstract void navigateAwayFromTransfer(); + protected abstract void navigateToTransferComplete(); + private class TransferModeListener { @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onEventMainThread(@NonNull TransferStatus event) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferFragment.java index 3a8ebc13b..3332b2124 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferFragment.java @@ -46,6 +46,11 @@ public final class NewDeviceTransferFragment extends DeviceTransferFragment { .navigate(R.id.action_restart_to_welcomeFragment); } + @Override + protected void navigateToTransferComplete() { + NavHostFragment.findNavController(this).navigate(R.id.action_newDeviceTransfer_to_newDeviceTransferComplete); + } + private class ServerTaskListener { @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(@NonNull NewDeviceServerTask.Status event) { @@ -54,8 +59,9 @@ public final class NewDeviceTransferFragment extends DeviceTransferFragment { case IN_PROGRESS: break; case SUCCESS: + transferFinished = true; DeviceToDeviceTransferService.stop(requireContext()); - NavHostFragment.findNavController(NewDeviceTransferFragment.this).navigate(R.id.action_newDeviceTransfer_to_newDeviceTransferComplete); + navigateToTransferComplete(); break; case FAILURE_VERSION_DOWNGRADE: abort(R.string.NewDeviceTransfer__cannot_transfer_from_a_newer_version_of_signal); diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceClientTask.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceClientTask.java index 4c379f1b2..042f9c873 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceClientTask.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceClientTask.java @@ -13,6 +13,7 @@ import org.thoughtcrime.securesms.backup.FullBackupBase; import org.thoughtcrime.securesms.backup.FullBackupExporter; import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.net.DeviceTransferBlockingInterceptor; import java.io.IOException; @@ -66,6 +67,7 @@ final class OldDeviceClientTask implements ClientTask { @Override public void success() { + SignalStore.misc().markOldDeviceTransferLocked(); EventBus.getDefault().post(new Status(0, true)); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferFragment.java index 25e74cb3b..15e85a49e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferFragment.java @@ -5,7 +5,6 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import androidx.navigation.fragment.NavHostFragment; import org.greenrobot.eventbus.EventBus; @@ -15,7 +14,6 @@ import org.signal.devicetransfer.DeviceToDeviceTransferService; import org.signal.devicetransfer.TransferStatus; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.devicetransfer.DeviceTransferFragment; -import org.thoughtcrime.securesms.keyvalue.SignalStore; /** * Shows transfer progress on the old device. Most logic is in {@link DeviceTransferFragment} @@ -48,14 +46,19 @@ public final class OldDeviceTransferFragment extends DeviceTransferFragment { requireActivity().finish(); } + @Override + protected void navigateToTransferComplete() { + NavHostFragment.findNavController(this).navigate(R.id.action_oldDeviceTransfer_to_oldDeviceTransferComplete); + } + private class ClientTaskListener { @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(@NonNull OldDeviceClientTask.Status event) { if (event.isDone()) { + transferFinished = true; ignoreTransferStatusEvents(); EventBus.getDefault().removeStickyEvent(TransferStatus.class); DeviceToDeviceTransferService.stop(requireContext()); - SignalStore.misc().markOldDeviceTransferLocked(); NavHostFragment.findNavController(OldDeviceTransferFragment.this).navigate(R.id.action_oldDeviceTransfer_to_oldDeviceTransferComplete); } else { status.setText(getString(R.string.DeviceTransfer__d_messages_so_far, event.getMessageCount())); diff --git a/device-transfer/lib/src/main/java/org/signal/devicetransfer/DeviceToDeviceTransferService.java b/device-transfer/lib/src/main/java/org/signal/devicetransfer/DeviceToDeviceTransferService.java index 51ba1177a..6c68a2396 100644 --- a/device-transfer/lib/src/main/java/org/signal/devicetransfer/DeviceToDeviceTransferService.java +++ b/device-transfer/lib/src/main/java/org/signal/devicetransfer/DeviceToDeviceTransferService.java @@ -88,7 +88,7 @@ public class DeviceToDeviceTransferService extends Service implements ShutdownCa @Override public void onCreate() { super.onCreate(); - Log.e(TAG, "onCreate"); + Log.v(TAG, "onCreate"); EventBus.getDefault().register(this); } @@ -100,7 +100,7 @@ public class DeviceToDeviceTransferService extends Service implements ShutdownCa @Override public void onDestroy() { - Log.e(TAG, "onDestroy"); + Log.v(TAG, "onDestroy"); EventBus.getDefault().unregister(this); @@ -219,6 +219,7 @@ public class DeviceToDeviceTransferService extends Service implements ShutdownCa case UNAVAILABLE: case FAILED: case SERVICE_DISCONNECTED: + case SHUTDOWN: Log.d(TAG, "Intentionally no notification text for: " + transferStatus.getTransferMode()); break; default: