From f76de8da186798f3515000799e4fdacda6595d5f Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 18 Oct 2012 10:32:27 +0400 Subject: switch to cursor-backed list adapter --- src/org/fox/ttcomics/ComicListFragment.java | 132 ++++++++++++++++------------ src/org/fox/ttcomics/CommonActivity.java | 61 ++++++++++++- 2 files changed, 136 insertions(+), 57 deletions(-) (limited to 'src') diff --git a/src/org/fox/ttcomics/ComicListFragment.java b/src/org/fox/ttcomics/ComicListFragment.java index 324c7a0..566c9cb 100644 --- a/src/org/fox/ttcomics/ComicListFragment.java +++ b/src/org/fox/ttcomics/ComicListFragment.java @@ -10,6 +10,7 @@ import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; +import android.database.SQLException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; @@ -17,6 +18,7 @@ import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; +import android.support.v4.widget.SimpleCursorAdapter; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -36,11 +38,18 @@ import android.widget.TextView; public class ComicListFragment extends Fragment implements OnItemClickListener { private final String TAG = this.getClass().getSimpleName(); + + private final static int SIZE_DIR = -100; + + // corresponds to tab indexes + private final static int MODE_ALL = 0; + private final static int MODE_UNREAD = 1; + private final static int MODE_UNFINISHED = 2; + private final static int MODE_READ = 3; private CommonActivity m_activity; private SharedPreferences m_prefs; private ComicsListAdapter m_adapter; - private ArrayList m_files = new ArrayList(); private int m_mode = 0; private String m_baseDirectory = ""; @@ -58,23 +67,24 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { m_mode = mode; } - private class ComicsListAdapter extends ArrayAdapter { - private ArrayList items; - - public ComicsListAdapter(Context context, int textViewResourceId, ArrayList items) { - super(context, textViewResourceId, items); - this.items = items; + private class ComicsListAdapter extends SimpleCursorAdapter { + public ComicsListAdapter(Context context, int layout, Cursor c, + String[] from, int[] to, int flags) { + super(context, layout, c, from, to, flags); + // TODO Auto-generated constructor stub } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; - File file = new File(items.get(position)); - String fileBaseName = file.getName(); + Cursor c = (Cursor) getItem(position); + + String filePath = c.getString(c.getColumnIndex("path")); + String fileBaseName = c.getString(c.getColumnIndex("filename")); - int lastPos = m_activity.getLastPosition(file.getAbsolutePath()); - int size = m_activity.getSize(file.getAbsolutePath()); + int lastPos = m_activity.getLastPosition(filePath + "/" + fileBaseName); + int size = m_activity.getSize(filePath + "/" + fileBaseName); if (v == null) { LayoutInflater vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); @@ -93,7 +103,7 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { TextView info = (TextView) v.findViewById(R.id.file_progress_info); if (info != null) { - if (size != -1) { + if (size != -1 && size != SIZE_DIR) { info.setText(getString(R.string.file_progress_info, lastPos+1, size)); info.setVisibility(View.VISIBLE); } else { @@ -104,7 +114,7 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { ProgressBar progressBar = (ProgressBar) v.findViewById(R.id.file_progress_bar); if (progressBar != null) { - if (size != -1) { + if (size != -1 && size != SIZE_DIR) { progressBar.setMax(size-1); progressBar.setProgress(lastPos); progressBar.setVisibility(View.VISIBLE); @@ -113,7 +123,7 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { } } - File thumbnailFile = new File(m_activity.getCacheFileName(file.getAbsolutePath())); + File thumbnailFile = new File(m_activity.getCacheFileName(filePath + "/" + fileBaseName)); ImageView thumbnail = (ImageView) v.findViewById(R.id.thumbnail); @@ -150,10 +160,11 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { if (savedInstanceState != null) { m_mode = savedInstanceState.getInt("mode"); - m_files = savedInstanceState.getStringArrayList("files"); + //m_files = savedInstanceState.getStringArrayList("files"); } - m_adapter = new ComicsListAdapter(getActivity(), R.layout.comics_list_row, m_files); + m_adapter = new ComicsListAdapter(getActivity(), R.layout.comics_list_row, createCursor(), + new String[] { "filename" }, new int[] { R.id.file_name }, 0); if (view.findViewById(R.id.comics_list) != null) { ListView list = (ListView) view.findViewById(R.id.comics_list); @@ -192,7 +203,8 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item .getMenuInfo(); - String fileName = m_adapter.getItem(info.position); + Cursor c = (Cursor) m_adapter.getItem(info.position); + String fileName = c.getString(c.getColumnIndex("path")) + "/" + c.getString(c.getColumnIndex("filename")); switch (item.getItemId()) { case R.id.menu_reset_progress: @@ -216,9 +228,32 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { } } - public Cursor createCursor() { - return m_activity.getReadableDb().query("comics_cache", null, "path = ?", - new String[] { m_baseDirectory }, null, null, "filename"); + private Cursor createCursor() { + String baseDir = m_baseDirectory.length() == 0 ? m_prefs.getString("comics_directory", "") : m_baseDirectory; + + String selection; + String selectionArgs[]; + + switch (m_mode) { + case MODE_READ: + selection = "path = ? AND position = size - 1"; + selectionArgs = new String[] { baseDir }; + break; + case MODE_UNFINISHED: + selection = "path = ? AND position < size AND position > 0"; + selectionArgs = new String[] { baseDir }; + break; + case MODE_UNREAD: + selection = "path = ? AND position = 0 AND size != ?"; + selectionArgs = new String[] { baseDir, String.valueOf(SIZE_DIR) }; + break; + default: + selection = "path = ?"; + selectionArgs = new String[] { baseDir }; + } + + return m_activity.getReadableDb().query("comics_cache", null, selection, + selectionArgs, null, null, "size != " + SIZE_DIR + ", filename, size = " + SIZE_DIR + ", filename"); } @Override @@ -246,20 +281,19 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { String comicsDir = params[0]; File dir = new File(comicsDir); - - m_files.clear(); - + + int fileIndex = 0; + if (dir.isDirectory()) { File archives[] = dir.listFiles(); - int fileIndex = 0; java.util.Arrays.sort(archives); for (File archive : archives) { String filePath = archive.getAbsolutePath(); - if (archive.isDirectory() && m_mode == 0) { - m_files.add(filePath); + if (archive.isDirectory()) { + m_activity.setSize(filePath, SIZE_DIR); } else if (archive.getName().toLowerCase().matches(".*\\.(cbz|zip)") && isAdded() && m_activity != null && m_activity.getWritableDb() != null && m_activity.getWritableDb().isOpen()) { @@ -300,33 +334,12 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { m_activity.setSize(filePath, size); } } - - int lastPos = m_activity.getLastPosition(filePath); - - switch (m_mode) { - case 0: - m_files.add(filePath); - break; - case 1: - if (lastPos == 0) { - m_files.add(filePath); - } - break; - case 2: - if (lastPos > 0 && lastPos != size - 1) { - m_files.add(filePath); - } - break; - case 3: - if (lastPos == size - 1) { - m_files.add(filePath); - } - break; - } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); - } + } catch (SQLException e) { + e.printStackTrace(); + } } ++fileIndex; @@ -337,14 +350,16 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { if (isAdded() && m_activity != null) { m_activity.cleanupCache(false); + m_activity.cleanupSqliteCache(comicsDir); } - return m_files.size(); + return fileIndex; //m_files.size(); } @Override protected void onPostExecute(Integer result) { if (isAdded() && m_adapter != null) { + m_adapter.changeCursor(createCursor()); m_adapter.notifyDataSetChanged(); } } @@ -361,17 +376,22 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { public void onResume() { super.onResume(); - if (m_files.size() == 0) { + m_adapter.notifyDataSetChanged(); + + String comicsDir = m_prefs.getString("comics_directory", ""); + + if (m_activity.getCachedItemCount(m_baseDirectory.length() > 0 ? m_baseDirectory : comicsDir) != 0) { rescan(false); } else { m_adapter.notifyDataSetChanged(); - } + } } public void onItemClick(AdapterView av, View view, int position, long id) { - Log.d(TAG, "onItemClick position=" + position); + //Log.d(TAG, "onItemClick position=" + position); - String fileName = m_adapter.getItem(position); + Cursor c = (Cursor) m_adapter.getItem(position); + String fileName = c.getString(c.getColumnIndex("path")) + "/" + c.getString(c.getColumnIndex("filename")); if (fileName != null) { m_activity.onComicArchiveSelected(fileName); @@ -384,7 +404,7 @@ public class ComicListFragment extends Fragment implements OnItemClickListener { super.onSaveInstanceState(out); out.putInt("mode", m_mode); - out.putStringArrayList("files", m_files); + //out.putStringArrayList("files", m_files); } } diff --git a/src/org/fox/ttcomics/CommonActivity.java b/src/org/fox/ttcomics/CommonActivity.java index 52a10c2..d35777b 100644 --- a/src/org/fox/ttcomics/CommonActivity.java +++ b/src/org/fox/ttcomics/CommonActivity.java @@ -17,6 +17,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; +import android.provider.BaseColumns; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.Display; @@ -211,6 +212,26 @@ public class CommonActivity extends FragmentActivity { stmt.close(); } } + + public String getChecksum(String fileName) { + String checksum = null; + + File file = new File(fileName); + + Cursor c = getReadableDb().query("comics_cache", new String[] { "checksum" }, + "filename = ? AND path = ?", + new String[] { file.getName(), file.getParentFile().getAbsolutePath() }, null, null, null); + + if (c.moveToFirst()) { + checksum = c.getString(c.getColumnIndex("checksum")); + } + + c.close(); + + return checksum; + + } + public int getLastPosition(String fileName) { int position = 0; @@ -231,6 +252,18 @@ public class CommonActivity extends FragmentActivity { } + public int getCachedItemCount(String baseDir) { + Cursor c = getReadableDb().query("comics_cache", new String[] { "COUNT(*)" }, + "path = ?", + new String[] { baseDir }, null, null, null); + + c.moveToFirst(); + int count = c.getInt(0); + c.close(); + + return count; + } + public int getMaxPosition(String fileName) { int position = 0; @@ -264,7 +297,7 @@ public class CommonActivity extends FragmentActivity { c.close(); - Log.d(TAG, "getSize:" + fileName + "=" + size); + //Log.d(TAG, "getSize:" + fileName + "=" + size); return size; } @@ -455,4 +488,30 @@ public class CommonActivity extends FragmentActivity { } + public void cleanupSqliteCache(String baseDir) { + Cursor c = getReadableDb().query("comics_cache", null, + null, null, null, null, null); + + if (c.moveToFirst()) { + while (!c.isAfterLast()) { + int id = c.getInt(c.getColumnIndex(BaseColumns._ID)); + String fileName = c.getString(c.getColumnIndex("path")) + "/" + c.getString(c.getColumnIndex("filename")); + + File file = new File(fileName); + + if (!file.exists()) { + SQLiteStatement stmt = getWritableDb().compileStatement("DELETE FROM comics_cache WHERE " + BaseColumns._ID + " = ?"); + stmt.bindLong(1, id); + stmt.execute(); + } + + c.moveToNext(); + } + } + + c.close(); + + + } + } -- cgit v1.2.3