SRE/02-Easy5/E5/sources/androidx/emoji2/text/EmojiProcessor.java
2025-03-31 16:33:42 +02:00

359 lines
15 KiB
Java

package androidx.emoji2.text;
import android.text.Editable;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.MetaKeyKeyListener;
import android.view.KeyEvent;
import android.view.inputmethod.InputConnection;
import androidx.emoji2.text.EmojiCompat;
import androidx.emoji2.text.MetadataRepo;
import java.util.Arrays;
/* loaded from: classes.dex */
final class EmojiProcessor {
private static final int ACTION_ADVANCE_BOTH = 1;
private static final int ACTION_ADVANCE_END = 2;
private static final int ACTION_FLUSH = 3;
private final int[] mEmojiAsDefaultStyleExceptions;
private EmojiCompat.GlyphChecker mGlyphChecker;
private final MetadataRepo mMetadataRepo;
private final EmojiCompat.SpanFactory mSpanFactory;
private final boolean mUseEmojiAsDefaultStyle;
private static boolean hasInvalidSelection(int i, int i2) {
return i == -1 || i2 == -1 || i != i2;
}
EmojiProcessor(MetadataRepo metadataRepo, EmojiCompat.SpanFactory spanFactory, EmojiCompat.GlyphChecker glyphChecker, boolean z, int[] iArr) {
this.mSpanFactory = spanFactory;
this.mMetadataRepo = metadataRepo;
this.mGlyphChecker = glyphChecker;
this.mUseEmojiAsDefaultStyle = z;
this.mEmojiAsDefaultStyleExceptions = iArr;
}
int getEmojiMatch(CharSequence charSequence) {
return getEmojiMatch(charSequence, this.mMetadataRepo.getMetadataVersion());
}
int getEmojiMatch(CharSequence charSequence, int i) {
ProcessorSm processorSm = new ProcessorSm(this.mMetadataRepo.getRootNode(), this.mUseEmojiAsDefaultStyle, this.mEmojiAsDefaultStyleExceptions);
int length = charSequence.length();
int i2 = 0;
int i3 = 0;
int i4 = 0;
while (i2 < length) {
int codePointAt = Character.codePointAt(charSequence, i2);
int check = processorSm.check(codePointAt);
EmojiMetadata currentMetadata = processorSm.getCurrentMetadata();
if (check == 1) {
i2 += Character.charCount(codePointAt);
i4 = 0;
} else if (check == 2) {
i2 += Character.charCount(codePointAt);
} else if (check == 3) {
currentMetadata = processorSm.getFlushMetadata();
if (currentMetadata.getCompatAdded() <= i) {
i3++;
}
}
if (currentMetadata != null && currentMetadata.getCompatAdded() <= i) {
i4++;
}
}
if (i3 != 0) {
return 2;
}
if (!processorSm.isInFlushableState() || processorSm.getCurrentMetadata().getCompatAdded() > i) {
return i4 == 0 ? 0 : 2;
}
return 1;
}
/* JADX WARN: Code restructure failed: missing block: B:95:0x0126, code lost:
((androidx.emoji2.text.SpannableBuilder) r10).endBatchEdit();
*/
/* JADX WARN: Removed duplicated region for block: B:14:0x0048 A[Catch: all -> 0x012d, TryCatch #0 {all -> 0x012d, blocks: (B:98:0x000c, B:101:0x0011, B:103:0x0015, B:105:0x0024, B:8:0x0037, B:10:0x0041, B:12:0x0044, B:14:0x0048, B:16:0x0054, B:18:0x0057, B:22:0x0064, B:28:0x0073, B:29:0x0081, B:33:0x009c, B:59:0x00ac, B:63:0x00b8, B:64:0x00c2, B:46:0x00cc, B:49:0x00d3, B:36:0x00d8, B:38:0x00e3, B:70:0x00ea, B:74:0x00f4, B:77:0x0100, B:78:0x0106, B:80:0x010f, B:5:0x002c), top: B:97:0x000c }] */
/* JADX WARN: Removed duplicated region for block: B:35:0x00d8 A[SYNTHETIC] */
/* JADX WARN: Removed duplicated region for block: B:42:0x00a3 A[SYNTHETIC] */
/* JADX WARN: Removed duplicated region for block: B:77:0x0100 A[Catch: all -> 0x012d, TryCatch #0 {all -> 0x012d, blocks: (B:98:0x000c, B:101:0x0011, B:103:0x0015, B:105:0x0024, B:8:0x0037, B:10:0x0041, B:12:0x0044, B:14:0x0048, B:16:0x0054, B:18:0x0057, B:22:0x0064, B:28:0x0073, B:29:0x0081, B:33:0x009c, B:59:0x00ac, B:63:0x00b8, B:64:0x00c2, B:46:0x00cc, B:49:0x00d3, B:36:0x00d8, B:38:0x00e3, B:70:0x00ea, B:74:0x00f4, B:77:0x0100, B:78:0x0106, B:80:0x010f, B:5:0x002c), top: B:97:0x000c }] */
/* JADX WARN: Removed duplicated region for block: B:80:0x010f A[Catch: all -> 0x012d, TRY_LEAVE, TryCatch #0 {all -> 0x012d, blocks: (B:98:0x000c, B:101:0x0011, B:103:0x0015, B:105:0x0024, B:8:0x0037, B:10:0x0041, B:12:0x0044, B:14:0x0048, B:16:0x0054, B:18:0x0057, B:22:0x0064, B:28:0x0073, B:29:0x0081, B:33:0x009c, B:59:0x00ac, B:63:0x00b8, B:64:0x00c2, B:46:0x00cc, B:49:0x00d3, B:36:0x00d8, B:38:0x00e3, B:70:0x00ea, B:74:0x00f4, B:77:0x0100, B:78:0x0106, B:80:0x010f, B:5:0x002c), top: B:97:0x000c }] */
/* JADX WARN: Removed duplicated region for block: B:90:0x011b */
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct add '--show-bad-code' argument
*/
java.lang.CharSequence process(java.lang.CharSequence r10, int r11, int r12, int r13, boolean r14) {
/*
Method dump skipped, instructions count: 310
To view this dump add '--comments-level debug' option
*/
throw new UnsupportedOperationException("Method not decompiled: androidx.emoji2.text.EmojiProcessor.process(java.lang.CharSequence, int, int, int, boolean):java.lang.CharSequence");
}
static boolean handleOnKeyDown(Editable editable, int i, KeyEvent keyEvent) {
boolean delete;
if (i != 67) {
if (i == 112) {
delete = delete(editable, keyEvent, true);
}
return false;
}
delete = delete(editable, keyEvent, false);
if (delete) {
MetaKeyKeyListener.adjustMetaAfterKeypress(editable);
return true;
}
return false;
}
private static boolean delete(Editable editable, KeyEvent keyEvent, boolean z) {
EmojiSpan[] emojiSpanArr;
if (hasModifiers(keyEvent)) {
return false;
}
int selectionStart = Selection.getSelectionStart(editable);
int selectionEnd = Selection.getSelectionEnd(editable);
if (!hasInvalidSelection(selectionStart, selectionEnd) && (emojiSpanArr = (EmojiSpan[]) editable.getSpans(selectionStart, selectionEnd, EmojiSpan.class)) != null && emojiSpanArr.length > 0) {
for (EmojiSpan emojiSpan : emojiSpanArr) {
int spanStart = editable.getSpanStart(emojiSpan);
int spanEnd = editable.getSpanEnd(emojiSpan);
if ((z && spanStart == selectionStart) || ((!z && spanEnd == selectionStart) || (selectionStart > spanStart && selectionStart < spanEnd))) {
editable.delete(spanStart, spanEnd);
return true;
}
}
}
return false;
}
static boolean handleDeleteSurroundingText(InputConnection inputConnection, Editable editable, int i, int i2, boolean z) {
int max;
int min;
if (editable != null && inputConnection != null && i >= 0 && i2 >= 0) {
int selectionStart = Selection.getSelectionStart(editable);
int selectionEnd = Selection.getSelectionEnd(editable);
if (hasInvalidSelection(selectionStart, selectionEnd)) {
return false;
}
if (z) {
max = CodepointIndexFinder.findIndexBackward(editable, selectionStart, Math.max(i, 0));
min = CodepointIndexFinder.findIndexForward(editable, selectionEnd, Math.max(i2, 0));
if (max == -1 || min == -1) {
return false;
}
} else {
max = Math.max(selectionStart - i, 0);
min = Math.min(selectionEnd + i2, editable.length());
}
EmojiSpan[] emojiSpanArr = (EmojiSpan[]) editable.getSpans(max, min, EmojiSpan.class);
if (emojiSpanArr != null && emojiSpanArr.length > 0) {
for (EmojiSpan emojiSpan : emojiSpanArr) {
int spanStart = editable.getSpanStart(emojiSpan);
int spanEnd = editable.getSpanEnd(emojiSpan);
max = Math.min(spanStart, max);
min = Math.max(spanEnd, min);
}
int max2 = Math.max(max, 0);
int min2 = Math.min(min, editable.length());
inputConnection.beginBatchEdit();
editable.delete(max2, min2);
inputConnection.endBatchEdit();
return true;
}
}
return false;
}
private static boolean hasModifiers(KeyEvent keyEvent) {
return !KeyEvent.metaStateHasNoModifiers(keyEvent.getMetaState());
}
private void addEmoji(Spannable spannable, EmojiMetadata emojiMetadata, int i, int i2) {
spannable.setSpan(this.mSpanFactory.createSpan(emojiMetadata), i, i2, 33);
}
private boolean hasGlyph(CharSequence charSequence, int i, int i2, EmojiMetadata emojiMetadata) {
if (emojiMetadata.getHasGlyph() == 0) {
emojiMetadata.setHasGlyph(this.mGlyphChecker.hasGlyph(charSequence, i, i2, emojiMetadata.getSdkAdded()));
}
return emojiMetadata.getHasGlyph() == 2;
}
static final class ProcessorSm {
private static final int STATE_DEFAULT = 1;
private static final int STATE_WALKING = 2;
private int mCurrentDepth;
private MetadataRepo.Node mCurrentNode;
private final int[] mEmojiAsDefaultStyleExceptions;
private MetadataRepo.Node mFlushNode;
private int mLastCodepoint;
private final MetadataRepo.Node mRootNode;
private int mState = 1;
private final boolean mUseEmojiAsDefaultStyle;
private static boolean isEmojiStyle(int i) {
return i == 65039;
}
private static boolean isTextStyle(int i) {
return i == 65038;
}
private int reset() {
this.mState = 1;
this.mCurrentNode = this.mRootNode;
this.mCurrentDepth = 0;
return 1;
}
ProcessorSm(MetadataRepo.Node node, boolean z, int[] iArr) {
this.mRootNode = node;
this.mCurrentNode = node;
this.mUseEmojiAsDefaultStyle = z;
this.mEmojiAsDefaultStyleExceptions = iArr;
}
int check(int i) {
MetadataRepo.Node node = this.mCurrentNode.get(i);
int i2 = 2;
if (this.mState != 2) {
if (node == null) {
i2 = reset();
} else {
this.mState = 2;
this.mCurrentNode = node;
this.mCurrentDepth = 1;
}
} else if (node != null) {
this.mCurrentNode = node;
this.mCurrentDepth++;
} else if (isTextStyle(i)) {
i2 = reset();
} else if (!isEmojiStyle(i)) {
if (this.mCurrentNode.getData() != null) {
i2 = 3;
if (this.mCurrentDepth == 1) {
if (shouldUseEmojiPresentationStyleForSingleCodepoint()) {
this.mFlushNode = this.mCurrentNode;
reset();
} else {
i2 = reset();
}
} else {
this.mFlushNode = this.mCurrentNode;
reset();
}
} else {
i2 = reset();
}
}
this.mLastCodepoint = i;
return i2;
}
EmojiMetadata getFlushMetadata() {
return this.mFlushNode.getData();
}
EmojiMetadata getCurrentMetadata() {
return this.mCurrentNode.getData();
}
boolean isInFlushableState() {
return this.mState == 2 && this.mCurrentNode.getData() != null && (this.mCurrentDepth > 1 || shouldUseEmojiPresentationStyleForSingleCodepoint());
}
private boolean shouldUseEmojiPresentationStyleForSingleCodepoint() {
if (this.mCurrentNode.getData().isDefaultEmoji() || isEmojiStyle(this.mLastCodepoint)) {
return true;
}
if (this.mUseEmojiAsDefaultStyle) {
if (this.mEmojiAsDefaultStyleExceptions == null) {
return true;
}
if (Arrays.binarySearch(this.mEmojiAsDefaultStyleExceptions, this.mCurrentNode.getData().getCodepointAt(0)) < 0) {
return true;
}
}
return false;
}
}
private static final class CodepointIndexFinder {
private static final int INVALID_INDEX = -1;
private CodepointIndexFinder() {
}
static int findIndexBackward(CharSequence charSequence, int i, int i2) {
int length = charSequence.length();
if (i < 0 || length < i || i2 < 0) {
return -1;
}
while (true) {
boolean z = false;
while (i2 != 0) {
i--;
if (i < 0) {
return z ? -1 : 0;
}
char charAt = charSequence.charAt(i);
if (z) {
if (!Character.isHighSurrogate(charAt)) {
return -1;
}
i2--;
} else if (!Character.isSurrogate(charAt)) {
i2--;
} else {
if (Character.isHighSurrogate(charAt)) {
return -1;
}
z = true;
}
}
return i;
}
}
static int findIndexForward(CharSequence charSequence, int i, int i2) {
int length = charSequence.length();
if (i < 0 || length < i || i2 < 0) {
return -1;
}
while (true) {
boolean z = false;
while (i2 != 0) {
if (i >= length) {
if (z) {
return -1;
}
return length;
}
char charAt = charSequence.charAt(i);
if (z) {
if (!Character.isLowSurrogate(charAt)) {
return -1;
}
i2--;
i++;
} else if (!Character.isSurrogate(charAt)) {
i2--;
i++;
} else {
if (Character.isLowSurrogate(charAt)) {
return -1;
}
i++;
z = true;
}
}
return i;
}
}
}
}