Ammar Githam
4 years ago
2 changed files with 86 additions and 96 deletions
-
176app/src/main/java/awaisomereport/ErrorReporterActivity.kt
-
6app/src/main/res/layout/activity_crash_error.xml
@ -1,102 +1,96 @@ |
|||||
package awaisomereport; |
|
||||
|
|
||||
import android.app.Activity; |
|
||||
import android.content.Context; |
|
||||
import android.graphics.Canvas; |
|
||||
import android.graphics.Paint; |
|
||||
import android.graphics.Rect; |
|
||||
import android.graphics.drawable.Drawable; |
|
||||
import android.os.Bundle; |
|
||||
import android.text.Spannable; |
|
||||
import android.text.SpannableString; |
|
||||
import android.text.style.ImageSpan; |
|
||||
import android.view.View; |
|
||||
import android.view.ViewGroup; |
|
||||
|
|
||||
import androidx.annotation.NonNull; |
|
||||
import androidx.annotation.Nullable; |
|
||||
|
|
||||
import java.lang.ref.WeakReference; |
|
||||
|
|
||||
import awais.instagrabber.R; |
|
||||
|
|
||||
public final class ErrorReporterActivity extends Activity implements View.OnClickListener { |
|
||||
private View btnReport; |
|
||||
|
|
||||
@Override |
|
||||
protected void onCreate(@Nullable final Bundle savedInstanceState) { |
|
||||
super.onCreate(savedInstanceState); |
|
||||
setContentView(R.layout.activity_crash_error); |
|
||||
|
|
||||
setFinishOnTouchOutside(false); |
|
||||
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); |
|
||||
|
|
||||
final SpannableString crashTitle = new SpannableString(" " + getString(R.string.crash_title)); |
|
||||
crashTitle.setSpan(new CenteredImageSpan(this, android.R.drawable.stat_notify_error), |
|
||||
0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); |
|
||||
setTitle(crashTitle); |
|
||||
|
|
||||
btnReport = findViewById(R.id.btnReport); |
|
||||
btnReport.setOnClickListener(this); |
|
||||
findViewById(R.id.btnCancel).setOnClickListener(this); |
|
||||
|
package awaisomereport |
||||
|
|
||||
|
import android.app.Activity |
||||
|
import android.content.Context |
||||
|
import android.graphics.Canvas |
||||
|
import android.graphics.Paint |
||||
|
import android.graphics.Paint.FontMetricsInt |
||||
|
import android.graphics.drawable.Drawable |
||||
|
import android.os.Bundle |
||||
|
import android.text.Spannable |
||||
|
import android.text.SpannableString |
||||
|
import android.text.style.ImageSpan |
||||
|
import android.view.View |
||||
|
import android.view.ViewGroup |
||||
|
import androidx.annotation.DrawableRes |
||||
|
import awais.instagrabber.R |
||||
|
import awais.instagrabber.databinding.ActivityCrashErrorBinding |
||||
|
import awaisomereport.CrashReporterHelper.startCrashEmailIntent |
||||
|
import java.lang.ref.WeakReference |
||||
|
import kotlin.system.exitProcess |
||||
|
|
||||
|
class ErrorReporterActivity : Activity(), View.OnClickListener { |
||||
|
|
||||
|
private lateinit var binding: ActivityCrashErrorBinding |
||||
|
|
||||
|
override fun onCreate(savedInstanceState: Bundle?) { |
||||
|
super.onCreate(savedInstanceState) |
||||
|
binding = ActivityCrashErrorBinding.inflate(layoutInflater) |
||||
|
setContentView(binding.root) |
||||
|
setFinishOnTouchOutside(false) |
||||
|
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) |
||||
|
val crashTitle = SpannableString(" " + getString(R.string.crash_title)) |
||||
|
crashTitle.setSpan( |
||||
|
CenteredImageSpan(this, android.R.drawable.stat_notify_error), |
||||
|
0, |
||||
|
1, |
||||
|
Spannable.SPAN_INCLUSIVE_EXCLUSIVE |
||||
|
) |
||||
|
title = crashTitle |
||||
|
binding.btnReport.setOnClickListener(this) |
||||
|
binding.btnCancel.setOnClickListener(this) |
||||
} |
} |
||||
|
|
||||
@Override |
|
||||
public void onClick(@NonNull final View v) { |
|
||||
if (v == btnReport) { |
|
||||
CrashReporterHelper.startCrashEmailIntent(this); |
|
||||
|
override fun onClick(v: View) { |
||||
|
if (v === binding.btnReport) { |
||||
|
startCrashEmailIntent(this) |
||||
} |
} |
||||
finish(); |
|
||||
System.exit(10); |
|
||||
|
finish() |
||||
|
exitProcess(10) |
||||
} |
} |
||||
|
|
||||
public static class CenteredImageSpan extends ImageSpan { |
|
||||
private WeakReference<Drawable> drawable; |
|
||||
|
|
||||
public CenteredImageSpan(final Context context, final int drawableRes) { |
|
||||
super(context, drawableRes); |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public int getSize(@NonNull final Paint paint, final CharSequence text, final int start, final int end, @Nullable final Paint.FontMetricsInt fm) { |
|
||||
final Drawable drawable = getCachedDrawable(); |
|
||||
final Rect rect = drawable.getBounds(); |
|
||||
|
|
||||
if (fm != null) { |
|
||||
final Paint.FontMetricsInt pfm = paint.getFontMetricsInt(); |
|
||||
fm.ascent = pfm.ascent; |
|
||||
fm.descent = pfm.descent; |
|
||||
fm.top = pfm.top; |
|
||||
fm.bottom = pfm.bottom; |
|
||||
|
private class CenteredImageSpan(context: Context, @DrawableRes drawableRes: Int) : ImageSpan(context, drawableRes) { |
||||
|
|
||||
|
private var drawable: WeakReference<Drawable>? = null |
||||
|
|
||||
|
override fun getSize( |
||||
|
paint: Paint, |
||||
|
text: CharSequence, |
||||
|
start: Int, |
||||
|
end: Int, |
||||
|
fm: FontMetricsInt? |
||||
|
): Int { |
||||
|
fm?.apply { |
||||
|
val pfm = paint.fontMetricsInt |
||||
|
ascent = pfm.ascent |
||||
|
descent = pfm.descent |
||||
|
top = pfm.top |
||||
|
bottom = pfm.bottom |
||||
} |
} |
||||
|
|
||||
return rect.right; |
|
||||
|
return cachedDrawable.bounds.right |
||||
} |
} |
||||
|
|
||||
@Override |
|
||||
public void draw(@NonNull final Canvas canvas, final CharSequence text, final int start, final int end, final float x, final int top, |
|
||||
final int y, final int bottom, @NonNull final Paint paint) { |
|
||||
final Drawable drawable = getCachedDrawable(); |
|
||||
canvas.save(); |
|
||||
|
|
||||
final int drawableHeight = drawable.getIntrinsicHeight(); |
|
||||
final Paint.FontMetricsInt fontMetricsInt = paint.getFontMetricsInt(); |
|
||||
int transY = bottom - drawable.getBounds().bottom + (drawableHeight - fontMetricsInt.descent + fontMetricsInt.ascent) / 2; |
|
||||
|
|
||||
canvas.translate(x, transY); |
|
||||
drawable.draw(canvas); |
|
||||
canvas.restore(); |
|
||||
|
override fun draw( |
||||
|
canvas: Canvas, |
||||
|
text: CharSequence, |
||||
|
start: Int, |
||||
|
end: Int, |
||||
|
x: Float, |
||||
|
top: Int, |
||||
|
y: Int, |
||||
|
bottom: Int, |
||||
|
paint: Paint |
||||
|
) { |
||||
|
canvas.save() |
||||
|
val drawableHeight = cachedDrawable.intrinsicHeight |
||||
|
val fontMetricsInt = paint.fontMetricsInt |
||||
|
val transY = bottom - cachedDrawable.bounds.bottom + (drawableHeight - fontMetricsInt.descent + fontMetricsInt.ascent) / 2 |
||||
|
canvas.translate(x, transY.toFloat()) |
||||
|
cachedDrawable.draw(canvas) |
||||
|
canvas.restore() |
||||
} |
} |
||||
|
|
||||
private Drawable getCachedDrawable() { |
|
||||
Drawable d = null; |
|
||||
if (drawable != null) d = drawable.get(); |
|
||||
if (d == null) { |
|
||||
d = getDrawable(); |
|
||||
drawable = new WeakReference<>(d); |
|
||||
} |
|
||||
return d; |
|
||||
} |
|
||||
|
private val cachedDrawable: Drawable |
||||
|
get() = drawable?.get() ?: getDrawable().also { drawable = WeakReference(it) } |
||||
} |
} |
||||
} |
|
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue