package org.telegram.ui.Components; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Outline; import android.net.Uri; import android.os.Build; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewOutlineProvider; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import androidx.core.content.FileProvider; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BuildConfig; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.R; import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.Theme; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; public class QRCodeBottomSheet extends BottomSheet { Bitmap qrCode; private final TextView help; private final TextView buttonTextView; int imageSize; RLottieImageView iconImage; public QRCodeBottomSheet(Context context, String link, String helpMessage) { super(context, false); fixNavigationBar(); setTitle(LocaleController.getString("InviteByQRCode", R.string.InviteByQRCode), true); ImageView imageView = new ImageView(context) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int size = MeasureSpec.getSize(widthMeasureSpec); super.onMeasure(MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY)); } }; imageView.setScaleType(ImageView.ScaleType.FIT_XY); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { imageView.setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setRoundRect(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight(), AndroidUtilities.dp(12)); } }); imageView.setClipToOutline(true); } LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setPadding(0, AndroidUtilities.dp(16), 0, 0); imageView.setImageBitmap(qrCode = createQR(context, link, qrCode)); iconImage = new RLottieImageView(context); iconImage.setBackgroundColor(Color.WHITE); iconImage.setAutoRepeat(true); iconImage.setAnimation(R.raw.qr_code_logo, 60, 60); iconImage.playAnimation(); //iconImage.setPadding(-AndroidUtilities.dp(4), -AndroidUtilities.dp(4), -AndroidUtilities.dp(4), -AndroidUtilities.dp(4)); FrameLayout frameLayout = new FrameLayout(context) { float lastX; @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); float x = imageSize / 768f * imageView.getMeasuredHeight(); if (lastX != x) { lastX = x; iconImage.getLayoutParams().height = iconImage.getLayoutParams().width = (int) x; super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } }; frameLayout.addView(imageView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); frameLayout.addView(iconImage, LayoutHelper.createFrame(60, 60, Gravity.CENTER)); linearLayout.addView(frameLayout, LayoutHelper.createLinear(220, 220, Gravity.CENTER_HORIZONTAL, 30, 0, 30, 0)); help = new TextView(context); help.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); help.setText(helpMessage); help.setGravity(Gravity.CENTER_HORIZONTAL); linearLayout.addView(help, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 40, 8, 40, 8)); buttonTextView = new TextView(context); buttonTextView.setPadding(AndroidUtilities.dp(34), 0, AndroidUtilities.dp(34), 0); buttonTextView.setGravity(Gravity.CENTER); buttonTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); buttonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); buttonTextView.setText(LocaleController.getString("ShareQrCode", R.string.ShareQrCode)); buttonTextView.setOnClickListener(view -> { Uri uri = AndroidUtilities.getBitmapShareUri(qrCode, "qr_tmp.png", Bitmap.CompressFormat.PNG); if (uri != null) { Intent i = new Intent(Intent.ACTION_SEND); i.setType("image/*"); i.putExtra(Intent.EXTRA_STREAM, uri); try { AndroidUtilities.findActivity(context).startActivityForResult(Intent.createChooser(i, LocaleController.getString("InviteByQRCode", R.string.InviteByQRCode)), 500); } catch (ActivityNotFoundException ex) { ex.printStackTrace(); } } }); linearLayout.addView(buttonTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM, 16, 15, 16, 16)); updateColors(); ScrollView scrollView = new ScrollView(context); scrollView.addView(linearLayout); setCustomView(scrollView); } public Bitmap createQR(Context context, String key, Bitmap oldBitmap) { try { HashMap hints = new HashMap<>(); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); hints.put(EncodeHintType.MARGIN, 0); QRCodeWriter writer = new QRCodeWriter(); Bitmap bitmap = writer.encode(key, 768, 768, hints, oldBitmap); imageSize = writer.getImageSize(); return bitmap; } catch (Exception e) { FileLog.e(e); } return null; } void updateColors() { buttonTextView.setBackgroundDrawable(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_featuredStickers_addButton), Theme.getColor(Theme.key_featuredStickers_addButtonPressed))); help.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); buttonTextView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); if (getTitleView() != null) { getTitleView().setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); } setBackgroundColor(Theme.getColor(Theme.key_dialogBackground)); } }