tls-psk: handle back button
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 &&
|
||||||
|
|||||||
Reference in New Issue
Block a user