Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request]: Update to target SDK 33 #5137

Closed
BenHenning opened this issue Aug 22, 2023 · 17 comments · Fixed by #5222
Closed

[Feature Request]: Update to target SDK 33 #5137

BenHenning opened this issue Aug 22, 2023 · 17 comments · Fixed by #5222
Assignees
Labels
enhancement End user-perceivable enhancements. Impact: High High perceived user impact (breaks a critical feature or blocks a release). Work: Medium The means to find the solution is clear, but it isn't at good-first-issue level yet.

Comments

@BenHenning
Copy link
Sponsor Member

Is your feature request related to a problem? Please describe.

Per https://developer.android.com/google/play/requirements/target-sdk, we're required to target SDK 33 starting on 31 August to continue publishing app versions.

Describe the solution you'd like

We need to update the target SDK everywhere, and perform both a manual test on SDK 33 and perform an audit for behavior differences from the current target version to ensure there aren't major discrepancies that may require additional investigation.

Describe alternatives you've considered

No response

Additional context

No response

@BenHenning BenHenning added enhancement End user-perceivable enhancements. triage needed Impact: High High perceived user impact (breaks a critical feature or blocks a release). Work: Medium The means to find the solution is clear, but it isn't at good-first-issue level yet. and removed triage needed labels Aug 22, 2023
@BenHenning BenHenning self-assigned this Aug 22, 2023
@MohitGupta121
Copy link
Member

@BenHenning I think this issue duplicate of this #4578, If I not wrong? Can we close previous one?

@BenHenning
Copy link
Sponsor Member Author

This one is targeting SDK 33 since that's the latest version that we need to target. I don't think any other issues are covering this requirement yet (the one linked is for 31 which has been completed).

@SekhGulamMainuddin
Copy link

@BenHenning can you assign this issue to me

@adhiamboperes
Copy link
Collaborator

adhiamboperes commented Oct 1, 2023

@BenHenning can you assign this issue to me

Are you able to run oppia on bazel?

Edit: Also this issue is currently assigned, can you pick something else without an assignee?

@SekhGulamMainuddin
Copy link

Ok

@BenHenning can you assign this issue to me

Are you able to run oppia on bazel?

Edit: Also this issue is currently assigned, can you pick something else without an assignee?

@BenHenning
Copy link
Sponsor Member Author

BenHenning commented Nov 16, 2023

So I've spent a bit of time working through the migration and the most obvious problem I've seen is the drag and drop layout is no longer working correctly (on SDK 33):

image

This was reproed both on an SDK 33 migration branch (#5222) as well as the latest develop on a Pixel 7 SDK 33 emulator. At first I thought maybe, for some reason, the tablet mode of the layout was being used. However, none of the other layouts in the app are using their tablet counterparts.

More investigation is needed.

@BenHenning
Copy link
Sponsor Member Author

NB: The same issue also exists for image region selection.

@BenHenning
Copy link
Sponsor Member Author

BenHenning commented Nov 16, 2023

https://developer.android.com/about/versions/13/behavior-changes-all contains the high-level behavior changes in SDK 33. Items of note:

  • SDK 33 introduced prefetch jobs which could be useful for future downloads support, or platform parameter syncing.
  • App standby mode was updated for better battery management.
  • Some changes to FCM high-priority quota management.
  • New post notifications support (https://developer.android.com/develop/ui/views/notifications/notification-permission). Probably not relevant to Oppia anytime soon.
  • Clipboards now support 'sensitive' data that needs to be opted into. While we do some clipboard interaction, this shouldn't affect existing functionality.
  • Shared user IDs are going away (shouldn't affect Oppia).
  • Core speech service has been removed. We didn't depend on this, so it shouldn't affect us.

Nothing here is obviously causing the problems we see above, and suggest no additional work items to do.

More investigation is needed on what's actually failing with the layouts.

Edit: https://developer.android.com/about/versions/13/behavior-changes-13 is also relevant since we're required to target SDK 33. Nothing in there is particularly relevant, either except:

  • Updated location services (may affect p2p lesson transfer in the future when P2p lesson transfer support #985 is worked on).
  • Additional restrictions on reading images (may affect avatar uploading--will check).
  • Improved media session management. Doesn't seem relevant since we use MediaPlayer, not MediaController. Might be something to look into in the future.
  • New restrictions on using non-SDK APIs (see https://developer.android.com/about/versions/13/changes/non-sdk-13). We do need to check this one on both the developer and beta builds of the app to make sure none of our >100 dependencies do this.

@BenHenning
Copy link
Sponsor Member Author

BenHenning commented Nov 16, 2023

Follow-up: confirming that avatar selection still seems to work on SDK 33 when also targeting SDK 33, so it seems that we don't need to change anything there.

Edit: Ah this is because our current permission implicitly grants all of the new READ_* permissions. Might be able to focus this in the future, though we need to maintain backward compatibility.

@BenHenning
Copy link
Sponsor Member Author

Aha! This actually isn't an issue of tablet vs. non-tablet. The decision for splitting out interactions is based on physical size:

return shouldSplit && computeDeviceDiagonalSizeInches() >= MINIMUM_DIAGONAL_WIDTH
. However, I'm still not sure:

  • Why this check is being done on a non-tablet device.
  • Why this only seems to be an SDK 33 thing (as a Pixel 7 emulator running SDK 32 didn't have the same problem).

@BenHenning
Copy link
Sponsor Member Author

For the layout issue, I added a simple log line to SplitScreenManager and checked it on a Pixel 6a emulator on SDK 32 vs. SDK 33. The line was:

    android.util.Log.e("@@@@@", "should split: $shouldSplit, min size (in): $MINIMUM_DIAGONAL_WIDTH_INCHES, computed size: ${computeDeviceDiagonalSizeInches()}")

Added to SplitScreenManager.isDeviceLargeEnoughForSplitScreen. Results:

  • SDK 32 (Pixel 6a): should split: true, min size (in): 7.0, computed size: 6.175147688889055
  • SDK 33 (Pixel 6a): should split: true, min size (in): 7.0, computed size: 35.75672528039694

Clearly the calculation is wrong on SDK 33. The SDK 32 calculation is correct per a quick search (the Pixel 6a has a 6.1" diagonally sized screen).

@BenHenning
Copy link
Sponsor Member Author

It seems that there were other folks who had issues with the logic above for computing size (per the SO referenced in the solution we use: https://stackoverflow.com/a/19156339/6628335): https://stackoverflow.com/a/41495217 and https://stackoverflow.com/a/23083395.

However, I think the second link is a misinterpretation. scaledDensity only applies to font size, not display density.

Here are findings from gathering new information:

  • SDK 32 (Pixel 6a): widthInPixel: 1080, heightInPixel: 2358, xdpi: 420.0, ydpi: 420.0, widthInInch: 2.5714285714285716, heightInInch: 5.614285714285714, scaled density: 2.625
  • SDK 33 (Pixel 6a): widthInPixel: 1080, heightInPixel: 2337, xdpi: 72.0, ydpi: 72.0, widthInInch: 15.0, heightInInch: 32.458333333333336, scaled density: 2.625

It very much seems that this is an issue with the xdpi/ydpi values coming from the display metrics.

@BenHenning
Copy link
Sponsor Member Author

Aha! It seems that this may be a regression with the emulator itself: https://issuetracker.google.com/issues/244781260. Per the discussion thread I'm going to try to use a non-Play SDK 33 image and see if that fixes the problem.

@BenHenning
Copy link
Sponsor Member Author

Confirming that on a non-Google API emulator image for SDK 33 on a Pixel 6a-esque profile seems to produce the correct xdpi/ydpi values:

image

I don't think we actually have to fix anything here since it's an emulator-specific problem.

@BenHenning
Copy link
Sponsor Member Author

Ran veridex on a universal APK build of both oppia_dev and oppia_beta. Results:

oppia_dev
NOTE: appcompat.sh is still under development. It can report
API uses that do not execute at runtime, and reflection uses
that do not exist. It can also miss on reflection uses.
#1: Linking unsupported Lsun/misc/Unsafe;->allocateInstance(Ljava/lang/Class;)Ljava/lang/Object; use(s):
       Lcom/google/android/gms/internal/measurement/zzkt;->zza(Ljava/lang/Class;)Ljava/lang/Object;
       Lcom/google/protobuf/UnsafeUtil;->allocateInstance(Ljava/lang/Class;)Ljava/lang/Object;

#2: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->arrayBaseOffset(Ljava/lang/Class;)I use(s):
       Lcom/google/android/gms/internal/measurement/zzkt;->zzb(Ljava/lang/Class;)I
       Lcom/google/common/hash/LittleEndianByteArray$UnsafeByteArray;-><clinit>()V
       Lcom/google/common/primitives/UnsignedBytes$LexicographicalComparatorHolder$UnsafeComparator;-><clinit>()V
       Lcom/google/protobuf/UnsafeUtil$MemoryAccessor;->arrayBaseOffset(Ljava/lang/Class;)I

#3: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->arrayIndexScale(Ljava/lang/Class;)I use(s):
       Lcom/google/android/gms/internal/measurement/zzkt;->zzc(Ljava/lang/Class;)I
       Lcom/google/common/hash/LittleEndianByteArray$UnsafeByteArray;-><clinit>()V
       Lcom/google/common/primitives/UnsignedBytes$LexicographicalComparatorHolder$UnsafeComparator;-><clinit>()V
       Lcom/google/protobuf/UnsafeUtil$MemoryAccessor;->arrayIndexScale(Ljava/lang/Class;)I

#4: Linking unsupported Lsun/misc/Unsafe;->compareAndSwapInt(Ljava/lang/Object;JII)Z use(s):
       Lcom/google/common/cache/Striped64;->casBusy()Z
       Lcom/google/common/hash/Striped64;->casBusy()Z

#5: Linking unsupported Lsun/misc/Unsafe;->compareAndSwapLong(Ljava/lang/Object;JJJ)Z use(s):
       Lcom/google/common/cache/Striped64$Cell;->cas(JJ)Z
       Lcom/google/common/cache/Striped64;->casBase(JJ)Z
       Lcom/google/common/hash/Striped64$Cell;->cas(JJ)Z
       Lcom/google/common/hash/Striped64;->casBase(JJ)Z

#6: Linking unsupported Lsun/misc/Unsafe;->compareAndSwapObject(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z use(s):
       Lcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper;->casListeners(Lcom/google/common/util/concurrent/AbstractFuture;Lcom/google/common/util/concurrent/AbstractFuture$Listener;Lcom/google/common/util/concurrent/AbstractFuture$Listener;)Z
       Lcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper;->casValue(Lcom/google/common/util/concurrent/AbstractFuture;Ljava/lang/Object;Ljava/lang/Object;)Z
       Lcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper;->casWaiters(Lcom/google/common/util/concurrent/AbstractFuture;Lcom/google/common/util/concurrent/AbstractFuture$Waiter;Lcom/google/common/util/concurrent/AbstractFuture$Waiter;)Z

#7: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getBoolean(Ljava/lang/Object;J)Z use(s):
       Lcom/google/android/gms/internal/measurement/zzkt$zzb;->zzb(Ljava/lang/Object;J)Z
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->getBoolean(Ljava/lang/Object;J)Z

#8: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getByte(J)B use(s):
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->getByte(J)B

#9: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getByte(Ljava/lang/Object;J)B use(s):
       Lcom/google/android/gms/internal/measurement/zzkt$zzb;->zza(Ljava/lang/Object;J)B
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->getByte(Ljava/lang/Object;J)B

#10: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getDouble(Ljava/lang/Object;J)D use(s):
       Lcom/google/android/gms/internal/measurement/zzkt$zzb;->zzd(Ljava/lang/Object;J)D
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->getDouble(Ljava/lang/Object;J)D

#11: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getFloat(Ljava/lang/Object;J)F use(s):
       Lcom/google/android/gms/internal/measurement/zzkt$zzb;->zzc(Ljava/lang/Object;J)F
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->getFloat(Ljava/lang/Object;J)F

#12: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getInt(J)I use(s):
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->getInt(J)I

#13: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getInt(Ljava/lang/Object;J)I use(s):
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIIIIIIJILcom/google/android/gms/internal/measurement/zzgl;)I (2 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIILcom/google/android/gms/internal/measurement/zzgl;)I
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIILcom/google/android/gms/internal/measurement/zzgl;)V
       Lcom/google/android/gms/internal/measurement/zzjk;->zzb(Ljava/lang/Object;)I (5 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zzb(Ljava/lang/Object;Lcom/google/android/gms/internal/measurement/zzlk;)V (7 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zzd(Ljava/lang/Object;)Z
       Lcom/google/android/gms/internal/measurement/zzkt$zzd;->zze(Ljava/lang/Object;J)I
       Lcom/google/protobuf/MessageSchema;->getSerializedSizeProto2(Ljava/lang/Object;)I (5 occurrences)
       Lcom/google/protobuf/MessageSchema;->isInitialized(Ljava/lang/Object;)Z
       Lcom/google/protobuf/MessageSchema;->parseOneofField(Ljava/lang/Object;[BIIIIIIIJILcom/google/protobuf/ArrayDecoders$Registers;)I (2 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseProto2Message(Ljava/lang/Object;[BIIILcom/google/protobuf/ArrayDecoders$Registers;)I
       Lcom/google/protobuf/MessageSchema;->writeFieldsInAscendingOrderProto2(Ljava/lang/Object;Lcom/google/protobuf/Writer;)V (7 occurrences)
       Lcom/google/protobuf/UnsafeUtil$MemoryAccessor;->getInt(Ljava/lang/Object;J)I

#14: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getLong(J)J use(s):
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->getLong(J)J

#15: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getLong(Ljava/lang/Object;J)J use(s):
       Lcom/google/android/gms/internal/measurement/zzjk;->zzb(Ljava/lang/Object;)I (3 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zzb(Ljava/lang/Object;Lcom/google/android/gms/internal/measurement/zzlk;)V (5 occurrences)
       Lcom/google/android/gms/internal/measurement/zzkt$zzd;->zzf(Ljava/lang/Object;J)J
       Lcom/google/common/hash/LittleEndianByteArray$UnsafeByteArray$1;->getLongLittleEndian([BI)J
       Lcom/google/common/hash/LittleEndianByteArray$UnsafeByteArray$2;->getLongLittleEndian([BI)J
       Lcom/google/common/primitives/UnsignedBytes$LexicographicalComparatorHolder$UnsafeComparator;->compare([B[B)I (2 occurrences)
       Lcom/google/protobuf/MessageSchema;->getSerializedSizeProto2(Ljava/lang/Object;)I (3 occurrences)
       Lcom/google/protobuf/MessageSchema;->writeFieldsInAscendingOrderProto2(Ljava/lang/Object;Lcom/google/protobuf/Writer;)V (5 occurrences)
       Lcom/google/protobuf/UnsafeUtil$MemoryAccessor;->getLong(Ljava/lang/Object;J)J

#16: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; use(s):
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIIIIIIJILcom/google/android/gms/internal/measurement/zzgl;)I (2 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIIIIIJIJLcom/google/android/gms/internal/measurement/zzgl;)I
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIIJLcom/google/android/gms/internal/measurement/zzgl;)I
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIILcom/google/android/gms/internal/measurement/zzgl;)I (3 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIILcom/google/android/gms/internal/measurement/zzgl;)V (2 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zzb(Ljava/lang/Object;)I (55 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zzb(Ljava/lang/Object;Lcom/google/android/gms/internal/measurement/zzlk;)V (41 occurrences)
       Lcom/google/android/gms/internal/measurement/zzkt;->zzf(Ljava/lang/Object;J)Ljava/lang/Object;
       Lcom/google/protobuf/MessageSchema;->getSerializedSizeProto2(Ljava/lang/Object;)I (41 occurrences)
       Lcom/google/protobuf/MessageSchema;->getSerializedSizeProto3(Ljava/lang/Object;)I (14 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseMapField(Ljava/lang/Object;[BIIIJLcom/google/protobuf/ArrayDecoders$Registers;)I
       Lcom/google/protobuf/MessageSchema;->parseOneofField(Ljava/lang/Object;[BIIIIIIIJILcom/google/protobuf/ArrayDecoders$Registers;)I (2 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseProto2Message(Ljava/lang/Object;[BIIILcom/google/protobuf/ArrayDecoders$Registers;)I (3 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseProto3Message(Ljava/lang/Object;[BIILcom/google/protobuf/ArrayDecoders$Registers;)I (2 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseRepeatedField(Ljava/lang/Object;[BIIIIIIJIJLcom/google/protobuf/ArrayDecoders$Registers;)I
       Lcom/google/protobuf/MessageSchema;->writeFieldsInAscendingOrderProto2(Ljava/lang/Object;Lcom/google/protobuf/Writer;)V (41 occurrences)
       Lcom/google/protobuf/UnsafeUtil$MemoryAccessor;->getObject(Ljava/lang/Object;J)Ljava/lang/Object;

#17: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getUnsafe()Lsun/misc/Unsafe; use(s):
       Lcom/google/common/cache/Striped64;->getUnsafe()Lsun/misc/Unsafe;
       Lcom/google/common/hash/LittleEndianByteArray$UnsafeByteArray;->getUnsafe()Lsun/misc/Unsafe;
       Lcom/google/common/hash/Striped64;->getUnsafe()Lsun/misc/Unsafe;
       Lcom/google/common/primitives/UnsignedBytes$LexicographicalComparatorHolder$UnsafeComparator;->getUnsafe()Lsun/misc/Unsafe;
       Lcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper;-><clinit>()V

#18: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->objectFieldOffset(Ljava/lang/reflect/Field;)J use(s):
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Class;Lcom/google/android/gms/internal/measurement/zzje;Lcom/google/android/gms/internal/measurement/zzjo;Lcom/google/android/gms/internal/measurement/zziq;Lcom/google/android/gms/internal/measurement/zzkn;Lcom/google/android/gms/internal/measurement/zzhk;Lcom/google/android/gms/internal/measurement/zziz;)Lcom/google/android/gms/internal/measurement/zzjk; (4 occurrences)
       Lcom/google/android/gms/internal/measurement/zzkt;-><clinit>()V
       Lcom/google/common/cache/Striped64$Cell;-><clinit>()V
       Lcom/google/common/cache/Striped64;-><clinit>()V (2 occurrences)
       Lcom/google/common/hash/Striped64$Cell;-><clinit>()V
       Lcom/google/common/hash/Striped64;-><clinit>()V (2 occurrences)
       Lcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper;-><clinit>()V (5 occurrences)
       Lcom/google/protobuf/MessageSchema;->newSchemaForRawMessageInfo(Lcom/google/protobuf/RawMessageInfo;Lcom/google/protobuf/NewInstanceSchema;Lcom/google/protobuf/ListFieldSchema;Lcom/google/protobuf/UnknownFieldSchema;Lcom/google/protobuf/ExtensionSchema;Lcom/google/protobuf/MapFieldSchema;)Lcom/google/protobuf/MessageSchema; (4 occurrences)
       Lcom/google/protobuf/UnsafeUtil$MemoryAccessor;->objectFieldOffset(Ljava/lang/reflect/Field;)J

#19: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putBoolean(Ljava/lang/Object;JZ)V use(s):
       Lcom/google/android/gms/internal/measurement/zzkt$zzb;->zza(Ljava/lang/Object;JZ)V
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->putBoolean(Ljava/lang/Object;JZ)V

#20: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putByte(JB)V use(s):
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->putByte(JB)V

#21: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putByte(Ljava/lang/Object;JB)V use(s):
       Lcom/google/android/gms/internal/measurement/zzkt$zzb;->zza(Ljava/lang/Object;JB)V
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->putByte(Ljava/lang/Object;JB)V

#22: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putDouble(Ljava/lang/Object;JD)V use(s):
       Lcom/google/android/gms/internal/measurement/zzkt$zzb;->zza(Ljava/lang/Object;JD)V
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->putDouble(Ljava/lang/Object;JD)V

#23: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putFloat(Ljava/lang/Object;JF)V use(s):
       Lcom/google/android/gms/internal/measurement/zzkt$zzb;->zza(Ljava/lang/Object;JF)V
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->putFloat(Ljava/lang/Object;JF)V

#24: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putInt(JI)V use(s):
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->putInt(JI)V

#25: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putInt(Ljava/lang/Object;JI)V use(s):
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIIIIIIJILcom/google/android/gms/internal/measurement/zzgl;)I (3 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIILcom/google/android/gms/internal/measurement/zzgl;)I (6 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIILcom/google/android/gms/internal/measurement/zzgl;)V (6 occurrences)
       Lcom/google/android/gms/internal/measurement/zzkt$zzd;->zza(Ljava/lang/Object;JI)V
       Lcom/google/protobuf/MessageSchema;->getSerializedSizeProto2(Ljava/lang/Object;)I (14 occurrences)
       Lcom/google/protobuf/MessageSchema;->getSerializedSizeProto3(Ljava/lang/Object;)I (14 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseOneofField(Ljava/lang/Object;[BIIIIIIIJILcom/google/protobuf/ArrayDecoders$Registers;)I (14 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseProto2Message(Ljava/lang/Object;[BIIILcom/google/protobuf/ArrayDecoders$Registers;)I (6 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseProto3Message(Ljava/lang/Object;[BIILcom/google/protobuf/ArrayDecoders$Registers;)I (4 occurrences)
       Lcom/google/protobuf/UnsafeUtil$MemoryAccessor;->putInt(Ljava/lang/Object;JI)V

#26: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putLong(JJ)V use(s):
       Lcom/google/protobuf/UnsafeUtil$JvmMemoryAccessor;->putLong(JJ)V

#27: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putLong(Ljava/lang/Object;JJ)V use(s):
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIILcom/google/android/gms/internal/measurement/zzgl;)I (3 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIILcom/google/android/gms/internal/measurement/zzgl;)V (3 occurrences)
       Lcom/google/android/gms/internal/measurement/zzkt$zzd;->zza(Ljava/lang/Object;JJ)V
       Lcom/google/common/hash/LittleEndianByteArray$UnsafeByteArray$1;->putLongLittleEndian([BIJ)V
       Lcom/google/common/hash/LittleEndianByteArray$UnsafeByteArray$2;->putLongLittleEndian([BIJ)V
       Lcom/google/protobuf/MessageSchema;->parseProto2Message(Ljava/lang/Object;[BIIILcom/google/protobuf/ArrayDecoders$Registers;)I (3 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseProto3Message(Ljava/lang/Object;[BIILcom/google/protobuf/ArrayDecoders$Registers;)I (3 occurrences)
       Lcom/google/protobuf/UnsafeUtil$MemoryAccessor;->putLong(Ljava/lang/Object;JJ)V

#28: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V use(s):
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIIIIIIJILcom/google/android/gms/internal/measurement/zzgl;)I (17 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIIIIIJIJLcom/google/android/gms/internal/measurement/zzgl;)I
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIIJLcom/google/android/gms/internal/measurement/zzgl;)I
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIIILcom/google/android/gms/internal/measurement/zzgl;)I (7 occurrences)
       Lcom/google/android/gms/internal/measurement/zzjk;->zza(Ljava/lang/Object;[BIILcom/google/android/gms/internal/measurement/zzgl;)V (5 occurrences)
       Lcom/google/android/gms/internal/measurement/zzkt;->zza(Ljava/lang/Object;JLjava/lang/Object;)V
       Lcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper;->putNext(Lcom/google/common/util/concurrent/AbstractFuture$Waiter;Lcom/google/common/util/concurrent/AbstractFuture$Waiter;)V
       Lcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper;->putThread(Lcom/google/common/util/concurrent/AbstractFuture$Waiter;Ljava/lang/Thread;)V
       Lcom/google/protobuf/MessageSchema;->parseMapField(Ljava/lang/Object;[BIIIJLcom/google/protobuf/ArrayDecoders$Registers;)I
       Lcom/google/protobuf/MessageSchema;->parseOneofField(Ljava/lang/Object;[BIIIIIIIJILcom/google/protobuf/ArrayDecoders$Registers;)I (17 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseProto2Message(Ljava/lang/Object;[BIIILcom/google/protobuf/ArrayDecoders$Registers;)I (7 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseProto3Message(Ljava/lang/Object;[BIILcom/google/protobuf/ArrayDecoders$Registers;)I (5 occurrences)
       Lcom/google/protobuf/MessageSchema;->parseRepeatedField(Ljava/lang/Object;[BIIIIIIJIJLcom/google/protobuf/ArrayDecoders$Registers;)I
       Lcom/google/protobuf/UnsafeUtil$MemoryAccessor;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V

#29: Reflection max-target-p Landroid/animation/LayoutTransition;->cancel use(s):
       Landroidx/transition/ViewGroupUtilsApi14;->cancelLayoutTransition(Landroid/animation/LayoutTransition;)V

#30: Reflection unsupported Landroid/app/Activity;->mMainThread use(s):
       Landroidx/core/app/ActivityRecreator;->getMainThreadField()Ljava/lang/reflect/Field;

#31: Reflection unsupported Landroid/app/Activity;->mToken use(s):
       Landroidx/core/app/ActivityRecreator;->getTokenField()Ljava/lang/reflect/Field;

#32: Reflection unsupported Landroid/app/Dialog;->mOnKeyListener use(s):
       Landroidx/core/view/KeyEventDispatcher;->getDialogKeyListenerPre28(Landroid/app/Dialog;)Landroid/content/DialogInterface$OnKeyListener;

#33: Reflection blocked Landroid/content/res/Resources$Theme;->rebase use(s):
       Landroidx/core/content/res/ResourcesCompat$ThemeCompat$ImplApi23;->rebase(Landroid/content/res/Resources$Theme;)V

#34: Reflection unsupported Landroid/content/res/Resources;->mResourcesImpl use(s):
       Landroidx/appcompat/app/ResourcesFlusher;->flushNougats(Landroid/content/res/Resources;)V

#35: Reflection unsupported Landroid/graphics/Canvas;->MATRIX_SAVE_FLAG use(s):
       Lcom/caverock/androidsvg/androidrendering/CanvasLegacy;-><clinit>()V

#36: Reflection unsupported Landroid/graphics/Typeface;->createFromFamiliesWithDefault use(s):
       Landroidx/core/graphics/TypefaceCompatApi21Impl;->init()V
       Landroidx/core/graphics/TypefaceCompatApi24Impl;-><clinit>()V
       Landroidx/core/graphics/TypefaceCompatApi26Impl;->obtainCreateFromFamiliesWithDefaultMethod(Ljava/lang/Class;)Ljava/lang/reflect/Method;
       Landroidx/core/graphics/TypefaceCompatApi28Impl;->obtainCreateFromFamiliesWithDefaultMethod(Ljava/lang/Class;)Ljava/lang/reflect/Method;

#37: Reflection unsupported Landroid/graphics/Typeface;->native_instance use(s):
       Landroidx/core/graphics/TypefaceCompatBaseImpl;->getUniqueKey(Landroid/graphics/Typeface;)J

#38: Reflection unsupported Landroid/os/Bundle;->getIBinder use(s):
       Landroidx/core/app/BundleCompat$BundleCompatBaseImpl;->getBinder(Landroid/os/Bundle;Ljava/lang/String;)Landroid/os/IBinder;

#39: Reflection unsupported Landroid/os/Bundle;->putIBinder use(s):
       Landroidx/core/app/BundleCompat$BundleCompatBaseImpl;->putBinder(Landroid/os/Bundle;Ljava/lang/String;Landroid/os/IBinder;)V

#40: Reflection unsupported,test-api Landroid/os/WorkSource;->add use(s):
       Lcom/google/android/gms/common/util/WorkSourceUtil;->zzx()Ljava/lang/reflect/Method;
       Lcom/google/android/gms/common/util/WorkSourceUtil;->zzy()Ljava/lang/reflect/Method;

#41: Reflection unsupported Landroid/os/WorkSource;->get use(s):
       Lcom/google/android/gms/common/util/WorkSourceUtil;->zzaa()Ljava/lang/reflect/Method;

#42: Reflection unsupported Landroid/os/WorkSource;->getName use(s):
       Lcom/google/android/gms/common/util/WorkSourceUtil;->zzab()Ljava/lang/reflect/Method;

#43: Reflection unsupported Landroid/view/LayoutInflater;->mFactory2 use(s):
       Landroidx/core/view/LayoutInflaterCompat;->forceSetFactory2(Landroid/view/LayoutInflater;Landroid/view/LayoutInflater$Factory2;)V

#44: Reflection unsupported Landroid/view/View;->computeFitSystemWindows use(s):
       Landroidx/appcompat/widget/ViewUtils;-><clinit>()V

#45: Reflection unsupported Landroid/view/View;->mAccessibilityDelegate use(s):
       Landroidx/core/view/ViewCompat;->getAccessibilityDelegateThroughReflection(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate;

#46: Reflection max-target-p Landroid/view/View;->mViewFlags use(s):
       Landroidx/transition/ViewUtilsBase;->setTransitionVisibility(Landroid/view/View;I)V

#47: Reflection max-target-p Landroid/view/View;->setFrame use(s):
       Landroidx/transition/ViewUtilsBase;->fetchSetFrame()V

#48: Reflection max-target-p Landroid/view/inputmethod/InputMethodManager;->mH use(s):
       Landroidx/activity/ImmLeaksCleaner;->initializeReflectiveFields()V

#49: Reflection unsupported Landroid/widget/AbsListView;->mIsChildViewEnabled use(s):
       Landroidx/appcompat/widget/DropDownListView;-><init>(Landroid/content/Context;Z)V

#50: Reflection max-target-p Landroid/widget/AutoCompleteTextView;->doAfterTextChanged use(s):
       Landroidx/appcompat/widget/SearchView$PreQAutoCompleteTextViewReflector;-><init>()V

#51: Reflection max-target-p Landroid/widget/AutoCompleteTextView;->doBeforeTextChanged use(s):
       Landroidx/appcompat/widget/SearchView$PreQAutoCompleteTextViewReflector;-><init>()V

#52: Reflection max-target-p Landroid/widget/AutoCompleteTextView;->ensureImeVisible use(s):
       Landroidx/appcompat/widget/SearchView$PreQAutoCompleteTextViewReflector;-><init>()V

#53: Reflection max-target-p Landroid/widget/ImageView;->mDrawMatrix use(s):
       Landroidx/transition/ImageViewUtils;->fetchDrawMatrixField()V

#54: Reflection max-target-p Landroid/widget/TextView;->getHorizontallyScrolling use(s):
       Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl;->isHorizontallyScrollable(Landroid/widget/TextView;)Z

#55: Reflection unsupported Landroid/widget/TextView;->getLayoutAlignment use(s):
       Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->suggestedSizeFitsInSpace(ILandroid/graphics/RectF;)Z

#56: Reflection max-target-p Landroid/widget/TextView;->mCursorDrawableRes use(s):
       Lcom/google/android/material/timepicker/TimePickerTextInputPresenter;->setCursorDrawableColor(Landroid/widget/EditText;I)V

#57: Reflection unsupported Landroid/widget/TextView;->mEditor use(s):
       Lcom/google/android/material/timepicker/TimePickerTextInputPresenter;->setCursorDrawableColor(Landroid/widget/EditText;I)V

#58: Reflection unsupported Landroid/widget/TextView;->mIncludePad use(s):
       Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->createStaticLayoutForMeasuringPre16(Ljava/lang/CharSequence;Landroid/text/Layout$Alignment;I)Landroid/text/StaticLayout;

#59: Reflection unsupported Landroid/widget/TextView;->mSpacingAdd use(s):
       Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->createStaticLayoutForMeasuringPre16(Ljava/lang/CharSequence;Landroid/text/Layout$Alignment;I)Landroid/text/StaticLayout;

#60: Reflection unsupported Landroid/widget/TextView;->mSpacingMult use(s):
       Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->createStaticLayoutForMeasuringPre16(Ljava/lang/CharSequence;Landroid/text/Layout$Alignment;I)Landroid/text/StaticLayout;

#61: Reflection unsupported Landroid/widget/TextView;->nullLayouts use(s):
       Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->setRawTextSize(F)V

#62: Reflection unsupported,core-platform-api Ldalvik/system/CloseGuard;->get use(s):
       Lokhttp3/internal/platform/android/CloseGuard$Companion;->get()Lokhttp3/internal/platform/android/CloseGuard;

#63: Reflection unsupported,core-platform-api Ldalvik/system/CloseGuard;->open use(s):
       Lokhttp3/internal/platform/android/CloseGuard$Companion;->get()Lokhttp3/internal/platform/android/CloseGuard;

#64: Reflection unsupported,core-platform-api Ldalvik/system/CloseGuard;->warnIfOpen use(s):
       Lokhttp3/internal/platform/android/CloseGuard$Companion;->get()Lokhttp3/internal/platform/android/CloseGuard;

#65: Reflection unsupported,core-platform-api Ljava/lang/Thread;->getUncaughtExceptionPreHandler use(s):
       Lkotlinx/coroutines/android/AndroidExceptionPreHandler;->preHandler()Ljava/lang/reflect/Method;

#66: Reflection unsupported Ljava/lang/Thread;->inheritableThreadLocals use(s):
       Lcom/google/common/base/internal/Finalizer;->getInheritableThreadLocalsField()Ljava/lang/reflect/Field;

#67: Reflection unsupported Ljava/nio/Buffer;->address use(s):
       Lcom/google/android/gms/internal/measurement/zzkt;->zzf()Ljava/lang/reflect/Field;
       Lcom/google/android/gms/internal/measurement/zzkt;->zzf()Ljava/lang/reflect/Field;
       Lcom/google/protobuf/UnsafeUtil;->bufferAddressField()Ljava/lang/reflect/Field;
       Lcom/google/protobuf/UnsafeUtil;->bufferAddressField()Ljava/lang/reflect/Field;

67 hidden API(s) used: 28 linked against, 39 through reflection
        56 in unsupported
        1 in blocked
        0 in max-target-o
        10 in max-target-p
        0 in max-target-q
        0 in max-target-r
To run an analysis that can give more reflection accesses, 
but could include false positives, pass the --imprecise flag. 
oppia_beta
NOTE: appcompat.sh is still under development. It can report
API uses that do not execute at runtime, and reflection uses
that do not exist. It can also miss on reflection uses.
#1: Linking unsupported Lsun/misc/Unsafe;->allocateInstance(Ljava/lang/Class;)Ljava/lang/Object; use(s):
       Lbq/fe;->a(Ljava/lang/Class;)Ljava/lang/Object;
       Lcz/bP;->a(Ljava/lang/Class;)Ljava/lang/Object;

#2: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->arrayBaseOffset(Ljava/lang/Class;)I use(s):
       Lbq/fe;->b(Ljava/lang/Class;)I
       Lcz/bP;->b(Ljava/lang/Class;)I

#3: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->arrayIndexScale(Ljava/lang/Class;)I use(s):
       Lbq/fe;->c(Ljava/lang/Class;)I
       Lcz/bP;->c(Ljava/lang/Class;)I

#4: Linking unsupported Lsun/misc/Unsafe;->compareAndSwapObject(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z use(s):
       LbP/l;->a(LbP/a;LbP/f;LbP/f;)Z
       LbP/l;->a(LbP/a;LbP/n;LbP/n;)Z
       LbP/l;->a(LbP/a;Ljava/lang/Object;Ljava/lang/Object;)Z

#5: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getBoolean(Ljava/lang/Object;J)Z use(s):
       Lbq/fg;->b(Ljava/lang/Object;J)Z
       Lcz/bT;->b(Ljava/lang/Object;J)Z

#6: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getByte(Ljava/lang/Object;J)B use(s):
       Lbq/fg;->a(Ljava/lang/Object;J)B
       Lcz/bT;->a(Ljava/lang/Object;J)B

#7: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getDouble(Ljava/lang/Object;J)D use(s):
       Lbq/fg;->d(Ljava/lang/Object;J)D
       Lcz/bT;->d(Ljava/lang/Object;J)D

#8: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getFloat(Ljava/lang/Object;J)F use(s):
       Lbq/fg;->c(Ljava/lang/Object;J)F
       Lcz/bT;->c(Ljava/lang/Object;J)F

#9: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getInt(Ljava/lang/Object;J)I use(s):
       Lbq/eu;->a(Ljava/lang/Object;[BIIIIIIIJILbq/cP;)I (2 occurrences)
       Lbq/eu;->a(Ljava/lang/Object;[BIIILbq/cP;)I
       Lbq/eu;->a(Ljava/lang/Object;[BIILbq/cP;)V
       Lbq/eu;->b(Ljava/lang/Object;)I (5 occurrences)
       Lbq/eu;->b(Ljava/lang/Object;Lbq/fy;)V (7 occurrences)
       Lbq/eu;->d(Ljava/lang/Object;)Z
       Lbq/fi;->e(Ljava/lang/Object;J)I
       Lcz/bU;->e(Ljava/lang/Object;J)I
       Lcz/bc;->a(Ljava/lang/Object;[BIIIIIIIJILcz/h;)I (2 occurrences)
       Lcz/bc;->a(Ljava/lang/Object;[BIIILcz/h;)I
       Lcz/bc;->b(Ljava/lang/Object;)I (5 occurrences)
       Lcz/bc;->b(Ljava/lang/Object;Lcz/ci;)V (7 occurrences)
       Lcz/bc;->e(Ljava/lang/Object;)Z

#10: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getLong(Ljava/lang/Object;J)J use(s):
       Lbq/eu;->b(Ljava/lang/Object;)I (3 occurrences)
       Lbq/eu;->b(Ljava/lang/Object;Lbq/fy;)V (5 occurrences)
       Lbq/fi;->f(Ljava/lang/Object;J)J
       Lcz/bU;->f(Ljava/lang/Object;J)J
       Lcz/bc;->b(Ljava/lang/Object;)I (3 occurrences)
       Lcz/bc;->b(Ljava/lang/Object;Lcz/ci;)V (5 occurrences)

#11: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; use(s):
       Lbq/eu;->a(Ljava/lang/Object;[BIIIIIIIJILbq/cP;)I (2 occurrences)
       Lbq/eu;->a(Ljava/lang/Object;[BIIIIIIJIJLbq/cP;)I
       Lbq/eu;->a(Ljava/lang/Object;[BIIILbq/cP;)I (3 occurrences)
       Lbq/eu;->a(Ljava/lang/Object;[BIIJLbq/cP;)I
       Lbq/eu;->a(Ljava/lang/Object;[BIILbq/cP;)V (2 occurrences)
       Lbq/eu;->b(Ljava/lang/Object;)I (55 occurrences)
       Lbq/eu;->b(Ljava/lang/Object;Lbq/fy;)V (41 occurrences)
       Lbq/fe;->f(Ljava/lang/Object;J)Ljava/lang/Object;
       Lcz/bP;->f(Ljava/lang/Object;J)Ljava/lang/Object;
       Lcz/bc;->a(Ljava/lang/Object;[BIIIIIIIJILcz/h;)I (2 occurrences)
       Lcz/bc;->a(Ljava/lang/Object;[BIIIIIIJIJLcz/h;)I
       Lcz/bc;->a(Ljava/lang/Object;[BIIIJLcz/h;)I
       Lcz/bc;->a(Ljava/lang/Object;[BIIILcz/h;)I (3 occurrences)
       Lcz/bc;->a(Ljava/lang/Object;[BIILcz/h;)V (2 occurrences)
       Lcz/bc;->b(Ljava/lang/Object;)I (55 occurrences)
       Lcz/bc;->b(Ljava/lang/Object;Lcz/ci;)V (41 occurrences)

#12: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->getUnsafe()Lsun/misc/Unsafe; use(s):
       LbP/l;-><clinit>()V

#13: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->objectFieldOffset(Ljava/lang/reflect/Field;)J use(s):
       LbP/l;-><clinit>()V (5 occurrences)
       Lbq/eu;->a(Lbq/eo;Lbq/ey;Lbq/dZ;Lbq/eY;Lbq/dq;Lbq/ei;)Lbq/eu; (4 occurrences)
       Lbq/fe;-><clinit>()V
       Lcz/bU;->a(Ljava/lang/reflect/Field;)J
       Lcz/bc;->a(Lcz/aW;Lcz/bf;Lcz/aJ;Lcz/bJ;Lcz/R;Lcz/aT;)Lcz/bc; (4 occurrences)

#14: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putBoolean(Ljava/lang/Object;JZ)V use(s):
       Lbq/fg;->a(Ljava/lang/Object;JZ)V
       Lcz/bT;->a(Ljava/lang/Object;JZ)V

#15: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putByte(Ljava/lang/Object;JB)V use(s):
       Lbq/fg;->a(Ljava/lang/Object;JB)V
       Lcz/bT;->a(Ljava/lang/Object;JB)V

#16: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putDouble(Ljava/lang/Object;JD)V use(s):
       Lbq/fg;->a(Ljava/lang/Object;JD)V
       Lcz/bT;->a(Ljava/lang/Object;JD)V

#17: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putFloat(Ljava/lang/Object;JF)V use(s):
       Lbq/fg;->a(Ljava/lang/Object;JF)V
       Lcz/bT;->a(Ljava/lang/Object;JF)V

#18: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putInt(Ljava/lang/Object;JI)V use(s):
       Lbq/eu;->a(Ljava/lang/Object;[BIIIIIIIJILbq/cP;)I (3 occurrences)
       Lbq/eu;->a(Ljava/lang/Object;[BIIILbq/cP;)I (6 occurrences)
       Lbq/eu;->a(Ljava/lang/Object;[BIILbq/cP;)V (6 occurrences)
       Lbq/fi;->a(Ljava/lang/Object;JI)V
       Lcz/bU;->a(Ljava/lang/Object;JI)V
       Lcz/bc;->a(Ljava/lang/Object;[BIIIIIIIJILcz/h;)I (3 occurrences)
       Lcz/bc;->a(Ljava/lang/Object;[BIIILcz/h;)I (6 occurrences)
       Lcz/bc;->a(Ljava/lang/Object;[BIILcz/h;)V (4 occurrences)
       Lcz/bc;->b(Ljava/lang/Object;)I (28 occurrences)

#19: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putLong(Ljava/lang/Object;JJ)V use(s):
       Lbq/eu;->a(Ljava/lang/Object;[BIIILbq/cP;)I (3 occurrences)
       Lbq/eu;->a(Ljava/lang/Object;[BIILbq/cP;)V (3 occurrences)
       Lbq/fi;->a(Ljava/lang/Object;JJ)V
       Lcz/bU;->a(Ljava/lang/Object;JJ)V
       Lcz/bc;->a(Ljava/lang/Object;[BIIILcz/h;)I (3 occurrences)
       Lcz/bc;->a(Ljava/lang/Object;[BIILcz/h;)V (3 occurrences)

#20: Linking unsupported,core-platform-api Lsun/misc/Unsafe;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V use(s):
       LbP/l;->a(LbP/n;LbP/n;)V
       LbP/l;->a(LbP/n;Ljava/lang/Thread;)V
       Lbq/eu;->a(Ljava/lang/Object;[BIIIIIIIJILbq/cP;)I (17 occurrences)
       Lbq/eu;->a(Ljava/lang/Object;[BIIIIIIJIJLbq/cP;)I
       Lbq/eu;->a(Ljava/lang/Object;[BIIILbq/cP;)I (7 occurrences)
       Lbq/eu;->a(Ljava/lang/Object;[BIIJLbq/cP;)I
       Lbq/eu;->a(Ljava/lang/Object;[BIILbq/cP;)V (5 occurrences)
       Lbq/fe;->a(Ljava/lang/Object;JLjava/lang/Object;)V
       Lcz/bP;->a(Ljava/lang/Object;JLjava/lang/Object;)V
       Lcz/bc;->a(Ljava/lang/Object;[BIIIIIIIJILcz/h;)I (17 occurrences)
       Lcz/bc;->a(Ljava/lang/Object;[BIIIIIIJIJLcz/h;)I
       Lcz/bc;->a(Ljava/lang/Object;[BIIIJLcz/h;)I
       Lcz/bc;->a(Ljava/lang/Object;[BIIILcz/h;)I (7 occurrences)
       Lcz/bc;->a(Ljava/lang/Object;[BIILcz/h;)V (5 occurrences)

#21: Reflection max-target-p Landroid/animation/LayoutTransition;->cancel use(s):
       Landroidx/transition/ab;->a(Landroid/view/ViewGroup;Z)V
       Landroidx/transition/ab;->a(Landroid/view/ViewGroup;Z)V

#22: Reflection unsupported Landroid/app/Activity;->mMainThread use(s):
       Landroidx/core/app/c;->b()Ljava/lang/reflect/Field;

#23: Reflection unsupported Landroid/app/Activity;->mToken use(s):
       Landroidx/core/app/c;->c()Ljava/lang/reflect/Field;

#24: Reflection unsupported Landroid/app/Dialog;->mOnKeyListener use(s):
       LC/m;->a(Landroid/app/Dialog;)Landroid/content/DialogInterface$OnKeyListener;

#25: Reflection blocked Landroid/content/res/Resources$Theme;->rebase use(s):
       Ls/p;->a(Landroid/content/res/Resources$Theme;)V

#26: Reflection unsupported Landroid/graphics/Canvas;->MATRIX_SAVE_FLAG use(s):
       LaI/a;-><clinit>()V

#27: Reflection max-target-q Landroid/graphics/FontFamily;->abortCreation use(s):
       Lt/i;-><init>()V

#28: Reflection max-target-q Landroid/graphics/FontFamily;->addFontFromAssetManager use(s):
       Lt/i;-><init>()V

#29: Reflection max-target-q Landroid/graphics/FontFamily;->addFontFromBuffer use(s):
       Lt/i;-><init>()V

#30: Reflection max-target-q Landroid/graphics/FontFamily;->freeze use(s):
       Lt/i;-><init>()V

#31: Reflection unsupported Landroid/graphics/Typeface;->createFromFamiliesWithDefault use(s):
       Lt/g;->a()V
       Lt/h;-><clinit>()V
       Lt/i;->a(Ljava/lang/Class;)Ljava/lang/reflect/Method;
       Lt/j;->a(Ljava/lang/Class;)Ljava/lang/reflect/Method;

#32: Reflection unsupported Landroid/graphics/Typeface;->native_instance use(s):
       Lt/l;->b(Landroid/graphics/Typeface;)J

#33: Reflection unsupported,test-api Landroid/os/WorkSource;->add use(s):
       Lbi/o;->a()Ljava/lang/reflect/Method;
       Lbi/o;->b()Ljava/lang/reflect/Method;

#34: Reflection unsupported Landroid/os/WorkSource;->get use(s):
       Lbi/o;->d()Ljava/lang/reflect/Method;

#35: Reflection unsupported Landroid/os/WorkSource;->getName use(s):
       Lbi/o;->e()Ljava/lang/reflect/Method;

#36: Reflection unsupported Landroid/view/LayoutInflater;->mFactory2 use(s):
       LC/o;->b(Landroid/view/LayoutInflater;Landroid/view/LayoutInflater$Factory2;)V

#37: Reflection unsupported Landroid/view/View;->computeFitSystemWindows use(s):
       Landroidx/appcompat/widget/bI;-><clinit>()V

#38: Reflection unsupported Landroid/view/View;->mAccessibilityDelegate use(s):
       LC/C;->N(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate;

#39: Reflection max-target-p Landroid/view/View;->mViewFlags use(s):
       Landroidx/transition/an;->a(Landroid/view/View;I)V

#40: Reflection max-target-p Landroid/view/View;->setFrame use(s):
       Landroidx/transition/an;->a(Landroid/view/View;IIII)V

#41: Reflection max-target-p Landroid/view/inputmethod/InputMethodManager;->mH use(s):
       Landroidx/activity/ImmLeaksCleaner;->a(Landroidx/lifecycle/q;Landroidx/lifecycle/k;)V

#42: Reflection unsupported Landroid/widget/AbsListView;->mIsChildViewEnabled use(s):
       Landroidx/appcompat/widget/DropDownListView;-><init>(Landroid/content/Context;Z)V

#43: Reflection max-target-p Landroid/widget/AutoCompleteTextView;->doAfterTextChanged use(s):
       Landroidx/appcompat/widget/bd;-><init>()V

#44: Reflection max-target-p Landroid/widget/AutoCompleteTextView;->doBeforeTextChanged use(s):
       Landroidx/appcompat/widget/bd;-><init>()V

#45: Reflection max-target-p Landroid/widget/AutoCompleteTextView;->ensureImeVisible use(s):
       Landroidx/appcompat/widget/bd;-><init>()V

#46: Reflection max-target-p Landroid/widget/TextView;->getHorizontallyScrolling use(s):
       Landroidx/appcompat/widget/ag;->a(Landroid/widget/TextView;)Z

#47: Reflection unsupported Landroid/widget/TextView;->getLayoutAlignment use(s):
       Landroidx/appcompat/widget/af;->f()V

#48: Reflection unsupported Landroid/widget/TextView;->nullLayouts use(s):
       Landroidx/appcompat/widget/af;->a(IF)V

#49: Reflection unsupported,core-platform-api Ldalvik/system/CloseGuard;->get use(s):
       LeT/l;->a()LeT/k;

#50: Reflection unsupported,core-platform-api Ldalvik/system/CloseGuard;->open use(s):
       LeT/l;->a()LeT/k;

#51: Reflection unsupported,core-platform-api Ldalvik/system/CloseGuard;->warnIfOpen use(s):
       LeT/l;->a()LeT/k;

#52: Reflection unsupported Ljava/nio/Buffer;->address use(s):
       Lbq/fe;->f()Ljava/lang/reflect/Field;
       Lbq/fe;->f()Ljava/lang/reflect/Field;
       Lcz/bP;->f()Ljava/lang/reflect/Field;
       Lcz/bP;->f()Ljava/lang/reflect/Field;

52 hidden API(s) used: 20 linked against, 32 through reflection
        39 in unsupported
        1 in blocked
        0 in max-target-o
        8 in max-target-p
        4 in max-target-q
        0 in max-target-r
To run an analysis that can give more reflection accesses, 
but could include false positives, pass the --imprecise flag. 

Quick glance shows that:

  • We do have problematic references.
  • Much of the problematic references are kept even after Proguard optimizing.
  • At least one is in the prevent list (which should, theoretically, prevent us from shipping the release though we'd need to try in order to be sure).

Will follow up with a more detailed analysis.

@BenHenning
Copy link
Sponsor Member Author

The offending APIs (per the non-Proguarded build):

  • AndroidX (activity, appcompat, core -- this is the one that has the blocked API access, transition
  • androidsvg
  • GMS (Google Play Services)
  • Material
  • Guava
  • Protobuf
  • Kotlinx coroutines
  • OkHttp

I think we operate without making changes and see if the Play Console lets us launch the current app version. Some of these dependencies may not have fixed their illegal references, and generally updating dependencies is difficult right now in the codebase.

@BenHenning
Copy link
Sponsor Member Author

NB: verifying this means confirming that we can successfully upload and deploy a binary of the app on Play Store via the Play Console (ie that none of the potentially offensive APIs above actually block the release).

BenHenning added a commit that referenced this issue Nov 29, 2023
## Explanation
Fixes #5137
Partially mitigates #5233

This updates all build & target SDKs for Gradle & Bazel builds to now
target SDK 33, per the new Play Store mandate (see
https://support.google.com/googleplay/android-developer/answer/11926878?hl=en).
The analysis of SDK 33 features, potential issues, and potential
mitigations are described in #5137. It was determined that there are no
obvious code changes needed beyond the minimum to target SDK 33. We'll
be relying on some platform-level regression testing plus the Play
Console's pre-submit app analysis report for finalizing the go/no-go
decision for SDK 33 support.

Testing consisted of manually playing through the app and seeing if
there were any issues using emulators both with SDK 33 and lower
versions. #5137 documents the issues found and their ultimate causes.
Since no functionality changes were needed for SDK 33, no tests needed
updating. Separately, tests are still running on SDK 30 due to being
stuck (see #4748).

One issue unrelated to SDK 33 was observed: when playing through the
prototype lesson, I once again brought the app into a broken state
wherein I couldn't leave the lesson via navigation. We've hit this issue
a few times, but still don't know the root cause. #5233 was filed and a
mitigation was introduced in this PR (+ a test for it): if the
exploration player observes a failure when trying to stop the player
session (for whatever reason), it still proceeds with its "end of
activity" flow (e.g. finishing the activity). This provides at least an
escape hatch for users who somehow hit this state. Note that this isn't
a proper fix for #5233 given the lack of a known root cause, so this is
only considered a mitigation.

The new test was verified as failing if the mitigation is omitted:


![image](https://github.com/oppia/oppia-android/assets/12983742/10ddbf85-332c-4469-8efa-483a967170f9)

Note that ``ExplorationActivityTest``'s setup was tweaked to change the
parent screen since this affects back navigation routing. I opted to
using lessons tab as the parent screen since it's the most common route
for users to hit, so it makes sense for our tests to default to that if
they don't specifically need to use a different route (and none of the
existing tests seemed to have an issue with this change).

## Essential Checklist
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
#bugnum: ...".)
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

## For UI-specific PRs only
N/A -- This isn't changing any UIs directly, and per the analysis in
#5137 it doesn't seem that there are any relevant new UIs enabled in SDK
33 that would affect Oppia.
adhiamboperes added a commit that referenced this issue Jan 11, 2024
Refactor firebase auth wrapper

Refactor dagger bindings for firestore dependencies

Ensure firestore logs show in dev event logs view.

Removed redundant bindings.

Localisation updates from https://translatewiki.net. (#5209)

Translation updates

Fixes #4708: Don't submit answer if it's invalid according to the input (#5205)

Fixes #4708: Don't submit answer if it's invalid according to the input
or else after submitting the recycler view will not restore items on
configuration change. See #4708 for more details

Video demo:

[before](https://drive.google.com/file/d/1bLgo-AYro0UbffR6X8nWo8Xv7oUuNJFa/view?usp=sharing)

[after](https://drive.google.com/file/d/1Oek7j6dgjJmgasyyd9FHtQo4E7zTvEBd/view?usp=sharing)

Continuation of PR #5202 since that one's no longer viable due to being
force pushed in a repo sync through GitHub UI.

- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [ ] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

If your PR includes UI-related changes, then:
- Add screenshots for portrait/landscape for both a tablet & phone of
the before & after UI changes
- For the screenshots above, include both English and pseudo-localized
(RTL) screenshots (see [RTL
guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines))
- Add a video showing the full UX flow with a screen reader enabled (see
[accessibility
guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide))
- For PRs introducing new UI elements or color changes, both light and
dark mode screenshots must be included
- Add a screenshot demonstrating that you ran affected Espresso tests
locally & that they're passing

Change unrelated to concerns like dark mode, RTL, accessibility. PR
demonstration of tests passing.

---------

Co-authored-by: Long Wei <longwei@google.com>
Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com>

Fix part of #5195: using viewLifecycleOwner (#5207)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
It is not a good idea to use a fragment as a lifecycle owner when
subscribing to liveData objects. It would be correct to use
viewLifecycleOwner.

Lint report before:
<img
src="https://github.com/oppia/oppia-android/assets/71126152/ad482fd4-d3b0-46c7-b7de-febe7a48c07b"
width="70%" height="70%" />

Lint report after
<img
src="https://github.com/oppia/oppia-android/assets/71126152/fe7a26cf-1fcd-4cd5-ae3a-3cb7dcf2659c"
width="70%" height="70%" />

<!--
- Explain what your PR does. If this PR fixes an existing bug, please
include
- "Fixes #bugnum:" in the explanation so that GitHub can auto-close the
issue
  - when this PR is merged.
  -->

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

<!-- Delete these section if this PR does not include UI-related
changes. -->
If your PR includes UI-related changes, then:
- Add screenshots for portrait/landscape for both a tablet & phone of
the before & after UI changes
- For the screenshots above, include both English and pseudo-localized
(RTL) screenshots (see [RTL
guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines))
- Add a video showing the full UX flow with a screen reader enabled (see
[accessibility
guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide))
- For PRs introducing new UI elements or color changes, both light and
dark mode screenshots must be included
- Add a screenshot demonstrating that you ran affected Espresso tests
locally & that they're passing

Fix #5032 Images in Arabic (RTL) lessons are right-aligned rather than center-aligned. (#5212)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
Fixes #5032, To make the image center-aligned, we are adding styling to
the HTML content image and removing the left margin by setting
drawableLeft bound to 0 in RTL.
<!--
- Explain what your PR does. If this PR fixes an existing bug, please
include
- "Fixes #bugnum:" in the explanation so that GitHub can auto-close the
issue
  - when this PR is merged.
  -->

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [ ] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

LTR Potrait

![beforeLTRpotrait](https://github.com/oppia/oppia-android/assets/76042077/298fc2c0-7512-40dc-8d56-444fe55f4998)

LTR Landscape

![LTRlandscape](https://github.com/oppia/oppia-android/assets/76042077/94e16ccb-052c-4723-b26e-00fa0591270d)

RTL Potrait

![beforeRTLpotrait](https://github.com/oppia/oppia-android/assets/76042077/59efc1c5-c695-442a-9549-8aa353d61aed)

RTL Landscape

![RTLlandscape](https://github.com/oppia/oppia-android/assets/76042077/dae3c7b8-ce4e-4968-8dea-c4bc23eaf75f)

RTL Potrait

![Potrait_after](https://github.com/oppia/oppia-android/assets/76042077/d5115f63-f71c-44fa-bb60-639e8f8abcef)

RTL Landscape

![landscapeafter](https://github.com/oppia/oppia-android/assets/76042077/9a37d6d1-dc80-489e-827c-8b208fa33d67)

LTR Potrait

![LTRpotraitafter](https://github.com/oppia/oppia-android/assets/76042077/4d51cf7c-68eb-4924-aaaa-64cb44391081)

LTR Landscape

![LTRLandscape](https://github.com/oppia/oppia-android/assets/76042077/802dcd37-5adb-4f5d-8a30-cfa110d76885)

<!-- Delete these section if this PR does not include UI-related
changes. -->
If your PR includes UI-related changes, then:
- Add screenshots for portrait/landscape for both a tablet & phone of
the before & after UI changes
- For the screenshots above, include both English and pseudo-localized
(RTL) screenshots (see [RTL
guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines))
- Add a video showing the full UX flow with a screen reader enabled (see
[accessibility
guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide))
- For PRs introducing new UI elements or color changes, both light and
dark mode screenshots must be included
- Add a screenshot demonstrating that you ran affected Espresso tests
locally & that they're passing

fix: Fix Translate Wiki Issues with Splash Activity Screen Strings (#5219)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
<!--
- Explain what your PR does. If this PR fixes an existing bug, please
include
- "Fixes #bugnum:" in the explanation so that GitHub can auto-close the
issue
  - when this PR is merged.
  -->
When merged, this PR will:
- Remove white spaces and new lines that were added to Splash Activity
Screen strings by the [App/OS Deprecation Milestone 3
PR](#5096). This will allow
TranslateWiki to translate them. See related [comment on the
PR](d471d79#r130759117).

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

<!-- Delete these section if this PR does not include UI-related
changes. -->
If your PR includes UI-related changes, then:
- Add screenshots for portrait/landscape for both a tablet & phone of
the before & after UI changes
- For the screenshots above, include both English and pseudo-localized
(RTL) screenshots (see [RTL
guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines))
- Add a video showing the full UX flow with a screen reader enabled (see
[accessibility
guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide))
- For PRs introducing new UI elements or color changes, both light and
dark mode screenshots must be included
- Add a screenshot demonstrating that you ran affected Espresso tests
locally & that they're passing

Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com>

Fix #5214, Fix Part of #1723 : Fix onboarding issue faced by new contributors (#5210)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
Fix #5214 : Wiki link not redirect to correct destination (
good-first-issue link)
Fix Part of #1723 : Fix onboarding issue faced by new contributors.

1. Tell contributors firmly to use "Android Studio Bumblebee | 2021.1.1
Patch 3."
2. In the wiki, make sure to mention that you need to have JDK 11 to use
oppia-android.
3. Concentrate on using robolectric instead of espresso and provide
clear instructions for setting up tests.

<!--
- Explain what your PR does. If this PR fixes an existing bug, please
include
- "Fixes #bugnum:" in the explanation so that GitHub can auto-close the
issue
  - when this PR is merged.
  -->

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [ ] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

Fix #5204 - Inconsistent Layout Lint Warning (#5218)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
<!--
- Explain what your PR does. If this PR fixes an existing bug, please
include
- "Fixes #bugnum:" in the explanation so that GitHub can auto-close the
issue
  - when this PR is merged.
  -->
Fix #5204 - [Part of #5169]

To address the lint warnings, two potential solutions were considered.
1. Initially, there was an option to include the missing IDs, ensuring
consistency across different layout configurations
[[**Link**](Rd4dev@f8977e6)].
However, it was observed that implementing this solution led to
functional disruptions within the current working application, as
confirmed through comprehensive testing procedures (refer to the
attached assets for a detailed overview).

https://github.com/oppia/oppia-android/assets/122200035/82172eaf-a555-4e76-b1ae-8f0db7ddb924

2. The second option was to suppress the lint warnings for the specific
views in the layout-sw600dp configuration files
[[**Link**](Rd4dev@a0f5b1e)]
to maintain the seamless functionality of the application . This was
achieved by incorporating the attribute
**`tools:ignore="InconsistentLayout"`** for relevant views, without
impacting the current operational stability of the application.

https://github.com/oppia/oppia-android/assets/122200035/93a65422-3526-4d76-873f-c08d24abc3ee

Taking the necessary action, I proceeded to implement the suppression of
lint warnings by submitting a pull request.

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [ ] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

<!-- Delete these section if this PR does not include UI-related
changes. -->
If your PR includes UI-related changes, then:
- Add screenshots for portrait/landscape for both a tablet & phone of
the before & after UI changes
- For the screenshots above, include both English and pseudo-localized
(RTL) screenshots (see [RTL
guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines))
- Add a video showing the full UX flow with a screen reader enabled (see
[accessibility
guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide))
- For PRs introducing new UI elements or color changes, both light and
dark mode screenshots must be included
- Add a screenshot demonstrating that you ran affected Espresso tests
locally & that they're passing

Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com>

Fix #5112: Rendering Inline SVGs (#5208)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
Fixes #5112

We discovered that `mathImg_` dimesions are in **ex**, and not **px**,
and this unit is not natively rendered on android.

This PR introduces a method that will convert ex to px and use the
resulting dimesions to compute the rendering size of a math image to be
rendered inline. The formula is based on the [androidSvg
library](https://github.com/oppia/androidsvg/blob/5bc9c7553e94c3476e8ea32baea3c77567228fcd/androidsvg/src/main/java/com/caverock/androidsvg/androidrendering/SVGAndroidRenderer.java#L5018)
that is also based on CSS3 specs.

To preserve the size computation of block SVGs, we have created a
seperate method that handles the calculation of rendering dimensions for
inline SVGs.

We have only tested these changes through visual observation, and
confirming that the images scale correctly when reading text size is
changed.

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

|Before|After|
|--|--|

|![IMG_0705](https://github.com/oppia/oppia-android/assets/99066793/62e00542-091c-48b1-9e63-aa1ca3c9abff)|![Screenshot_1698283405](https://github.com/oppia/oppia-android/assets/59600948/e1c534ee-b379-461c-bc39-7854fe57dc70)|

|![Screenshot_1698284125](https://github.com/oppia/oppia-android/assets/59600948/3f47014d-f4e3-4430-9e1e-d4b4609014e7)|![Screenshot_1698283411](https://github.com/oppia/oppia-android/assets/59600948/786445ec-0b75-41af-882b-ae93e2da9b4d)|

|![Screenshot_1697714168](https://github.com/oppia/oppia-android/assets/59600948/9fa8daeb-25ca-4b90-ac66-a6228c81f120)|![Screenshot_1698284519](https://github.com/oppia/oppia-android/assets/59600948/0b39d37d-1471-4ecf-8626-13a01ec35c3e)|

|![Screenshot_1697745323](https://github.com/oppia/oppia-android/assets/59600948/8152c286-8845-4f3b-8ecf-93acd03dbc3e)|![Screenshot_1698284666](https://github.com/oppia/oppia-android/assets/59600948/dbff75ba-bb08-4855-b49a-0e4d337c478b)|

|![Screenshot_1697714820](https://github.com/oppia/oppia-android/assets/59600948/65b7eadc-c8b0-4963-8dbf-d4cd19590e98)|![Screenshot_1698284933](https://github.com/oppia/oppia-android/assets/59600948/9b517dc5-fc75-43f8-b6af-a4e24b1cde28)|

Images scaled to Largest text and display size, and dark mode
||||
|--|--|--|

|![image](https://github.com/oppia/oppia-android/assets/59600948/cedd58b2-a16f-4ed7-9856-df9371242d3a)|![image](https://github.com/oppia/oppia-android/assets/59600948/acf79348-72cb-4732-b91a-1f934861d9f0)|![image](https://github.com/oppia/oppia-android/assets/59600948/fa07209d-fb54-4f21-a267-cc9bd7d26177)|

|![image](https://github.com/oppia/oppia-android/assets/59600948/241f8501-21ce-488f-be6e-a6f2b4bde198)|![image](https://github.com/oppia/oppia-android/assets/59600948/82d0a270-e486-4553-96ae-559ad7b784a2)|![image](https://github.com/oppia/oppia-android/assets/59600948/6080aff6-aff0-46ad-b30c-88e086aeeac7)|

---------

Co-authored-by: Ben Henning <ben@oppia.org>

Fix #3596: Adds Audio Loading UI (#5179)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
<!--
- Explain what your PR does. If this PR fixes an existing bug, please
include
- "Fixes #bugnum:" in the explanation so that GitHub can auto-close the
issue
  - when this PR is merged.
  -->

Fixes #3596

This PR adds an indeterminate progress bar when the audio is loading,
before it starts playing.

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

<!-- Delete these section if this PR does not include UI-related
changes. -->
If your PR includes UI-related changes, then:
- Add screenshots for portrait/landscape for both a tablet & phone of
the before & after UI changes
- For the screenshots above, include both English and pseudo-localized
(RTL) screenshots (see [RTL
guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines))
- Add a video showing the full UX flow with a screen reader enabled (see
[accessibility
guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide))
- Add a screenshot demonstrating that you ran affected Espresso tests
locally & that they're passing

https://github.com/oppia/oppia-android/assets/84731134/5c6fe393-5d89-4bda-a144-57bdc42a9c57

---------

Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com>

Fix #5226: EnableContinueButtonAnimation Feature Flag  (#5228)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
Fix #5226

Remove declarations and usages of the enableContinueButtonAnimation
PlatformParameter.

(A) Removed declaration of
TestPlatformParameterModule.forceEnableContinueButtonAnimation() from
all test functions namely:

testContinueInteractionAnim_openPrototypeExp_checkContinueButtonAnimatesAfter45Seconds(),
testConIntAnim_openProtExp_orientLandscapeAfter30Sec_checkAnimHasNotStarted(),
testConIntAnim_openProtExp_orientLandAfter30Sec_checkAnimStartsIn15SecAfterOrientChange(),
testContNavBtnAnim_openMathExp_checkContNavBtnAnimatesAfter45Seconds(),
testContNavBtnAnim_openMathExp_playThroughSecondState_checkContBtnDoesNotAnimateAfter45Sec(),
testConIntAnim_openFractions_expId1_checkButtonDoesNotAnimate()
in StateFragmentLocalTest.kt file

(B) Removed function declaration
TestPlatformParameterModule.forceEnableContinueButtonAnimation(false)
from setup() function
in StateFragmentTest.kt


(C) Removed function declaration
TestPlatformParameterModule.forceEnableContinueButtonAnimation(false)
from setup() function
in ExploreActivityTest.kt

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

Fix #5230: VectorDrawableCompat error lint (#5237)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
Fix #5230: VectorDrawableCompat Lint error

Warning: VectorDrawableCompat
Fix: opened the app's build.gradle file.
Inside the android block, added the vectorDrawables section under
defaultConfig with the code below:
android { ... defaultConfig { ... vectorDrawables { useSupportLibrary
true } } }

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

Fix #3345 Images are not fully displayed  (#5234)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
Fixes #3345, substracting drawableWidth from maxContentItemPadding only
if drawableWidth >= (maxcontentWidth -
 maxContentItemPadding) would solve the issue.
<!--
- Explain what your PR does. If this PR fixes an existing bug, please
include
- "Fixes #bugnum:" in the explanation so that GitHub can auto-close the
issue
  - when this PR is merged.
  -->

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

https://user-images.githubusercontent.com/82181327/122643554-54f1ac00-d108-11eb-906f-6748d2facf2f.jpg

https://user-images.githubusercontent.com/101634267/245153650-cd8335df-01ec-47e6-97b2-7f7244d95efb.jpg

https://user-images.githubusercontent.com/101634267/245153665-cb9506d2-6d0d-4231-8a42-5f8ab15cf4d4.jpg

![after_image_cut](https://github.com/oppia/oppia-android/assets/76042077/babacf98-1ef6-4f29-98a4-cc46c5f53303)

![after_imagecut](https://github.com/oppia/oppia-android/assets/76042077/e08cf8d0-5f25-46bb-afbe-124952d19bfc)

![after_image_cut2](https://github.com/oppia/oppia-android/assets/76042077/85e950df-1ae9-48f2-b46c-c610b838593a)

![After_RTL](https://github.com/oppia/oppia-android/assets/76042077/586ade28-a45e-4f0a-9ac8-51457ccf8b5a)

![after_no_effect_RTL](https://github.com/oppia/oppia-android/assets/76042077/75820a6d-cc76-4ec0-b90e-ede7e5a72643)

<!-- Delete these section if this PR does not include UI-related
changes. -->
If your PR includes UI-related changes, then:
- Add screenshots for portrait/landscape for both a tablet & phone of
the before & after UI changes
- For the screenshots above, include both English and pseudo-localized
(RTL) screenshots (see [RTL
guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines))
- Add a video showing the full UX flow with a screen reader enabled (see
[accessibility
guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide))
- For PRs introducing new UI elements or color changes, both light and
dark mode screenshots must be included
- Add a screenshot demonstrating that you ran affected Espresso tests
locally & that they're passing

Localisation updates from https://translatewiki.net. (#5242)

Translation updates

Fix #5137: Upgrade builds to target SDK 33 (#5222)

Fixes #5137
Partially mitigates #5233

This updates all build & target SDKs for Gradle & Bazel builds to now
target SDK 33, per the new Play Store mandate (see
https://support.google.com/googleplay/android-developer/answer/11926878?hl=en).
The analysis of SDK 33 features, potential issues, and potential
mitigations are described in #5137. It was determined that there are no
obvious code changes needed beyond the minimum to target SDK 33. We'll
be relying on some platform-level regression testing plus the Play
Console's pre-submit app analysis report for finalizing the go/no-go
decision for SDK 33 support.

Testing consisted of manually playing through the app and seeing if
there were any issues using emulators both with SDK 33 and lower
versions. #5137 documents the issues found and their ultimate causes.
Since no functionality changes were needed for SDK 33, no tests needed
updating. Separately, tests are still running on SDK 30 due to being
stuck (see #4748).

One issue unrelated to SDK 33 was observed: when playing through the
prototype lesson, I once again brought the app into a broken state
wherein I couldn't leave the lesson via navigation. We've hit this issue
a few times, but still don't know the root cause. #5233 was filed and a
mitigation was introduced in this PR (+ a test for it): if the
exploration player observes a failure when trying to stop the player
session (for whatever reason), it still proceeds with its "end of
activity" flow (e.g. finishing the activity). This provides at least an
escape hatch for users who somehow hit this state. Note that this isn't
a proper fix for #5233 given the lack of a known root cause, so this is
only considered a mitigation.

The new test was verified as failing if the mitigation is omitted:

![image](https://github.com/oppia/oppia-android/assets/12983742/10ddbf85-332c-4469-8efa-483a967170f9)

Note that ``ExplorationActivityTest``'s setup was tweaked to change the
parent screen since this affects back navigation routing. I opted to
using lessons tab as the parent screen since it's the most common route
for users to hit, so it makes sense for our tests to default to that if
they don't specifically need to use a different route (and none of the
existing tests seemed to have an issue with this change).

- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

N/A -- This isn't changing any UIs directly, and per the analysis in
33 that would affect Oppia.

Technical Analytics: Milestone 1 - Add Feature Flag Statuses and Ability To Sync Them to Cache Store (#5203)

<!-- READ ME FIRST: Please fill in the explanation section below and
check off every point from the Essential Checklist! -->
<!--
- Explain what your PR does. If this PR fixes an existing bug, please
include
- "Fixes #bugnum:" in the explanation so that GitHub can auto-close the
issue
  - when this PR is merged.
  -->
When merged, this PR will:
- Create a new `FeatureFlagConstants.kt` file to contain all feature
flags.
- Create feature flag sync status trackers for each existing feature
flag.
- Modify the `PlatformParameterSyncUpWorker` to allow status trackers of
all feature flags to be synced and cached in the PersistentCacheStore.
- Merge the `TestBooleanPlatformParameter`,
`TestStringPlatformParameter` and the `TestIntegerPlatformParameter`
files into the `TestPlatformParameterConstants` file.
- Add syncing with the web for the `EnableDownloadsSupport`,
`EnableEditAccountsOptionsUi`, `EnableSpotlightUi`,
`EnableExtraTopicTabsUi`, `EnableInteractionConfigChangeStateRetention`,
and `EnableAppAndOsDeprecation` feature flags.
- Write tests for the changes made.

<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

<!-- Delete these section if this PR does not include UI-related
changes. -->
If your PR includes UI-related changes, then:
- Add screenshots for portrait/landscape for both a tablet & phone of
the before & after UI changes
- For the screenshots above, include both English and pseudo-localized
(RTL) screenshots (see [RTL
guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines))
- Add a video showing the full UX flow with a screen reader enabled (see
[accessibility
guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide))
- For PRs introducing new UI elements or color changes, both light and
dark mode screenshots must be included
- Add a screenshot demonstrating that you ran affected Espresso tests
locally & that they're passing

---------

Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com>
Co-authored-by: Ben Henning <ben@oppia.org>

Refactor TestAuthenticationModule.kt to provide FirebaseAuthWrapper

Ensure firestore logs show in dev event logs view.

Removed redundant bindings.

Remove FakeAuthenticationController and refactored its usages to the new FakeFirebaseWrapperImpl

Remove DebugFirestoreEventLogger.kt and usages.

Update AuthenticationControllerTest tests

Fix static analysis checks

Fix bazel build errors

Reformat auth/BUILD.bazel

Create wrapper for firebase auth instance

Fix lint errors

Fix failing tests

Fix failing lint checks

Fix test failures

Fix BUILD file formatting

Fix DebugFirestoreEventLoggerImplTest

Fake a firebase instance.

Fix build failures

Fix test file exemption warnings

Fix bazel build input file

Fix bazel build input file

Fix failing tests
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement End user-perceivable enhancements. Impact: High High perceived user impact (breaks a critical feature or blocks a release). Work: Medium The means to find the solution is clear, but it isn't at good-first-issue level yet.
Development

Successfully merging a pull request may close this issue.

4 participants