diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/KeyTransferInteractor.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/KeyTransferInteractor.java index 75ee873dd..e67cb63a3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/KeyTransferInteractor.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/KeyTransferInteractor.java @@ -83,12 +83,12 @@ public class KeyTransferInteractor { private static class TransferThread extends Thread { private final Handler handler; - private final KeyTransferCallback callback; private final byte[] presharedKey; private final boolean isServer; private final String clientHost; private final Integer clientPort; + private KeyTransferCallback callback; private SSLServerSocket serverSocket; private byte[] dataToSend; private String sendPassthrough; @@ -174,9 +174,12 @@ public class KeyTransferInteractor { OutputStream outputStream = new BufferedOutputStream(socket.getOutputStream()); socket.setSoTimeout(500); - while (!isInterrupted() && socket.isConnected()) { + while (!isInterrupted() && socket.isConnected() && !socket.isClosed()) { sendDataIfAvailable(socket, outputStream); - receiveDataIfAvailable(socket, bufferedReader); + boolean connectionTerminated = receiveDataIfAvailable(socket, bufferedReader); + if (connectionTerminated) { + break; + } } Log.d(Constants.TAG, "disconnected"); invokeListener(CONNECTION_LOST, null); @@ -191,7 +194,6 @@ public class KeyTransferInteractor { } if (firstLine == null) { - invokeListener(CONNECTION_LOST, null); return true; } @@ -200,7 +202,7 @@ public class KeyTransferInteractor { socket.setSoTimeout(500); invokeListener(CONNECTION_RECEIVE_OK, receivedData); - return true; + return false; } private boolean sendDataIfAvailable(Socket socket, OutputStream outputStream) throws IOException { @@ -280,6 +282,8 @@ public class KeyTransferInteractor { @Override public void interrupt() { + callback = null; + super.interrupt(); if (serverSocket != null) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/presenter/TransferPresenter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/presenter/TransferPresenter.java index a237099b6..17775ca1f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/presenter/TransferPresenter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/presenter/TransferPresenter.java @@ -63,6 +63,7 @@ import org.sufficientlysecure.keychain.util.Log; @RequiresApi(api = VERSION_CODES.LOLLIPOP) public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks>, OnClickTransferKeyListener, OnClickImportKeyListener { + public static final String BACKSTACK_TAG_TRANSFER = "transfer"; private final Context context; private final TransferMvpView view; private final LoaderManager loaderManager; @@ -94,7 +95,7 @@ public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks CryptoOperationHelper createCryptoOperationHelper(Callback callback); + + void addFakeBackStackItem(String tag); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferFragment.java index 9d1dc616d..251933cda 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/transfer/view/TransferFragment.java @@ -27,6 +27,8 @@ import android.os.Parcelable; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentManager.OnBackStackChangedListener; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.Adapter; import android.view.LayoutInflater; @@ -194,6 +196,27 @@ public class TransferFragment extends Fragment implements TransferMvpView { result.createNotify(getActivity()).show(); } + @Override + public void addFakeBackStackItem(final String tag) { + FragmentManager fragmentManager = getFragmentManager(); + + fragmentManager.beginTransaction() + .addToBackStack(tag) + .commitAllowingStateLoss(); + fragmentManager.executePendingTransactions(); + + fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() { + @Override + public void onBackStackChanged() { + FragmentManager fragMan = getFragmentManager(); + fragMan.popBackStack(tag, FragmentManager.POP_BACK_STACK_INCLUSIVE); + fragMan.removeOnBackStackChangedListener(this); + + presenter.onUiBackStackPop(); + } + }); + } + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (currentCryptoOperationHelper != null &&