Only display box art progress bar if a network load is required

This commit is contained in:
Cameron Gutman 2016-09-20 12:11:06 -07:00
parent 37509cce9b
commit 239dd1d5a1
4 changed files with 49 additions and 39 deletions

View File

@ -3,6 +3,7 @@ package com.limelight.grid;
import android.app.Activity; import android.app.Activity;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import com.limelight.AppView; import com.limelight.AppView;
@ -82,9 +83,10 @@ public class AppGridAdapter extends GenericGridAdapter<AppView.AppObject> {
itemList.remove(app); itemList.remove(app);
} }
public boolean populateImageView(ImageView imgView, AppView.AppObject obj) { @Override
public boolean populateImageView(ImageView imgView, ProgressBar prgView, AppView.AppObject obj) {
// Let the cached asset loader handle it // Let the cached asset loader handle it
loader.populateImageView(obj.app, imgView); loader.populateImageView(obj.app, imgView, prgView);
return true; return true;
} }
@ -108,9 +110,4 @@ public class AppGridAdapter extends GenericGridAdapter<AppView.AppObject> {
// No overlay // No overlay
return false; return false;
} }
@Override
public boolean shouldShowProgressBar(AppView.AppObject obj) {
return true;
}
} }

View File

@ -45,10 +45,9 @@ public abstract class GenericGridAdapter<T> extends BaseAdapter {
return i; return i;
} }
public abstract boolean populateImageView(ImageView imgView, T obj); public abstract boolean populateImageView(ImageView imgView, ProgressBar prgView, T obj);
public abstract boolean populateTextView(TextView txtView, T obj); public abstract boolean populateTextView(TextView txtView, T obj);
public abstract boolean populateOverlayView(ImageView overlayView, T obj); public abstract boolean populateOverlayView(ImageView overlayView, T obj);
public abstract boolean shouldShowProgressBar(T obj);
@Override @Override
public View getView(int i, View convertView, ViewGroup viewGroup) { public View getView(int i, View convertView, ViewGroup viewGroup) {
@ -61,16 +60,8 @@ public abstract class GenericGridAdapter<T> extends BaseAdapter {
TextView txtView = (TextView) convertView.findViewById(R.id.grid_text); TextView txtView = (TextView) convertView.findViewById(R.id.grid_text);
ProgressBar prgView = (ProgressBar) convertView.findViewById(R.id.grid_spinner); ProgressBar prgView = (ProgressBar) convertView.findViewById(R.id.grid_spinner);
if (prgView != null) {
if (shouldShowProgressBar(itemList.get(i))) {
prgView.setVisibility(View.VISIBLE);
}
else {
prgView.setVisibility(View.INVISIBLE);
}
}
if (imgView != null) { if (imgView != null) {
if (!populateImageView(imgView, itemList.get(i))) { if (!populateImageView(imgView, prgView, itemList.get(i))) {
imgView.setImageBitmap(null); imgView.setImageBitmap(null);
} }
} }

View File

@ -1,7 +1,9 @@
package com.limelight.grid; package com.limelight.grid;
import android.content.Context; import android.content.Context;
import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import com.limelight.PcView; import com.limelight.PcView;
@ -36,7 +38,7 @@ public class PcGridAdapter extends GenericGridAdapter<PcView.ComputerObject> {
} }
@Override @Override
public boolean populateImageView(ImageView imgView, PcView.ComputerObject obj) { public boolean populateImageView(ImageView imgView, ProgressBar prgView, PcView.ComputerObject obj) {
if (obj.details.state == ComputerDetails.State.ONLINE) { if (obj.details.state == ComputerDetails.State.ONLINE) {
imgView.setAlpha(1.0f); imgView.setAlpha(1.0f);
} }
@ -44,6 +46,13 @@ public class PcGridAdapter extends GenericGridAdapter<PcView.ComputerObject> {
imgView.setAlpha(0.4f); imgView.setAlpha(0.4f);
} }
if (obj.details.reachability == ComputerDetails.Reachability.UNKNOWN) {
prgView.setVisibility(View.VISIBLE);
}
else {
prgView.setVisibility(View.INVISIBLE);
}
imgView.setImageResource(R.drawable.ic_computer); imgView.setImageResource(R.drawable.ic_computer);
return true; return true;
} }
@ -70,10 +79,4 @@ public class PcGridAdapter extends GenericGridAdapter<PcView.ComputerObject> {
} }
return false; return false;
} }
@Override
public boolean shouldShowProgressBar(PcView.ComputerObject obj) {
// Still refreshing this PC so display the progress bar
return obj.details.reachability == ComputerDetails.Reachability.UNKNOWN;
}
} }

View File

@ -5,7 +5,9 @@ import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar;
import com.limelight.nvstream.http.ComputerDetails; import com.limelight.nvstream.http.ComputerDetails;
import com.limelight.nvstream.http.NvApp; import com.limelight.nvstream.http.NvApp;
@ -130,12 +132,14 @@ public class CachedAppAssetLoader {
private class LoaderTask extends AsyncTask<LoaderTuple, Void, Bitmap> { private class LoaderTask extends AsyncTask<LoaderTuple, Void, Bitmap> {
private final WeakReference<ImageView> imageViewRef; private final WeakReference<ImageView> imageViewRef;
private final WeakReference<ProgressBar> progressViewRef;
private final boolean diskOnly; private final boolean diskOnly;
private LoaderTuple tuple; private LoaderTuple tuple;
public LoaderTask(ImageView imageView, boolean diskOnly) { public LoaderTask(ImageView imageView, ProgressBar prgView, boolean diskOnly) {
this.imageViewRef = new WeakReference<>(imageView); this.imageViewRef = new WeakReference<>(imageView);
this.progressViewRef = new WeakReference<>(prgView);
this.diskOnly = diskOnly; this.diskOnly = diskOnly;
} }
@ -143,8 +147,8 @@ public class CachedAppAssetLoader {
protected Bitmap doInBackground(LoaderTuple... params) { protected Bitmap doInBackground(LoaderTuple... params) {
tuple = params[0]; tuple = params[0];
// Check whether it has been cancelled or the image view is gone // Check whether it has been cancelled or the views are gone
if (isCancelled() || imageViewRef.get() == null) { if (isCancelled() || imageViewRef.get() == null || progressViewRef.get() == null) {
return null; return null;
} }
@ -177,11 +181,17 @@ public class CachedAppAssetLoader {
// If the current loader task for this view isn't us, do nothing // If the current loader task for this view isn't us, do nothing
final ImageView imageView = imageViewRef.get(); final ImageView imageView = imageViewRef.get();
final ProgressBar prgView = progressViewRef.get();
if (getLoaderTask(imageView) == this) { if (getLoaderTask(imageView) == this) {
// Now display the progress bar since we have to hit the network
if (prgView != null) {
prgView.setVisibility(View.VISIBLE);
}
// Set off another loader task on the network executor // Set off another loader task on the network executor
LoaderTask task = new LoaderTask(imageView, false); LoaderTask task = new LoaderTask(imageView, prgView, false);
AsyncDrawable asyncDrawable = new AsyncDrawable(imageView.getResources(), placeholderBitmap, task); AsyncDrawable asyncDrawable = new AsyncDrawable(imageView.getResources(), placeholderBitmap, task);
imageView.setAlpha(1.0f); imageView.setVisibility(View.VISIBLE);
imageView.setImageDrawable(asyncDrawable); imageView.setImageDrawable(asyncDrawable);
task.executeOnExecutor(networkExecutor, tuple); task.executeOnExecutor(networkExecutor, tuple);
} }
@ -195,14 +205,20 @@ public class CachedAppAssetLoader {
} }
final ImageView imageView = imageViewRef.get(); final ImageView imageView = imageViewRef.get();
final ProgressBar prgView = progressViewRef.get();
if (getLoaderTask(imageView) == this) { if (getLoaderTask(imageView) == this) {
// Set the bitmap // Set the bitmap
if (bitmap != null) { if (bitmap != null) {
imageView.setImageBitmap(bitmap); imageView.setImageBitmap(bitmap);
} }
// Hide the progress bar
if (prgView != null) {
prgView.setVisibility(View.INVISIBLE);
}
// Show the view // Show the view
imageView.setAlpha(1.0f); imageView.setVisibility(View.VISIBLE);
} }
} }
} }
@ -280,31 +296,34 @@ public class CachedAppAssetLoader {
}); });
} }
public boolean populateImageView(NvApp app, ImageView view) { public boolean populateImageView(NvApp app, ImageView imgView, ProgressBar prgView) {
LoaderTuple tuple = new LoaderTuple(computer, app); LoaderTuple tuple = new LoaderTuple(computer, app);
// If there's already a task in progress for this view, // If there's already a task in progress for this view,
// cancel it. If the task is already loading the same image, // cancel it. If the task is already loading the same image,
// we return and let that load finish. // we return and let that load finish.
if (!cancelPendingLoad(tuple, view)) { if (!cancelPendingLoad(tuple, imgView)) {
return true; return true;
} }
// Hide the progress bar always on initial load
prgView.setVisibility(View.INVISIBLE);
// First, try the memory cache in the current context // First, try the memory cache in the current context
Bitmap bmp = memoryLoader.loadBitmapFromCache(tuple); Bitmap bmp = memoryLoader.loadBitmapFromCache(tuple);
if (bmp != null) { if (bmp != null) {
// Show the bitmap immediately // Show the bitmap immediately
view.setAlpha(1.0f); imgView.setVisibility(View.VISIBLE);
view.setImageBitmap(bmp); imgView.setImageBitmap(bmp);
return true; return true;
} }
// If it's not in memory, create an async task to load it. This task will be attached // If it's not in memory, create an async task to load it. This task will be attached
// via AsyncDrawable to this view. // via AsyncDrawable to this view.
final LoaderTask task = new LoaderTask(view, true); final LoaderTask task = new LoaderTask(imgView, prgView, true);
final AsyncDrawable asyncDrawable = new AsyncDrawable(view.getResources(), placeholderBitmap, task); final AsyncDrawable asyncDrawable = new AsyncDrawable(imgView.getResources(), placeholderBitmap, task);
view.setAlpha(0.0f); imgView.setVisibility(View.INVISIBLE);
view.setImageDrawable(asyncDrawable); imgView.setImageDrawable(asyncDrawable);
// Run the task on our foreground executor // Run the task on our foreground executor
task.executeOnExecutor(foregroundExecutor, tuple); task.executeOnExecutor(foregroundExecutor, tuple);