Skip to content

Use JSON APIs for explore #2731

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

Merged
merged 11 commits into from
Mar 26, 2019
Merged

Conversation

maskaravivek
Copy link
Member

Description (required)

Fixes #2729

What changes did you make and why?

Tests performed (required)

Tested explore and search until several pages in prodDebug.

@codecov-io
Copy link

codecov-io commented Mar 23, 2019

Codecov Report

Merging #2731 into master will increase coverage by 0.07%.
The diff coverage is 9.3%.

Impacted file tree graph

@@            Coverage Diff            @@
##           master   #2731      +/-   ##
=========================================
+ Coverage    2.72%    2.8%   +0.07%     
=========================================
  Files         267     267              
  Lines       12801   12758      -43     
  Branches     1137    1125      -12     
=========================================
+ Hits          349     358       +9     
+ Misses      12426   12375      -51     
+ Partials       26      25       -1
Impacted Files Coverage Δ
.../java/fr/free/nrw/commons/di/NetworkingModule.java 0% <ø> (ø) ⬆️
.../free/nrw/commons/category/CategoryImageUtils.java 0% <ø> (ø) ⬆️
...rw/commons/mwapi/ApacheHttpClientMediaWikiApi.java 0% <ø> (ø) ⬆️
app/src/main/java/fr/free/nrw/commons/Media.java 1.37% <0%> (-0.16%) ⬇️
.../nrw/commons/category/CategoryImageController.java 0% <0%> (ø) ⬆️
...rw/commons/explore/images/SearchImageFragment.java 0% <0%> (ø) ⬆️
...bookmarks/pictures/BookmarkPicturesController.java 0% <0%> (ø) ⬆️
...fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java 0% <0%> (ø) ⬆️
...a/fr/free/nrw/commons/media/model/ExtMetadata.java 0% <0%> (ø) ⬆️
...w/commons/category/CategoryImagesListFragment.java 0% <0%> (ø) ⬆️
... and 2 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update cbab7dd...822136f. Read the comment docs.

@maskaravivek maskaravivek changed the title Use JSON APIs for explore [WIP] Use JSON APIs for explore Mar 24, 2019
@maskaravivek
Copy link
Member Author

Help needed

I am stuck at making mockwebserver + okhttp tests work. I have added a OkHttpJsonApiClientTest class and am trying to run the test but it fails with some null pointer exception.

Mar 24, 2019 9:18:17 AM okhttp3.mockwebserver.MockWebServer$2 execute
INFO: MockWebServer[53564] starting to accept connections
Mar 24, 2019 9:18:17 AM okhttp3.mockwebserver.MockWebServer$2 execute
INFO: MockWebServer[53567] starting to accept connections
Mar 24, 2019 9:18:17 AM okhttp3.mockwebserver.MockWebServer$2 execute
INFO: MockWebServer[53566] starting to accept connections
Mar 24, 2019 9:18:17 AM okhttp3.mockwebserver.MockWebServer$2 execute
INFO: MockWebServer[53565] starting to accept connections
Mar 24, 2019 9:18:17 AM okhttp3.mockwebserver.MockWebServer$2 acceptConnections
INFO: MockWebServer[53567] done accepting connections: Socket closed

java.lang.NullPointerException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at okhttp3.internal.platform.AndroidPlatform.api24IsCleartextTrafficPermitted(AndroidPlatform.java:187)
	at okhttp3.internal.platform.AndroidPlatform.isCleartextTrafficPermitted(AndroidPlatform.java:174)
	at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:146)
	at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
	at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
	at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
	at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
	at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
	at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
	at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:254)
	at okhttp3.RealCall.execute(RealCall.java:92)
	at fr.free.nrw.commons.mwapi.OkHttpJsonApiClient.lambda$getCategoryImages$7(OkHttpJsonApiClient.java:342)
	at io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:44)
	at io.reactivex.Single.subscribe(Single.java:3438)
	at io.reactivex.Single.blockingGet(Single.java:2699)
	at fr.free.nrw.commons.mwapi.OkHttpJsonApiClientTest.getCategoryImages(OkHttpJsonApiClientTest.kt:59)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:568)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.robolectric.internal.SandboxTestRunner$2.evaluate(SandboxTestRunner.java:253)
	at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:130)
	at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:42)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.robolectric.internal.SandboxTestRunner$1.evaluate(SandboxTestRunner.java:84)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

It would be great if someone can help me with it. @ashishkumar468 @domdomegg

ashishkumar468 added a commit to ashishkumar468/apps-android-commons that referenced this pull request Mar 24, 2019
* Increased sdk version to 23
@domdomegg
Copy link
Member

I think @ashishkumar468 has fixed it.

I've noticed something interesting - the ordering that it shows category images in is different (these are consistently the first thing on the beta featured page):

master 2731
Screenshot_1553422447 Screenshot_1553422636

There doesn't seem to be much of a reason for their ordering - previously I believe they were in reverse order of when they were added to the category (i.e. so you'd see the most recently added ones first - perfect for explore, especially featured and uploaded via mobile). Is this something we could fix?

@domdomegg
Copy link
Member

Also, I have no idea what the conditions are for this (sorry!), but now I sometimes get this error when navigating to explore:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String fr.free.nrw.commons.Media.getDisplayTitle()' on a null object reference
at fr.free.nrw.commons.category.GridViewAdapter.getView(GridViewAdapter.java:88)
at android.widget.AbsListView.obtainView(AbsListView.java:2366)
at android.widget.GridView.onMeasure(GridView.java:1070)
at android.view.View.measure(View.java:23169)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure(View.java:23169)
at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1638)
at android.view.View.measure(View.java:23169)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure(View.java:23169)
at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
at android.view.View.measure(View.java:23169)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:696)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at androidx.test.espresso.base.Interrogator.loopAndInterrogate(Interrogator.java:148)
at androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:519)
at androidx.test.espresso.base.UiControllerImpl.loopMainThreadUntilIdle(UiControllerImpl.java:441)
at androidx.test.espresso.contrib.DrawerActions$DrawerAction.perform(DrawerActions.java:78)
at androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform(ViewInteraction.java:360)
at androidx.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:251)
at androidx.test.espresso.ViewInteraction.access$100(ViewInteraction.java:64)
at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:157)
at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:154)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

@domdomegg
Copy link
Member

I seem to have got the app into some state where this always happens. Not sure how. However clearing the data makes it work, and then after a few more times going around explore it'll start to crash with this error again.

More logs
2019-03-24 10:36:35.480 5019-5019/fr.free.nrw.commons.beta E/AndroidRuntime: FATAL EXCEPTION: main
    Process: fr.free.nrw.commons.beta, PID: 5019
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String fr.free.nrw.commons.Media.getDisplayTitle()' on a null object reference
        at fr.free.nrw.commons.category.GridViewAdapter.getView(GridViewAdapter.java:88)
        at android.widget.AbsListView.obtainView(AbsListView.java:2366)
        at android.widget.GridView.onMeasure(GridView.java:1070)
        at android.view.View.measure(View.java:23169)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
        at android.view.View.measure(View.java:23169)
        at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1638)
        at android.view.View.measure(View.java:23169)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
        at android.view.View.measure(View.java:23169)
        at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-03-24 10:36:35.481 5019-5019/fr.free.nrw.commons.beta E/ACRA: ACRA caught a NullPointerException for fr.free.nrw.commons.beta
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String fr.free.nrw.commons.Media.getDisplayTitle()' on a null object reference
        at fr.free.nrw.commons.category.GridViewAdapter.getView(GridViewAdapter.java:88)
        at android.widget.AbsListView.obtainView(AbsListView.java:2366)
        at android.widget.GridView.onMeasure(GridView.java:1070)
        at android.view.View.measure(View.java:23169)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
        at android.view.View.measure(View.java:23169)
        at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1638)
        at android.view.View.measure(View.java:23169)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
        at android.view.View.measure(View.java:23169)
        at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

@maskaravivek
Copy link
Member Author

@domdomegg Do you also have access to logs just before this fatal crash. I want to take a look at the response from the API. My guess is that some of the fields for a particular image might be not present.

@maskaravivek
Copy link
Member Author

Also, I have no idea what the conditions are for this (sorry!), but now I sometimes get this error when navigating to explore:

This is happening on prod build, right?

@domdomegg
Copy link
Member

Full logs
2019-03-24 10:37:51.642 5175-5175/fr.free.nrw.commons.beta W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@9f71fa5
2019-03-24 10:37:51.658 5175-5175/fr.free.nrw.commons.beta I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead.
2019-03-24 10:37:51.697 5175-5204/fr.free.nrw.commons.beta D/OkHttp: --> GET https://commons.wikimedia.beta.wmflabs.org/w/api.php?action=query&generator=categorymembers&format=json&gcmtype=file&gcmtitle=Category%3AFeatured_pictures_on_Wikimedia_Commons&gcmsort=timestamp&gcmdir=desc&gcmlimit=10&gcmcontinue=2019-03-17%2011%3A37%3A21%7C64137&continue=gcmcontinue%7C%7C&prop=imageinfo&iiprop=url%7Cextmetadata&iiextmetadatafilter=DateTime%7CCategories%7CGPSLatitude%7CGPSLongitude%7CImageDescription%7CDateTimeOriginal%7CArtist%7CLicenseShortName&iiextmetadatalanguage=en
2019-03-24 10:37:51.697 5175-5204/fr.free.nrw.commons.beta D/OkHttp: --> END GET
2019-03-24 10:37:51.705 5175-5206/fr.free.nrw.commons.beta D/OkHttp: --> GET https://commons.wikimedia.beta.wmflabs.org/w/api.php?action=query&generator=categorymembers&format=json&gcmtype=file&gcmtitle=Category%3AUploaded_with_Mobile%2FAndroid&gcmsort=timestamp&gcmdir=desc&gcmlimit=10&gcmcontinue=2019-03-18%2016%3A58%3A43%7C64261&continue=gcmcontinue%7C%7C&prop=imageinfo&iiprop=url%7Cextmetadata&iiextmetadatafilter=DateTime%7CCategories%7CGPSLatitude%7CGPSLongitude%7CImageDescription%7CDateTimeOriginal%7CArtist%7CLicenseShortName&iiextmetadatalanguage=en
2019-03-24 10:37:51.705 5175-5206/fr.free.nrw.commons.beta D/OkHttp: --> END GET
2019-03-24 10:37:51.766 5175-5209/fr.free.nrw.commons.beta D/EGL_emulation: eglMakeCurrent: 0xec7aae80: ver 2 0 (tinfo 0xec7ed410)
2019-03-24 10:37:51.781 5175-5209/fr.free.nrw.commons.beta D/EGL_emulation: eglMakeCurrent: 0xec7aae80: ver 2 0 (tinfo 0xec7ed410)
2019-03-24 10:37:51.797 5175-5209/fr.free.nrw.commons.beta I/chatty: uid=10085(fr.free.nrw.commons.beta) RenderThread identical 2 lines
2019-03-24 10:37:51.805 5175-5209/fr.free.nrw.commons.beta D/EGL_emulation: eglMakeCurrent: 0xec7aae80: ver 2 0 (tinfo 0xec7ed410)
2019-03-24 10:37:51.812 5175-5209/fr.free.nrw.commons.beta D/EGL_emulation: eglMakeCurrent: 0xec7aae80: ver 2 0 (tinfo 0xec7ed410)
2019-03-24 10:37:51.828 5175-5209/fr.free.nrw.commons.beta D/EGL_emulation: eglMakeCurrent: 0xec7aae80: ver 2 0 (tinfo 0xec7ed410)
2019-03-24 10:37:52.021 5175-5204/fr.free.nrw.commons.beta D/OkHttp: <-- 200 https://commons.wikimedia.beta.wmflabs.org/w/api.php?action=query&generator=categorymembers&format=json&gcmtype=file&gcmtitle=Category%3AFeatured_pictures_on_Wikimedia_Commons&gcmsort=timestamp&gcmdir=desc&gcmlimit=10&gcmcontinue=2019-03-17%2011%3A37%3A21%7C64137&continue=gcmcontinue%7C%7C&prop=imageinfo&iiprop=url%7Cextmetadata&iiextmetadatafilter=DateTime%7CCategories%7CGPSLatitude%7CGPSLongitude%7CImageDescription%7CDateTimeOriginal%7CArtist%7CLicenseShortName&iiextmetadatalanguage=en (323ms)
2019-03-24 10:37:52.021 5175-5204/fr.free.nrw.commons.beta D/OkHttp: date: Sun, 24 Mar 2019 10:41:28 GMT
2019-03-24 10:37:52.021 5175-5204/fr.free.nrw.commons.beta D/OkHttp: content-type: application/json; charset=utf-8
2019-03-24 10:37:52.021 5175-5204/fr.free.nrw.commons.beta D/OkHttp: server: deployment-mediawiki-09.deployment-prep.eqiad.wmflabs
2019-03-24 10:37:52.021 5175-5204/fr.free.nrw.commons.beta D/OkHttp: x-powered-by: HHVM/3.18.6-dev
2019-03-24 10:37:52.022 5175-5204/fr.free.nrw.commons.beta D/OkHttp: p3p: CP="This is not a P3P policy! See https://commons.wikimedia.beta.wmflabs.org/wiki/Special:CentralAutoLogin/P3P for more info."
2019-03-24 10:37:52.022 5175-5204/fr.free.nrw.commons.beta D/OkHttp: cache-control: private, must-revalidate, max-age=0
2019-03-24 10:37:52.022 5175-5204/fr.free.nrw.commons.beta D/OkHttp: content-disposition: inline; filename=api-result.json
2019-03-24 10:37:52.022 5175-5204/fr.free.nrw.commons.beta D/OkHttp: x-content-type-options: nosniff
2019-03-24 10:37:52.022 5175-5204/fr.free.nrw.commons.beta D/OkHttp: x-frame-options: DENY
2019-03-24 10:37:52.022 5175-5204/fr.free.nrw.commons.beta D/OkHttp: backend-timing: D=62588 t=1553424088705074
2019-03-24 10:37:52.022 5175-5204/fr.free.nrw.commons.beta D/OkHttp: vary: Accept-Encoding,Treat-as-Untrusted,X-Forwarded-Proto,Cookie,Authorization,X-Seven
2019-03-24 10:37:52.023 5175-5204/fr.free.nrw.commons.beta D/OkHttp: x-varnish: 386567461, 111377668
2019-03-24 10:37:52.023 5175-5204/fr.free.nrw.commons.beta D/OkHttp: via: 1.1 varnish (Varnish/5.1), 1.1 varnish (Varnish/5.1)
2019-03-24 10:37:52.023 5175-5204/fr.free.nrw.commons.beta D/OkHttp: accept-ranges: bytes
2019-03-24 10:37:52.023 5175-5204/fr.free.nrw.commons.beta D/OkHttp: age: 0
2019-03-24 10:37:52.023 5175-5204/fr.free.nrw.commons.beta D/OkHttp: x-cache: deployment-cache-text05 pass, deployment-cache-text05 pass
2019-03-24 10:37:52.023 5175-5204/fr.free.nrw.commons.beta D/OkHttp: x-cache-status: pass
2019-03-24 10:37:52.023 5175-5204/fr.free.nrw.commons.beta D/OkHttp: server-timing: cache;desc="pass"
2019-03-24 10:37:52.024 5175-5204/fr.free.nrw.commons.beta D/OkHttp: set-cookie: WMF-Last-Access=24-Mar-2019;Path=/;HttpOnly;secure;Expires=Thu, 25 Apr 2019 00:00:00 GMT
2019-03-24 10:37:52.024 5175-5204/fr.free.nrw.commons.beta D/OkHttp: set-cookie: WMF-Last-Access-Global=24-Mar-2019;Path=/;Domain=.wikimedia.beta.wmflabs.org;HttpOnly;secure;Expires=Thu, 25 Apr 2019 00:00:00 GMT
2019-03-24 10:37:52.024 5175-5204/fr.free.nrw.commons.beta D/OkHttp: x-analytics: ns=-1;special=Badtitle;https=1;nocookies=1
2019-03-24 10:37:52.024 5175-5204/fr.free.nrw.commons.beta D/OkHttp: x-client-ip: 31.14.251.57
2019-03-24 10:37:52.024 5175-5204/fr.free.nrw.commons.beta D/OkHttp: set-cookie: GeoIP=REMOVED; Path=/; secure; Domain=.beta.wmflabs.org
2019-03-24 10:37:52.026 5175-5204/fr.free.nrw.commons.beta D/OkHttp: {"batchcomplete":"","query":{"pages":{"64137":{"pageid":64137,"ns":6,"title":"File:Castle Peak Hospital.jpg","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/9/96/Castle_Peak_Hospital.jpg","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:Castle_Peak_Hospital.jpg","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64137","extmetadata":{"DateTime":{"value":"2019-03-04 08:59:47","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"All free media|Creative Commons Attribution-ShareAlike 4.0 files|Media lacking a description|Media with locations|Pages with maps|Self-published work|Uploaded with Mobile/Android","source":"commons-categories","hidden":""},"GPSLatitude":{"value":"22.408539","source":"commons-desc-page","hidden":""},"GPSLongitude":{"value":"113.973844","source":"commons-desc-page","hidden":""},"ImageDescription":{"value":"<div class=\"boilerplate metadata\" id=\"cleanup\" style=\"text-align: center; background: #ffe; margin: .75em 15%; padding: .5em; border: 1px solid #e3e3b0; direction: ltr;\">This file has no <b>description</b>, and may be lacking other information.\n<p>Please provide a meaningful description of this file.\n</p>\n</div>","source":"commons-desc-page"},"DateTimeOriginal":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=Template:According_to_EXIF_data&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"Template:According to EXIF data (page does not exist)\">Template:According to EXIF data</a>","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:GangZhao&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:GangZhao (page does not exist)\">GangZhao</a>","source":"commons-desc-page"},"LicenseShortName":{"value":"CC-BY-SA-4.0","source":"commons-desc-page","hidden":""}}}]},"21793":{"pageid":21793,"ns":0,"title":"Hauptseite"},"18598":{"pageid":18598,"ns":0,"title":"Main Page/potd"},"20623":{"pageid":20623,"ns":0,"title":"Pela Seri"},"18597":{"pageid":18597,"ns":0,"title":"Main Page/motd"}}}}
2019-03-24 10:37:52.026 5175-5204/fr.free.nrw.commons.beta D/OkHttp: <-- END HTTP (2169-byte body)
2019-03-24 10:37:52.029 5175-5204/fr.free.nrw.commons.beta W/rw.commons.bet: Accessing hidden field Lsun/misc/Unsafe;->theUnsafe:Lsun/misc/Unsafe; (light greylist, reflection)
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: <-- 200 https://commons.wikimedia.beta.wmflabs.org/w/api.php?action=query&generator=categorymembers&format=json&gcmtype=file&gcmtitle=Category%3AUploaded_with_Mobile%2FAndroid&gcmsort=timestamp&gcmdir=desc&gcmlimit=10&gcmcontinue=2019-03-18%2016%3A58%3A43%7C64261&continue=gcmcontinue%7C%7C&prop=imageinfo&iiprop=url%7Cextmetadata&iiextmetadatafilter=DateTime%7CCategories%7CGPSLatitude%7CGPSLongitude%7CImageDescription%7CDateTimeOriginal%7CArtist%7CLicenseShortName&iiextmetadatalanguage=en (339ms)
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: date: Sun, 24 Mar 2019 10:41:28 GMT
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: content-type: application/json; charset=utf-8
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: server: deployment-mediawiki-09.deployment-prep.eqiad.wmflabs
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: x-powered-by: HHVM/3.18.6-dev
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: p3p: CP="This is not a P3P policy! See https://commons.wikimedia.beta.wmflabs.org/wiki/Special:CentralAutoLogin/P3P for more info."
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: cache-control: private, must-revalidate, max-age=0
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: content-disposition: inline; filename=api-result.json
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: x-content-type-options: nosniff
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: x-frame-options: DENY
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: backend-timing: D=80824 t=1553424088712186
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: vary: Accept-Encoding,Treat-as-Untrusted,X-Forwarded-Proto,Cookie,Authorization,X-Seven
2019-03-24 10:37:52.045 5175-5206/fr.free.nrw.commons.beta D/OkHttp: x-varnish: 387090897, 114266854
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: via: 1.1 varnish (Varnish/5.1), 1.1 varnish (Varnish/5.1)
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: accept-ranges: bytes
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: age: 0
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: x-cache: deployment-cache-text05 pass, deployment-cache-text05 pass
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: x-cache-status: pass
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: server-timing: cache;desc="pass"
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: set-cookie: WMF-Last-Access=24-Mar-2019;Path=/;HttpOnly;secure;Expires=Thu, 25 Apr 2019 00:00:00 GMT
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: set-cookie: WMF-Last-Access-Global=24-Mar-2019;Path=/;Domain=.wikimedia.beta.wmflabs.org;HttpOnly;secure;Expires=Thu, 25 Apr 2019 00:00:00 GMT
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: x-analytics: ns=-1;special=Badtitle;https=1;nocookies=1
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: x-client-ip: 31.14.251.57
2019-03-24 10:37:52.046 5175-5206/fr.free.nrw.commons.beta D/OkHttp: set-cookie: GeoIP=REMOVED; Path=/; secure; Domain=.beta.wmflabs.org
2019-03-24 10:37:52.047 5175-5206/fr.free.nrw.commons.beta D/OkHttp: {"batchcomplete":"","continue":{"gcmcontinue":"2019-03-18 05:50:11|64163","continue":"gcmcontinue||"},"query":{"pages":{"64261":{"pageid":64261,"ns":6,"title":"File:Room3.jpg","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/8/80/Room3.jpg","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:Room3.jpg","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64261","extmetadata":{"DateTime":{"value":"2019-03-18 16:58:43","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"Self-published work|Test|Uploaded with Mobile/Android","source":"commons-categories","hidden":""},"ImageDescription":{"value":"Arrow Test3","source":"commons-desc-page"},"DateTimeOriginal":{"value":"2019-02-18","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:Mrpeny&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:Mrpeny (page does not exist)\">Mrpeny</a>","source":"commons-desc-page"},"LicenseShortName":{"value":"CC-BY-SA-3.0","source":"commons-desc-page","hidden":""}}}]},"64260":{"pageid":64260,"ns":6,"title":"File:MobileTest 190318-085953.jpg","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/d/dc/MobileTest_190318-085953.jpg","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:MobileTest_190318-085953.jpg","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64260","extmetadata":{"DateTime":{"value":"2019-03-23 21:43:05","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"Media lacking a description|Self-published work|Uploaded with Mobile/Android|Uploaded with Mobile/Android Tests","source":"commons-categories","hidden":""},"ImageDescription":{"value":"<div class=\"boilerplate metadata\" id=\"cleanup\" style=\"text-align: center; background: #ffe; margin: .75em 15%; padding: .5em; border: 1px solid #e3e3b0; direction: ltr;\">This file has no <b>description</b>, and may be lacking other information.\n<p>Please provide a meaningful description of this file.\n</p>\n</div>","source":"commons-desc-page"},"DateTimeOriginal":{"value":"2019-02-23","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:Domdomegg&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:Domdomegg (page does not exist)\">Domdomegg</a>","source":"commons-desc-page"},"LicenseShortName":{"value":"CC-BY-SA-3.0","source":"commons-desc-page","hidden":""}}}]},"64259":{"pageid":64259,"ns":6,"title":"File:MobileTest 190318-083537.jpg","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/1/18/MobileTest_190318-083537.jpg","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:MobileTest_190318-083537.jpg","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64259","extmetadata":{"DateTime":{"value":"2019-03-23 21:43:05","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"Media lacking a description|Self-published work|Uploaded with Mobile/Android|Uploaded with Mobile/Android Tests","source":"commons-categories","hidden":""},"ImageDescription":{"value":"<div class=\"boilerplate metadata\" id=\"cleanup\" style=\"text-align: center; background: #ffe; margin: .75em 15%; padding: .5em; border: 1px solid #e3e3b0; direction: ltr;\">This file has no <b>description</b>, and may be lacking other information.\n<p>Please provide a meaningful description of this file.\n</p>\n</div>","source":"commons-desc-page"},"DateTimeOriginal":{"value":"2019-02-23","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:Domdomegg&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:Domdomegg (page does not exist)\">Domdomegg</a>","source":"commons-desc-page"},"LicenseShor
2019-03-24 10:37:52.047 5175-5206/fr.free.nrw.commons.beta D/OkHttp: tName":{"value":"CC-BY-SA-3.0","source":"commons-desc-page","hidden":""}}}]},"64258":{"pageid":64258,"ns":6,"title":"File:MobileTest 190318-083257.jpg","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/7/74/MobileTest_190318-083257.jpg","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:MobileTest_190318-083257.jpg","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64258","extmetadata":{"DateTime":{"value":"2019-03-23 21:43:05","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"Media lacking a description|Self-published work|Uploaded with Mobile/Android|Uploaded with Mobile/Android Tests","source":"commons-categories","hidden":""},"ImageDescription":{"value":"<div class=\"boilerplate metadata\" id=\"cleanup\" style=\"text-align: center; background: #ffe; margin: .75em 15%; padding: .5em; border: 1px solid #e3e3b0; direction: ltr;\">This file has no <b>description</b>, and may be lacking other information.\n<p>Please provide a meaningful description of this file.\n</p>\n</div>","source":"commons-desc-page"},"DateTimeOriginal":{"value":"2019-02-23","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:Domdomegg&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:Domdomegg (page does not exist)\">Domdomegg</a>","source":"commons-desc-page"},"LicenseShortName":{"value":"CC-BY-SA-3.0","source":"commons-desc-page","hidden":""}}}]},"64257":{"pageid":64257,"ns":6,"title":"File:Room2.jpg","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/e/ec/Room2.jpg","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:Room2.jpg","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64257","extmetadata":{"DateTime":{"value":"2019-03-18 14:57:11","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"Self-published work|Test|Uploaded with Mobile/Android","source":"commons-categories","hidden":""},"ImageDescription":{"value":"Arrow test2","source":"commons-desc-page"},"DateTimeOriginal":{"value":"2019-02-18","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:Mrpeny&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:Mrpeny (page does not exist)\">Mrpeny</a>","source":"commons-desc-page"},"LicenseShortName":{"value":"CC-BY-SA-3.0","source":"commons-desc-page","hidden":""}}}]},"64256":{"pageid":64256,"ns":6,"title":"File:MobileTest 190318-082500.jpg","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/e/e0/MobileTest_190318-082500.jpg","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:MobileTest_190318-082500.jpg","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64256","extmetadata":{"DateTime":{"value":"2019-03-23 21:43:05","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"Media lacking a description|Self-published work|Uploaded with Mobile/Android|Uploaded with Mobile/Android Tests","source":"commons-categories","hidden":""},"ImageDescription":{"value":"<div class=\"boilerplate metadata\" id=\"cleanup\" style=\"text-align: center; background: #ffe; margin: .75em 15%; padding: .5em; border: 1px solid #e3e3b0; direction: ltr;\">This file has no <b>description</b>, and may be lacking other information.\n<p>Please provide a meaningful description of this file.\n</p>\n</div>","source":"commons-desc-page"},"DateTimeOriginal":{"value":"2019-02-23","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:Domdomegg&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:Domdomegg (page does not exist)\">Domdomegg</a>","source":"commons-desc-page"},"LicenseShortName":{"value":"CC-BY-SA-3.0","source":"co
2019-03-24 10:37:52.047 5175-5206/fr.free.nrw.commons.beta D/OkHttp: mmons-desc-page","hidden":""}}}]},"64255":{"pageid":64255,"ns":6,"title":"File:Room1.jpg","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/5/5c/Room1.jpg","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:Room1.jpg","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64255","extmetadata":{"DateTime":{"value":"2019-03-18 14:23:27","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"Self-published work|Test|Uploaded with Mobile/Android","source":"commons-categories","hidden":""},"ImageDescription":{"value":"Arrow test1","source":"commons-desc-page"},"DateTimeOriginal":{"value":"2019-02-18","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:Mrpeny&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:Mrpeny (page does not exist)\">Mrpeny</a>","source":"commons-desc-page"},"LicenseShortName":{"value":"CC-BY-SA-3.0","source":"commons-desc-page","hidden":""}}}]},"64121":{"pageid":64121,"ns":6,"title":"File:Emergency exit.jpg","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/6/6a/Emergency_exit.jpg","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:Emergency_exit.jpg","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64121","extmetadata":{"DateTime":{"value":"2019-02-28 04:43:31","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"Media lacking a description|Media needing categories as of 28 February 2019|Media needing category review as of 18 March 2019|Pages with broken file links|Self-published work|Uploaded with Mobile/Android","source":"commons-categories","hidden":""},"ImageDescription":{"value":"<div class=\"boilerplate metadata\" id=\"cleanup\" style=\"text-align: center; background: #ffe; margin: .75em 15%; padding: .5em; border: 1px solid #e3e3b0; direction: ltr;\">This file has no <b>description</b>, and may be lacking other information.\n<p>Please provide a meaningful description of this file.\n</p>\n</div>","source":"commons-desc-page"},"DateTimeOriginal":{"value":"2017-07-26","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:GangZhao&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:GangZhao (page does not exist)\">GangZhao</a>","source":"commons-desc-page"},"LicenseShortName":{"value":"CC-BY-SA-3.0","source":"commons-desc-page","hidden":""}}}]},"64171":{"pageid":64171,"ns":6,"title":"File:CommonsAppTest 21.jpg","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/e/e0/CommonsAppTest_21.jpg","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:CommonsAppTest_21.jpg","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64171","extmetadata":{"DateTime":{"value":"2019-03-13 12:41:20","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"Deletion requests March 2019|Incomplete deletion requests - missing subpage|Media lacking a description|Pages with broken file links|Self-published work|Test|Test2222|Uploaded with Mobile/Android","source":"commons-categories","hidden":""},"ImageDescription":{"value":"<div class=\"boilerplate metadata\" id=\"cleanup\" style=\"text-align: center; background: #ffe; margin: .75em 15%; padding: .5em; border: 1px solid #e3e3b0; direction: ltr;\">This file has no <b>description</b>, and may be lacking other information.\n<p>Please provide a meaningful description of this file.\n</p>\n</div>","source":"commons-desc-page"},"DateTimeOriginal":{"value":"2019-02-13","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:Whym_test1&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:Whym test1 (page does not exist)\">Whym test1</a>","so
2019-03-24 10:37:52.047 5175-5206/fr.free.nrw.commons.beta D/OkHttp: urce":"commons-desc-page"},"LicenseShortName":{"value":"CC-BY-SA-3.0","source":"commons-desc-page","hidden":""}}}]},"64088":{"pageid":64088,"ns":6,"title":"File:Fuck.png","imagerepository":"local","imageinfo":[{"url":"https://upload.beta.wmflabs.org/wikipedia/commons/2/21/Fuck.png","descriptionurl":"https://commons.wikimedia.beta.wmflabs.org/wiki/File:Fuck.png","descriptionshorturl":"https://commons.wikimedia.beta.wmflabs.org/w/index.php?curid=64088","extmetadata":{"DateTime":{"value":"2019-02-06 05:10:10","source":"mediawiki-metadata","hidden":""},"Categories":{"value":"Deletion requests March 2019|Media lacking a description|Media needing categories as of 6 February 2019|Pages with broken file links|Self-published work|Uploaded with Mobile/Android","source":"commons-categories","hidden":""},"ImageDescription":{"value":"<div class=\"boilerplate metadata\" id=\"cleanup\" style=\"text-align: center; background: #ffe; margin: .75em 15%; padding: .5em; border: 1px solid #e3e3b0; direction: ltr;\">This file has no <b>description</b>, and may be lacking other information.\n<p>Please provide a meaningful description of this file.\n</p>\n</div>","source":"commons-desc-page"},"DateTimeOriginal":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=Template:According_to_EXIF_data&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"Template:According to EXIF data (page does not exist)\">Template:According to EXIF data</a>","source":"commons-desc-page"},"Artist":{"value":"<a href=\"https://commons.wikimedia.beta.wmflabs.org/w/index.php?title=User:Atyu&amp;action=edit&amp;redlink=1\" class=\"new\" title=\"User:Atyu (page does not exist)\">Atyu</a>","source":"commons-desc-page"},"LicenseShortName":{"value":"CC-BY-SA-3.0","source":"commons-desc-page","hidden":""}}}]}}}}
2019-03-24 10:37:52.047 5175-5206/fr.free.nrw.commons.beta D/OkHttp: <-- END HTTP (13815-byte body)
2019-03-24 10:37:52.067 5175-5175/fr.free.nrw.commons.beta D/AndroidRuntime: Shutting down VM
    
    
    --------- beginning of crash
2019-03-24 10:37:52.068 5175-5175/fr.free.nrw.commons.beta E/AndroidRuntime: FATAL EXCEPTION: main
    Process: fr.free.nrw.commons.beta, PID: 5175
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String fr.free.nrw.commons.Media.getDisplayTitle()' on a null object reference
        at fr.free.nrw.commons.category.GridViewAdapter.getView(GridViewAdapter.java:88)
        at android.widget.AbsListView.obtainView(AbsListView.java:2366)
        at android.widget.GridView.onMeasure(GridView.java:1070)
        at android.view.View.measure(View.java:23169)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
        at android.view.View.measure(View.java:23169)
        at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1638)
        at android.view.View.measure(View.java:23169)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
        at android.view.View.measure(View.java:23169)
        at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-03-24 10:37:52.069 5175-5175/fr.free.nrw.commons.beta E/ACRA: ACRA caught a NullPointerException for fr.free.nrw.commons.beta
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String fr.free.nrw.commons.Media.getDisplayTitle()' on a null object reference
        at fr.free.nrw.commons.category.GridViewAdapter.getView(GridViewAdapter.java:88)
        at android.widget.AbsListView.obtainView(AbsListView.java:2366)
        at android.widget.GridView.onMeasure(GridView.java:1070)
        at android.view.View.measure(View.java:23169)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
        at android.view.View.measure(View.java:23169)
        at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1638)
        at android.view.View.measure(View.java:23169)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
        at android.view.View.measure(View.java:23169)
        at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-03-24 10:37:52.093 5175-5175/fr.free.nrw.commons.beta I/Process: Sending signal. PID: 5175 SIG: 9
</details>

@domdomegg
Copy link
Member

This is happening on prod build, right?

I've just been testing on Beta so far - will test on prod now. Logs above are all from beta.

@domdomegg
Copy link
Member

I've noticed something interesting - the ordering that it shows category images in is different (these are consistently the first thing on the beta featured page):
There doesn't seem to be much of a reason for their ordering - previously I believe they were in reverse order of when they were added to the category (i.e. so you'd see the most recently added ones first - perfect for explore, especially featured and uploaded via mobile). Is this something we could fix?

On prod it seems to get random images each time instead of having any ordering - this might have been the case on beta too actually. Going to try messing around until it crashes now.

@domdomegg
Copy link
Member

Figured it out - and it makes sense why beta only was crashing. Explore crashes now at the end of the category - on beta the featured category is short enough that it reaches the end and crashes.

On prod this can be reproduced by viewing a small category, or when searching for a nonsense term (as there are no results)

@domdomegg
Copy link
Member

domdomegg commented Mar 24, 2019

Prod crash (searching for 'domdomegg')
2019-03-24 10:55:40.615 20615-20656/fr.free.nrw.commons D/OkHttp: --> GET https://commons.wikimedia.org/w/api.php?action=query&generator=search&format=json&gsrwhat=text&gsrnamespace=6&gsrlimit=25&gsrsearch=domdomegg
2019-03-24 10:55:40.615 20615-20656/fr.free.nrw.commons D/OkHttp: --> END GET
2019-03-24 10:55:40.625 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: <<<<<<<<<<<<<< START OF REQUEST LOGGING [/w/api.php?srsearch=domdomegg&srlimit=25&sroffset=0&format=xml&srwhat=text&srnamespace=14&action=query&list=search&format=xml] >>>>>>>>>>>>
2019-03-24 10:55:40.626 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: Request line:
     GET /w/api.php?srsearch=domdomegg&srlimit=25&sroffset=0&format=xml&srwhat=text&srnamespace=14&action=query&list=search&format=xml HTTP/1.1
2019-03-24 10:55:40.626 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: <<<<<<<<<<<<<< REQUEST PARAMS >>>>>>>>>>>>
2019-03-24 10:55:40.627 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: <<<<<<<<<<<<<< REQUEST PARAMS >>>>>>>>>>>>
2019-03-24 10:55:40.627 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: <<<<<<<<<<<<<< HEADERS >>>>>>>>>>>>
2019-03-24 10:55:40.627 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: Header >> Host: commons.wikimedia.org
2019-03-24 10:55:40.630 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: Header >> Connection: Keep-Alive
2019-03-24 10:55:40.630 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: Header >> User-Agent: Commons/2.10.1-debug-jsonExplore~057f1e0b7 (https://mediawiki.org/wiki/Apps/Commons) Android/9
2019-03-24 10:55:40.630 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: Header >> Cookie: GeoIP=REMOVED; loginnotify_prevlogins=2019-1wegs1a-3zmxsokdrcnrqwlchpqslnoybbp74q0; commonswikiSession=REMOVED; commonswikiUserID=4024640; commonswikiUserName=Domdomegg; forceHTTPS=true; centralauth_User=Domdomegg; centralauth_Token=REMOVED; centralauth_Session=REMOVED; WMF-Last-Access=24-Mar-2019
2019-03-24 10:55:40.631 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: Header >> Cookie2: $Version=1
2019-03-24 10:55:40.632 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: <<<<<<<<<<<<<< HEADERS >>>>>>>>>>>>
2019-03-24 10:55:40.632 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: Protocol version:
     HTTP/1.1
2019-03-24 10:55:40.632 20615-20649/fr.free.nrw.commons V/NetworkInterceptors: <<<<<<<<<<<<<< END OF REQUEST LOGGING [/w/api.php?srsearch=domdomegg&srlimit=25&sroffset=0&format=xml&srwhat=text&srnamespace=14&action=query&list=search&format=xml] >>>>>>>>>>>>
2019-03-24 10:55:40.909 20615-20656/fr.free.nrw.commons D/OkHttp: <-- 200 https://commons.wikimedia.org/w/api.php?action=query&generator=search&format=json&gsrwhat=text&gsrnamespace=6&gsrlimit=25&gsrsearch=domdomegg (294ms)
2019-03-24 10:55:40.909 20615-20656/fr.free.nrw.commons D/OkHttp: date: Sun, 24 Mar 2019 10:55:40 GMT
2019-03-24 10:55:40.909 20615-20656/fr.free.nrw.commons D/OkHttp: content-type: application/json; charset=utf-8
2019-03-24 10:55:40.909 20615-20656/fr.free.nrw.commons D/OkHttp: server: mw1228.eqiad.wmnet
2019-03-24 10:55:40.909 20615-20656/fr.free.nrw.commons D/OkHttp: x-powered-by: HHVM/3.18.6-dev
2019-03-24 10:55:40.909 20615-20656/fr.free.nrw.commons D/OkHttp: p3p: CP="This is not a P3P policy! See https://commons.wikimedia.org/wiki/Special:CentralAutoLogin/P3P for more info."
2019-03-24 10:55:40.909 20615-20656/fr.free.nrw.commons D/OkHttp: cache-control: private, must-revalidate, max-age=0
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: x-search-id: 8wt22bk6cj0t29bh2q4hwm0oo
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: x-content-type-options: nosniff
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: content-disposition: inline; filename=api-result.json
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: x-frame-options: DENY
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: backend-timing: D=189645 t=1553424940694931
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: vary: Accept-Encoding,Treat-as-Untrusted,X-Forwarded-Proto,Cookie,Authorization,X-Seven
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: x-varnish: 811158804, 327435284, 953330675
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: via: 1.1 varnish (Varnish/5.1), 1.1 varnish (Varnish/5.1), 1.1 varnish (Varnish/5.1)
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: accept-ranges: bytes
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: age: 0
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: x-cache: cp1085 pass, cp3041 pass, cp3042 pass
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: x-cache-status: pass
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: server-timing: cache;desc="pass"
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: strict-transport-security: max-age=106384710; includeSubDomains; preload
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: set-cookie: WMF-Last-Access=24-Mar-2019;Path=/;HttpOnly;secure;Expires=Thu, 25 Apr 2019 00:00:00 GMT
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: x-analytics: ns=-1;special=Badtitle;https=1;nocookies=1
2019-03-24 10:55:40.910 20615-20656/fr.free.nrw.commons D/OkHttp: x-client-ip: 31.14.251.57
2019-03-24 10:55:40.911 20615-20656/fr.free.nrw.commons D/OkHttp: set-cookie: GeoIP=GB:ENG:Shepherds_Bush:51.51:-0.22:v4; Path=/; secure; Domain=.wikimedia.org
2019-03-24 10:55:40.912 20615-20656/fr.free.nrw.commons D/OkHttp: {"batchcomplete":"","continue":{"gsroffset":25,"continue":"gsroffset||"},"query":{"pages":{"39946831":{"pageid":39946831,"ns":6,"title":"File:Atlantic horseshoe crab (Limulus polyphemus) (6).jpg","index":10},"39947219":{"pageid":39947219,"ns":6,"title":"File:Banggai cardinalfish (Pterapogon kauderni) (1).jpg","index":3},"39947250":{"pageid":39947250,"ns":6,"title":"File:Banggai cardinalfish (Pterapogon kauderni) (2).jpg","index":21},"39948454":{"pageid":39948454,"ns":6,"title":"File:Black-headed parrot (Pionites melanocephalus) (8).jpg","index":15},"39947387":{"pageid":39947387,"ns":6,"title":"File:Black swan (Cygnus atratus) (1).jpg","index":8},"39948519":{"pageid":39948519,"ns":6,"title":"File:Bronze Turkey (Meleagris gallopava) (1).jpg","index":17},"39948628":{"pageid":39948628,"ns":6,"title":"File:Brown Iory (Chalcopsitta duivenbodei) (1).jpg","index":12},"39948840":{"pageid":39948840,"ns":6,"title":"File:Brown Iory (Chalcopsitta duivenbodei) (2).jpg","index":13},"39948989":{"pageid":39948989,"ns":6,"title":"File:Brown Iory (Chalcopsitta duivenbodei) (3).jpg","index":19},"39948903":{"pageid":39948903,"ns":6,"title":"File:Burrowing owl (Athene cunicularia) (3).jpg","index":14},"39949010":{"pageid":39949010,"ns":6,"title":"File:Burrowing owl (Athene cunicularia) (4).jpg","index":22},"39975987":{"pageid":39975987,"ns":6,"title":"File:Candy cane coral (Caulastrea echinulata) (1).jpg","index":18},"46011213":{"pageid":46011213,"ns":6,"title":"File:Carrots at Ljubljana Central Market.JPG","index":2},"39976187":{"pageid":39976187,"ns":6,"title":"File:Chattering lory (Lorius garrulus) (2).jpg","index":4},"39976759":{"pageid":39976759,"ns":6,"title":"File:Chilean flamingo (Phoenicopterus chilensis) (1).jpg","index":23},"39977202":{"pageid":39977202,"ns":6,"title":"File:Chilean flamingo (Phoenicopterus chilensis) (2).jpg","index":24},"40247903":{"pageid":40247903,"ns":6,"title":"File:Frigatebird (3).jpg","index":5},"40247959":{"pageid":40247959,"ns":6,"title":"File:Frigatebird (4).jpg","index":7},"40248051":{"pageid":40248051,"ns":6,"title":"File:Frigatebird (5).jpg","index":25},"40248093":{"pageid":40248093,"ns":6,"title":"File:Frigatebird (6).jpg","index":20},"46011159":{"pageid":46011159,"ns":6,"title":"File:Grape tomatoes on the vine at Ljubljana Central Market.JPG","index":1},"63506617":{"pageid":63506617,"ns":6,"title":"File:Molecular beacon binding.svg","index":9},"46135450":{"pageid":46135450,"ns":6,"title":"File:Red-and-yellow barbet at Birdworld 01.jpg","index":11},"46135451":{"pageid":46135451,"ns":6,"title":"File:Red-and-yellow barbet at Birdworld 02.jpg","index":16},"46137486":{"pageid":46137486,"ns":6,"title":"File:White woodpecker at Birdworld 02.jpg","index":6}}}}
2019-03-24 10:55:40.912 20615-20656/fr.free.nrw.commons D/OkHttp: <-- END HTTP (2721-byte body)
2019-03-24 10:55:40.926 20615-20615/fr.free.nrw.commons D/AndroidRuntime: Shutting down VM
    
    
    --------- beginning of crash
2019-03-24 10:55:40.927 20615-20615/fr.free.nrw.commons E/AndroidRuntime: FATAL EXCEPTION: main
    Process: fr.free.nrw.commons, PID: 20615
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String fr.free.nrw.commons.Media.getDisplayTitle()' on a null object reference
        at fr.free.nrw.commons.explore.images.SearchImagesRenderer.render(SearchImagesRenderer.java:54)
        at com.pedrogomez.renderers.RVRendererAdapter.onBindViewHolder(RVRendererAdapter.java:121)
        at com.pedrogomez.renderers.RVRendererAdapter.onBindViewHolder(RVRendererAdapter.java:41)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6890)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6932)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5852)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6119)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5958)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5954)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2226)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3990)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3707)
        at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4260)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at androidx.viewpager.widget.ViewPager.onLayout(ViewPager.java:1775)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:753)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2792)
2019-03-24 10:55:40.927 20615-20615/fr.free.nrw.commons E/AndroidRuntime:     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2319)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-03-24 10:55:40.929 20615-20615/fr.free.nrw.commons E/ACRA: ACRA caught a NullPointerException for fr.free.nrw.commons
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String fr.free.nrw.commons.Media.getDisplayTitle()' on a null object reference
        at fr.free.nrw.commons.explore.images.SearchImagesRenderer.render(SearchImagesRenderer.java:54)
        at com.pedrogomez.renderers.RVRendererAdapter.onBindViewHolder(RVRendererAdapter.java:121)
        at com.pedrogomez.renderers.RVRendererAdapter.onBindViewHolder(RVRendererAdapter.java:41)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6890)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6932)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5852)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6119)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5958)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5954)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2226)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3990)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3707)
        at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4260)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at androidx.viewpager.widget.ViewPager.onLayout(ViewPager.java:1775)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:753)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2792)
2019-03-24 10:55:40.929 20615-20615/fr.free.nrw.commons E/ACRA:     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2319)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-03-24 10:55:40.942 20615-20649/fr.free.nrw.commons D/CustomApiResult: API response for method https://commons.wikimedia.org/w/api.php is
     <?xml version="1.0" encoding="UTF-8"?><api batchcomplete=""><query><searchinfo totalhits="0"/><search/></query></api>
    
    --------- beginning of system
2019-03-24 10:55:40.984 20615-20615/fr.free.nrw.commons I/Process: Sending signal. PID: 20615 SIG: 9

@maskaravivek
Copy link
Member Author

Figured it out - and it makes sense why beta only was crashing. Explore crashes now at the end of the category - on beta the featured category is short enough that it reaches the end and crashes.

On prod this can be reproduced by viewing a small category, or when searching for a nonsense term (as there are no results)

Thanks a lot for testing it in so much detail. I will fix all of these issues and update the PR. :)

@maskaravivek
Copy link
Member Author

@domdomegg I have fixed the crash and other issues reported by you.

Also, I have added unit tests for the changes I have made.

@maskaravivek maskaravivek changed the title [WIP] Use JSON APIs for explore Use JSON APIs for explore Mar 25, 2019
@maskaravivek maskaravivek requested a review from misaochan March 25, 2019 10:59
@domdomegg domdomegg self-requested a review March 25, 2019 23:45
@domdomegg
Copy link
Member

Tested 2.10.1-debug-jsonExplore~822136fdc (beta and prod).

Beta Commons Upload

I'm happy to merge in it's current state, but do still wonder about why the ordering has changed. Is there any way to get the old behaviour (sorted by most recently added by category), or close (e.g. sorted by most recently uploaded)?

Copy link
Collaborator

@ashishkumar468 ashishkumar468 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 👍

@ashishkumar468
Copy link
Collaborator

Merging this one to master, @maskaravivek Can you create a separate issue for the upstream ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants