Glimpse: Switch to (Coil)ZoomImage

This one supports EXIF tags!

Change-Id: Icc4283d2b4d32d96d1a6c9bc831997330596e83e
diff --git a/app/Android.bp b/app/Android.bp
index 698fc2e..d4e4d90 100644
--- a/app/Android.bp
+++ b/app/Android.bp
@@ -46,7 +46,8 @@
         "Glimpse_io.coil-kt_coil",
         "Glimpse_io.coil-kt_coil-gif",
         "Glimpse_io.coil-kt_coil-video",
-        "Glimpse_com.davemorrissey.labs_subsampling-scale-image-view-androidx",
+        "Glimpse_io.github.panpf.zoomimage_zoomimage-core-android",
+        "Glimpse_io.github.panpf.zoomimage_zoomimage-view-coil",
     ],
 
     optimize: {
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index fc21551..c767117 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -108,8 +108,9 @@
     implementation("io.coil-kt:coil-gif:2.5.0")
     implementation("io.coil-kt:coil-video:2.5.0")
 
-    // subsampling-scale-image-view
-    implementation("com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0")
+    // ZoomImage
+    implementation("io.github.panpf.zoomimage:zoomimage-core-android:1.0.2")
+    implementation("io.github.panpf.zoomimage:zoomimage-view-coil:1.0.2")
 }
 
 configure<GenerateBpPluginExtension> {
@@ -117,8 +118,9 @@
     availableInAOSP.set { module: Module ->
         when {
             module.group.startsWith("androidx") -> {
-                // We provide our own androidx.media3
-                !module.group.startsWith("androidx.media3")
+                // We provide our own androidx.media3 & annotation-jvm
+                !module.group.startsWith("androidx.media3") &&
+                        module.name != "annotation-jvm"
             }
             module.group.startsWith("org.jetbrains") -> true
             module.group == "com.google.auto.value" -> true
diff --git a/app/libs/Android.bp b/app/libs/Android.bp
index 6244b94..ba56591 100644
--- a/app/libs/Android.bp
+++ b/app/libs/Android.bp
@@ -5,6 +5,32 @@
 
 // DO NOT EDIT THIS FILE MANUALLY
 
+java_import {
+    name: "Glimpse_androidx.annotation_annotation-jvm-nodeps",
+    jars: ["androidx/annotation/annotation-jvm/1.7.0/annotation-jvm-1.7.0.jar"],
+    sdk_version: "34",
+    min_sdk_version: "14",
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+}
+
+java_library_static {
+    name: "Glimpse_androidx.annotation_annotation-jvm",
+    sdk_version: "34",
+    min_sdk_version: "14",
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    static_libs: [
+        "Glimpse_androidx.annotation_annotation-jvm-nodeps",
+        "kotlin-stdlib",
+    ],
+    java_version: "1.7",
+}
+
 android_library_import {
     name: "Glimpse_androidx.media3_media3-common-nodeps",
     aars: ["androidx/media3/media3-common/1.2.1/media3-common-1.2.1.aar"],
@@ -394,38 +420,6 @@
 }
 
 android_library_import {
-    name: "Glimpse_com.davemorrissey.labs_subsampling-scale-image-view-androidx-nodeps",
-    aars: ["com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/subsampling-scale-image-view-androidx-3.10.0.aar"],
-    sdk_version: "34",
-    min_sdk_version: "14",
-    apex_available: [
-        "//apex_available:platform",
-        "//apex_available:anyapex",
-    ],
-    static_libs: [
-        "androidx.appcompat_appcompat",
-        "androidx.exifinterface_exifinterface",
-    ],
-}
-
-android_library {
-    name: "Glimpse_com.davemorrissey.labs_subsampling-scale-image-view-androidx",
-    sdk_version: "34",
-    min_sdk_version: "14",
-    apex_available: [
-        "//apex_available:platform",
-        "//apex_available:anyapex",
-    ],
-    manifest: "com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/AndroidManifest.xml",
-    static_libs: [
-        "Glimpse_com.davemorrissey.labs_subsampling-scale-image-view-androidx-nodeps",
-        "androidx.appcompat_appcompat",
-        "androidx.exifinterface_exifinterface",
-    ],
-    java_version: "1.7",
-}
-
-android_library_import {
     name: "Glimpse_com.google.android.material_material-nodeps",
     aars: ["com/google/android/material/material/1.9.0/material-1.9.0.aar"],
     sdk_version: "34",
@@ -705,3 +699,145 @@
     ],
     java_version: "1.7",
 }
+
+android_library_import {
+    name: "Glimpse_io.github.panpf.zoomimage_zoomimage-core-android-nodeps",
+    aars: ["io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/zoomimage-core-release.aar"],
+    sdk_version: "34",
+    min_sdk_version: "14",
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    static_libs: [
+        "kotlinx-coroutines-android",
+        "androidx.exifinterface_exifinterface",
+        "androidx.lifecycle_lifecycle-common",
+        "kotlin-stdlib-jdk8",
+        "Glimpse_androidx.annotation_annotation-jvm",
+        "kotlinx-coroutines-core-jvm",
+    ],
+}
+
+android_library {
+    name: "Glimpse_io.github.panpf.zoomimage_zoomimage-core-android",
+    sdk_version: "34",
+    min_sdk_version: "14",
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    manifest: "io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/AndroidManifest.xml",
+    static_libs: [
+        "Glimpse_io.github.panpf.zoomimage_zoomimage-core-android-nodeps",
+        "kotlinx-coroutines-android",
+        "androidx.exifinterface_exifinterface",
+        "androidx.lifecycle_lifecycle-common",
+        "kotlin-stdlib-jdk8",
+        "Glimpse_androidx.annotation_annotation-jvm",
+        "kotlinx-coroutines-core-jvm",
+    ],
+    java_version: "1.7",
+}
+
+android_library_import {
+    name: "Glimpse_io.github.panpf.zoomimage_zoomimage-core-coil-nodeps",
+    aars: ["io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/zoomimage-core-coil-1.0.2.aar"],
+    sdk_version: "34",
+    min_sdk_version: "14",
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    static_libs: [
+        "Glimpse_io.coil-kt_coil",
+        "kotlin-stdlib-jdk8",
+    ],
+}
+
+android_library {
+    name: "Glimpse_io.github.panpf.zoomimage_zoomimage-core-coil",
+    sdk_version: "34",
+    min_sdk_version: "14",
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    manifest: "io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/AndroidManifest.xml",
+    static_libs: [
+        "Glimpse_io.github.panpf.zoomimage_zoomimage-core-coil-nodeps",
+        "Glimpse_io.coil-kt_coil",
+        "kotlin-stdlib-jdk8",
+    ],
+    java_version: "1.7",
+}
+
+android_library_import {
+    name: "Glimpse_io.github.panpf.zoomimage_zoomimage-view-coil-nodeps",
+    aars: ["io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/zoomimage-view-coil-1.0.2.aar"],
+    sdk_version: "34",
+    min_sdk_version: "14",
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    static_libs: [
+        "Glimpse_io.github.panpf.zoomimage_zoomimage-view",
+        "Glimpse_io.github.panpf.zoomimage_zoomimage-core-coil",
+        "kotlin-stdlib-jdk8",
+    ],
+}
+
+android_library {
+    name: "Glimpse_io.github.panpf.zoomimage_zoomimage-view-coil",
+    sdk_version: "34",
+    min_sdk_version: "14",
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    manifest: "io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/AndroidManifest.xml",
+    static_libs: [
+        "Glimpse_io.github.panpf.zoomimage_zoomimage-view-coil-nodeps",
+        "Glimpse_io.github.panpf.zoomimage_zoomimage-view",
+        "Glimpse_io.github.panpf.zoomimage_zoomimage-core-coil",
+        "kotlin-stdlib-jdk8",
+    ],
+    java_version: "1.7",
+}
+
+android_library_import {
+    name: "Glimpse_io.github.panpf.zoomimage_zoomimage-view-nodeps",
+    aars: ["io/github/panpf/zoomimage/zoomimage-view/1.0.2/zoomimage-view-1.0.2.aar"],
+    sdk_version: "34",
+    min_sdk_version: "14",
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    static_libs: [
+        "androidx.appcompat_appcompat",
+        "androidx.core_core-ktx",
+        "androidx.lifecycle_lifecycle-runtime-ktx",
+        "kotlin-stdlib-jdk8",
+    ],
+}
+
+android_library {
+    name: "Glimpse_io.github.panpf.zoomimage_zoomimage-view",
+    sdk_version: "34",
+    min_sdk_version: "14",
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    manifest: "io/github/panpf/zoomimage/zoomimage-view/1.0.2/AndroidManifest.xml",
+    static_libs: [
+        "Glimpse_io.github.panpf.zoomimage_zoomimage-view-nodeps",
+        "androidx.appcompat_appcompat",
+        "androidx.core_core-ktx",
+        "androidx.lifecycle_lifecycle-runtime-ktx",
+        "kotlin-stdlib-jdk8",
+    ],
+    java_version: "1.7",
+}
diff --git a/app/libs/androidx/annotation/annotation-jvm/1.7.0/annotation-jvm-1.7.0.jar b/app/libs/androidx/annotation/annotation-jvm/1.7.0/annotation-jvm-1.7.0.jar
new file mode 100644
index 0000000..3102808
--- /dev/null
+++ b/app/libs/androidx/annotation/annotation-jvm/1.7.0/annotation-jvm-1.7.0.jar
Binary files differ
diff --git a/app/libs/androidx/annotation/annotation-jvm/1.7.0/annotation-jvm-1.7.0.jar.license b/app/libs/androidx/annotation/annotation-jvm/1.7.0/annotation-jvm-1.7.0.jar.license
new file mode 100644
index 0000000..b0b532b
--- /dev/null
+++ b/app/libs/androidx/annotation/annotation-jvm/1.7.0/annotation-jvm-1.7.0.jar.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2013-2024 The Android Open Source Project
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/AndroidManifest.xml b/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/AndroidManifest.xml
deleted file mode 100644
index 1ce0f9a..0000000
--- a/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/AndroidManifest.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.davemorrissey.labs.subscaleview"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk
-        android:minSdkVersion="14"
-        android:targetSdkVersion="29" />
-
-</manifest>
\ No newline at end of file
diff --git a/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/AndroidManifest.xml.license b/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/AndroidManifest.xml.license
deleted file mode 100644
index 2f13729..0000000
--- a/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/AndroidManifest.xml.license
+++ /dev/null
@@ -1,3 +0,0 @@
-SPDX-FileCopyrightText: 2024 Dave Morrissey
-
-SPDX-License-Identifier: Apache-2.0
diff --git a/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/subsampling-scale-image-view-androidx-3.10.0.aar b/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/subsampling-scale-image-view-androidx-3.10.0.aar
deleted file mode 100644
index f64efa3..0000000
--- a/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/subsampling-scale-image-view-androidx-3.10.0.aar
+++ /dev/null
Binary files differ
diff --git a/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/subsampling-scale-image-view-androidx-3.10.0.aar.license b/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/subsampling-scale-image-view-androidx-3.10.0.aar.license
deleted file mode 100644
index 2f13729..0000000
--- a/app/libs/com/davemorrissey/labs/subsampling-scale-image-view-androidx/3.10.0/subsampling-scale-image-view-androidx-3.10.0.aar.license
+++ /dev/null
@@ -1,3 +0,0 @@
-SPDX-FileCopyrightText: 2024 Dave Morrissey
-
-SPDX-License-Identifier: Apache-2.0
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/AndroidManifest.xml b/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/AndroidManifest.xml
new file mode 100644
index 0000000..c30ea8e
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/AndroidManifest.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.github.panpf.zoomimage.core" >
+
+    <uses-sdk android:minSdkVersion="16" />
+
+</manifest>
\ No newline at end of file
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/AndroidManifest.xml.license b/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/AndroidManifest.xml.license
new file mode 100644
index 0000000..1f91bd8
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/AndroidManifest.xml.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2024 panpf
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/zoomimage-core-release.aar b/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/zoomimage-core-release.aar
new file mode 100644
index 0000000..171b253
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/zoomimage-core-release.aar
Binary files differ
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/zoomimage-core-release.aar.license b/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/zoomimage-core-release.aar.license
new file mode 100644
index 0000000..1f91bd8
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-core-android/1.0.2/zoomimage-core-release.aar.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2024 panpf
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/AndroidManifest.xml b/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/AndroidManifest.xml
new file mode 100644
index 0000000..90a3e86
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/AndroidManifest.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.github.panpf.zoomimage.core.coil" >
+
+    <uses-sdk android:minSdkVersion="21" />
+
+</manifest>
\ No newline at end of file
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/AndroidManifest.xml.license b/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/AndroidManifest.xml.license
new file mode 100644
index 0000000..1f91bd8
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/AndroidManifest.xml.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2024 panpf
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/zoomimage-core-coil-1.0.2.aar b/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/zoomimage-core-coil-1.0.2.aar
new file mode 100644
index 0000000..b90062b
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/zoomimage-core-coil-1.0.2.aar
Binary files differ
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/zoomimage-core-coil-1.0.2.aar.license b/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/zoomimage-core-coil-1.0.2.aar.license
new file mode 100644
index 0000000..1f91bd8
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-core-coil/1.0.2/zoomimage-core-coil-1.0.2.aar.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2024 panpf
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/AndroidManifest.xml b/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/AndroidManifest.xml
new file mode 100644
index 0000000..481bae0
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/AndroidManifest.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.github.panpf.zoomimage.view.coil" >
+
+    <uses-sdk android:minSdkVersion="21" />
+
+</manifest>
\ No newline at end of file
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/AndroidManifest.xml.license b/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/AndroidManifest.xml.license
new file mode 100644
index 0000000..1f91bd8
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/AndroidManifest.xml.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2024 panpf
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/zoomimage-view-coil-1.0.2.aar b/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/zoomimage-view-coil-1.0.2.aar
new file mode 100644
index 0000000..25ccd1b
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/zoomimage-view-coil-1.0.2.aar
Binary files differ
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/zoomimage-view-coil-1.0.2.aar.license b/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/zoomimage-view-coil-1.0.2.aar.license
new file mode 100644
index 0000000..1f91bd8
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-view-coil/1.0.2/zoomimage-view-coil-1.0.2.aar.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2024 panpf
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/AndroidManifest.xml b/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/AndroidManifest.xml
new file mode 100644
index 0000000..674953b
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/AndroidManifest.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.github.panpf.zoomimage.view" >
+
+    <uses-sdk android:minSdkVersion="16" />
+
+</manifest>
\ No newline at end of file
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/AndroidManifest.xml.license b/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/AndroidManifest.xml.license
new file mode 100644
index 0000000..1f91bd8
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/AndroidManifest.xml.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2024 panpf
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/zoomimage-view-1.0.2.aar b/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/zoomimage-view-1.0.2.aar
new file mode 100644
index 0000000..1120c4c
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/zoomimage-view-1.0.2.aar
Binary files differ
diff --git a/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/zoomimage-view-1.0.2.aar.license b/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/zoomimage-view-1.0.2.aar.license
new file mode 100644
index 0000000..1f91bd8
--- /dev/null
+++ b/app/libs/io/github/panpf/zoomimage/zoomimage-view/1.0.2/zoomimage-view-1.0.2.aar.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2024 panpf
+
+SPDX-License-Identifier: Apache-2.0
diff --git a/app/src/main/java/org/lineageos/glimpse/recyclerview/MediaViewerAdapter.kt b/app/src/main/java/org/lineageos/glimpse/recyclerview/MediaViewerAdapter.kt
index 561699b..4ad4059 100644
--- a/app/src/main/java/org/lineageos/glimpse/recyclerview/MediaViewerAdapter.kt
+++ b/app/src/main/java/org/lineageos/glimpse/recyclerview/MediaViewerAdapter.kt
@@ -17,8 +17,8 @@
 import androidx.recyclerview.widget.DiffUtil
 import androidx.recyclerview.widget.ListAdapter
 import androidx.recyclerview.widget.RecyclerView
-import com.davemorrissey.labs.subscaleview.ImageSource
-import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
+import coil.load
+import com.github.panpf.zoomimage.CoilZoomImageView
 import org.lineageos.glimpse.R
 import org.lineageos.glimpse.ext.fade
 import org.lineageos.glimpse.models.Media
@@ -26,6 +26,7 @@
 import org.lineageos.glimpse.models.MediaType
 import org.lineageos.glimpse.viewmodels.MediaViewerUIViewModel
 import org.lineageos.glimpse.viewmodels.MediaViewerViewModel
+import kotlin.reflect.safeCast
 
 class MediaViewerAdapter(
     private val exoPlayer: Lazy<ExoPlayer>,
@@ -60,7 +61,7 @@
         private val mediaViewerUIViewModel: MediaViewerUIViewModel,
     ) : RecyclerView.ViewHolder(view) {
         // Views
-        private val imageView = view.findViewById<SubsamplingScaleImageView>(R.id.imageView)
+        private val imageView = view.findViewById<CoilZoomImageView>(R.id.imageView)
 
         @androidx.media3.common.util.UnstableApi
         private val playerControlView = view.findViewById<PlayerControlView>(R.id.exo_controller)
@@ -129,8 +130,11 @@
 
             updateDisplayedMedia()
 
-            if (media.mediaType == MediaType.IMAGE) {
-                imageView.setImage(ImageSource.uri(media.uri))
+            imageView.load(media.uri) {
+                MediaStoreMedia::class.safeCast(media)?.let {
+                    memoryCacheKey("full_${it.id}")
+                    placeholderMemoryCacheKey("thumbnail_${it.id}")
+                }
             }
         }
 
diff --git a/app/src/main/res/layout/media_view.xml b/app/src/main/res/layout/media_view.xml
index 36bce1f..ee43281 100644
--- a/app/src/main/res/layout/media_view.xml
+++ b/app/src/main/res/layout/media_view.xml
@@ -9,7 +9,7 @@
     android:layout_height="match_parent">
 
     <!-- Images -->
-    <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
+    <com.github.panpf.zoomimage.CoilZoomImageView
         android:id="@+id/imageView"
         android:layout_width="0dp"
         android:layout_height="0dp"
@@ -17,7 +17,8 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
+        app:layout_constraintTop_toTopOf="parent"
+        app:disabledScrollBar="true" />
 
     <!-- Video -->
     <androidx.media3.ui.PlayerView