diff --git a/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetAdapter.java b/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetAdapter.java index 85b0f26a27545b9644f2a85157b9887a22a509a8..992038a3176c5e70ff53ff47981d32f1521320fb 100644 --- a/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetAdapter.java +++ b/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetAdapter.java @@ -131,10 +131,10 @@ public class OpenHABWidgetAdapter extends RecyclerView.Adapter<OpenHABWidgetAdap mChartTheme = tv.string; } - public void update(List<OpenHABWidget> widgets) { + public void update(List<OpenHABWidget> widgets, boolean forceFullUpdate) { boolean compatibleUpdate = true; - if (widgets.size() != mItems.size()) { + if (widgets.size() != mItems.size() || forceFullUpdate) { compatibleUpdate = false; } else { for (int i = 0; i < widgets.size(); i++) { diff --git a/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetListFragment.java b/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetListFragment.java index 6b7128c00eda4c10c88239f1206606188480be7b..8a3c0f48de85637195c6d481ab97ba1c3bb594ed 100644 --- a/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetListFragment.java +++ b/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetListFragment.java @@ -293,7 +293,7 @@ public class OpenHABWidgetListFragment extends Fragment mWidgets = widgets; if (openHABWidgetAdapter != null) { - openHABWidgetAdapter.update(widgets); + openHABWidgetAdapter.update(widgets, refreshLayout.isRefreshing()); setHighlightedPageLink(mHighlightedPageLink); refreshLayout.setRefreshing(false); } diff --git a/mobile/src/main/java/org/openhab/habdroid/ui/widget/WidgetImageView.java b/mobile/src/main/java/org/openhab/habdroid/ui/widget/WidgetImageView.java index f4b527e534abf085ef55bd8489aa26a3cff21bc4..7e9d8a2191c6ec42f80168da9918f29705261aea 100644 --- a/mobile/src/main/java/org/openhab/habdroid/ui/widget/WidgetImageView.java +++ b/mobile/src/main/java/org/openhab/habdroid/ui/widget/WidgetImageView.java @@ -109,21 +109,23 @@ public class WidgetImageView extends AppCompatImageView { AsyncHttpClient client = connection.getAsyncHttpClient(); HttpUrl actualUrl = client.buildUrl(url); - if (mLastRequest != null && mLastRequest.isForUrl(actualUrl)) { - // Nothing to do + if (mLastRequest != null && mLastRequest.isActiveForUrl(actualUrl)) { + // We're already in the process of loading this image, thus there's nothing to do return; } cancelCurrentLoad(); - // Make sure to discard last request (which was for a different URL) to ensure - // it's not re-triggered later, e.g. when being attached to the window - mLastRequest = null; if (actualUrl == null) { applyFallbackDrawable(); + mLastRequest = null; return; } + Bitmap cached = CacheManager.getInstance(getContext()).getCachedBitmap(actualUrl); + + mLastRequest = new HttpImageRequest(client, actualUrl, timeoutMillis); + if (cached != null) { setBitmapInternal(cached); } else { @@ -131,7 +133,6 @@ public class WidgetImageView extends AppCompatImageView { } if (cached == null || forceLoad) { - mLastRequest = new HttpImageRequest(client, actualUrl, timeoutMillis); mLastRequest.execute(forceLoad); } } @@ -188,8 +189,12 @@ public class WidgetImageView extends AppCompatImageView { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - if (mLastRequest != null && !mLastRequest.hasCompleted()) { - mLastRequest.execute(false); + if (mLastRequest != null) { + if (!mLastRequest.hasCompleted()) { + mLastRequest.execute(false); + } else { + scheduleNextRefresh(); + } } } @@ -288,10 +293,6 @@ public class WidgetImageView extends AppCompatImageView { mCall = null; } - public boolean hasCompleted() { - return mCall != null; - } - public void execute(boolean avoidCache) { Log.i(TAG, "Refreshing image at " + mUrl); HttpClient.CachingMode cachingMode = avoidCache @@ -303,12 +304,15 @@ public class WidgetImageView extends AppCompatImageView { public void cancel() { if (mCall != null) { mCall.cancel(); - mCall = null; } } - public boolean isForUrl(HttpUrl url) { - return mCall != null && mCall.request().url().equals(url); + public boolean hasCompleted() { + return mCall == null; + } + + public boolean isActiveForUrl(HttpUrl url) { + return mCall != null && mCall.request().url().equals(url) && !mCall.isCanceled(); } } }