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

@ -70,8 +70,7 @@ dependencies {
compile 'com.mikepenz:community-material-typeface:1.3.41.1@aar'
// Nordpol
compile 'com.fidesmo:nordpol-android:0.1.15@aar'
compile 'com.fidesmo:nordpol-core:0.1.15'
compile 'com.fidesmo:nordpol-android:0.1.18'
// libs as submodules
compile project(':extern:openpgp-api-lib:openpgp-api')
@ -117,8 +116,8 @@ dependencyVerification {
'com.mikepenz:iconics-core:d2495547db9d881168b1b502b1934f6a000ed5086c6c6a7114f3bbcbbb7ec306',
'com.mikepenz:community-material-typeface:990acfcfb892a733d36748fe29176bd61dd5ab34bc8ca1c591200e639d955b99',
'com.mikepenz:fontawesome-typeface:69cb09934a83bac607e78a29459868d537f766224b4a65a042d1f84c98c7b05d',
'com.fidesmo:nordpol-core:fe09e65379f2c7300b669ef7df2bfbde47729dac19edacc26b5ddb44b94ff67d',
'com.fidesmo:nordpol-android:012f93c2c78bd5e3b35af3e8a6676c4fac56755abee252dcfdbb8b35df19e3dd',
'com.fidesmo:nordpol-core:3de58e850a00bba5b4d3a604d1399bcd89f695ea191ec0b03a57222e18062d15',
'com.fidesmo:nordpol-android:56f43fe2b1676817bcb4085926de14a08282ef6729c855c198d81aec62b20d65',
// 'OpenKeychain.extern.bouncycastle:core:b22dfb37e09fb520683dd0ba089351787560a75b59b60822143f633ec984cab5',
// 'OpenKeychain.extern.openpgp-api-lib:openpgp-api:8a53012b9df6d62174ebdc11e0ab56700501a915930db5c12e32d565f136fc06',
// 'OpenKeychain.extern.openkeychain-api-lib:openkeychain-intents:9263330c00497b7bb70502160f50c8396228129376f48f4f5656d28360a2edac',

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>