signalapp / Signal-Android

A private messenger for Android.
https://signal.org
GNU Affero General Public License v3.0
25.54k stars 6.12k forks source link

NullPointerException when opening gallery #8949

Closed awaitlink closed 5 years ago

awaitlink commented 5 years ago

Bug description

When entering "selecting images from gallery" view, Signal crashes.

Steps to reproduce

Actual result: Crash and app restart. Expected result: Gallery selection screen

Device info

Device: Pixel 3 XL Android version: Q Beta 5 Signal version: 4.44.2

Debug log

I'm seeing this exception:

XX:XX:04.886 I PassphraseRequiredActionBarActivity: onCreate(null)
XX:XX:04.887 I ExperienceUpgradeActivity: getExperienceUpgrade(494)
XX:XX:04.887 I PassphraseRequiredActionBarActivity: routeApplicationState(), state: 0
XX:XX:04.887 I PassphraseRequiredActionBarActivity: initializeClearKeyReceiver()
XX:XX:04.933 I PassphraseRequiredActionBarActivity: onResume()
XX:XX:05.011 I EncryptedGifCacheDecoder: Checking item for encrypted GIF cache decoder: /data/user/0/org.thoughtcrime.securesms/cache/image_manager_disk_cache/4040ed5358d210c7511616fd6fc6e29bcf962aeff7196f1c402e510b52dcae4c.0
XX:XX:05.012 I EncryptedBitmapCacheDecoder: Checking item for encrypted Bitmap cache decoder: /data/user/0/org.thoughtcrime.securesms/cache/image_manager_disk_cache/4040ed5358d210c7511616fd6fc6e29bcf962aeff7196f1c402e510b52dcae4c.0
XX:XX:05.012 I EncryptedBitmapCacheDecoder: Encrypted Bitmap cache decoder running: /data/user/0/org.thoughtcrime.securesms/cache/image_manager_disk_cache/4040ed5358d210c7511616fd6fc6e29bcf962aeff7196f1c402e510b52dcae4c.0
XX:XX:06.304 I KeyboardAwareLinearLayout: rotation changed
XX:XX:06.305 I KeyboardAwareLinearLayout: onKeyboardClose()

XX:XX:06.328 E UncaughtExceptionLogger: 
XX:XX:06.328 E UncaughtExceptionLogger: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase()' on a null object reference
XX:XX:06.328 E UncaughtExceptionLogger:     at org.thoughtcrime.securesms.mediasend.MediaRepository.lambda$getFolders$5(MediaRepository.java:91)
XX:XX:06.328 E UncaughtExceptionLogger:     at org.thoughtcrime.securesms.mediasend.-$$Lambda$MediaRepository$PS4-rnN1bOw9bXZ4nNk5oGByXLw.compare(Unknown Source:4)
XX:XX:06.328 E UncaughtExceptionLogger:     at java.util.TimSort.countRunAndMakeAscending(TimSort.java:360)
XX:XX:06.328 E UncaughtExceptionLogger:     at java.util.TimSort.sort(TimSort.java:220)
XX:XX:06.328 E UncaughtExceptionLogger:     at java.util.Arrays.sort(Arrays.java:1492)
XX:XX:06.328 E UncaughtExceptionLogger:     at java.util.ArrayList.sort(ArrayList.java:1470)
XX:XX:06.328 E UncaughtExceptionLogger:     at java.util.Collections.sort(Collections.java:206)
XX:XX:06.328 E UncaughtExceptionLogger:     at com.annimon.stream.operator.ObjSorted.nextIteration(ObjSorted.java:25)
XX:XX:06.328 E UncaughtExceptionLogger:     at com.annimon.stream.iterator.LsaExtIterator.hasNext(LsaExtIterator.java:20)
XX:XX:06.328 E UncaughtExceptionLogger:     at com.annimon.stream.Stream.toList(Stream.java:1538)
XX:XX:06.328 E UncaughtExceptionLogger:     at org.thoughtcrime.securesms.mediasend.MediaRepository.getFolders(MediaRepository.java:92)
XX:XX:06.328 E UncaughtExceptionLogger:     at org.thoughtcrime.securesms.mediasend.MediaRepository.lambda$getFolders$0(MediaRepository.java:43)
XX:XX:06.328 E UncaughtExceptionLogger:     at org.thoughtcrime.securesms.mediasend.-$$Lambda$MediaRepository$jyCvikuYVn-XiA6JE48R6_i5UDs.run(Unknown Source:6)
XX:XX:06.328 E UncaughtExceptionLogger:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
XX:XX:06.328 E UncaughtExceptionLogger:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
XX:XX:06.328 E UncaughtExceptionLogger:     at java.lang.Thread.run(Thread.java:919)

XX:XX:06.339 I PassphraseRequiredActionBarActivity: onPause()
XX:XX:06.352 I PassphraseRequiredActionBarActivity: onResume()
XX:XX:06.408 I PassphraseRequiredActionBarActivity: onDestroy()
XX:XX:08.680 I IncomingMessageObserver: Waiting for websocket state change....
[...]
XX:XX:08.860 I ApplicationContext: App is now visible.
awaitlink commented 5 years ago

The cause of this issue was that I was doing (I was able to reproduce this again too):

adb shell screenrecord /sdcard/screenrecord.mp4
^C
adb pull /sdcard/screenrecord.mp4 # not sure if this is necessary
adb shell rm /sdcard/screenrecord.mp4

The last command exits with 0. Then I disconnect USB.

However when browsing on device, Files app from Google finds that screenrecording's folder and shows it in "Recent" as folder with name 0 containing 1 item. The path to the file is shown as:

/storage/emulated/0/screenrecord.mp4

When trying to play it, "Something went wrong". Upon deleting this file, Signal starts working properly again.

greyson-signal commented 5 years ago

Interesting. FWIW there seems to be several problems with system-level media queries in the Android Q Beta. This may be one of them. Easy enough to guard against though.