diff --git a/app/src/main/java/org/kontalk/ui/MyKeyActivity.java b/app/src/main/java/org/kontalk/ui/MyKeyActivity.java
index ac668c872..a80269920 100644
--- a/app/src/main/java/org/kontalk/ui/MyKeyActivity.java
+++ b/app/src/main/java/org/kontalk/ui/MyKeyActivity.java
@@ -18,6 +18,7 @@
package org.kontalk.ui;
+import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
@@ -36,7 +37,7 @@
* My key activity.
* @author Daniele Ricci
*/
-public class MyKeyActivity extends ToolbarActivity {
+public class MyKeyActivity extends ToolbarActivity implements ViewUtils.OnQRCodeGeneratedListener {
private static final String TAG = Kontalk.TAG;
private View mViewport;
@@ -44,6 +45,7 @@ public class MyKeyActivity extends ToolbarActivity {
private TextView mTextName;
private TextView mTextFingerprint;
private ImageView mQRCode;
+ private View mLoading;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -57,6 +59,7 @@ protected void onCreate(Bundle savedInstanceState) {
mTextName = findViewById(R.id.name);
mTextFingerprint = findViewById(R.id.fingerprint);
mQRCode = findViewById(R.id.qrcode);
+ mLoading = findViewById(R.id.loading);
}
@Override
@@ -83,8 +86,8 @@ protected void onStart() {
mTextFingerprint.setText(PGP.formatFingerprint(fingerprint)
.replaceFirst(" ", "\n"));
- ViewUtils.getQRCodeBitmapAsync(this, mViewport, mQRCode,
- PGP.createFingerprintURI(fingerprint));
+ ViewUtils.getQRCodeBitmapAsync(this, mViewport,
+ PGP.createFingerprintURI(fingerprint), this);
}
@Override
@@ -92,4 +95,15 @@ protected boolean isNormalUpNavigation() {
return true;
}
+ @Override
+ public void onQRCodeGenerated(Bitmap qrCode) {
+ mLoading.setVisibility(View.GONE);
+ mQRCode.setImageBitmap(qrCode);
+ }
+
+ @Override
+ public void onQRCodeError(Exception e) {
+ mLoading.setVisibility(View.GONE);
+ // TODO error
+ }
}
diff --git a/app/src/main/java/org/kontalk/ui/RegisterDeviceActivity.java b/app/src/main/java/org/kontalk/ui/RegisterDeviceActivity.java
index 194d988dc..d59bebc1e 100644
--- a/app/src/main/java/org/kontalk/ui/RegisterDeviceActivity.java
+++ b/app/src/main/java/org/kontalk/ui/RegisterDeviceActivity.java
@@ -21,6 +21,7 @@
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
+import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.View;
@@ -37,7 +38,7 @@
* Shows the secure token for registering another device with the same key.
* @author Daniele Ricci
*/
-public class RegisterDeviceActivity extends ToolbarActivity {
+public class RegisterDeviceActivity extends ToolbarActivity implements ViewUtils.OnQRCodeGeneratedListener {
private static final String TAG = Kontalk.TAG;
private View mViewport;
@@ -45,6 +46,7 @@ public class RegisterDeviceActivity extends ToolbarActivity {
private TextView mTextServer;
private TextView mTextToken;
private ImageView mQRCode;
+ private View mLoading;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -58,6 +60,7 @@ protected void onCreate(Bundle savedInstanceState) {
mTextServer = findViewById(R.id.servername);
mTextToken = findViewById(R.id.token);
mQRCode = findViewById(R.id.qrcode);
+ mLoading = findViewById(R.id.loading);
}
@SuppressLint("SetTextI18n")
@@ -81,8 +84,8 @@ protected void onStart() {
mTextToken.setText(token);
}
- ViewUtils.getQRCodeBitmapAsync(this, mViewport, mQRCode,
- generateTokenText(account, token, from));
+ ViewUtils.getQRCodeBitmapAsync(this, mViewport,
+ generateTokenText(account, token, from), this);
}
@Override
@@ -90,6 +93,18 @@ protected boolean isNormalUpNavigation() {
return true;
}
+ @Override
+ public void onQRCodeGenerated(Bitmap qrCode) {
+ mLoading.setVisibility(View.GONE);
+ mQRCode.setImageBitmap(qrCode);
+ }
+
+ @Override
+ public void onQRCodeError(Exception e) {
+ mLoading.setVisibility(View.GONE);
+ // TODO error
+ }
+
/** This must match the parsing done in {@link #parseTokenText}. */
private static String generateTokenText(String account, String token, String from) {
return account + ";" + from + ";" + token;
diff --git a/app/src/main/java/org/kontalk/util/ViewUtils.java b/app/src/main/java/org/kontalk/util/ViewUtils.java
index 75cc66739..a64f8e224 100644
--- a/app/src/main/java/org/kontalk/util/ViewUtils.java
+++ b/app/src/main/java/org/kontalk/util/ViewUtils.java
@@ -28,6 +28,8 @@
import com.google.zxing.qrcode.QRCodeWriter;
import com.vanniktech.emoji.EmojiManager;
+import org.jivesoftware.smack.util.Async;
+
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
@@ -36,7 +38,6 @@
import android.text.SpannableStringBuilder;
import android.view.View;
import android.view.ViewTreeObserver;
-import android.widget.ImageView;
import android.widget.TextView;
@@ -56,9 +57,9 @@ public static int dp(Context context, float value) {
/**
* Waits for global layout to happen and set a QR code for the minimum size
* between height and width of the given container. The QR code will be
- * loaded automatically in {@code destination}.
+ * returned to the given listener.
*/
- public static void getQRCodeBitmapAsync(final Context context, final View container, final ImageView destination, final String text) {
+ public static void getQRCodeBitmapAsync(final Context context, final View container, final String text, final OnQRCodeGeneratedListener listener) {
// no need to handle memory leaks because the view tree observer
// is created on every activity restart
container.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@@ -71,14 +72,24 @@ public void onGlobalLayout() {
size = Math.min(displaySize.x, displaySize.y);
}
- try {
- // TODO load in another thread
- Bitmap qrCode = getQRCodeBitmap(size, text);
- destination.setImageBitmap(qrCode);
- }
- catch (WriterException e) {
- // TODO set error image on destination
- }
+ final int qrSize = size;
+ Async.go(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ final Bitmap qrCode = getQRCodeBitmap(qrSize, text);
+ container.post(new Runnable() {
+ @Override
+ public void run() {
+ listener.onQRCodeGenerated(qrCode);
+ }
+ });
+ }
+ catch (WriterException e) {
+ listener.onQRCodeError(e);
+ }
+ }
+ });
}
});
}
@@ -91,6 +102,11 @@ public static Bitmap getQRCodeBitmap(int size, String text) throws WriterExcepti
return toBitmap(matrix);
}
+ public interface OnQRCodeGeneratedListener {
+ void onQRCodeGenerated(Bitmap qrCode);
+ void onQRCodeError(Exception e);
+ }
+
/**
* Writes the given Matrix on a new Bitmap object.
* http://codeisland.org/2013/generating-qr-codes-with-zxing/
diff --git a/app/src/main/res/layout/mykey_screen.xml b/app/src/main/res/layout/mykey_screen.xml
index 8e5366516..ff1d9bdab 100644
--- a/app/src/main/res/layout/mykey_screen.xml
+++ b/app/src/main/res/layout/mykey_screen.xml
@@ -69,6 +69,13 @@
android:layout_gravity="center_horizontal"
android:layout_marginTop="12dp" />
+
+
diff --git a/app/src/main/res/layout/register_device_screen.xml b/app/src/main/res/layout/register_device_screen.xml
index ad621740b..354ddf160 100644
--- a/app/src/main/res/layout/register_device_screen.xml
+++ b/app/src/main/res/layout/register_device_screen.xml
@@ -85,6 +85,13 @@
android:layout_gravity="center_horizontal"
android:layout_marginTop="12dp" />
+
+