diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index f0028f34c..a6b60b343 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -823,6 +823,12 @@
android:name=".ui.PanicExitActivity"
android:theme="@android:style/Theme.NoDisplay" />
+
+
nfcPosition = NfcSweetspotData.SWEETSPOT_DATA.get(Build.MODEL);
+ if (nfcPosition == null) {
+ throw new IllegalArgumentException("No data available for this model. This activity should not be called!");
+ }
+ DisplayMetrics displayDimensions = getDisplaySize();
+
+ final float translationX = (float) (displayDimensions.widthPixels * nfcPosition.first);
+ final float translationY = (float) (displayDimensions.heightPixels * nfcPosition.second);
+
+ sweetspotIndicator.post(new Runnable() {
+ @Override
+ public void run() {
+ sweetspotIndicator.setTranslationX(translationX - sweetspotIndicator.getWidth() / 2);
+ sweetspotIndicator.setTranslationY(translationY - sweetspotIndicator.getHeight() / 2);
+ }
+ });
+
+ sweetspotIcon = findViewById(R.id.nfc_sweetspot_icon);
+ sweetspotCircle1 = findViewById(R.id.nfc_sweetspot_circle_1);
+ sweetspotCircle2 = findViewById(R.id.nfc_sweetspot_circle_2);
+ sweetspotCircle3 = findViewById(R.id.nfc_sweetspot_circle_3);
+
+ sweetspotIcon.setAlpha(0.0f);
+ sweetspotCircle1.setAlpha(0.0f);
+ sweetspotCircle2.setAlpha(0.0f);
+ sweetspotCircle3.setAlpha(0.0f);
+ }
+
+ @Override
+ public void onEnterAnimationComplete() {
+ super.onEnterAnimationComplete();
+
+ DecelerateInterpolator interpolator = new DecelerateInterpolator();
+ sweetspotIcon.animate().alpha(1.0f).setInterpolator(interpolator).setDuration(300).start();
+ sweetspotCircle1.animate().alpha(1.0f).setInterpolator(interpolator).setDuration(500).setStartDelay(100).start();
+ sweetspotCircle2.animate().alpha(1.0f).setInterpolator(interpolator).setDuration(700).setStartDelay(200).start();
+ sweetspotCircle3.animate().alpha(1.0f).setInterpolator(interpolator).setDuration(1000).setStartDelay(300).start();
+ }
+
+ @Override
+ protected void initTheme() {
+ // do nothing
+ }
+
+ @Override
+ public void finish() {
+ super.finish();
+
+ overridePendingTransition(R.anim.fade_in_quick, R.anim.fade_out_quick);
+ }
+
+ @Override
+ protected void onSecurityTokenPostExecute() {
+ Intent result = new Intent();
+ result.putExtra(EXTRA_TOKEN_INFO, tokenInfo);
+ setResult(Activity.RESULT_OK, result);
+ finish();
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (event.getActionMasked() == MotionEvent.ACTION_UP) {
+ setResult(Activity.RESULT_CANCELED);
+ finish();
+ return true;
+ }
+
+ return super.onTouchEvent(event);
+ }
+
+ @NonNull
+ private DisplayMetrics getDisplaySize() {
+ DisplayMetrics metrics = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics(metrics);
+
+ return metrics;
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java
index 063181dfe..1fdde6113 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java
@@ -57,7 +57,7 @@ public abstract class BaseActivity extends AppCompatActivity {
super.onResume();
onResumeChecks(this);
- if (mThemeChanger.changeTheme()) {
+ if (mThemeChanger != null && mThemeChanger.changeTheme()) {
Intent intent = getIntent();
finish();
overridePendingTransition(0, 0);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenActivity.java
index db7153e3d..183286b75 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenActivity.java
@@ -73,7 +73,7 @@ public abstract class BaseSecurityTokenActivity extends BaseActivity
protected UsbConnectionDispatcher mUsbDispatcher;
private boolean mTagHandlingEnabled;
- private SecurityTokenInfo tokenInfo;
+ protected SecurityTokenInfo tokenInfo;
/**
* Override to change UI before SecurityToken handling (UI thread)
diff --git a/OpenKeychain/src/main/res/drawable/circle.xml b/OpenKeychain/src/main/res/drawable/circle.xml
new file mode 100644
index 000000000..fc1218eb6
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/circle.xml
@@ -0,0 +1,6 @@
+
+
+
diff --git a/OpenKeychain/src/main/res/layout/create_security_token_wait_fragment.xml b/OpenKeychain/src/main/res/layout/create_security_token_wait_fragment.xml
index 23336ec7f..a5bc7067c 100644
--- a/OpenKeychain/src/main/res/layout/create_security_token_wait_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/create_security_token_wait_fragment.xml
@@ -32,6 +32,22 @@
android:layout_gravity="center_horizontal"
custom:nfc_device="card_black"/>
+
+
+
+
+
+
diff --git a/OpenKeychain/src/main/res/layout/show_nfc_sweetspot_activity.xml b/OpenKeychain/src/main/res/layout/show_nfc_sweetspot_activity.xml
new file mode 100644
index 000000000..9f16ea06c
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/show_nfc_sweetspot_activity.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 2f0a2eaf1..de4037a7d 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -1961,4 +1961,6 @@
- "Updating %d keys"
+ "Where is my NFC reader?"
+
diff --git a/OpenKeychain/src/main/res/values/themes.xml b/OpenKeychain/src/main/res/values/themes.xml
index fc6ae3846..ca6bb6cb8 100644
--- a/OpenKeychain/src/main/res/values/themes.xml
+++ b/OpenKeychain/src/main/res/values/themes.xml
@@ -133,5 +133,18 @@
- true
+
+
+
+
diff --git a/graphics/drawables/circle.svg b/graphics/drawables/circle.svg
new file mode 100644
index 000000000..b0f1c0ed2
--- /dev/null
+++ b/graphics/drawables/circle.svg
@@ -0,0 +1,63 @@
+
+
+
+