CrackMe.apk
Download file
package androidx.core.text;
import android.text.SpannableStringBuilder;
import com.google.common.base.Ascii;
import java.util.Locale;
import kotlin.text.Typography;
public final class BidiFormatter {
private static final int DEFAULT_FLAGS = 2;
static final BidiFormatter DEFAULT_LTR_INSTANCE;
static final BidiFormatter DEFAULT_RTL_INSTANCE;
static final TextDirectionHeuristicCompat DEFAULT_TEXT_DIRECTION_HEURISTIC;
private static final int DIR_LTR = -1;
private static final int DIR_RTL = 1;
private static final int DIR_UNKNOWN = 0;
private static final String EMPTY_STRING = "";
private static final int FLAG_STEREO_RESET = 2;
private static final char LRE = '';
private static final char LRM = '';
private static final String LRM_STRING = Character.toString(LRM);
private static final char PDF = '';
private static final char RLE = '';
private static final char RLM = '';
private static final String RLM_STRING = Character.toString(RLM);
private final TextDirectionHeuristicCompat mDefaultTextDirectionHeuristicCompat;
private final int mFlags;
private final boolean mIsRtlContext;
static {
TextDirectionHeuristicCompat textDirectionHeuristicCompat = TextDirectionHeuristicsCompat.FIRSTSTRONG_LTR;
DEFAULT_TEXT_DIRECTION_HEURISTIC = textDirectionHeuristicCompat;
DEFAULT_LTR_INSTANCE = new BidiFormatter(false, 2, textDirectionHeuristicCompat);
DEFAULT_RTL_INSTANCE = new BidiFormatter(true, 2, textDirectionHeuristicCompat);
}
public static final class Builder {
private int mFlags;
private boolean mIsRtlContext;
private TextDirectionHeuristicCompat mTextDirectionHeuristicCompat;
public Builder() {
initialize(BidiFormatter.isRtlLocale(Locale.getDefault()));
}
public Builder(boolean z) {
initialize(z);
}
public Builder(Locale locale) {
initialize(BidiFormatter.isRtlLocale(locale));
}
private void initialize(boolean z) {
this.mIsRtlContext = z;
this.mTextDirectionHeuristicCompat = BidiFormatter.DEFAULT_TEXT_DIRECTION_HEURISTIC;
this.mFlags = 2;
}
public Builder stereoReset(boolean z) {
if (z) {
this.mFlags |= 2;
} else {
this.mFlags &= -3;
}
return this;
}
public Builder setTextDirectionHeuristic(TextDirectionHeuristicCompat textDirectionHeuristicCompat) {
this.mTextDirectionHeuristicCompat = textDirectionHeuristicCompat;
return this;
}
private static BidiFormatter getDefaultInstanceFromContext(boolean z) {
return z ? BidiFormatter.DEFAULT_RTL_INSTANCE : BidiFormatter.DEFAULT_LTR_INSTANCE;
}
public BidiFormatter build() {
if (this.mFlags == 2 && this.mTextDirectionHeuristicCompat == BidiFormatter.DEFAULT_TEXT_DIRECTION_HEURISTIC) {
return getDefaultInstanceFromContext(this.mIsRtlContext);
}
return new BidiFormatter(this.mIsRtlContext, this.mFlags, this.mTextDirectionHeuristicCompat);
}
}
public static BidiFormatter getInstance() {
return new Builder().build();
}
public static BidiFormatter getInstance(boolean z) {
return new Builder(z).build();
}
public static BidiFormatter getInstance(Locale locale) {
return new Builder(locale).build();
}
BidiFormatter(boolean z, int i, TextDirectionHeuristicCompat textDirectionHeuristicCompat) {
this.mIsRtlContext = z;
this.mFlags = i;
this.mDefaultTextDirectionHeuristicCompat = textDirectionHeuristicCompat;
}
public boolean isRtlContext() {
return this.mIsRtlContext;
}
public boolean getStereoReset() {
return (this.mFlags & 2) != 0;
}
private String markAfter(CharSequence charSequence, TextDirectionHeuristicCompat textDirectionHeuristicCompat) {
boolean isRtl = textDirectionHeuristicCompat.isRtl(charSequence, 0, charSequence.length());
if (!this.mIsRtlContext && (isRtl || getExitDir(charSequence) == 1)) {
return LRM_STRING;
}
if (this.mIsRtlContext) {
return (!isRtl || getExitDir(charSequence) == -1) ? RLM_STRING : "";
}
return "";
}
private String markBefore(CharSequence charSequence, TextDirectionHeuristicCompat textDirectionHeuristicCompat) {
boolean isRtl = textDirectionHeuristicCompat.isRtl(charSequence, 0, charSequence.length());
if (!this.mIsRtlContext && (isRtl || getEntryDir(charSequence) == 1)) {
return LRM_STRING;
}
if (this.mIsRtlContext) {
return (!isRtl || getEntryDir(charSequence) == -1) ? RLM_STRING : "";
}
return "";
}
public boolean isRtl(String str) {
return isRtl((CharSequence) str);
}
public boolean isRtl(CharSequence charSequence) {
return this.mDefaultTextDirectionHeuristicCompat.isRtl(charSequence, 0, charSequence.length());
}
public String unicodeWrap(String str, TextDirectionHeuristicCompat textDirectionHeuristicCompat, boolean z) {
if (str == null) {
return null;
}
return unicodeWrap((CharSequence) str, textDirectionHeuristicCompat, z).toString();
}
public CharSequence unicodeWrap(CharSequence charSequence, TextDirectionHeuristicCompat textDirectionHeuristicCompat, boolean z) {
if (charSequence == null) {
return null;
}
boolean isRtl = textDirectionHeuristicCompat.isRtl(charSequence, 0, charSequence.length());
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
if (getStereoReset() && z) {
spannableStringBuilder.append(markBefore(charSequence, isRtl ? TextDirectionHeuristicsCompat.RTL : TextDirectionHeuristicsCompat.LTR));
}
if (isRtl != this.mIsRtlContext) {
spannableStringBuilder.append(isRtl ? RLE : LRE);
spannableStringBuilder.append(charSequence);
spannableStringBuilder.append(PDF);
} else {
spannableStringBuilder.append(charSequence);
}
if (z) {
spannableStringBuilder.append(markAfter(charSequence, isRtl ? TextDirectionHeuristicsCompat.RTL : TextDirectionHeuristicsCompat.LTR));
}
return spannableStringBuilder;
}
public String unicodeWrap(String str, TextDirectionHeuristicCompat textDirectionHeuristicCompat) {
return unicodeWrap(str, textDirectionHeuristicCompat, true);
}
public CharSequence unicodeWrap(CharSequence charSequence, TextDirectionHeuristicCompat textDirectionHeuristicCompat) {
return unicodeWrap(charSequence, textDirectionHeuristicCompat, true);
}
public String unicodeWrap(String str, boolean z) {
return unicodeWrap(str, this.mDefaultTextDirectionHeuristicCompat, z);
}
public CharSequence unicodeWrap(CharSequence charSequence, boolean z) {
return unicodeWrap(charSequence, this.mDefaultTextDirectionHeuristicCompat, z);
}
public String unicodeWrap(String str) {
return unicodeWrap(str, this.mDefaultTextDirectionHeuristicCompat, true);
}
public CharSequence unicodeWrap(CharSequence charSequence) {
return unicodeWrap(charSequence, this.mDefaultTextDirectionHeuristicCompat, true);
}
static boolean isRtlLocale(Locale locale) {
return TextUtilsCompat.getLayoutDirectionFromLocale(locale) == 1;
}
private static int getExitDir(CharSequence charSequence) {
return new DirectionalityEstimator(charSequence, false).getExitDir();
}
private static int getEntryDir(CharSequence charSequence) {
return new DirectionalityEstimator(charSequence, false).getEntryDir();
}
private static class DirectionalityEstimator {
private static final byte[] DIR_TYPE_CACHE = new byte[DIR_TYPE_CACHE_SIZE];
private static final int DIR_TYPE_CACHE_SIZE = 1792;
private int charIndex;
private final boolean isHtml;
private char lastChar;
private final int length;
private final CharSequence text;
static {
for (int i = 0; i < DIR_TYPE_CACHE_SIZE; i++) {
DIR_TYPE_CACHE[i] = Character.getDirectionality(i);
}
}
DirectionalityEstimator(CharSequence charSequence, boolean z) {
this.text = charSequence;
this.isHtml = z;
this.length = charSequence.length();
}
/* access modifiers changed from: package-private */
public int getEntryDir() {
this.charIndex = 0;
int i = 0;
int i2 = 0;
int i3 = 0;
while (this.charIndex < this.length && i == 0) {
byte dirTypeForward = dirTypeForward();
if (dirTypeForward != 0) {
if (dirTypeForward == 1 || dirTypeForward == 2) {
if (i3 == 0) {
return 1;
}
} else if (dirTypeForward != 9) {
switch (dirTypeForward) {
case 14:
case 15:
i3++;
i2 = -1;
continue;
case 16:
case 17:
i3++;
i2 = 1;
continue;
case 18:
i3--;
i2 = 0;
continue;
}
}
} else if (i3 == 0) {
return -1;
}
i = i3;
}
if (i == 0) {
return 0;
}
if (i2 != 0) {
return i2;
}
while (this.charIndex > 0) {
switch (dirTypeBackward()) {
case 14:
case 15:
if (i == i3) {
return -1;
}
break;
case 16:
case 17:
if (i == i3) {
return 1;
}
break;
case 18:
i3++;
continue;
}
i3--;
}
return 0;
}
/* access modifiers changed from: package-private */
/* JADX WARNING: Code restructure failed: missing block: B:18:0x002b, code lost:
r1 = r1 - 1;
*/
/* Code decompiled incorrectly, please refer to instructions dump. */
public int getExitDir() {
/*
r7 = this;
int r0 = r7.length
r7.charIndex = r0
r0 = 0
r1 = 0
r2 = 0
L_0x0007:
int r3 = r7.charIndex
if (r3 <= 0) goto L_0x003b
byte r3 = r7.dirTypeBackward()
r4 = -1
if (r3 == 0) goto L_0x0034
r5 = 1
if (r3 == r5) goto L_0x002e
r6 = 2
if (r3 == r6) goto L_0x002e
r6 = 9
if (r3 == r6) goto L_0x0007
switch(r3) {
case 14: goto L_0x0028;
case 15: goto L_0x0028;
case 16: goto L_0x0025;
case 17: goto L_0x0025;
case 18: goto L_0x0022;
default: goto L_0x001f;
}
L_0x001f:
if (r2 != 0) goto L_0x0007
goto L_0x0039
L_0x0022:
int r1 = r1 + 1
goto L_0x0007
L_0x0025:
if (r2 != r1) goto L_0x002b
return r5
L_0x0028:
if (r2 != r1) goto L_0x002b
return r4
L_0x002b:
int r1 = r1 + -1
goto L_0x0007
L_0x002e:
if (r1 != 0) goto L_0x0031
return r5
L_0x0031:
if (r2 != 0) goto L_0x0007
goto L_0x0039
L_0x0034:
if (r1 != 0) goto L_0x0037
return r4
L_0x0037:
if (r2 != 0) goto L_0x0007
L_0x0039:
r2 = r1
goto L_0x0007
L_0x003b:
return r0
*/
throw new UnsupportedOperationException("Method not decompiled: androidx.core.text.BidiFormatter.DirectionalityEstimator.getExitDir():int");
}
private static byte getCachedDirectionality(char c) {
return c < DIR_TYPE_CACHE_SIZE ? DIR_TYPE_CACHE[c] : Character.getDirectionality(c);
}
/* access modifiers changed from: package-private */
public byte dirTypeForward() {
char charAt = this.text.charAt(this.charIndex);
this.lastChar = charAt;
if (Character.isHighSurrogate(charAt)) {
int codePointAt = Character.codePointAt(this.text, this.charIndex);
this.charIndex += Character.charCount(codePointAt);
return Character.getDirectionality(codePointAt);
}
this.charIndex++;
byte cachedDirectionality = getCachedDirectionality(this.lastChar);
if (!this.isHtml) {
return cachedDirectionality;
}
char c = this.lastChar;
if (c == '<') {
return skipTagForward();
}
return c == '&' ? skipEntityForward() : cachedDirectionality;
}
/* access modifiers changed from: package-private */
public byte dirTypeBackward() {
char charAt = this.text.charAt(this.charIndex - 1);
this.lastChar = charAt;
if (Character.isLowSurrogate(charAt)) {
int codePointBefore = Character.codePointBefore(this.text, this.charIndex);
this.charIndex -= Character.charCount(codePointBefore);
return Character.getDirectionality(codePointBefore);
}
this.charIndex--;
byte cachedDirectionality = getCachedDirectionality(this.lastChar);
if (!this.isHtml) {
return cachedDirectionality;
}
char c = this.lastChar;
if (c == '>') {
return skipTagBackward();
}
return c == ';' ? skipEntityBackward() : cachedDirectionality;
}
private byte skipTagForward() {
char charAt;
int i = this.charIndex;
while (true) {
int i2 = this.charIndex;
if (i2 < this.length) {
CharSequence charSequence = this.text;
this.charIndex = i2 + 1;
char charAt2 = charSequence.charAt(i2);
this.lastChar = charAt2;
if (charAt2 == '>') {
return Ascii.FF;
}
if (charAt2 == '\"' || charAt2 == '\'') {
do {
int i3 = this.charIndex;
if (i3 >= this.length) {
break;
}
CharSequence charSequence2 = this.text;
this.charIndex = i3 + 1;
charAt = charSequence2.charAt(i3);
this.lastChar = charAt;
} while (charAt != charAt2);
}
} else {
this.charIndex = i;
this.lastChar = Typography.less;
return Ascii.CR;
}
}
}
private byte skipTagBackward() {
char charAt;
int i = this.charIndex;
while (true) {
int i2 = this.charIndex;
if (i2 <= 0) {
break;
}
CharSequence charSequence = this.text;
int i3 = i2 - 1;
this.charIndex = i3;
char charAt2 = charSequence.charAt(i3);
this.lastChar = charAt2;
if (charAt2 == '<') {
return Ascii.FF;
}
if (charAt2 == '>') {
break;
} else if (charAt2 == '\"' || charAt2 == '\'') {
do {
int i4 = this.charIndex;
if (i4 <= 0) {
break;
}
CharSequence charSequence2 = this.text;
int i5 = i4 - 1;
this.charIndex = i5;
charAt = charSequence2.charAt(i5);
this.lastChar = charAt;
} while (charAt != charAt2);
}
}
this.charIndex = i;
this.lastChar = Typography.greater;
return Ascii.CR;
}
private byte skipEntityForward() {
char charAt;
do {
int i = this.charIndex;
if (i >= this.length) {
return Ascii.FF;
}
CharSequence charSequence = this.text;
this.charIndex = i + 1;
charAt = charSequence.charAt(i);
this.lastChar = charAt;
} while (charAt != ';');
return Ascii.FF;
}
private byte skipEntityBackward() {
char charAt;
int i = this.charIndex;
do {
int i2 = this.charIndex;
if (i2 <= 0) {
break;
}
CharSequence charSequence = this.text;
int i3 = i2 - 1;
this.charIndex = i3;
charAt = charSequence.charAt(i3);
this.lastChar = charAt;
if (charAt == '&') {
return Ascii.FF;
}
} while (charAt != ';');
this.charIndex = i;
this.lastChar = ';';
return Ascii.CR;
}
}
}
Download file