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