From e2b50daaddbe228354659c13762c3eaf499e1bf4 Mon Sep 17 00:00:00 2001
From: FurWaz <fur.waz06@gmail.com>
Date: Tue, 13 Dec 2022 10:57:12 +0100
Subject: [PATCH] Added async photos loading

---
 .../app/src/main/java/Views/InfoAdapter.java  | 10 +++++++++
 .../com/furwaz/roomview/RoomActivity.java     | 13 ++++++++++++
 .../com/furwaz/roomview/ZoneActivity.java     | 21 +++++++++++++++----
 3 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/Sources/app/src/main/java/Views/InfoAdapter.java b/Sources/app/src/main/java/Views/InfoAdapter.java
index 72ff605..fed05b2 100644
--- a/Sources/app/src/main/java/Views/InfoAdapter.java
+++ b/Sources/app/src/main/java/Views/InfoAdapter.java
@@ -135,6 +135,16 @@ public class InfoAdapter<A> extends BaseAdapter {
 
     public void setBindings(InfoBinding[] objs) {
         this.objs = objs;
+        this.updateQueryList();
+    }
+
+    public void addBinding(InfoBinding binding) {
+        InfoBinding[] newObjs = new InfoBinding[this.objs.length + 1];
+        for (int i = 0; i < this.objs.length; i++)
+            newObjs[i] = this.objs[i];
+        newObjs[this.objs.length] = binding;
+        this.objs = newObjs;
+        this.updateQueryList();
     }
 
     public void setOnEditListener(Callback cb) {
diff --git a/Sources/app/src/main/java/com/furwaz/roomview/RoomActivity.java b/Sources/app/src/main/java/com/furwaz/roomview/RoomActivity.java
index 838c5fe..4acbfaa 100644
--- a/Sources/app/src/main/java/com/furwaz/roomview/RoomActivity.java
+++ b/Sources/app/src/main/java/com/furwaz/roomview/RoomActivity.java
@@ -26,6 +26,8 @@ import android.widget.Toast;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 import Common.BuildingManager;
 import Common.InfoBinding;
@@ -38,6 +40,7 @@ import Structures.PathDoor;
 import Structures.PathInfo;
 import Structures.PathStairs;
 import Structures.PathType;
+import Structures.PhotoInfo;
 import Structures.RoomInfo;
 import Structures.StairsDirection;
 import Structures.ZoneInfo;
@@ -69,6 +72,16 @@ public class RoomActivity extends AppCompatActivity {
             return;
         }
 
+        // pre-load all the zones's photos (to make the app faster)
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        executor.execute(() -> {
+            for (ZoneInfo zone : room.getZones()) {
+                for (PhotoInfo photo : zone.getPhotos()) {
+                    photo.getBitmap();
+                }
+            }
+        });
+
         View pathways_btn = findViewById(R.id.btn_tab_pathways);
         pathways_btn.setOnClickListener(view -> switchToPathways());
 
diff --git a/Sources/app/src/main/java/com/furwaz/roomview/ZoneActivity.java b/Sources/app/src/main/java/com/furwaz/roomview/ZoneActivity.java
index 3f1b89a..e00d4ef 100644
--- a/Sources/app/src/main/java/com/furwaz/roomview/ZoneActivity.java
+++ b/Sources/app/src/main/java/com/furwaz/roomview/ZoneActivity.java
@@ -12,6 +12,9 @@ import android.widget.SearchView;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
 import Common.BuildingManager;
 import Common.InfoBinding;
 import Popups.PhotoPopup;
@@ -49,7 +52,7 @@ public class ZoneActivity extends AppCompatActivity {
         photo_lv = findViewById(R.id.photo_list);
         LinearLayout noDataLayout = findViewById(R.id.no_photo_layout);
 
-        photo_adapter = new InfoAdapter<PhotoInfo>(this, zone.getPhotos(), noDataLayout, R.layout.photo_tile);
+        photo_adapter = new InfoAdapter<>(this, zone.getPhotos(), noDataLayout, R.layout.photo_tile);
         photo_lv.setAdapter(photo_adapter);
 
         photo_adapter.setOnRemoveListener(param -> {
@@ -82,7 +85,7 @@ public class ZoneActivity extends AppCompatActivity {
             intent.putExtra("room", building.getRooms().indexOf(room));
             intent.putExtra("zone", room.getZones().indexOf(zone));
             intent.putExtra("photo", zone.getPhotos().indexOf(param));
-            intent.putExtra("new_photo", ((PhotoInfo) param).getBitmap() == null);
+            intent.putExtra("new_photo", ((PhotoInfo) param).getImage() == null);
             startActivity(intent);
             return null;
         });
@@ -90,8 +93,18 @@ public class ZoneActivity extends AppCompatActivity {
 
         photo_adapter.setBindings(new InfoBinding[]{
                 new InfoBinding(param -> ((PhotoInfo) param).getPathViews().size(), R.id.photo_pathways),
-                new InfoBinding(param -> stringifyOrientation(((PhotoInfo) param).getOrientation()), R.id.photo_orientation),
-                new InfoBinding(param -> ((PhotoInfo) param).getBitmap(), R.id.photo_bitmap)
+                new InfoBinding(param -> stringifyOrientation(((PhotoInfo) param).getOrientation()), R.id.photo_orientation)
+        });
+
+        // load the photos async (to make the app faster)
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        executor.execute(() -> {
+            for (PhotoInfo photo : zone.getPhotos()) {
+                photo.getBitmap();
+            }
+            runOnUiThread(() -> {
+                photo_adapter.addBinding(new InfoBinding(param -> ((PhotoInfo) param).getBitmap(), R.id.photo_bitmap));
+            });
         });
 
         SearchView photo_sv = findViewById(R.id.photo_search);
-- 
GitLab