package au.com.newint.newinternationalist; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.v7.app.ActionBarActivity; import android.support.v4.app.Fragment; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.GridView; import java.util.ArrayList; public class MagazineArchiveActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_magazine_archive); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new MagazineArchiveFragment()) .commit(); } } @Override public void onResume() { super.onResume(); // Send Google Analytics if the user allows it Helpers.sendGoogleAnalytics(getResources().getString(R.string.title_activity_magazine_archive)); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_magazine_archive, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { Intent settingsIntent = new Intent(this, SettingsActivity.class); startActivity(settingsIntent); return true; } return super.onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view. */ public static class MagazineArchiveFragment extends Fragment { public MagazineArchiveFragment() { } ArrayList<Issue> magazines = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.fragment_magazine_archive, container, false); // Get Magazines magazines = Publisher.INSTANCE.getIssuesFromFilesystem(); // Setup the GridView GridView gridview = (GridView) rootView.findViewById(R.id.magazineArchiveGridView); gridview.setAdapter(new ImageAdapter(rootView.getContext())); gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { // On tap, move to magazine table of contents Intent tableOfContentsIntent = new Intent(rootView.getContext(), TableOfContentsActivity.class); // Pass issue through as a Parcel tableOfContentsIntent.putExtra("issue", magazines.get(position)); startActivity(tableOfContentsIntent); } }); return rootView; } public class ImageAdapter extends BaseAdapter { private Context mContext; private Bitmap mDefaultCoverBitmap; public ImageAdapter(Context c) { mContext = c; mDefaultCoverBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.home_cover); } public int getCount() { return Publisher.INSTANCE.numberOfIssues(); } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } // Get the cover size from resources int coverWidth = Math.round(getResources().getDimension(R.dimen.magazine_archive_column_width)); int coverHeight = Math.round(getResources().getDimension(R.dimen.magazine_archive_column_height)); // create a new ImageView for each item referenced by the Adapter public View getView(final int position, View convertView, ViewGroup parent) { final CachedImageView cachedImageView; if (convertView == null || !(convertView instanceof CachedImageView) ) { // if it's not recycled, initialize some attributes cachedImageView = new CachedImageView(mContext); cachedImageView.setLayoutParams(new GridView.LayoutParams(coverWidth, coverHeight)); // imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); cachedImageView.setPadding(0, 0, 0, 0); } else { cachedImageView = (CachedImageView) convertView; cachedImageView.setCacheStreamFactory(null); } // Get/set the cover for this view. if (magazines != null) { Issue issue = magazines.get(position); // Set default loading cover... cachedImageView.setImageBitmap(mDefaultCoverBitmap); final CacheStreamFactory cacheStreamFactory = issue.getCoverCacheStreamFactoryForSize(coverWidth); // tell the cached image view which CacheStreamFactory to expect a callback from cachedImageView.setCacheStreamFactory(cacheStreamFactory); final long callTime = System.nanoTime(); cacheStreamFactory.preload(new CacheStreamFactory.CachePreloadCallback() { @Override public void onLoad(byte[] payload) { if (payload==null) return; if (cachedImageView.hasCacheStreamFactory(cacheStreamFactory)) Helpers.debugLog("MagazineArchiveActivity", "getView->preload->onLoad: expected callback"); else { Helpers.debugLog("MagazineArchiveActivity", "getView->preload->onLoad: not expecting this callback"); return; } long returnTime = System.nanoTime(); final Bitmap coverBitmap = Helpers.bitmapDecode(payload); Helpers.debugLog("MagazineArchiveActivity", "onLoad delay: " + (returnTime - callTime)); // only fade in if the callback took longer than 5 ms if ((returnTime - callTime) < 5 * 1000 * 1000 * 1000) { cachedImageView.setImageBitmap(coverBitmap); } else { Animation fadeOutAnimation = new AlphaAnimation(1.0f, 0.0f); final Animation fadeInAnimation = new AlphaAnimation(0.0f, 1.0f); fadeOutAnimation.setDuration(100); fadeInAnimation.setDuration(200); fadeOutAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { cachedImageView.setImageBitmap(coverBitmap); cachedImageView.startAnimation(fadeInAnimation); } @Override public void onAnimationRepeat(Animation animation) { } }); cachedImageView.startAnimation(fadeOutAnimation); } } @Override public void onLoadBackground(byte[] payload) { } }); } return cachedImageView; } } } }