@@ -82,7 +82,10 @@ object ThumbnailsRequester : KoinComponent {
8282
8383 fun getAvatarUri (account : Account ): String {
8484 val accountManager = AccountManager .get(appContext)
85- val baseUrl = accountManager.getUserData(account, eu.opencloud.android.lib.common.accounts.AccountUtils .Constants .KEY_OC_BASE_URL )
85+ val baseUrl =
86+ accountManager.getUserData(account, eu.opencloud.android.lib.common.accounts.AccountUtils .Constants .KEY_OC_BASE_URL )
87+ ?.trimEnd(' /' )
88+ .orEmpty()
8689 val username = AccountUtils .getUsernameOfAccount(account.name)
8790 return " $baseUrl /index.php/avatar/${android.net.Uri .encode(username)} /384"
8891 }
@@ -122,7 +125,7 @@ object ThumbnailsRequester : KoinComponent {
122125
123126 ImageLoader (appContext).newBuilder().okHttpClient(
124127 okHttpClient = openCloudClient.okHttpClient.newBuilder()
125- .addNetworkInterceptor (coilRequestHeaderInterceptor).build()
128+ .addInterceptor (coilRequestHeaderInterceptor).build()
126129 ).logger(DebugLogger ())
127130 .memoryCache {
128131 getSharedMemoryCache()
@@ -148,9 +151,26 @@ object ThumbnailsRequester : KoinComponent {
148151 OC_X_REQUEST_ID to RandomUtils .generateRandomUUID(),
149152 )
150153
151- val request = chain.request().newBuilder()
152- requestHeaders.toHeaders().forEach { request.addHeader(it.first, it.second) }
153- val response = chain.proceed(request.build())
154+ val requestBuilder = chain.request().newBuilder()
155+ requestHeaders.toHeaders().forEach { requestBuilder.addHeader(it.first, it.second) }
156+ val requestWithHeaders = requestBuilder.build()
157+
158+ var response = chain.proceed(requestWithHeaders)
159+
160+ val originalUrl = requestWithHeaders.url.toString()
161+ if (
162+ originalUrl.contains(" /index.php/avatar/" ) &&
163+ (! response.isSuccessful || ! isProbablyAnImage(response))
164+ ) {
165+ response.close()
166+
167+ val baseUrl = originalUrl.substringBefore(" /index.php/avatar/" ).trimEnd(' /' )
168+ val graphUrl = " $baseUrl /graph/v1.0/me/photo/\$ value"
169+
170+ val graphRequest = requestWithHeaders.newBuilder().url(graphUrl).build()
171+ response = chain.proceed(graphRequest)
172+ }
173+
154174 var builder = response.newBuilder()
155175 var changed = false
156176
@@ -161,7 +181,11 @@ object ThumbnailsRequester : KoinComponent {
161181 changed = true
162182 }
163183
164- if (chain.request().url.toString().contains(" /avatar/" ) && response.header(" Content-Type" ).isNullOrEmpty()) {
184+ val finalRequestUrl = response.request.url.toString()
185+ if (
186+ (finalRequestUrl.contains(" /avatar/" ) || finalRequestUrl.contains(" /photo/\$ value" )) &&
187+ response.header(" Content-Type" ).isNullOrEmpty()
188+ ) {
165189 builder.addHeader(" Content-Type" , " image/png" )
166190 changed = true
167191 }
@@ -171,5 +195,10 @@ object ThumbnailsRequester : KoinComponent {
171195 }
172196 return response
173197 }
198+
199+ private fun isProbablyAnImage (response : Response ): Boolean {
200+ val contentType = response.header(" Content-Type" )
201+ return contentType.isNullOrEmpty() || contentType.startsWith(" image" )
202+ }
174203 }
175204}
0 commit comments