/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.buuuk.android.gallery; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.os.SystemClock; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import android.widget.Toast; import android.widget.AbsListView.OnScrollListener; import java.io.File; import java.io.FilenameFilter; import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; //Need the following import to get access to the app resources, since this //class is in a sub-package. import com.buuuk.android.util.FileUtils; import com.thankcreate.care.R; public class ImageGrid extends Activity implements OnScrollListener{ GridView mGrid; private static final String DIRECTORY = "/sdcard/"; private static final String DATA_DIRECTORY = "/sdcard/.ImageViewFlipper/"; private static final String DATA_FILE = "/sdcard/.ImageViewFlipper/imagelist.dat"; List<String> ImageList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); loadApps(); // do this in onresume? setContentView(R.layout.grid); mGrid = (GridView) findViewById(R.id.myGrid); mGrid.setOnScrollListener(this); File data_directory = new File(DATA_DIRECTORY); if (!data_directory.exists()) { if (data_directory.mkdir()) { FileUtils savedata = new FileUtils(); Toast toast = Toast.makeText(ImageGrid.this, "Please wait while we search your SD Card for images...", Toast.LENGTH_SHORT); toast.show(); SystemClock.sleep(100); ImageList = FindFiles(); savedata.saveArray(DATA_FILE, ImageList); } else { ImageList = FindFiles(); } } else { File data_file= new File(DATA_FILE); if (!data_file.exists()) { FileUtils savedata = new FileUtils(); Toast toast = Toast.makeText(ImageGrid.this, "Please wait while we search your SD Card for images...", Toast.LENGTH_SHORT); toast.show(); SystemClock.sleep(100); ImageList = FindFiles(); savedata.saveArray(DATA_FILE, ImageList); } else { FileUtils readdata = new FileUtils(); ImageList = readdata.loadArray(DATA_FILE); } } mAdapter = new AppsAdapter(); mGrid.setAdapter(mAdapter); mThumbnails = new HashMap<Integer,SoftReference<ImageView>>(); mThumbnailImages = new HashMap<Integer,SoftReference<Bitmap>>(); } private List<String> FindFiles() { final List<String> tFileList = new ArrayList<String>(); Resources resources = getResources(); // array of valid image file extensions String[] imageTypes = resources.getStringArray(R.array.image); FilenameFilter[] filter = new FilenameFilter[imageTypes.length]; int i = 0; for (final String type : imageTypes) { filter[i] = new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith("." + type); } }; i++; } FileUtils fileUtils = new FileUtils(); File[] allMatchingFiles = fileUtils.listFilesAsArray( new File(DIRECTORY), filter, -1); for (File f : allMatchingFiles) { tFileList.add(f.getAbsolutePath()); } return tFileList; } private List<ResolveInfo> mApps; private void loadApps() { Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); mApps = getPackageManager().queryIntentActivities(mainIntent, 0); } public AppsAdapter mAdapter; public class AppsAdapter extends BaseAdapter { public AppsAdapter() { map = new HashMap(); } public Map<Integer,SoftReference<Bitmap>> map; public View getView(final int position, View convertView, ViewGroup parent) { ImageView i; if (convertView == null) { i = new ImageView(ImageGrid.this); i.setScaleType(ImageView.ScaleType.FIT_CENTER); i.setLayoutParams(new GridView.LayoutParams(80, 80)); } else { i = (ImageView) convertView; } if(!mBusy && mThumbnailImages.containsKey(position) && mThumbnailImages.get(position).get()!=null) { i.setImageBitmap(mThumbnailImages.get(position).get()); } else { i.setImageBitmap(null); if(!mBusy)loadThumbnail(i,position); } i.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(ImageGrid.this, "Opening Image...", Toast.LENGTH_LONG).show(); // TODO Auto-generated method stub SharedPreferences indexPrefs = getSharedPreferences("currentIndex", MODE_PRIVATE); SharedPreferences.Editor indexEditor = indexPrefs.edit(); indexEditor.putInt("currentIndex", position); indexEditor.commit(); final Intent intent = new Intent(ImageGrid.this, ImageViewFlipper.class); startActivity(intent); } }); return i; } public final int getCount() { return ImageList.size(); } public final Object getItem(int position) { return ImageList.get(position); } public final long getItemId(int position) { return position; } } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } public boolean mBusy = false; public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { case OnScrollListener.SCROLL_STATE_IDLE: mBusy = false; mAdapter.notifyDataSetChanged(); break; case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: mBusy = true; // mStatus.setText("Touch scroll"); break; case OnScrollListener.SCROLL_STATE_FLING: mBusy = true; // mStatus.setText("Fling"); break; } } private Map<Integer,SoftReference<ImageView>> mThumbnails; private Map<Integer,SoftReference<Bitmap>> mThumbnailImages; private void loadThumbnail( ImageView iv, int position ){ mThumbnails.put(position,new SoftReference<ImageView>(iv)); try{new LoadThumbnailTask().execute(position);}catch(Exception e){} } public void onThumbnailLoaded( int position, Bitmap bm, LoadThumbnailTask t ){ Bitmap tn = bm; if( mThumbnails.get(position).get() != null && tn!=null) mThumbnails.get(position).get().setImageBitmap(tn); t.cancel(true); } public class LoadThumbnailTask extends AsyncTask<Integer, Void, Bitmap>{ private int position; @Override protected Bitmap doInBackground(Integer... params) { try{ position = params[0]; Bitmap bitmapOrg = BitmapFactory.decodeFile(ImageList.get(position)); int width = bitmapOrg.getWidth(); int height = bitmapOrg.getHeight(); //new width / height int newWidth = 80; int newHeight = 80; // calculate the scale float scaleWidth = (float) newWidth / width; float scaleHeight = (float) newHeight/ (height * scaleWidth) ; // create a matrix for the manipulation Matrix matrix = new Matrix(); // resize the bit map matrix.postScale(scaleWidth, scaleWidth); matrix.postScale(scaleHeight, scaleHeight); // recreate the new Bitmap and set it back Bitmap bm = Bitmap.createBitmap(bitmapOrg, 0, 0,width, height, matrix, true); mThumbnailImages.put(position, new SoftReference<Bitmap>(bm)); System.gc(); return bm; }catch(Exception e){ } return null; } protected void onPostExecute(Bitmap bm) { onThumbnailLoaded(position, bm, this); } } }