diff --git a/app/build.gradle b/app/build.gradle index 1df970bf..be3cff06 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -162,6 +162,7 @@ dependencies { implementation "com.github.bumptech.glide:glide:$glideVersion" implementation "com.github.bumptech.glide:okhttp3-integration:$glideVersion" + kapt "com.github.bumptech.glide:compiler:$glideVersion" implementation "io.reactivex.rxjava2:rxjava:2.2.20" implementation "io.reactivex.rxjava2:rxandroid:2.1.1" diff --git a/app/src/main/java/com/keylesspalace/tusky/di/AppComponent.kt b/app/src/main/java/com/keylesspalace/tusky/di/AppComponent.kt index ff3d0266..c18362bd 100644 --- a/app/src/main/java/com/keylesspalace/tusky/di/AppComponent.kt +++ b/app/src/main/java/com/keylesspalace/tusky/di/AppComponent.kt @@ -36,7 +36,8 @@ import javax.inject.Singleton BroadcastReceiverModule::class, ViewModelModule::class, RepositoryModule::class, - MediaUploaderModule::class + MediaUploaderModule::class, + GlideModule::class ]) interface AppComponent { @Component.Builder diff --git a/app/src/main/java/com/keylesspalace/tusky/di/GlideModule.kt b/app/src/main/java/com/keylesspalace/tusky/di/GlideModule.kt new file mode 100644 index 00000000..3a1bc0d0 --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/di/GlideModule.kt @@ -0,0 +1,12 @@ +package com.keylesspalace.tusky.di + +import com.keylesspalace.tusky.util.OmittedDomainAppModule +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class GlideModule { + @ContributesAndroidInjector + abstract fun provideOmittedDomainAppModule() : OmittedDomainAppModule + +} \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/util/OmittedDomainFetcher.kt b/app/src/main/java/com/keylesspalace/tusky/util/OmittedDomainFetcher.kt new file mode 100644 index 00000000..735b3482 --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/util/OmittedDomainFetcher.kt @@ -0,0 +1,60 @@ +package com.keylesspalace.tusky.util + +import android.content.Context +import android.util.Log +import com.bumptech.glide.Glide +import com.bumptech.glide.Registry +import com.bumptech.glide.annotation.GlideModule +import com.bumptech.glide.load.Options +import com.bumptech.glide.load.data.HttpUrlFetcher +import com.bumptech.glide.load.model.GlideUrl +import com.bumptech.glide.load.model.ModelLoader +import com.bumptech.glide.load.model.ModelLoaderFactory +import com.bumptech.glide.load.model.MultiModelLoaderFactory +import com.bumptech.glide.load.model.stream.HttpGlideUrlLoader +import com.bumptech.glide.module.AppGlideModule +import com.bumptech.glide.signature.ObjectKey +import com.keylesspalace.tusky.TuskyApplication +import com.keylesspalace.tusky.db.AccountManager +import java.io.File +import java.io.InputStream +import javax.inject.Inject + +@GlideModule +class OmittedDomainAppModule : AppGlideModule() { + @Inject + lateinit var accountManager : AccountManager + + override fun registerComponents(context: Context, glide: Glide, registry: Registry) { + Log.d("OmittedDomainAppModule", "registering loader factory") + + (context.applicationContext as TuskyApplication).androidInjector.inject(this) + + registry.append(String::class.java, InputStream::class.java, OmittedDomainLoaderFactory(accountManager)) + } +} + +class OmittedDomainLoaderFactory(val accountManager: AccountManager) : ModelLoaderFactory { + override fun teardown() = Unit + + override fun build(factory: MultiModelLoaderFactory): ModelLoader = OmittedDomainLoader(accountManager) +} + +class OmittedDomainLoader(val accountManager: AccountManager) : ModelLoader { + override fun buildLoadData(model: String, width: Int, height: Int, options: Options): ModelLoader.LoadData? + { + val trueUrl = if(accountManager.activeAccount != null) + "https://" + accountManager.activeAccount!!.domain + model + else model + + val timeout = options.get(HttpGlideUrlLoader.TIMEOUT) ?: 100 + + return ModelLoader.LoadData(ObjectKey(model), HttpUrlFetcher(GlideUrl(trueUrl), timeout)) + } + + + override fun handles(model: String): Boolean { + val file = File(model) + return !file.exists() + } +} \ No newline at end of file