Switch to indeterminate progress bars

This commit is contained in:
Cameron Gutman 2016-08-13 14:42:03 -07:00
parent 96e98c1abb
commit ba605643bb
12 changed files with 72 additions and 41 deletions

View File

@ -26,7 +26,7 @@ public class AppGridAdapter extends GenericGridAdapter<AppView.AppObject> {
private final CachedAppAssetLoader loader; private final CachedAppAssetLoader loader;
public AppGridAdapter(Activity activity, boolean listMode, boolean small, ComputerDetails computer, String uniqueId) { public AppGridAdapter(Activity activity, boolean listMode, boolean small, ComputerDetails computer, String uniqueId) {
super(activity, listMode ? R.layout.simple_row : (small ? R.layout.app_grid_item_small : R.layout.app_grid_item), R.drawable.image_loading); super(activity, listMode ? R.layout.simple_row : (small ? R.layout.app_grid_item_small : R.layout.app_grid_item));
int dpi = activity.getResources().getDisplayMetrics().densityDpi; int dpi = activity.getResources().getDisplayMetrics().densityDpi;
int dp; int dp;
@ -51,9 +51,7 @@ public class AppGridAdapter extends GenericGridAdapter<AppView.AppObject> {
this.loader = new CachedAppAssetLoader(computer, scalingDivisor, this.loader = new CachedAppAssetLoader(computer, scalingDivisor,
new NetworkAssetLoader(context, uniqueId), new NetworkAssetLoader(context, uniqueId),
new MemoryAssetLoader(), new MemoryAssetLoader(),
new DiskAssetLoader(context.getCacheDir()), new DiskAssetLoader(context.getCacheDir()));
BitmapFactory.decodeResource(activity.getResources(),
R.drawable.image_loading, options));
} }
public void cancelQueuedOperations() { public void cancelQueuedOperations() {
@ -110,4 +108,9 @@ 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

@ -6,6 +6,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import com.limelight.R; import com.limelight.R;
@ -14,15 +15,13 @@ import java.util.ArrayList;
public abstract class GenericGridAdapter<T> extends BaseAdapter { public abstract class GenericGridAdapter<T> extends BaseAdapter {
protected final Context context; protected final Context context;
protected final int defaultImageRes;
protected final int layoutId; protected final int layoutId;
protected final ArrayList<T> itemList = new ArrayList<>(); protected final ArrayList<T> itemList = new ArrayList<>();
protected final LayoutInflater inflater; protected final LayoutInflater inflater;
public GenericGridAdapter(Context context, int layoutId, int defaultImageRes) { public GenericGridAdapter(Context context, int layoutId) {
this.context = context; this.context = context;
this.layoutId = layoutId; this.layoutId = layoutId;
this.defaultImageRes = defaultImageRes;
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} }
@ -49,6 +48,7 @@ public abstract class GenericGridAdapter<T> extends BaseAdapter {
public abstract boolean populateImageView(ImageView imgView, T obj); public abstract boolean populateImageView(ImageView imgView, 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) {
@ -59,10 +59,19 @@ public abstract class GenericGridAdapter<T> extends BaseAdapter {
ImageView imgView = (ImageView) convertView.findViewById(R.id.grid_image); ImageView imgView = (ImageView) convertView.findViewById(R.id.grid_image);
ImageView overlayView = (ImageView) convertView.findViewById(R.id.grid_overlay); ImageView overlayView = (ImageView) convertView.findViewById(R.id.grid_overlay);
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);
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, itemList.get(i))) {
imgView.setImageResource(defaultImageRes); imgView.setImageBitmap(null);
} }
} }
if (!populateTextView(txtView, itemList.get(i))) { if (!populateTextView(txtView, itemList.get(i))) {

View File

@ -14,7 +14,7 @@ import java.util.Comparator;
public class PcGridAdapter extends GenericGridAdapter<PcView.ComputerObject> { public class PcGridAdapter extends GenericGridAdapter<PcView.ComputerObject> {
public PcGridAdapter(Context context, boolean listMode, boolean small) { public PcGridAdapter(Context context, boolean listMode, boolean small) {
super(context, listMode ? R.layout.simple_row : (small ? R.layout.pc_grid_item_small : R.layout.pc_grid_item), R.drawable.computer); super(context, listMode ? R.layout.simple_row : (small ? R.layout.pc_grid_item_small : R.layout.pc_grid_item));
} }
public void addComputer(PcView.ComputerObject computer) { public void addComputer(PcView.ComputerObject computer) {
@ -37,20 +37,20 @@ public class PcGridAdapter extends GenericGridAdapter<PcView.ComputerObject> {
@Override @Override
public boolean populateImageView(ImageView imgView, PcView.ComputerObject obj) { public boolean populateImageView(ImageView imgView, PcView.ComputerObject obj) {
if (obj.details.reachability != ComputerDetails.Reachability.OFFLINE) { if (obj.details.state == ComputerDetails.State.ONLINE) {
imgView.setAlpha(1.0f); imgView.setAlpha(1.0f);
} }
else { else {
imgView.setAlpha(0.4f); imgView.setAlpha(0.4f);
} }
// Return false to use the default drawable imgView.setImageResource(R.drawable.computer);
return false; return true;
} }
@Override @Override
public boolean populateTextView(TextView txtView, PcView.ComputerObject obj) { public boolean populateTextView(TextView txtView, PcView.ComputerObject obj) {
if (obj.details.reachability != ComputerDetails.Reachability.OFFLINE) { if (obj.details.state == ComputerDetails.State.ONLINE) {
txtView.setAlpha(1.0f); txtView.setAlpha(1.0f);
} }
else { else {
@ -63,13 +63,13 @@ public class PcGridAdapter extends GenericGridAdapter<PcView.ComputerObject> {
@Override @Override
public boolean populateOverlayView(ImageView overlayView, PcView.ComputerObject obj) { public boolean populateOverlayView(ImageView overlayView, PcView.ComputerObject obj) {
if (obj.details.reachability == ComputerDetails.Reachability.UNKNOWN) {
// Still refreshing this PC so display the overlay
overlayView.setImageResource(R.drawable.image_loading);
return true;
}
// No overlay // No overlay
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

@ -53,13 +53,13 @@ public class CachedAppAssetLoader {
public CachedAppAssetLoader(ComputerDetails computer, double scalingDivider, public CachedAppAssetLoader(ComputerDetails computer, double scalingDivider,
NetworkAssetLoader networkLoader, MemoryAssetLoader memoryLoader, NetworkAssetLoader networkLoader, MemoryAssetLoader memoryLoader,
DiskAssetLoader diskLoader, Bitmap placeholderBitmap) { DiskAssetLoader diskLoader) {
this.computer = computer; this.computer = computer;
this.scalingDivider = scalingDivider; this.scalingDivider = scalingDivider;
this.networkLoader = networkLoader; this.networkLoader = networkLoader;
this.memoryLoader = memoryLoader; this.memoryLoader = memoryLoader;
this.diskLoader = diskLoader; this.diskLoader = diskLoader;
this.placeholderBitmap = placeholderBitmap; this.placeholderBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
} }
public void cancelBackgroundLoads() { public void cancelBackgroundLoads() {
@ -280,14 +280,14 @@ public class CachedAppAssetLoader {
}); });
} }
public void populateImageView(NvApp app, ImageView view) { public boolean populateImageView(NvApp app, ImageView view) {
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, view)) {
return; return true;
} }
// First, try the memory cache in the current context // First, try the memory cache in the current context
@ -296,7 +296,7 @@ public class CachedAppAssetLoader {
// Show the bitmap immediately // Show the bitmap immediately
view.setAlpha(1.0f); view.setAlpha(1.0f);
view.setImageBitmap(bmp); view.setImageBitmap(bmp);
return; 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
@ -308,6 +308,7 @@ public class CachedAppAssetLoader {
// Run the task on our foreground executor // Run the task on our foreground executor
task.executeOnExecutor(foregroundExecutor, tuple); task.executeOnExecutor(foregroundExecutor, tuple);
return false;
} }
public class LoaderTuple { public class LoaderTuple {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@ -15,18 +15,18 @@
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_centerHorizontal="true"> android:layout_centerHorizontal="true">
<ImageView <ProgressBar
android:id="@+id/pcs_loading" android:id="@+id/pcs_loading"
android:layout_width="75dp" android:layout_width="75dp"
android:layout_height="75dp" android:layout_height="75dp"
android:src="@drawable/image_loading"/> android:indeterminate="true"/>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_toRightOf="@+id/pcs_loading" android:layout_toRightOf="@+id/pcs_loading"
android:layout_toEndOf="@+id/pcs_loading" android:layout_toEndOf="@+id/pcs_loading"
android:layout_marginLeft="5dp" android:layout_marginLeft="10dp"
android:layout_marginStart="5dp" android:layout_marginStart="10dp"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:textAppearance="?android:attr/textAppearanceLarge" android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center" android:gravity="center"

View File

@ -15,18 +15,18 @@
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_centerHorizontal="true"> android:layout_centerHorizontal="true">
<ImageView <ProgressBar
android:id="@+id/pcs_loading" android:id="@+id/pcs_loading"
android:layout_width="75dp" android:layout_width="75dp"
android:layout_height="75dp" android:layout_height="75dp"
android:src="@drawable/image_loading"/> android:indeterminate="true"/>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_toRightOf="@+id/pcs_loading" android:layout_toRightOf="@+id/pcs_loading"
android:layout_toEndOf="@+id/pcs_loading" android:layout_toEndOf="@+id/pcs_loading"
android:layout_marginLeft="5dp" android:layout_marginLeft="10dp"
android:layout_marginStart="5dp" android:layout_marginStart="10dp"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:textAppearance="?android:attr/textAppearanceLarge" android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center" android:gravity="center"

View File

@ -8,6 +8,14 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/grid_spinner"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="75dp"
android:layout_height="75dp"
android:indeterminate="true">
</ProgressBar>
<ImageView <ImageView
android:id="@+id/grid_image" android:id="@+id/grid_image"
android:cropToPadding="false" android:cropToPadding="false"

View File

@ -8,6 +8,14 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/grid_spinner"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="50dp"
android:layout_height="50dp"
android:indeterminate="true">
</ProgressBar>
<ImageView <ImageView
android:id="@+id/grid_image" android:id="@+id/grid_image"
android:cropToPadding="false" android:cropToPadding="false"

View File

@ -13,16 +13,17 @@
android:layout_width="150dp" android:layout_width="150dp"
android:layout_height="100dp"> android:layout_height="100dp">
</ImageView> </ImageView>
<ImageView <ProgressBar
android:id="@+id/grid_overlay" android:id="@+id/grid_spinner"
android:layout_marginTop="15dp" android:layout_marginTop="15dp"
android:layout_marginLeft="65dp" android:layout_marginLeft="65dp"
android:layout_marginStart="65dp" android:layout_marginStart="65dp"
android:layout_marginRight="20dp" android:layout_marginRight="20dp"
android:layout_marginEnd="20dp" android:layout_marginEnd="20dp"
android:layout_width="50dp" android:layout_width="50dp"
android:layout_height="50dp"> android:layout_height="50dp"
</ImageView> android:indeterminate="true">
</ProgressBar>
</RelativeLayout> </RelativeLayout>
<TextView <TextView
android:id="@+id/grid_text" android:id="@+id/grid_text"

View File

@ -13,16 +13,17 @@
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="67dp"> android:layout_height="67dp">
</ImageView> </ImageView>
<ImageView <ProgressBar
android:id="@+id/grid_overlay" android:id="@+id/grid_spinner"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_marginLeft="42dp" android:layout_marginLeft="42dp"
android:layout_marginStart="42dp" android:layout_marginStart="42dp"
android:layout_marginRight="13dp" android:layout_marginRight="13dp"
android:layout_marginEnd="13dp" android:layout_marginEnd="13dp"
android:layout_width="33dp" android:layout_width="33dp"
android:layout_height="33dp"> android:layout_height="33dp"
</ImageView> android:indeterminate="true">
</ProgressBar>
</RelativeLayout> </RelativeLayout>
<TextView <TextView
android:id="@+id/grid_text" android:id="@+id/grid_text"

View File

@ -55,7 +55,7 @@
<!-- General strings --> <!-- General strings -->
<string name="ip_hint">IP address of GeForce PC</string> <string name="ip_hint">IP address of GeForce PC</string>
<string name="searching_pc">Searching for PCs…</string> <string name="searching_pc">Searching for PCs with GeForce Experience running</string>
<string name="yes">Yes</string> <string name="yes">Yes</string>
<string name="no">No</string> <string name="no">No</string>
<string name="lost_connection">Lost connection to PC</string> <string name="lost_connection">Lost connection to PC</string>