tls-psk: use inline progress animation
This commit is contained in:
@@ -91,6 +91,7 @@ public class KeyTransferInteractor {
|
|||||||
|
|
||||||
private SSLServerSocket serverSocket;
|
private SSLServerSocket serverSocket;
|
||||||
private byte[] dataToSend;
|
private byte[] dataToSend;
|
||||||
|
private String sendPassthrough;
|
||||||
|
|
||||||
static TransferThread createClientTransferThread(KeyTransferCallback callback, byte[] presharedKey,
|
static TransferThread createClientTransferThread(KeyTransferCallback callback, byte[] presharedKey,
|
||||||
String host, int port) {
|
String host, int port) {
|
||||||
@@ -209,8 +210,9 @@ public class KeyTransferInteractor {
|
|||||||
dataToSend = null;
|
dataToSend = null;
|
||||||
|
|
||||||
socket.setSoTimeout(2000);
|
socket.setSoTimeout(2000);
|
||||||
sendDataAndClose(socket.getOutputStream(), data);
|
sendData(socket.getOutputStream(), data);
|
||||||
invokeListener(CONNECTION_SEND_OK, null);
|
invokeListener(CONNECTION_SEND_OK, sendPassthrough);
|
||||||
|
sendPassthrough = null;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -226,7 +228,7 @@ public class KeyTransferInteractor {
|
|||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendDataAndClose(OutputStream outputStream, byte[] data) throws IOException {
|
private void sendData(OutputStream outputStream, byte[] data) throws IOException {
|
||||||
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
|
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
|
||||||
bufferedOutputStream.write(data);
|
bufferedOutputStream.write(data);
|
||||||
bufferedOutputStream.close();
|
bufferedOutputStream.close();
|
||||||
@@ -265,8 +267,9 @@ public class KeyTransferInteractor {
|
|||||||
handler.post(runnable);
|
handler.post(runnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized void sendDataAndClose(byte[] dataToSend) {
|
synchronized void sendData(byte[] dataToSend, String passthrough) {
|
||||||
this.dataToSend = dataToSend;
|
this.dataToSend = dataToSend;
|
||||||
|
this.sendPassthrough = passthrough;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -297,8 +300,8 @@ public class KeyTransferInteractor {
|
|||||||
transferThread = null;
|
transferThread = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendData(byte[] dataToSend) {
|
public void sendData(byte[] dataToSend, String passthrough) {
|
||||||
transferThread.sendDataAndClose(dataToSend);
|
transferThread.sendData(dataToSend, passthrough);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface KeyTransferCallback {
|
public interface KeyTransferCallback {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import android.graphics.Bitmap;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build.VERSION_CODES;
|
import android.os.Build.VERSION_CODES;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.support.annotation.RequiresApi;
|
import android.support.annotation.RequiresApi;
|
||||||
import android.support.v4.app.LoaderManager;
|
import android.support.v4.app.LoaderManager;
|
||||||
import android.support.v4.app.LoaderManager.LoaderCallbacks;
|
import android.support.v4.app.LoaderManager.LoaderCallbacks;
|
||||||
@@ -96,7 +97,8 @@ public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks<L
|
|||||||
try {
|
try {
|
||||||
byte[] armoredSecretKey =
|
byte[] armoredSecretKey =
|
||||||
KeyRepository.createDatabaseInteractor(context).getSecretKeyRingAsArmoredData(masterKeyId);
|
KeyRepository.createDatabaseInteractor(context).getSecretKeyRingAsArmoredData(masterKeyId);
|
||||||
connectionSend(armoredSecretKey);
|
secretKeyAdapter.focusItem(masterKeyId);
|
||||||
|
connectionSend(armoredSecretKey, Long.toString(masterKeyId));
|
||||||
} catch (IOException | NotFoundException | PgpGeneralException e) {
|
} catch (IOException | NotFoundException | PgpGeneralException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -129,9 +131,18 @@ public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks<L
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDataSentOk(String arg) {
|
public void onDataSentOk(String passthrough) {
|
||||||
Log.d(Constants.TAG, "data sent ok!");
|
Log.d(Constants.TAG, "data sent ok!");
|
||||||
view.showFakeSendProgressDialog();
|
final long masterKeyId = Long.parseLong(passthrough);
|
||||||
|
|
||||||
|
new Handler().postDelayed(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
secretKeyAdapter.focusItem(null);
|
||||||
|
secretKeyAdapter.addToFinishedItems(masterKeyId);
|
||||||
|
}
|
||||||
|
}, 750);
|
||||||
|
// view.showFakeSendProgressDialog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -162,11 +173,11 @@ public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks<L
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void connectionSend(byte[] armoredSecretKey) {
|
private void connectionSend(byte[] armoredSecretKey, String passthrough) {
|
||||||
if (keyTransferClientInteractor != null) {
|
if (keyTransferClientInteractor != null) {
|
||||||
keyTransferClientInteractor.sendData(armoredSecretKey);
|
keyTransferClientInteractor.sendData(armoredSecretKey, passthrough);
|
||||||
} else if (keyTransferServerInteractor != null) {
|
} else if (keyTransferServerInteractor != null) {
|
||||||
keyTransferServerInteractor.sendData(armoredSecretKey);
|
keyTransferServerInteractor.sendData(armoredSecretKey, passthrough);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.sufficientlysecure.keychain.ui.transfer.view;
|
package org.sufficientlysecure.keychain.ui.transfer.view;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -14,6 +15,7 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import android.widget.ViewAnimator;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.ui.transfer.loader.SecretKeyLoader;
|
import org.sufficientlysecure.keychain.ui.transfer.loader.SecretKeyLoader;
|
||||||
@@ -22,7 +24,11 @@ import org.sufficientlysecure.keychain.ui.util.recyclerview.DividerItemDecoratio
|
|||||||
|
|
||||||
|
|
||||||
public class TransferSecretKeyList extends RecyclerView {
|
public class TransferSecretKeyList extends RecyclerView {
|
||||||
private OnClickTransferKeyListener onClickTransferKeyListener;
|
private static final int STATE_INVISIBLE = 0;
|
||||||
|
private static final int STATE_BUTTON = 1;
|
||||||
|
private static final int STATE_PROGRESS = 2;
|
||||||
|
private static final int STATE_TRANSFERRED = 3;
|
||||||
|
|
||||||
|
|
||||||
public TransferSecretKeyList(Context context) {
|
public TransferSecretKeyList(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@@ -42,6 +48,7 @@ public class TransferSecretKeyList extends RecyclerView {
|
|||||||
private void init(Context context) {
|
private void init(Context context) {
|
||||||
setLayoutManager(new LinearLayoutManager(context));
|
setLayoutManager(new LinearLayoutManager(context));
|
||||||
addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL_LIST));
|
addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL_LIST));
|
||||||
|
setItemAnimator(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TransferKeyAdapter extends RecyclerView.Adapter<TransferKeyViewHolder> {
|
public static class TransferKeyAdapter extends RecyclerView.Adapter<TransferKeyViewHolder> {
|
||||||
@@ -49,7 +56,9 @@ public class TransferSecretKeyList extends RecyclerView {
|
|||||||
private final LayoutInflater layoutInflater;
|
private final LayoutInflater layoutInflater;
|
||||||
private final OnClickTransferKeyListener onClickTransferKeyListener;
|
private final OnClickTransferKeyListener onClickTransferKeyListener;
|
||||||
|
|
||||||
|
private Long focusedMasterKeyId;
|
||||||
private List<SecretKeyItem> data;
|
private List<SecretKeyItem> data;
|
||||||
|
private ArrayList<Long> finishedItems;
|
||||||
|
|
||||||
|
|
||||||
public TransferKeyAdapter(Context context, LayoutInflater layoutInflater,
|
public TransferKeyAdapter(Context context, LayoutInflater layoutInflater,
|
||||||
@@ -67,7 +76,8 @@ public class TransferSecretKeyList extends RecyclerView {
|
|||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(TransferKeyViewHolder holder, int position) {
|
public void onBindViewHolder(TransferKeyViewHolder holder, int position) {
|
||||||
SecretKeyItem item = data.get(position);
|
SecretKeyItem item = data.get(position);
|
||||||
holder.bind(context, item, onClickTransferKeyListener);
|
boolean isFinished = finishedItems.contains(item.masterKeyId);
|
||||||
|
holder.bind(context, item, onClickTransferKeyListener, focusedMasterKeyId, isFinished);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -82,9 +92,19 @@ public class TransferSecretKeyList extends RecyclerView {
|
|||||||
|
|
||||||
public void setData(List<SecretKeyItem> data) {
|
public void setData(List<SecretKeyItem> data) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
|
this.finishedItems = new ArrayList<>();
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addToFinishedItems(long masterKeyId) {
|
||||||
|
finishedItems.add(masterKeyId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void focusItem(Long masterKeyId) {
|
||||||
|
focusedMasterKeyId = masterKeyId;
|
||||||
|
notifyItemRangeChanged(0, getItemCount());
|
||||||
|
}
|
||||||
|
|
||||||
public Loader<List<SecretKeyItem>> createLoader(Context context) {
|
public Loader<List<SecretKeyItem>> createLoader(Context context) {
|
||||||
return new SecretKeyLoader(context, context.getContentResolver());
|
return new SecretKeyLoader(context, context.getContentResolver());
|
||||||
}
|
}
|
||||||
@@ -95,8 +115,9 @@ public class TransferSecretKeyList extends RecyclerView {
|
|||||||
private final TextView vEmail;
|
private final TextView vEmail;
|
||||||
private final TextView vCreation;
|
private final TextView vCreation;
|
||||||
private final View vSendButton;
|
private final View vSendButton;
|
||||||
|
private final ViewAnimator vState;
|
||||||
|
|
||||||
public TransferKeyViewHolder(View itemView) {
|
TransferKeyViewHolder(View itemView) {
|
||||||
super(itemView);
|
super(itemView);
|
||||||
|
|
||||||
vName = (TextView) itemView.findViewById(R.id.key_list_item_name);
|
vName = (TextView) itemView.findViewById(R.id.key_list_item_name);
|
||||||
@@ -104,9 +125,12 @@ public class TransferSecretKeyList extends RecyclerView {
|
|||||||
vCreation = (TextView) itemView.findViewById(R.id.key_list_item_creation);
|
vCreation = (TextView) itemView.findViewById(R.id.key_list_item_creation);
|
||||||
|
|
||||||
vSendButton = itemView.findViewById(R.id.button_transfer);
|
vSendButton = itemView.findViewById(R.id.button_transfer);
|
||||||
|
vState = (ViewAnimator) itemView.findViewById(R.id.transfer_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void bind(Context context, final SecretKeyItem item, final OnClickTransferKeyListener onClickTransferKeyListener) {
|
private void bind(Context context, final SecretKeyItem item,
|
||||||
|
final OnClickTransferKeyListener onClickTransferKeyListener, Long focusedMasterKeyId,
|
||||||
|
boolean isFinished) {
|
||||||
if (item.name != null) {
|
if (item.name != null) {
|
||||||
vName.setText(item.name);
|
vName.setText(item.name);
|
||||||
vName.setVisibility(View.VISIBLE);
|
vName.setVisibility(View.VISIBLE);
|
||||||
@@ -125,7 +149,20 @@ public class TransferSecretKeyList extends RecyclerView {
|
|||||||
DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_ABBREV_MONTH);
|
DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_ABBREV_MONTH);
|
||||||
vCreation.setText(context.getString(R.string.label_key_created, dateTime));
|
vCreation.setText(context.getString(R.string.label_key_created, dateTime));
|
||||||
|
|
||||||
if (onClickTransferKeyListener != null) {
|
if (focusedMasterKeyId != null) {
|
||||||
|
if (focusedMasterKeyId != item.masterKeyId) {
|
||||||
|
itemView.animate().alpha(0.2f).start();
|
||||||
|
vState.setDisplayedChild(isFinished ? STATE_TRANSFERRED : STATE_INVISIBLE);
|
||||||
|
} else {
|
||||||
|
itemView.setAlpha(1.0f);
|
||||||
|
vState.setDisplayedChild(STATE_PROGRESS);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
itemView.animate().alpha(1.0f).start();
|
||||||
|
vState.setDisplayedChild(isFinished ? STATE_TRANSFERRED : STATE_BUTTON);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (focusedMasterKeyId == null && onClickTransferKeyListener != null) {
|
||||||
vSendButton.setOnClickListener(new OnClickListener() {
|
vSendButton.setOnClickListener(new OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
|
|||||||
@@ -2,11 +2,12 @@
|
|||||||
<LinearLayout
|
<LinearLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:custom="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:minHeight="?attr/listPreferredItemHeight"
|
android:minHeight="?attr/listPreferredItemHeight"
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
|
android:gravity="center_vertical"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
@@ -47,14 +48,42 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<ImageView
|
<org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:padding="8dp"
|
android:outAnimation="@anim/fade_out"
|
||||||
android:id="@+id/button_transfer"
|
android:inAnimation="@anim/fade_in"
|
||||||
android:src="@drawable/ic_play_arrow_white_24dp"
|
android:id="@+id/transfer_state"
|
||||||
android:tint="@color/md_black_1000"
|
custom:initialView="2">
|
||||||
android:background="?selectableItemBackground"
|
|
||||||
/>
|
<Space
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:id="@+id/button_transfer"
|
||||||
|
android:src="@drawable/ic_play_arrow_white_24dp"
|
||||||
|
android:tint="@color/md_black_1000"
|
||||||
|
android:background="?selectableItemBackground"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:layout_width="36dp"
|
||||||
|
android:layout_height="36dp"
|
||||||
|
android:padding="8dp"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:src="@drawable/ic_check_black_24dp"
|
||||||
|
android:tint="@color/android_green_light"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|||||||
Reference in New Issue
Block a user