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 + + + +