diff --git a/example/pom.xml b/example/pom.xml index f9a92ee..3653b1e 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -25,7 +25,7 @@ it.tdlight tdlight-java - 2.7.8.3 + 2.7.8.6 diff --git a/src/main/java/it/tdlight/client/QrCodeTerminal.java b/src/main/java/it/tdlight/client/QrCodeTerminal.java new file mode 100644 index 0000000..9db2e4d --- /dev/null +++ b/src/main/java/it/tdlight/client/QrCodeTerminal.java @@ -0,0 +1,38 @@ +package it.tdlight.client; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import java.util.Hashtable; + +class QrCodeTerminal { + + public static String getQr(String url) { + int width = 40; + int height = 40; + Hashtable qrParam = new Hashtable<>(); + qrParam.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); + qrParam.put(EncodeHintType.CHARACTER_SET, "utf-8"); + try { + BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, width, height, qrParam); + return toAscii(bitMatrix); + } catch (WriterException ex) { + throw new IllegalStateException("Can't encode QR code", ex); + } + } + + public static String toAscii(BitMatrix bitMatrix) { + StringBuilder sb = new StringBuilder(); + for (int rows = 0; rows < bitMatrix.getHeight(); rows++) { + for (int cols = 0; cols < bitMatrix.getWidth(); cols++) { + boolean x = bitMatrix.get(rows, cols); + sb.append(x ? " " : "██"); + } + sb.append("\n"); + } + return sb.toString(); + } +} diff --git a/src/main/java/it/tdlight/client/ScannerClientInteraction.java b/src/main/java/it/tdlight/client/ScannerClientInteraction.java index 1584fe7..2380518 100644 --- a/src/main/java/it/tdlight/client/ScannerClientInteraction.java +++ b/src/main/java/it/tdlight/client/ScannerClientInteraction.java @@ -62,8 +62,11 @@ final class ScannerClientInteraction implements ClientInteraction { System.out.println(passwordMessage); break; case NOTIFY_LINK: - System.out.println("Please confirm this login link on another device: " - + ((ParameterInfoNotifyLink) parameterInfo).getLink()); + String link = ((ParameterInfoNotifyLink) parameterInfo).getLink(); + System.out.println("Please confirm this login link on another device: " + link); + System.out.println(); + System.out.println(QrCodeTerminal.getQr(link)); + System.out.println(); return ""; case TERMS_OF_SERVICE: TermsOfService tos = ((ParameterInfoTermsOfService) parameterInfo).getTermsOfService(); diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 23acfa3..859b536 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -3,6 +3,7 @@ module tdlight.java { requires org.reactivestreams; requires org.slf4j; requires it.unimi.dsi.fastutil; + requires com.google.zxing; exports it.tdlight.tdlight; exports it.tdlight.tdnative; exports it.tdlight.tdlib; diff --git a/tdlib/pom.xml b/tdlib/pom.xml index c22d54a..0c9cccc 100644 --- a/tdlib/pom.xml +++ b/tdlib/pom.xml @@ -68,6 +68,10 @@ net.harawata appdirs + + + com.google.zxing + core @@ -81,6 +85,11 @@ net.harawata appdirs 1.2.1 + + + com.google.zxing + core + 3.4.1 diff --git a/tdlight/pom.xml b/tdlight/pom.xml index 52ad260..6d6e83a 100644 --- a/tdlight/pom.xml +++ b/tdlight/pom.xml @@ -69,7 +69,11 @@ net.harawata appdirs - + + com.google.zxing + core + + @@ -81,6 +85,11 @@ net.harawata appdirs 1.2.1 + + + com.google.zxing + core + 3.4.1