Better transaction animation

This commit is contained in:
Theo Franzén
2016-01-27 16:40:30 +01:00
committed by franzaine
parent 751298a4d8
commit 0191cf92db
12 changed files with 186 additions and 207 deletions

View File

@@ -49,6 +49,8 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import nordpol.android.NfcGuideView;
/**
* This class provides a communication interface to OpenPGP applications on ISO SmartCard compliant
* NFC devices.
@@ -67,6 +69,7 @@ public class SecurityTokenOperationActivity extends BaseSecurityTokenNfcActivity
public ViewAnimator vAnimator;
public TextView vErrorText;
public Button vErrorTryAgainButton;
public NfcGuideView nfcGuideView;
private RequiredInputParcel mRequiredInput;
private Intent mServiceIntent;
@@ -88,6 +91,8 @@ public class SecurityTokenOperationActivity extends BaseSecurityTokenNfcActivity
super.onCreate(savedInstanceState);
Log.d(Constants.TAG, "NfcOperationActivity.onCreate");
nfcGuideView = (NfcGuideView) findViewById(R.id.nfc_guide_view);
// prevent annoying orientation changes while fumbling with the device
OrientationUtils.lockOrientation(this);
// prevent close when touching outside of the dialog (happens easily when fumbling with the device)
@@ -101,6 +106,9 @@ public class SecurityTokenOperationActivity extends BaseSecurityTokenNfcActivity
vAnimator = (ViewAnimator) findViewById(R.id.view_animator);
vAnimator.setDisplayedChild(0);
nfcGuideView.setCurrentStatus(NfcGuideView.NfcGuideViewStatus.STARTING_POSITION);
vErrorText = (TextView) findViewById(R.id.security_token_activity_3_error_text);
vErrorTryAgainButton = (Button) findViewById(R.id.security_token_activity_3_error_try_again);
vErrorTryAgainButton.setOnClickListener(new View.OnClickListener() {
@@ -110,6 +118,9 @@ public class SecurityTokenOperationActivity extends BaseSecurityTokenNfcActivity
obtainPassphraseIfRequired();
vAnimator.setDisplayedChild(0);
nfcGuideView.setVisibility(View.VISIBLE);
nfcGuideView.setCurrentStatus(NfcGuideView.NfcGuideViewStatus.STARTING_POSITION);
}
});
Button vCancel = (Button) findViewById(R.id.security_token_activity_0_cancel);
@@ -147,6 +158,7 @@ public class SecurityTokenOperationActivity extends BaseSecurityTokenNfcActivity
public void onNfcPreExecute() {
// start with indeterminate progress
vAnimator.setDisplayedChild(1);
nfcGuideView.setCurrentStatus(NfcGuideView.NfcGuideViewStatus.TRANSFERRING);
}
@Override
@@ -277,6 +289,8 @@ public class SecurityTokenOperationActivity extends BaseSecurityTokenNfcActivity
// show finish
vAnimator.setDisplayedChild(2);
nfcGuideView.setCurrentStatus(NfcGuideView.NfcGuideViewStatus.DONE);
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
@@ -307,6 +321,8 @@ public class SecurityTokenOperationActivity extends BaseSecurityTokenNfcActivity
vErrorText.setText(error + "\n\n" + getString(R.string.security_token_nfc_try_again_text));
vAnimator.setDisplayedChild(3);
nfcGuideView.setVisibility(View.GONE);
}
@Override

Binary file not shown.

Before

Width:  |  Height:  |  Size: 709 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 493 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 922 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 KiB

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="24dp">
<nordpol.android.NfcGuideView
android:id="@+id/nfc_guide_view"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
custom:nfc_device="card_black"/>
<include
layout="@layout/security_token_operation_activity_toolable_view_animator"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
</LinearLayout>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -21,13 +22,15 @@
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginLeft="8dp"
android:layout_marginBottom="24dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/security_token_create" />
<ImageView
android:layout_width="match_parent"
<nordpol.android.NfcGuideView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/yubikey_phone" />
android:layout_gravity="center_horizontal"
custom:nfc_device="usb_black"/>
</LinearLayout>

View File

@@ -3,207 +3,16 @@
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp">
<org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator
android:id="@+id/view_animator"
<nordpol.android.NfcGuideView
android:id="@+id/nfc_guide_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:inAnimation="@anim/fade_in"
android:measureAllChildren="false"
android:minHeight="?listPreferredItemHeightSmall"
android:outAnimation="@anim/fade_out"
custom:initialView="3">
android:layout_height="wrap_content"
custom:nfc_device="usb_black"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include layout="@layout/security_token_operation_activity_toolable_view_animator" />
<TextView
android:id="@+id/security_token_activity_0_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_marginTop="24dp"
android:text="@string/security_token_nfc_text"
android:textAppearance="@android:style/TextAppearance.Medium" />
<ImageView
android:id="@+id/security_token_activity_0_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/security_token_activity_0_text"
android:layout_margin="24dp"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:src="@drawable/yubikey_phone" />
<Button
android:id="@+id/security_token_activity_0_cancel"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/security_token_activity_0_image"
android:layout_margin="8dp"
android:text="@string/progress_cancel" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/security_token_activity_1_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_marginTop="24dp"
android:text="@string/security_token_nfc_wait"
android:textAppearance="@android:style/TextAppearance.Medium" />
<ProgressBar
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:padding="8dp" />
<!-- placeholder to retain dialog size -->
<ImageView
android:id="@+id/security_token_activity_1_placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/security_token_activity_1_text"
android:layout_margin="24dp"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:src="@drawable/yubikey_phone"
android:visibility="invisible" />
<Button
android:id="@+id/security_token_activity_1_button_placeholder"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/security_token_activity_1_placeholder"
android:layout_margin="8dp"
android:text=""
android:visibility="invisible" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/security_token_activity_2_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_marginTop="24dp"
android:text="@string/security_token_nfc_finished"
android:textAppearance="@android:style/TextAppearance.Medium" />
<!-- placeholder to retain dialog size -->
<ImageView
android:id="@+id/security_token_activity_2_placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/security_token_activity_2_text"
android:layout_margin="24dp"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:src="@drawable/yubikey_phone"
android:visibility="invisible" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:src="@drawable/ic_check_circle_black_48dp" />
<Button
android:id="@+id/security_token_activity_2_button_placeholder"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/security_token_activity_2_placeholder"
android:layout_margin="8dp"
android:text=""
android:visibility="invisible" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/security_token_activity_3_text_placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/security_token_activity_3_placeholder"
android:layout_alignRight="@+id/security_token_activity_3_placeholder"
android:layout_marginLeft="24dp"
android:layout_marginTop="24dp"
android:text=""
android:textAppearance="@android:style/TextAppearance.Medium" />
<!-- placeholder to retain dialog size -->
<ImageView
android:id="@+id/security_token_activity_3_placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/security_token_activity_3_text_placeholder"
android:layout_margin="24dp"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:src="@drawable/yubikey_phone"
android:visibility="invisible" />
<TextView
android:id="@+id/security_token_activity_3_error_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_margin="24dp"
android:textAppearance="@android:style/TextAppearance.Medium"
android:textColor="@color/android_red_dark"
tools:text="Error text" />
<Button
android:id="@+id/security_token_activity_3_error_try_again"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/security_token_activity_3_placeholder"
android:layout_margin="8dp"
android:text="@string/security_token_error_try_again" />
</RelativeLayout>
</org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator>
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:id="@+id/view_animator"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:inAnimation="@anim/fade_in"
android:measureAllChildren="false"
android:minHeight="?listPreferredItemHeightSmall"
android:outAnimation="@anim/fade_out"
custom:initialView="3"
tools:showIn="@layout/security_token_operation_activity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/security_token_activity_0_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_marginTop="24dp"
android:text="@string/security_token_nfc_text"
android:textAppearance="@android:style/TextAppearance.Medium" />
<Button
android:id="@+id/security_token_activity_0_cancel"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_margin="8dp"
android:text="@string/progress_cancel" />
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/security_token_activity_1_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_marginTop="24dp"
android:text="@string/security_token_nfc_wait"
android:textAppearance="@android:style/TextAppearance.Medium" />
<Button
android:id="@+id/security_token_activity_1_button_placeholder"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_margin="8dp"
android:text=""
android:visibility="invisible" />
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/security_token_activity_2_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_marginTop="24dp"
android:text="@string/security_token_nfc_finished"
android:textAppearance="@android:style/TextAppearance.Medium" />
<Button
android:id="@+id/security_token_activity_2_button_placeholder"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_margin="8dp"
android:text=""
android:visibility="invisible" />
</LinearLayout>
<ScrollView
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/security_token_activity_3_text_placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:layout_marginTop="24dp"
android:text=""
android:textAppearance="@android:style/TextAppearance.Medium" />
<TextView
android:id="@+id/security_token_activity_3_error_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="24dp"
android:textAppearance="@android:style/TextAppearance.Medium"
android:textColor="@color/android_red_dark"
tools:text="Error text" />
<Button
android:id="@+id/security_token_activity_3_error_try_again"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_margin="8dp"
android:text="@string/security_token_error_try_again" />
</LinearLayout>
</ScrollView>
</org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator>