tls-psk: handle back button

This commit is contained in:
Vincent Breitmoser
2017-05-30 21:33:55 +02:00
parent b14674749b
commit f4d9d0a7c0
3 changed files with 46 additions and 8 deletions

View File

@@ -83,12 +83,12 @@ public class KeyTransferInteractor {
private static class TransferThread extends Thread { private static class TransferThread extends Thread {
private final Handler handler; private final Handler handler;
private final KeyTransferCallback callback;
private final byte[] presharedKey; private final byte[] presharedKey;
private final boolean isServer; private final boolean isServer;
private final String clientHost; private final String clientHost;
private final Integer clientPort; private final Integer clientPort;
private KeyTransferCallback callback;
private SSLServerSocket serverSocket; private SSLServerSocket serverSocket;
private byte[] dataToSend; private byte[] dataToSend;
private String sendPassthrough; private String sendPassthrough;
@@ -174,9 +174,12 @@ public class KeyTransferInteractor {
OutputStream outputStream = new BufferedOutputStream(socket.getOutputStream()); OutputStream outputStream = new BufferedOutputStream(socket.getOutputStream());
socket.setSoTimeout(500); socket.setSoTimeout(500);
while (!isInterrupted() && socket.isConnected()) { while (!isInterrupted() && socket.isConnected() && !socket.isClosed()) {
sendDataIfAvailable(socket, outputStream); sendDataIfAvailable(socket, outputStream);
receiveDataIfAvailable(socket, bufferedReader); boolean connectionTerminated = receiveDataIfAvailable(socket, bufferedReader);
if (connectionTerminated) {
break;
}
} }
Log.d(Constants.TAG, "disconnected"); Log.d(Constants.TAG, "disconnected");
invokeListener(CONNECTION_LOST, null); invokeListener(CONNECTION_LOST, null);
@@ -191,7 +194,6 @@ public class KeyTransferInteractor {
} }
if (firstLine == null) { if (firstLine == null) {
invokeListener(CONNECTION_LOST, null);
return true; return true;
} }
@@ -200,7 +202,7 @@ public class KeyTransferInteractor {
socket.setSoTimeout(500); socket.setSoTimeout(500);
invokeListener(CONNECTION_RECEIVE_OK, receivedData); invokeListener(CONNECTION_RECEIVE_OK, receivedData);
return true; return false;
} }
private boolean sendDataIfAvailable(Socket socket, OutputStream outputStream) throws IOException { private boolean sendDataIfAvailable(Socket socket, OutputStream outputStream) throws IOException {
@@ -280,6 +282,8 @@ public class KeyTransferInteractor {
@Override @Override
public void interrupt() { public void interrupt() {
callback = null;
super.interrupt(); super.interrupt();
if (serverSocket != null) { if (serverSocket != null) {

View File

@@ -63,6 +63,7 @@ import org.sufficientlysecure.keychain.util.Log;
@RequiresApi(api = VERSION_CODES.LOLLIPOP) @RequiresApi(api = VERSION_CODES.LOLLIPOP)
public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks<List<SecretKeyItem>>, public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks<List<SecretKeyItem>>,
OnClickTransferKeyListener, OnClickImportKeyListener { OnClickTransferKeyListener, OnClickImportKeyListener {
public static final String BACKSTACK_TAG_TRANSFER = "transfer";
private final Context context; private final Context context;
private final TransferMvpView view; private final TransferMvpView view;
private final LoaderManager loaderManager; private final LoaderManager loaderManager;
@@ -94,7 +95,7 @@ public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks<L
loaderManager.restartLoader(loaderId, null, this); loaderManager.restartLoader(loaderId, null, this);
if (keyTransferServerInteractor == null && keyTransferClientInteractor == null && !wasConnected) { if (keyTransferServerInteractor == null && keyTransferClientInteractor == null && !wasConnected) {
connectionStartListen(); connectionResetAndStartListen();
} }
} }
@@ -112,6 +113,12 @@ public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks<L
connectionStartConnect(qrCodeContent); connectionStartConnect(qrCodeContent);
} }
public void onUiBackStackPop() {
if (wasConnected) {
connectionResetAndStartListen();
}
}
@Override @Override
public void onUiClickTransferKey(long masterKeyId) { public void onUiClickTransferKey(long masterKeyId) {
try { try {
@@ -181,14 +188,15 @@ public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks<L
secretKeyAdapter.clearFinishedItems(); secretKeyAdapter.clearFinishedItems();
view.showConnectionEstablished(otherName); view.showConnectionEstablished(otherName);
view.addFakeBackStackItem(BACKSTACK_TAG_TRANSFER);
} }
@Override @Override
public void onConnectionLost() { public void onConnectionLost() {
Log.d(Constants.TAG, "Lost connection!"); Log.d(Constants.TAG, "Lost connection!");
if (!wasConnected) { if (!wasConnected) {
connectionStartListen();
view.showErrorConnectionFailed(); view.showErrorConnectionFailed();
connectionResetAndStartListen();
} else { } else {
view.showViewDisconnected(); view.showViewDisconnected();
secretKeyAdapter.disableAll(); secretKeyAdapter.disableAll();
@@ -237,7 +245,8 @@ public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks<L
keyTransferClientInteractor.connectToServer(qrCodeContent, this); keyTransferClientInteractor.connectToServer(qrCodeContent, this);
} }
private void connectionStartListen() { private void connectionResetAndStartListen() {
wasConnected = false;
connectionClear(); connectionClear();
keyTransferServerInteractor = new KeyTransferInteractor(); keyTransferServerInteractor = new KeyTransferInteractor();
@@ -302,5 +311,7 @@ public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks<L
void setReceivedKeyAdapter(Adapter secretKeyAdapter); void setReceivedKeyAdapter(Adapter secretKeyAdapter);
<T extends Parcelable, S extends OperationResult> CryptoOperationHelper<T,S> createCryptoOperationHelper(Callback<T, S> callback); <T extends Parcelable, S extends OperationResult> CryptoOperationHelper<T,S> createCryptoOperationHelper(Callback<T, S> callback);
void addFakeBackStackItem(String tag);
} }
} }

View File

@@ -27,6 +27,8 @@ import android.os.Parcelable;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi; import android.support.annotation.RequiresApi;
import android.support.v4.app.Fragment; 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;
import android.support.v7.widget.RecyclerView.Adapter; import android.support.v7.widget.RecyclerView.Adapter;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@@ -194,6 +196,27 @@ public class TransferFragment extends Fragment implements TransferMvpView {
result.createNotify(getActivity()).show(); 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 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (currentCryptoOperationHelper != null && if (currentCryptoOperationHelper != null &&