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 13783569b..0540a04fa 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/KeyTransferInteractor.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/network/KeyTransferInteractor.java @@ -91,6 +91,7 @@ public class KeyTransferInteractor { private SSLServerSocket serverSocket; private byte[] dataToSend; + private String sendPassthrough; static TransferThread createClientTransferThread(KeyTransferCallback callback, byte[] presharedKey, String host, int port) { @@ -209,8 +210,9 @@ public class KeyTransferInteractor { dataToSend = null; socket.setSoTimeout(2000); - sendDataAndClose(socket.getOutputStream(), data); - invokeListener(CONNECTION_SEND_OK, null); + sendData(socket.getOutputStream(), data); + invokeListener(CONNECTION_SEND_OK, sendPassthrough); + sendPassthrough = null; return true; } return false; @@ -226,7 +228,7 @@ public class KeyTransferInteractor { 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.write(data); bufferedOutputStream.close(); @@ -265,8 +267,9 @@ public class KeyTransferInteractor { handler.post(runnable); } - synchronized void sendDataAndClose(byte[] dataToSend) { + synchronized void sendData(byte[] dataToSend, String passthrough) { this.dataToSend = dataToSend; + this.sendPassthrough = passthrough; } @Override @@ -297,8 +300,8 @@ public class KeyTransferInteractor { transferThread = null; } - public void sendData(byte[] dataToSend) { - transferThread.sendDataAndClose(dataToSend); + public void sendData(byte[] dataToSend, String passthrough) { + transferThread.sendData(dataToSend, passthrough); } public interface KeyTransferCallback { 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 b0e307217..b44cede18 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 @@ -26,6 +26,7 @@ import android.graphics.Bitmap; import android.net.Uri; import android.os.Build.VERSION_CODES; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.RequiresApi; import android.support.v4.app.LoaderManager; import android.support.v4.app.LoaderManager.LoaderCallbacks; @@ -96,7 +97,8 @@ public class TransferPresenter implements KeyTransferCallback, LoaderCallbacks { @@ -49,7 +56,9 @@ public class TransferSecretKeyList extends RecyclerView { private final LayoutInflater layoutInflater; private final OnClickTransferKeyListener onClickTransferKeyListener; + private Long focusedMasterKeyId; private List data; + private ArrayList finishedItems; public TransferKeyAdapter(Context context, LayoutInflater layoutInflater, @@ -67,7 +76,8 @@ public class TransferSecretKeyList extends RecyclerView { @Override public void onBindViewHolder(TransferKeyViewHolder holder, int 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 @@ -82,9 +92,19 @@ public class TransferSecretKeyList extends RecyclerView { public void setData(List data) { this.data = data; + this.finishedItems = new ArrayList<>(); notifyDataSetChanged(); } + public void addToFinishedItems(long masterKeyId) { + finishedItems.add(masterKeyId); + } + + public void focusItem(Long masterKeyId) { + focusedMasterKeyId = masterKeyId; + notifyItemRangeChanged(0, getItemCount()); + } + public Loader> createLoader(Context context) { return new SecretKeyLoader(context, context.getContentResolver()); } @@ -95,8 +115,9 @@ public class TransferSecretKeyList extends RecyclerView { private final TextView vEmail; private final TextView vCreation; private final View vSendButton; + private final ViewAnimator vState; - public TransferKeyViewHolder(View itemView) { + TransferKeyViewHolder(View itemView) { super(itemView); 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); 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) { vName.setText(item.name); vName.setVisibility(View.VISIBLE); @@ -125,7 +149,20 @@ public class TransferSecretKeyList extends RecyclerView { DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_ABBREV_MONTH); 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() { @Override public void onClick(View v) { diff --git a/OpenKeychain/src/main/res/layout/key_transfer_item.xml b/OpenKeychain/src/main/res/layout/key_transfer_item.xml index 9271f66a2..2faf2aef0 100644 --- a/OpenKeychain/src/main/res/layout/key_transfer_item.xml +++ b/OpenKeychain/src/main/res/layout/key_transfer_item.xml @@ -2,11 +2,12 @@ - + android:outAnimation="@anim/fade_out" + android:inAnimation="@anim/fade_in" + android:id="@+id/transfer_state" + custom:initialView="2"> + + + + + + + + + +