ADD week 5
This commit is contained in:
		
							
								
								
									
										358
									
								
								02-Easy5/E5/sources/androidx/emoji2/text/EmojiProcessor.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										358
									
								
								02-Easy5/E5/sources/androidx/emoji2/text/EmojiProcessor.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,358 @@ | ||||
| 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; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user