package com.limelight.grid; import android.content.Context; import android.graphics.BitmapFactory; import android.view.View; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.limelight.AppView; import com.limelight.LimeLog; import com.limelight.R; import com.limelight.grid.assets.CachedAppAssetLoader; import com.limelight.grid.assets.DiskAssetLoader; import com.limelight.grid.assets.MemoryAssetLoader; import com.limelight.grid.assets.NetworkAssetLoader; import com.limelight.nvstream.http.ComputerDetails; import com.limelight.preferences.PreferenceConfiguration; import java.util.Collections; import java.util.Comparator; @SuppressWarnings("unchecked") public class AppGridAdapter extends GenericGridAdapter { private static final int ART_WIDTH_PX = 300; private static final int SMALL_WIDTH_DP = 100; private static final int LARGE_WIDTH_DP = 150; private final ComputerDetails computer; private final String uniqueId; private CachedAppAssetLoader loader; public AppGridAdapter(Context context, PreferenceConfiguration prefs, ComputerDetails computer, String uniqueId) { super(context, getLayoutIdForPreferences(prefs)); this.computer = computer; this.uniqueId = uniqueId; updateLayoutWithPreferences(context, prefs); } private static int getLayoutIdForPreferences(PreferenceConfiguration prefs) { if (prefs.listMode) { return R.layout.simple_row; } else if (prefs.smallIconMode) { return R.layout.app_grid_item_small; } else { return R.layout.app_grid_item; } } public void updateLayoutWithPreferences(Context context, PreferenceConfiguration prefs) { int dpi = context.getResources().getDisplayMetrics().densityDpi; int dp; if (prefs.smallIconMode) { dp = SMALL_WIDTH_DP; } else { dp = LARGE_WIDTH_DP; } double scalingDivisor = ART_WIDTH_PX / (dp * (dpi / 160.0)); if (scalingDivisor < 1.0) { // We don't want to make them bigger before draw-time scalingDivisor = 1.0; } LimeLog.info("Art scaling divisor: " + scalingDivisor); if (loader != null) { // Cancel operations on the old loader cancelQueuedOperations(); } this.loader = new CachedAppAssetLoader(computer, scalingDivisor, new NetworkAssetLoader(context, uniqueId), new MemoryAssetLoader(), new DiskAssetLoader(context), BitmapFactory.decodeResource(context.getResources(), R.drawable.no_app_image)); // This will trigger the view to reload with the new layout setLayoutId(getLayoutIdForPreferences(prefs)); } public void cancelQueuedOperations() { loader.cancelForegroundLoads(); loader.cancelBackgroundLoads(); loader.freeCacheMemory(); } private void sortList() { Collections.sort(itemList, new Comparator() { @Override public int compare(AppView.AppObject lhs, AppView.AppObject rhs) { return lhs.app.getAppName().toLowerCase().compareTo(rhs.app.getAppName().toLowerCase()); } }); } public void addApp(AppView.AppObject app) { // Queue a request to fetch this bitmap into cache loader.queueCacheLoad(app.app); // Add the app to our sorted list itemList.add(app); sortList(); } public void removeApp(AppView.AppObject app) { itemList.remove(app); } @Override public void populateView(ImageView imgView, ProgressBar prgView, TextView txtView, ImageView overlayView, AppView.AppObject obj) { // Let the cached asset loader handle it loader.populateImageView(obj.app, imgView, prgView); // Select the text view so it starts marquee mode txtView.setSelected(true); txtView.setText(obj.app.getAppName()); if (obj.isRunning) { // Show the play button overlay overlayView.setImageResource(R.drawable.ic_play); overlayView.setVisibility(View.VISIBLE); } else { overlayView.setVisibility(View.GONE); } } }