summaryrefslogtreecommitdiff
path: root/org.fox.ttcomics
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2015-06-12 12:08:47 +0300
committerAndrew Dolgov <[email protected]>2015-06-12 12:08:47 +0300
commit8c2e73b5344e1770a536cee6b9f88a2101791334 (patch)
tree47e4ac2091f728c31041c1760b4369779a49e408 /org.fox.ttcomics
parent4d1f07884c7ecf55cce1b5e4a9d2204a6b5e6232 (diff)
add icons & gpl license files
Diffstat (limited to 'org.fox.ttcomics')
-rwxr-xr-xorg.fox.ttcomics/src/main/AndroidManifest.xml140
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicFragment.java520
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicListFragment.java964
-rwxr-xr-xorg.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicPager.java464
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/CommonActivity.java582
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DatabaseHelper.java766
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DirectoryPicker.java346
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/MainActivity.java764
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/PreferencesFragment.java288
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ViewComicActivity.java682
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/archive/CbzComicArchive.java188
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/archive/ComicArchive.java58
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/sync/SyncClient.java408
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/sync/SyncFolderService.java246
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/ByteArrayImageDownloader.java58
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/CompatListActivity.java66
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/IVTViewPager.java76
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/NaturalOrderComparator.java380
-rwxr-xr-xorg.fox.ttcomics/src/main/res/layout/fragment_comics_pager.xml130
-rw-r--r--org.fox.ttcomics/src/main/res/xml/preferences.xml140
20 files changed, 3633 insertions, 3633 deletions
diff --git a/org.fox.ttcomics/src/main/AndroidManifest.xml b/org.fox.ttcomics/src/main/AndroidManifest.xml
index 293eec8..3b029f7 100755
--- a/org.fox.ttcomics/src/main/AndroidManifest.xml
+++ b/org.fox.ttcomics/src/main/AndroidManifest.xml
@@ -1,71 +1,71 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="org.fox.ttcomics2"
- android:versionCode="65"
- android:versionName="1.24" >
-
- <uses-sdk
- android:minSdkVersion="16"
- android:targetSdkVersion="21" />
-
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.GET_ACCOUNTS" />
- <uses-permission android:name="android.permission.INTERNET" />
-
- <application
- android:name="org.fox.ttcomics2.Application"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:hardwareAccelerated="true"
- android:largeHeap="true"
- android:allowBackup="true">
- <activity
- android:theme="@android:style/Theme.NoDisplay"
- android:name=".LaunchActivity"
- android:label="@string/title_activity_main" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
-
- <activity
- android:theme="@style/AppTheme"
- android:name=".MainActivity"
- android:label="@string/app_name">
- </activity>
-
- <activity
- android:theme="@style/AppTheme"
- android:name=".PreferencesActivity"
- android:label="@string/title_activity_preferences">
- </activity>
-
- <activity
- android:name=".ViewComicActivity"
- android:label="@string/title_activity_main">
- </activity>
-
- <activity
- android:name=".CommonActivity"
- android:label="@string/title_activity_main">
- </activity>
-
- <activity
- android:theme="@style/AppTheme"
- android:name=".DirectoryPicker"
- android:label="@string/title_activity_main">
- </activity>
-
- <activity android:name="org.acra.CrashReportDialog"
- android:theme="@style/DarkDialogTheme"
- android:launchMode="singleInstance"
- android:excludeFromRecents="true"
- android:finishOnTaskLaunch="true" />
-
- <service
- android:name=".sync.SyncFolderService"
- android:exported="false"/>
-
- </application>
-
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.fox.ttcomics2"
+ android:versionCode="65"
+ android:versionName="1.24" >
+
+ <uses-sdk
+ android:minSdkVersion="16"
+ android:targetSdkVersion="21" />
+
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.GET_ACCOUNTS" />
+ <uses-permission android:name="android.permission.INTERNET" />
+
+ <application
+ android:name="org.fox.ttcomics2.Application"
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:hardwareAccelerated="true"
+ android:largeHeap="true"
+ android:allowBackup="true">
+ <activity
+ android:theme="@android:style/Theme.NoDisplay"
+ android:name=".LaunchActivity"
+ android:label="@string/title_activity_main" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ <activity
+ android:theme="@style/AppTheme"
+ android:name=".MainActivity"
+ android:label="@string/app_name">
+ </activity>
+
+ <activity
+ android:theme="@style/AppTheme"
+ android:name=".PreferencesActivity"
+ android:label="@string/title_activity_preferences">
+ </activity>
+
+ <activity
+ android:name=".ViewComicActivity"
+ android:label="@string/title_activity_main">
+ </activity>
+
+ <activity
+ android:name=".CommonActivity"
+ android:label="@string/title_activity_main">
+ </activity>
+
+ <activity
+ android:theme="@style/AppTheme"
+ android:name=".DirectoryPicker"
+ android:label="@string/title_activity_main">
+ </activity>
+
+ <activity android:name="org.acra.CrashReportDialog"
+ android:theme="@style/DarkDialogTheme"
+ android:launchMode="singleInstance"
+ android:excludeFromRecents="true"
+ android:finishOnTaskLaunch="true" />
+
+ <service
+ android:name=".sync.SyncFolderService"
+ android:exported="false"/>
+
+ </application>
+
</manifest> \ No newline at end of file
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicFragment.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicFragment.java
index 4e07bd4..85e7537 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicFragment.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicFragment.java
@@ -1,260 +1,260 @@
-package org.fox.ttcomics2;
-
-
-import android.app.Activity;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.support.v4.app.Fragment;
-import android.support.v7.app.ActionBar;
-import android.view.GestureDetector;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.nostra13.universalimageloader.core.DisplayImageOptions;
-import com.nostra13.universalimageloader.core.ImageLoader;
-
-import org.fox.ttcomics2.archive.ComicArchive;
-
-import java.io.IOException;
-
-import it.sephiroth.android.library.imagezoom.ImageViewTouch;
-
-public class ComicFragment extends Fragment implements GestureDetector.OnDoubleTapListener {
- private final String TAG = this.getClass().getSimpleName();
-
- private SharedPreferences m_prefs;
- private int m_page;
- private ViewComicActivity m_activity;
- private GestureDetector m_detector;
- private boolean m_thumbnail = false;
- private ComicArchive m_archive;
-
- public ComicFragment() {
- super();
- }
-
- public void initialize(ComicArchive archive, int page) {
- m_archive = archive;
- m_page = page;
- }
-
- public void setPage(int page) {
- m_page = page;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-
- View view = inflater.inflate(R.layout.fragment_comic, container, false);
-
- final ImageViewTouch image = (ImageViewTouch) view.findViewById(R.id.comic_image);
-
- if (savedInstanceState != null) {
- m_page = savedInstanceState.getInt("page");
- m_thumbnail = savedInstanceState.getBoolean("thumbnail");
- m_archive = savedInstanceState.getParcelable("archive");
- }
-
- image.setFitToScreen(true);
-
- ImageLoader imageLoader = ImageLoader.getInstance();
-
- if (m_prefs.getBoolean("fit_to_width", false)) {
- image.setFitToWidth(true);
- }
-
- try {
- byte[] buf = m_archive.getByteArray(m_page);
-
- DisplayImageOptions options = new DisplayImageOptions.Builder()
- .showImageOnFail(R.drawable.badimage)
- .extraForDownloader(buf)
- .cacheOnDisk(false)
- .cacheInMemory(false)
- .build();
-
- imageLoader.displayImage("stream://" + m_page, image, options);
-
- } catch (IOException e) {
- image.setImageResource(R.drawable.badimage);
- e.printStackTrace();
- }
-
- image.setOnScaleChangedListener(new ImageViewTouch.OnScaleChangedListener() {
- @Override
- public void onScaleChanged(float scale) {
- // TODO: shared scale change?
- }
- });
-
- image.setOnTouchListener(new View.OnTouchListener() {
- @Override
- public boolean onTouch(View view, MotionEvent event) {
- return m_detector.onTouchEvent(event);
- }
- });
-
- //}
-
- /* TextView page = (TextView) view.findViewById(R.id.comic_page);
-
- if (page != null) {
- page.setText(String.valueOf(m_page+1));
- } */
-
- return view;
-
- }
-
- private void onLeftSideTapped() {
- ImageViewTouch image = (ImageViewTouch) getView().findViewById(R.id.comic_image);
-
- if (image != null) {
- boolean atLeftEdge = !image.canScroll(1);
-
- if (atLeftEdge) {
- m_activity.selectPreviousComic();
- }
- }
- }
-
- public boolean canScroll(int direction) {
- ImageViewTouch image = (ImageViewTouch) getView().findViewById(R.id.comic_image);
-
- if (image != null) {
- return image.canScroll(direction);
- } else {
- return false;
- }
- }
-
- private void onRightSideTapped() {
- ImageViewTouch image = (ImageViewTouch) getView().findViewById(R.id.comic_image);
-
- if (image != null) {
- boolean atRightEdge = !image.canScroll(-1);
-
- if (atRightEdge) {
- m_activity.selectNextComic();
- }
- }
- }
-
- @Override
- public void setUserVisibleHint(boolean isVisibleToUser) {
- super.setUserVisibleHint(isVisibleToUser);
-
- //setThumbnail(!isVisibleToUser); disabled
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
-
- m_prefs = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
- m_activity = (ViewComicActivity) activity;
-
- m_detector = new GestureDetector(m_activity, new GestureDetector.OnGestureListener() {
-
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void onShowPress(MotionEvent e) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
- float distanceY) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void onLongPress(MotionEvent e) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean onDown(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- });
-
- m_detector.setOnDoubleTapListener(this);
- }
-
- @Override
- public void onSaveInstanceState(Bundle out) {
- super.onSaveInstanceState(out);
- out.putInt("page", m_page);
- out.putBoolean("thumbnail", m_thumbnail);
- out.putParcelable("archive", m_archive);
- }
-
- @Override
- public boolean onDoubleTap(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean onDoubleTapEvent(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean onSingleTapConfirmed(MotionEvent e) {
-
- int width = getView().getWidth();
-
- int x = Math.round(e.getX());
-
- if (x <= width/10) {
- onLeftSideTapped();
- } else if (x >= width-(width/10)) {
- onRightSideTapped();
- } else {
- ActionBar bar = m_activity.getSupportActionBar();
-
- if (bar.isShowing()) {
- bar.hide();
- m_activity.hideSeekBar(true);
-
- if (m_prefs.getBoolean("use_full_screen", false)) {
- m_activity.hideSystemUI(true);
- }
-
- } else {
- m_activity.hideSeekBar(false);
-
- if (m_prefs.getBoolean("use_full_screen", false)) {
- m_activity.hideSystemUI(false);
- }
-
- bar.show();
- }
- }
-
- return false;
- }
-
-}
+package org.fox.ttcomics2;
+
+
+import android.app.Activity;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.support.v4.app.Fragment;
+import android.support.v7.app.ActionBar;
+import android.view.GestureDetector;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.nostra13.universalimageloader.core.DisplayImageOptions;
+import com.nostra13.universalimageloader.core.ImageLoader;
+
+import org.fox.ttcomics2.archive.ComicArchive;
+
+import java.io.IOException;
+
+import it.sephiroth.android.library.imagezoom.ImageViewTouch;
+
+public class ComicFragment extends Fragment implements GestureDetector.OnDoubleTapListener {
+ private final String TAG = this.getClass().getSimpleName();
+
+ private SharedPreferences m_prefs;
+ private int m_page;
+ private ViewComicActivity m_activity;
+ private GestureDetector m_detector;
+ private boolean m_thumbnail = false;
+ private ComicArchive m_archive;
+
+ public ComicFragment() {
+ super();
+ }
+
+ public void initialize(ComicArchive archive, int page) {
+ m_archive = archive;
+ m_page = page;
+ }
+
+ public void setPage(int page) {
+ m_page = page;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ View view = inflater.inflate(R.layout.fragment_comic, container, false);
+
+ final ImageViewTouch image = (ImageViewTouch) view.findViewById(R.id.comic_image);
+
+ if (savedInstanceState != null) {
+ m_page = savedInstanceState.getInt("page");
+ m_thumbnail = savedInstanceState.getBoolean("thumbnail");
+ m_archive = savedInstanceState.getParcelable("archive");
+ }
+
+ image.setFitToScreen(true);
+
+ ImageLoader imageLoader = ImageLoader.getInstance();
+
+ if (m_prefs.getBoolean("fit_to_width", false)) {
+ image.setFitToWidth(true);
+ }
+
+ try {
+ byte[] buf = m_archive.getByteArray(m_page);
+
+ DisplayImageOptions options = new DisplayImageOptions.Builder()
+ .showImageOnFail(R.drawable.badimage)
+ .extraForDownloader(buf)
+ .cacheOnDisk(false)
+ .cacheInMemory(false)
+ .build();
+
+ imageLoader.displayImage("stream://" + m_page, image, options);
+
+ } catch (IOException e) {
+ image.setImageResource(R.drawable.badimage);
+ e.printStackTrace();
+ }
+
+ image.setOnScaleChangedListener(new ImageViewTouch.OnScaleChangedListener() {
+ @Override
+ public void onScaleChanged(float scale) {
+ // TODO: shared scale change?
+ }
+ });
+
+ image.setOnTouchListener(new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View view, MotionEvent event) {
+ return m_detector.onTouchEvent(event);
+ }
+ });
+
+ //}
+
+ /* TextView page = (TextView) view.findViewById(R.id.comic_page);
+
+ if (page != null) {
+ page.setText(String.valueOf(m_page+1));
+ } */
+
+ return view;
+
+ }
+
+ private void onLeftSideTapped() {
+ ImageViewTouch image = (ImageViewTouch) getView().findViewById(R.id.comic_image);
+
+ if (image != null) {
+ boolean atLeftEdge = !image.canScroll(1);
+
+ if (atLeftEdge) {
+ m_activity.selectPreviousComic();
+ }
+ }
+ }
+
+ public boolean canScroll(int direction) {
+ ImageViewTouch image = (ImageViewTouch) getView().findViewById(R.id.comic_image);
+
+ if (image != null) {
+ return image.canScroll(direction);
+ } else {
+ return false;
+ }
+ }
+
+ private void onRightSideTapped() {
+ ImageViewTouch image = (ImageViewTouch) getView().findViewById(R.id.comic_image);
+
+ if (image != null) {
+ boolean atRightEdge = !image.canScroll(-1);
+
+ if (atRightEdge) {
+ m_activity.selectNextComic();
+ }
+ }
+ }
+
+ @Override
+ public void setUserVisibleHint(boolean isVisibleToUser) {
+ super.setUserVisibleHint(isVisibleToUser);
+
+ //setThumbnail(!isVisibleToUser); disabled
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+
+ m_prefs = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
+ m_activity = (ViewComicActivity) activity;
+
+ m_detector = new GestureDetector(m_activity, new GestureDetector.OnGestureListener() {
+
+ @Override
+ public boolean onSingleTapUp(MotionEvent e) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void onShowPress(MotionEvent e) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
+ float distanceY) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void onLongPress(MotionEvent e) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
+ float velocityY) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean onDown(MotionEvent e) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+ });
+
+ m_detector.setOnDoubleTapListener(this);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+ out.putInt("page", m_page);
+ out.putBoolean("thumbnail", m_thumbnail);
+ out.putParcelable("archive", m_archive);
+ }
+
+ @Override
+ public boolean onDoubleTap(MotionEvent e) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean onDoubleTapEvent(MotionEvent e) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean onSingleTapConfirmed(MotionEvent e) {
+
+ int width = getView().getWidth();
+
+ int x = Math.round(e.getX());
+
+ if (x <= width/10) {
+ onLeftSideTapped();
+ } else if (x >= width-(width/10)) {
+ onRightSideTapped();
+ } else {
+ ActionBar bar = m_activity.getSupportActionBar();
+
+ if (bar.isShowing()) {
+ bar.hide();
+ m_activity.hideSeekBar(true);
+
+ if (m_prefs.getBoolean("use_full_screen", false)) {
+ m_activity.hideSystemUI(true);
+ }
+
+ } else {
+ m_activity.hideSeekBar(false);
+
+ if (m_prefs.getBoolean("use_full_screen", false)) {
+ m_activity.hideSystemUI(false);
+ }
+
+ bar.show();
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicListFragment.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicListFragment.java
index 6f3a598..bec7a6f 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicListFragment.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicListFragment.java
@@ -1,482 +1,482 @@
-package org.fox.ttcomics2;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.provider.BaseColumns;
-import android.support.v4.app.Fragment;
-import android.support.v4.widget.SimpleCursorAdapter;
-import android.support.v4.widget.SwipeRefreshLayout;
-import android.util.Log;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AbsListView;
-import android.widget.AdapterView;
-import android.widget.AdapterView.AdapterContextMenuInfo;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ImageView;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.nhaarman.listviewanimations.appearance.AnimationAdapter;
-import com.nhaarman.listviewanimations.appearance.simple.ScaleInAnimationAdapter;
-import com.nostra13.universalimageloader.core.DisplayImageOptions;
-import com.nostra13.universalimageloader.core.ImageLoader;
-import com.nostra13.universalimageloader.core.process.BitmapProcessor;
-import com.shamanland.fab.FloatingActionButton;
-
-import java.io.File;
-
-import jp.co.recruit_mp.android.widget.HeaderFooterGridView;
-
-public class ComicListFragment extends Fragment implements OnItemClickListener {
- private final String TAG = this.getClass().getSimpleName();
-
- protected 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 MainActivity m_activity;
- private SharedPreferences m_prefs;
- private ComicsListAdapter m_adapter;
- private int m_mode = 0;
- private String m_baseDirectory = "";
- private SwipeRefreshLayout m_swipeLayout;
- private AnimationAdapter m_animationAdapter;
- private ImageLoader m_imageLoader = ImageLoader.getInstance();
-
- public ComicListFragment() {
- super();
- }
-
- public void setBaseDirectory(String baseDirectory) {
- m_baseDirectory = baseDirectory;
- }
-
- public void setMode(int mode) {
- m_mode = mode;
- }
-
- public void updateWithoutRescan() {
- if (m_adapter != null) {
- m_adapter.changeCursor(createCursor());
- //m_animationAdapter.reset();
- m_adapter.notifyDataSetChanged();
- }
- }
-
- public String getBaseDirectory() {
- return m_baseDirectory;
- }
-
- static class ComicsViewHolder {
- TextView name;
- TextView info;
- ProgressBar progressBar;
- ImageView overflow;
- ImageView thumbnail;
-
- public ComicsViewHolder(View v) {
- name = (TextView) v.findViewById(R.id.file_name);
- info = (TextView) v.findViewById(R.id.file_progress_info);
- progressBar = (ProgressBar) v.findViewById(R.id.file_progress_bar);
- overflow = (ImageView) v.findViewById(R.id.overflow);
- thumbnail = (ImageView) v.findViewById(R.id.thumbnail);
-
- }
-
- }
-
- private class ComicsListAdapter extends SimpleCursorAdapter {
-
- DisplayImageOptions m_imageOptions = new DisplayImageOptions.Builder()
- .cacheInMemory(true)
- .resetViewBeforeLoading(true)
- .postProcessor(new BitmapProcessor() {
- @Override
- public Bitmap process(Bitmap bmp) {
- int maxDimension = 400;
-
- if (Math.max(bmp.getHeight(), bmp.getWidth()) > maxDimension) {
- int newHeight;
- int newWidth;
-
- if (bmp.getHeight() > bmp.getWidth()) {
- newHeight = maxDimension;
- newWidth = (int)(bmp.getWidth() * (float)maxDimension / (float)bmp.getHeight());
- } else {
- newWidth = maxDimension;
- newHeight = (int)(bmp.getHeight() * (float)maxDimension / (float)bmp.getWidth());
- }
-
- return Bitmap.createScaledBitmap(bmp, newWidth, newHeight, true);
- } else {
- return bmp;
- }
- }
- })
- .cacheOnDisk(false)
- .build();
-
- 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;
-
- Cursor c = (Cursor) getItem(position);
-
- String filePath = c.getString(c.getColumnIndex("path"));
- String fileBaseName = c.getString(c.getColumnIndex("filename"));
- String firstChild = c.getString(c.getColumnIndex("firstchild"));
-
- int lastPos = c.getInt(c.getColumnIndex("position"));
- int size = c.getInt(c.getColumnIndex("size"));
-
- final ComicsViewHolder holder;
-
- if (convertView == null) {
- LayoutInflater vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
- convertView = vi.inflate(R.layout.comics_grid_row, null);
-
- holder = new ComicsViewHolder(convertView);
- convertView.setTag(holder);
- } else {
- holder = (ComicsViewHolder) convertView.getTag();
- }
-
- if (holder.name != null) {
- holder.name.setText(fileBaseName);
- }
-
- if (holder.info != null) {
- if (size != -1 && size != SIZE_DIR) {
- if (lastPos == size - 1) {
- holder.info.setText(getString(R.string.file_finished));
- } else if (lastPos > 0) {
- holder.info.setText(getString(R.string.file_progress_info, lastPos + 1, size, (int) (lastPos / (float) size * 100f)));
- } else {
- holder.info.setText(getString(R.string.file_unread, size));
- }
- holder.info.setVisibility(View.VISIBLE);
- } else if (size == SIZE_DIR) {
- holder.info.setText(getString(R.string.list_type_directory));
- holder.info.setVisibility(View.VISIBLE);
- } else {
- holder.info.setText(getString(R.string.list_type_unknown));
- holder.info.setVisibility(View.VISIBLE);
- }
- }
-
- if (holder.progressBar != null) {
- if (size != -1 && size != SIZE_DIR) {
- holder.progressBar.setMax(size - 1);
- holder.progressBar.setProgress(lastPos);
- holder.progressBar.setEnabled(true);
- holder.progressBar.setVisibility(View.VISIBLE);
- } else {
- holder.progressBar.setProgress(0);
- holder.progressBar.setMax(0);
- holder.progressBar.setEnabled(false);
- holder.progressBar.setVisibility(View.VISIBLE);
- }
- }
-
- if (holder.overflow != null) {
- if (size == SIZE_DIR) {
- holder.overflow.setImageResource(R.drawable.ic_folder);
-
- } else {
- holder.overflow.setImageResource(R.drawable.ic_dots_vertical);
-
- holder.overflow.setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- getActivity().openContextMenu(v);
- }
- });
- }
- }
-
- File thumbnailFile = new File(CommonActivity.getCacheFileName(m_activity, firstChild != null ? firstChild : filePath + "/" + fileBaseName));
-
- if (holder.thumbnail != null && thumbnailFile != null && thumbnailFile.exists()) {
-
- if (!thumbnailFile.getAbsolutePath().equals(holder.thumbnail.getTag())) {
-
- m_imageLoader.displayImage("file://" + thumbnailFile.getAbsolutePath(), holder.thumbnail, m_imageOptions);
- holder.thumbnail.setTag(thumbnailFile.getAbsolutePath());
- }
- } else {
- holder.thumbnail.setImageDrawable(null);
- }
-
- return convertView;
- }
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-
- View view = inflater.inflate(R.layout.fragment_comics_grid, container, false);
-
- if (savedInstanceState != null) {
- m_mode = savedInstanceState.getInt("mode");
- m_baseDirectory = savedInstanceState.getString("baseDir");
- }
-
- m_swipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.comics_swipe_container);
-
- m_swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
- @Override
- public void onRefresh() {
- rescan(true);
- }
- });
-
- m_swipeLayout.setColorScheme(android.R.color.holo_green_dark,
- android.R.color.holo_red_dark,
- android.R.color.holo_blue_dark,
- android.R.color.holo_orange_dark);
-
- m_adapter = new ComicsListAdapter(getActivity(), R.layout.comics_grid_row, createCursor(),
- new String[] { "filename" }, new int[] { R.id.file_name }, 0);
- m_animationAdapter = new ScaleInAnimationAdapter(m_adapter);
-
- HeaderFooterGridView grid = (HeaderFooterGridView) view.findViewById(R.id.comics_grid);
-
- FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
-
- if (m_prefs.getBoolean("enable_fab", true)) {
- fab.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- rescan(true);
- }
- });
-
- View footer = inflater.inflate(R.layout.comics_grid_footer, grid, false);
- grid.addFooterView(footer, null, false);
- } else {
- fab.setVisibility(View.GONE);
- }
-
- m_animationAdapter.setAbsListView(grid);
- grid.setAdapter(m_animationAdapter);
-
- //grid.setOnTouchListener(new ShowHideOnScroll(fab));
- grid.setOnScrollListener(new AbsListView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING || scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
- m_imageLoader.pause();
- } else {
- m_imageLoader.resume();
- }
- }
-
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
-
- }
- });
- //grid.setEmptyView(view.findViewById(R.id.no_comics));
- grid.setOnItemClickListener(this);
-
- registerForContextMenu(grid);
-
- return view;
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
-
- getActivity().getMenuInflater().inflate(R.menu.context_comic_archive, menu);
-
- AdapterContextMenuInfo info = (AdapterContextMenuInfo)menuInfo;
-
- Cursor c = (Cursor) m_adapter.getItem(info.position);
-
- if (c != null) {
- menu.setHeaderTitle(c.getString(c.getColumnIndex("filename")));
-
- int size = c.getInt(c.getColumnIndex("size"));
-
- if (size == SIZE_DIR) {
- menu.findItem(R.id.menu_mark_as_read).setEnabled(false);
- menu.findItem(R.id.menu_reset_progress).setEnabled(false);
- }
- }
-
- super.onCreateContextMenu(menu, v, menuInfo);
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
- .getMenuInfo();
-
- 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_open:
- if (fileName != null) {
- m_activity.onComicArchiveSelected(fileName);
- }
- return true;
- case R.id.menu_reset_progress:
- if (fileName != null) {
- m_activity.resetProgress(fileName);
- }
- return true;
- case R.id.menu_mark_as_read:
-
- if (fileName != null) {
-
- m_activity.m_databaseHelper.setLastPosition(fileName,
- m_activity.m_databaseHelper.getSize(fileName) - 1);
-
- updateWithoutRescan();
- }
-
- return true;
- default:
- Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
- return super.onContextItemSelected(item);
- }
- }
-
- private Cursor createCursor() {
- String selection;
- String selectionArgs[];
-
- switch (m_mode) {
- case MODE_READ:
- selection = "path = ? AND position = size - 1";
- selectionArgs = new String[] { m_baseDirectory };
- break;
- case MODE_UNFINISHED:
- selection = "path = ? AND position < size AND position > 0 AND position != size - 1";
- selectionArgs = new String[] { m_baseDirectory };
- break;
- case MODE_UNREAD:
- selection = "path = ? AND position = 0 AND size != ?";
- selectionArgs = new String[] { m_baseDirectory, String.valueOf(SIZE_DIR) };
- break;
- default:
- selection = "path = ?";
- selectionArgs = new String[] { m_baseDirectory };
- }
-
- return m_activity
- .m_databaseHelper
- .getReadableDatabase()
- .query("comics_cache", new String[]{BaseColumns._ID, "filename", "path", "position", "size",
- "(SELECT path || '/' || filename FROM comics_cache AS t2 WHERE t2.path = comics_cache.path || '/' " +
- "|| comics_cache.filename AND filename != '' ORDER BY filename LIMIT 1) AS firstchild"},
- selection, selectionArgs, null, null, "size != " + SIZE_DIR + ", filename, size = " + SIZE_DIR + ", filename");
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
-
- m_activity = (MainActivity)activity;
-
- m_prefs = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
- }
-
- protected void rescan(final boolean fullRescan) {
- if (m_swipeLayout != null) m_swipeLayout.setRefreshing(true);
-
- m_activity.m_databaseHelper.rescanDirectory(m_baseDirectory, fullRescan, new DatabaseHelper.DirectoryScanListener() {
-
- @Override
- public void onProgressUpdate(int progress, int max) {
- //
- }
-
- @Override
- public void onPostExecute(int result) {
- try {
- m_activity.cleanupCache(false);
-
- if (m_swipeLayout != null) m_swipeLayout.setRefreshing(false);
-
- updateWithoutRescan();
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- Log.d(TAG, "baseDir=" + m_baseDirectory);
-
- if (m_activity.getMode() != m_mode) {
- m_mode = m_activity.getMode();
- }
-
- if (m_activity.m_databaseHelper.getCachedItemCount(m_baseDirectory) == 0) {
- rescan(false);
- } else {
- updateWithoutRescan();
- }
-
- String comicsDir = m_prefs.getString("comics_directory", "");
-
- if (comicsDir.equals(m_baseDirectory)) {
- m_activity.setTitle(R.string.app_name);
- m_activity.getSupportActionBar().setDisplayHomeAsUpEnabled(false);
- } else {
- m_activity.setTitle(new File(m_baseDirectory).getName());
- m_activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- }
- }
-
- public void onItemClick(AdapterView<?> av, View view, int position, long id) {
- //Log.d(TAG, "onItemClick position=" + 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);
- }
- }
-
-
- @Override
- public void onSaveInstanceState(Bundle out) {
- super.onSaveInstanceState(out);
-
- out.putInt("mode", m_mode);
- out.putString("baseDir", m_baseDirectory);
- }
-
-}
+package org.fox.ttcomics2;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.provider.BaseColumns;
+import android.support.v4.app.Fragment;
+import android.support.v4.widget.SimpleCursorAdapter;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.util.Log;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.nhaarman.listviewanimations.appearance.AnimationAdapter;
+import com.nhaarman.listviewanimations.appearance.simple.ScaleInAnimationAdapter;
+import com.nostra13.universalimageloader.core.DisplayImageOptions;
+import com.nostra13.universalimageloader.core.ImageLoader;
+import com.nostra13.universalimageloader.core.process.BitmapProcessor;
+import com.shamanland.fab.FloatingActionButton;
+
+import java.io.File;
+
+import jp.co.recruit_mp.android.widget.HeaderFooterGridView;
+
+public class ComicListFragment extends Fragment implements OnItemClickListener {
+ private final String TAG = this.getClass().getSimpleName();
+
+ protected 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 MainActivity m_activity;
+ private SharedPreferences m_prefs;
+ private ComicsListAdapter m_adapter;
+ private int m_mode = 0;
+ private String m_baseDirectory = "";
+ private SwipeRefreshLayout m_swipeLayout;
+ private AnimationAdapter m_animationAdapter;
+ private ImageLoader m_imageLoader = ImageLoader.getInstance();
+
+ public ComicListFragment() {
+ super();
+ }
+
+ public void setBaseDirectory(String baseDirectory) {
+ m_baseDirectory = baseDirectory;
+ }
+
+ public void setMode(int mode) {
+ m_mode = mode;
+ }
+
+ public void updateWithoutRescan() {
+ if (m_adapter != null) {
+ m_adapter.changeCursor(createCursor());
+ //m_animationAdapter.reset();
+ m_adapter.notifyDataSetChanged();
+ }
+ }
+
+ public String getBaseDirectory() {
+ return m_baseDirectory;
+ }
+
+ static class ComicsViewHolder {
+ TextView name;
+ TextView info;
+ ProgressBar progressBar;
+ ImageView overflow;
+ ImageView thumbnail;
+
+ public ComicsViewHolder(View v) {
+ name = (TextView) v.findViewById(R.id.file_name);
+ info = (TextView) v.findViewById(R.id.file_progress_info);
+ progressBar = (ProgressBar) v.findViewById(R.id.file_progress_bar);
+ overflow = (ImageView) v.findViewById(R.id.overflow);
+ thumbnail = (ImageView) v.findViewById(R.id.thumbnail);
+
+ }
+
+ }
+
+ private class ComicsListAdapter extends SimpleCursorAdapter {
+
+ DisplayImageOptions m_imageOptions = new DisplayImageOptions.Builder()
+ .cacheInMemory(true)
+ .resetViewBeforeLoading(true)
+ .postProcessor(new BitmapProcessor() {
+ @Override
+ public Bitmap process(Bitmap bmp) {
+ int maxDimension = 400;
+
+ if (Math.max(bmp.getHeight(), bmp.getWidth()) > maxDimension) {
+ int newHeight;
+ int newWidth;
+
+ if (bmp.getHeight() > bmp.getWidth()) {
+ newHeight = maxDimension;
+ newWidth = (int)(bmp.getWidth() * (float)maxDimension / (float)bmp.getHeight());
+ } else {
+ newWidth = maxDimension;
+ newHeight = (int)(bmp.getHeight() * (float)maxDimension / (float)bmp.getWidth());
+ }
+
+ return Bitmap.createScaledBitmap(bmp, newWidth, newHeight, true);
+ } else {
+ return bmp;
+ }
+ }
+ })
+ .cacheOnDisk(false)
+ .build();
+
+ 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;
+
+ Cursor c = (Cursor) getItem(position);
+
+ String filePath = c.getString(c.getColumnIndex("path"));
+ String fileBaseName = c.getString(c.getColumnIndex("filename"));
+ String firstChild = c.getString(c.getColumnIndex("firstchild"));
+
+ int lastPos = c.getInt(c.getColumnIndex("position"));
+ int size = c.getInt(c.getColumnIndex("size"));
+
+ final ComicsViewHolder holder;
+
+ if (convertView == null) {
+ LayoutInflater vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ convertView = vi.inflate(R.layout.comics_grid_row, null);
+
+ holder = new ComicsViewHolder(convertView);
+ convertView.setTag(holder);
+ } else {
+ holder = (ComicsViewHolder) convertView.getTag();
+ }
+
+ if (holder.name != null) {
+ holder.name.setText(fileBaseName);
+ }
+
+ if (holder.info != null) {
+ if (size != -1 && size != SIZE_DIR) {
+ if (lastPos == size - 1) {
+ holder.info.setText(getString(R.string.file_finished));
+ } else if (lastPos > 0) {
+ holder.info.setText(getString(R.string.file_progress_info, lastPos + 1, size, (int) (lastPos / (float) size * 100f)));
+ } else {
+ holder.info.setText(getString(R.string.file_unread, size));
+ }
+ holder.info.setVisibility(View.VISIBLE);
+ } else if (size == SIZE_DIR) {
+ holder.info.setText(getString(R.string.list_type_directory));
+ holder.info.setVisibility(View.VISIBLE);
+ } else {
+ holder.info.setText(getString(R.string.list_type_unknown));
+ holder.info.setVisibility(View.VISIBLE);
+ }
+ }
+
+ if (holder.progressBar != null) {
+ if (size != -1 && size != SIZE_DIR) {
+ holder.progressBar.setMax(size - 1);
+ holder.progressBar.setProgress(lastPos);
+ holder.progressBar.setEnabled(true);
+ holder.progressBar.setVisibility(View.VISIBLE);
+ } else {
+ holder.progressBar.setProgress(0);
+ holder.progressBar.setMax(0);
+ holder.progressBar.setEnabled(false);
+ holder.progressBar.setVisibility(View.VISIBLE);
+ }
+ }
+
+ if (holder.overflow != null) {
+ if (size == SIZE_DIR) {
+ holder.overflow.setImageResource(R.drawable.ic_folder);
+
+ } else {
+ holder.overflow.setImageResource(R.drawable.ic_dots_vertical);
+
+ holder.overflow.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ getActivity().openContextMenu(v);
+ }
+ });
+ }
+ }
+
+ File thumbnailFile = new File(CommonActivity.getCacheFileName(m_activity, firstChild != null ? firstChild : filePath + "/" + fileBaseName));
+
+ if (holder.thumbnail != null && thumbnailFile != null && thumbnailFile.exists()) {
+
+ if (!thumbnailFile.getAbsolutePath().equals(holder.thumbnail.getTag())) {
+
+ m_imageLoader.displayImage("file://" + thumbnailFile.getAbsolutePath(), holder.thumbnail, m_imageOptions);
+ holder.thumbnail.setTag(thumbnailFile.getAbsolutePath());
+ }
+ } else {
+ holder.thumbnail.setImageDrawable(null);
+ }
+
+ return convertView;
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ View view = inflater.inflate(R.layout.fragment_comics_grid, container, false);
+
+ if (savedInstanceState != null) {
+ m_mode = savedInstanceState.getInt("mode");
+ m_baseDirectory = savedInstanceState.getString("baseDir");
+ }
+
+ m_swipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.comics_swipe_container);
+
+ m_swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+ @Override
+ public void onRefresh() {
+ rescan(true);
+ }
+ });
+
+ m_swipeLayout.setColorScheme(android.R.color.holo_green_dark,
+ android.R.color.holo_red_dark,
+ android.R.color.holo_blue_dark,
+ android.R.color.holo_orange_dark);
+
+ m_adapter = new ComicsListAdapter(getActivity(), R.layout.comics_grid_row, createCursor(),
+ new String[] { "filename" }, new int[] { R.id.file_name }, 0);
+ m_animationAdapter = new ScaleInAnimationAdapter(m_adapter);
+
+ HeaderFooterGridView grid = (HeaderFooterGridView) view.findViewById(R.id.comics_grid);
+
+ FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
+
+ if (m_prefs.getBoolean("enable_fab", true)) {
+ fab.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ rescan(true);
+ }
+ });
+
+ View footer = inflater.inflate(R.layout.comics_grid_footer, grid, false);
+ grid.addFooterView(footer, null, false);
+ } else {
+ fab.setVisibility(View.GONE);
+ }
+
+ m_animationAdapter.setAbsListView(grid);
+ grid.setAdapter(m_animationAdapter);
+
+ //grid.setOnTouchListener(new ShowHideOnScroll(fab));
+ grid.setOnScrollListener(new AbsListView.OnScrollListener() {
+ @Override
+ public void onScrollStateChanged(AbsListView view, int scrollState) {
+ if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING || scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
+ m_imageLoader.pause();
+ } else {
+ m_imageLoader.resume();
+ }
+ }
+
+ @Override
+ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+
+ }
+ });
+ //grid.setEmptyView(view.findViewById(R.id.no_comics));
+ grid.setOnItemClickListener(this);
+
+ registerForContextMenu(grid);
+
+ return view;
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v,
+ ContextMenuInfo menuInfo) {
+
+ getActivity().getMenuInflater().inflate(R.menu.context_comic_archive, menu);
+
+ AdapterContextMenuInfo info = (AdapterContextMenuInfo)menuInfo;
+
+ Cursor c = (Cursor) m_adapter.getItem(info.position);
+
+ if (c != null) {
+ menu.setHeaderTitle(c.getString(c.getColumnIndex("filename")));
+
+ int size = c.getInt(c.getColumnIndex("size"));
+
+ if (size == SIZE_DIR) {
+ menu.findItem(R.id.menu_mark_as_read).setEnabled(false);
+ menu.findItem(R.id.menu_reset_progress).setEnabled(false);
+ }
+ }
+
+ super.onCreateContextMenu(menu, v, menuInfo);
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
+ .getMenuInfo();
+
+ 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_open:
+ if (fileName != null) {
+ m_activity.onComicArchiveSelected(fileName);
+ }
+ return true;
+ case R.id.menu_reset_progress:
+ if (fileName != null) {
+ m_activity.resetProgress(fileName);
+ }
+ return true;
+ case R.id.menu_mark_as_read:
+
+ if (fileName != null) {
+
+ m_activity.m_databaseHelper.setLastPosition(fileName,
+ m_activity.m_databaseHelper.getSize(fileName) - 1);
+
+ updateWithoutRescan();
+ }
+
+ return true;
+ default:
+ Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
+ return super.onContextItemSelected(item);
+ }
+ }
+
+ private Cursor createCursor() {
+ String selection;
+ String selectionArgs[];
+
+ switch (m_mode) {
+ case MODE_READ:
+ selection = "path = ? AND position = size - 1";
+ selectionArgs = new String[] { m_baseDirectory };
+ break;
+ case MODE_UNFINISHED:
+ selection = "path = ? AND position < size AND position > 0 AND position != size - 1";
+ selectionArgs = new String[] { m_baseDirectory };
+ break;
+ case MODE_UNREAD:
+ selection = "path = ? AND position = 0 AND size != ?";
+ selectionArgs = new String[] { m_baseDirectory, String.valueOf(SIZE_DIR) };
+ break;
+ default:
+ selection = "path = ?";
+ selectionArgs = new String[] { m_baseDirectory };
+ }
+
+ return m_activity
+ .m_databaseHelper
+ .getReadableDatabase()
+ .query("comics_cache", new String[]{BaseColumns._ID, "filename", "path", "position", "size",
+ "(SELECT path || '/' || filename FROM comics_cache AS t2 WHERE t2.path = comics_cache.path || '/' " +
+ "|| comics_cache.filename AND filename != '' ORDER BY filename LIMIT 1) AS firstchild"},
+ selection, selectionArgs, null, null, "size != " + SIZE_DIR + ", filename, size = " + SIZE_DIR + ", filename");
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+
+ m_activity = (MainActivity)activity;
+
+ m_prefs = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
+ }
+
+ protected void rescan(final boolean fullRescan) {
+ if (m_swipeLayout != null) m_swipeLayout.setRefreshing(true);
+
+ m_activity.m_databaseHelper.rescanDirectory(m_baseDirectory, fullRescan, new DatabaseHelper.DirectoryScanListener() {
+
+ @Override
+ public void onProgressUpdate(int progress, int max) {
+ //
+ }
+
+ @Override
+ public void onPostExecute(int result) {
+ try {
+ m_activity.cleanupCache(false);
+
+ if (m_swipeLayout != null) m_swipeLayout.setRefreshing(false);
+
+ updateWithoutRescan();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ Log.d(TAG, "baseDir=" + m_baseDirectory);
+
+ if (m_activity.getMode() != m_mode) {
+ m_mode = m_activity.getMode();
+ }
+
+ if (m_activity.m_databaseHelper.getCachedItemCount(m_baseDirectory) == 0) {
+ rescan(false);
+ } else {
+ updateWithoutRescan();
+ }
+
+ String comicsDir = m_prefs.getString("comics_directory", "");
+
+ if (comicsDir.equals(m_baseDirectory)) {
+ m_activity.setTitle(R.string.app_name);
+ m_activity.getSupportActionBar().setDisplayHomeAsUpEnabled(false);
+ } else {
+ m_activity.setTitle(new File(m_baseDirectory).getName());
+ m_activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+ }
+
+ public void onItemClick(AdapterView<?> av, View view, int position, long id) {
+ //Log.d(TAG, "onItemClick position=" + 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);
+ }
+ }
+
+
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putInt("mode", m_mode);
+ out.putString("baseDir", m_baseDirectory);
+ }
+
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicPager.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicPager.java
index 4529384..022514e 100755
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicPager.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ComicPager.java
@@ -1,232 +1,232 @@
-package org.fox.ttcomics2;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.os.Handler;
-import android.preference.PreferenceManager;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentStatePagerAdapter;
-import android.support.v7.app.ActionBar;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import com.ToxicBakery.viewpager.transforms.DepthPageTransformer;
-
-import org.fox.ttcomics2.archive.CbzComicArchive;
-import org.fox.ttcomics2.archive.ComicArchive;
-import org.fox.ttcomics2.utils.IVTViewPager;
-
-import java.io.IOException;
-
-public class ComicPager extends Fragment {
- private String m_fileName;
- private SharedPreferences m_prefs;
- private final String TAG = this.getClass().getSimpleName();
- private ComicArchive m_archive;
- private CommonActivity m_activity;
- private SeekBar m_seekBar;
- private TextView m_currentPage;
- private TextView m_totalPages;
- private View m_bottomBar;
-
- public void hideReadingUI(boolean hide) {
- m_bottomBar.setVisibility(hide ? View.GONE : View.VISIBLE);
-
- ActionBar actionBar = m_activity.getSupportActionBar();
-
- if (hide)
- actionBar.hide();
- else
- actionBar.show();
-
- }
-
- private class PagerAdapter extends FragmentStatePagerAdapter {
- public PagerAdapter(FragmentManager fm) {
- super(fm);
- }
-
- @Override
- public Fragment getItem(int position) {
- ComicFragment cf = new ComicFragment();
- cf.initialize(m_archive, position);
-
- return cf;
- }
-
- @Override
- public int getCount() {
- return m_archive.getCount();
- }
- }
-
- private PagerAdapter m_adapter;
-
- public ComicPager() {
- super();
- }
-
- public ComicArchive getArchive() {
- return m_archive;
- }
-
- public int getCount() {
- return m_adapter.getCount();
- }
-
- public int getPosition() {
- IVTViewPager pager = (IVTViewPager) getView().findViewById(R.id.comics_pager);
-
- if (pager != null) {
- return pager.getCurrentItem();
- }
-
- return 0;
- }
-
- public String getFileName() {
- return m_fileName;
- }
-
- public void setCurrentItem(int item) {
- IVTViewPager pager = (IVTViewPager) getView().findViewById(R.id.comics_pager);
-
- if (pager != null) {
- try {
- pager.setCurrentItem(item);
- m_currentPage.setText(String.valueOf(item + 1));
- m_totalPages.setText(String.valueOf(m_archive.getCount()));
- } catch (IndexOutOfBoundsException e) {
- e.printStackTrace();
- }
- }
-
- }
-
- public void setFileName(String fileName) {
- m_fileName = fileName;
- }
-
- @SuppressLint("NewApi")
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-
- final View view = inflater.inflate(R.layout.fragment_comics_pager, container, false);
-
- m_adapter = new PagerAdapter(getActivity().getSupportFragmentManager());
-
- final IVTViewPager pager = (IVTViewPager) view.findViewById(R.id.comics_pager);
-
- if (savedInstanceState != null) {
- m_fileName = savedInstanceState.getString("fileName");
- }
-
- try {
- if (m_fileName.toLowerCase().matches(".*\\.(cbz|zip)")) {
- m_archive = new CbzComicArchive(m_fileName);
- }
-
- final int position = m_activity.m_databaseHelper.getLastPosition(m_fileName);
-
- m_currentPage = (TextView) view.findViewById(R.id.comics_page);
- m_totalPages = (TextView) view.findViewById(R.id.comics_total_pages);
-
- m_currentPage.setText(String.valueOf(position + 1));
- m_totalPages.setText(String.valueOf(m_archive.getCount()));
-
- m_bottomBar = view.findViewById(R.id.comics_bottom_bar);
-
- m_seekBar = (SeekBar) view.findViewById(R.id.comics_seek_bar);
- m_seekBar.setMax(m_archive.getCount() - 1);
- m_seekBar.setProgress(position);
- m_seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- if (fromUser) {
- setCurrentItem(progress);
- }
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- });
-
- pager.setAdapter(m_adapter);
- pager.setCurrentItem(position);
- pager.setPageTransformer(true, new DepthPageTransformer());
-
- m_activity.onComicSelected(m_fileName, position);
-
- if (m_prefs.getBoolean("use_full_screen", false)) {
- m_activity.hideSystemUI(true);
- }
-
- new Handler().postDelayed(new Runnable() {
- @Override
- public void run() {
- hideReadingUI(true);
- }
- }, 1000);
-
-
- } catch (IOException e) {
- m_activity.toast(R.string.error_could_not_open_comic_archive);
- e.printStackTrace();
- }
-
- pager.setOnPageChangeListener(new IVTViewPager.OnPageChangeListener() {
- public void onPageSelected(int position) {
-
- m_activity.onComicSelected(m_fileName, position);
- m_seekBar.setProgress(position);
- m_currentPage.setText(String.valueOf(position + 1));
-
- if (m_prefs.getBoolean("use_full_screen", false)) {
- m_activity.hideSystemUI(true);
- }
-
- hideReadingUI(true);
- }
-
- public void onPageScrolled(int arg0, float arg1, int arg2) {
- // TODO Auto-generated method stub
- }
-
- public void onPageScrollStateChanged(int arg0) {
- // TODO Auto-generated method stub
- }
- });
-
- return view;
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
-
- m_activity = (CommonActivity) activity;
-
- m_prefs = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
- }
-
- @Override
- public void onSaveInstanceState(Bundle out) {
- super.onSaveInstanceState(out);
-
- out.putString("fileName", m_fileName);
- }
-
-}
+package org.fox.ttcomics2;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Handler;
+import android.preference.PreferenceManager;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentStatePagerAdapter;
+import android.support.v7.app.ActionBar;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import com.ToxicBakery.viewpager.transforms.DepthPageTransformer;
+
+import org.fox.ttcomics2.archive.CbzComicArchive;
+import org.fox.ttcomics2.archive.ComicArchive;
+import org.fox.ttcomics2.utils.IVTViewPager;
+
+import java.io.IOException;
+
+public class ComicPager extends Fragment {
+ private String m_fileName;
+ private SharedPreferences m_prefs;
+ private final String TAG = this.getClass().getSimpleName();
+ private ComicArchive m_archive;
+ private CommonActivity m_activity;
+ private SeekBar m_seekBar;
+ private TextView m_currentPage;
+ private TextView m_totalPages;
+ private View m_bottomBar;
+
+ public void hideReadingUI(boolean hide) {
+ m_bottomBar.setVisibility(hide ? View.GONE : View.VISIBLE);
+
+ ActionBar actionBar = m_activity.getSupportActionBar();
+
+ if (hide)
+ actionBar.hide();
+ else
+ actionBar.show();
+
+ }
+
+ private class PagerAdapter extends FragmentStatePagerAdapter {
+ public PagerAdapter(FragmentManager fm) {
+ super(fm);
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ ComicFragment cf = new ComicFragment();
+ cf.initialize(m_archive, position);
+
+ return cf;
+ }
+
+ @Override
+ public int getCount() {
+ return m_archive.getCount();
+ }
+ }
+
+ private PagerAdapter m_adapter;
+
+ public ComicPager() {
+ super();
+ }
+
+ public ComicArchive getArchive() {
+ return m_archive;
+ }
+
+ public int getCount() {
+ return m_adapter.getCount();
+ }
+
+ public int getPosition() {
+ IVTViewPager pager = (IVTViewPager) getView().findViewById(R.id.comics_pager);
+
+ if (pager != null) {
+ return pager.getCurrentItem();
+ }
+
+ return 0;
+ }
+
+ public String getFileName() {
+ return m_fileName;
+ }
+
+ public void setCurrentItem(int item) {
+ IVTViewPager pager = (IVTViewPager) getView().findViewById(R.id.comics_pager);
+
+ if (pager != null) {
+ try {
+ pager.setCurrentItem(item);
+ m_currentPage.setText(String.valueOf(item + 1));
+ m_totalPages.setText(String.valueOf(m_archive.getCount()));
+ } catch (IndexOutOfBoundsException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+
+ public void setFileName(String fileName) {
+ m_fileName = fileName;
+ }
+
+ @SuppressLint("NewApi")
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ final View view = inflater.inflate(R.layout.fragment_comics_pager, container, false);
+
+ m_adapter = new PagerAdapter(getActivity().getSupportFragmentManager());
+
+ final IVTViewPager pager = (IVTViewPager) view.findViewById(R.id.comics_pager);
+
+ if (savedInstanceState != null) {
+ m_fileName = savedInstanceState.getString("fileName");
+ }
+
+ try {
+ if (m_fileName.toLowerCase().matches(".*\\.(cbz|zip)")) {
+ m_archive = new CbzComicArchive(m_fileName);
+ }
+
+ final int position = m_activity.m_databaseHelper.getLastPosition(m_fileName);
+
+ m_currentPage = (TextView) view.findViewById(R.id.comics_page);
+ m_totalPages = (TextView) view.findViewById(R.id.comics_total_pages);
+
+ m_currentPage.setText(String.valueOf(position + 1));
+ m_totalPages.setText(String.valueOf(m_archive.getCount()));
+
+ m_bottomBar = view.findViewById(R.id.comics_bottom_bar);
+
+ m_seekBar = (SeekBar) view.findViewById(R.id.comics_seek_bar);
+ m_seekBar.setMax(m_archive.getCount() - 1);
+ m_seekBar.setProgress(position);
+ m_seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ if (fromUser) {
+ setCurrentItem(progress);
+ }
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+
+ }
+ });
+
+ pager.setAdapter(m_adapter);
+ pager.setCurrentItem(position);
+ pager.setPageTransformer(true, new DepthPageTransformer());
+
+ m_activity.onComicSelected(m_fileName, position);
+
+ if (m_prefs.getBoolean("use_full_screen", false)) {
+ m_activity.hideSystemUI(true);
+ }
+
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ hideReadingUI(true);
+ }
+ }, 1000);
+
+
+ } catch (IOException e) {
+ m_activity.toast(R.string.error_could_not_open_comic_archive);
+ e.printStackTrace();
+ }
+
+ pager.setOnPageChangeListener(new IVTViewPager.OnPageChangeListener() {
+ public void onPageSelected(int position) {
+
+ m_activity.onComicSelected(m_fileName, position);
+ m_seekBar.setProgress(position);
+ m_currentPage.setText(String.valueOf(position + 1));
+
+ if (m_prefs.getBoolean("use_full_screen", false)) {
+ m_activity.hideSystemUI(true);
+ }
+
+ hideReadingUI(true);
+ }
+
+ public void onPageScrolled(int arg0, float arg1, int arg2) {
+ // TODO Auto-generated method stub
+ }
+
+ public void onPageScrollStateChanged(int arg0) {
+ // TODO Auto-generated method stub
+ }
+ });
+
+ return view;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+
+ m_activity = (CommonActivity) activity;
+
+ m_prefs = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putString("fileName", m_fileName);
+ }
+
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/CommonActivity.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/CommonActivity.java
index db9f4cc..e6191be 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/CommonActivity.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/CommonActivity.java
@@ -1,291 +1,291 @@
-package org.fox.ttcomics2;
-
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.os.Environment;
-import android.preference.PreferenceManager;
-import android.support.v7.app.AppCompatActivity;
-import android.util.Log;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.Toast;
-
-import com.nostra13.universalimageloader.core.DisplayImageOptions;
-import com.nostra13.universalimageloader.core.ImageLoader;
-import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
-
-import org.fox.ttcomics2.sync.SyncClient;
-import org.fox.ttcomics2.utils.ByteArrayImageDownloader;
-
-import java.io.File;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Date;
-
-public class CommonActivity extends AppCompatActivity {
- private final String TAG = this.getClass().getSimpleName();
-
- protected static final String FRAG_COMICS_PAGER = "comic_pager";
- protected static final String FRAG_COMICS_LIST = "comics_list";
-
- protected final static int REQUEST_SHARE = 1;
- protected static final int REQUEST_VIEWCOMIC = 2;
-
- protected SharedPreferences m_prefs;
- protected SyncClient m_syncClient = new SyncClient();
-
- protected DatabaseHelper m_databaseHelper;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- m_databaseHelper = DatabaseHelper.getInstance(this);
-
- if (!ImageLoader.getInstance().isInited()) {
-
- DisplayImageOptions options = new DisplayImageOptions.Builder()
- .cacheInMemory(true)
- .resetViewBeforeLoading(true)
- .cacheOnDisk(false)
- .build();
-
- ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
- .defaultDisplayImageOptions(options)
- .imageDownloader(new ByteArrayImageDownloader(this))
- .build();
-
- ImageLoader.getInstance().init(config);
- }
-
- m_prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
-
- initSync();
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- initSync();
- }
-
- private void initSync() {
- if (m_prefs.getBoolean("use_position_sync", false)) {
- String googleAccount = getGoogleAccount(this);
-
- if (googleAccount != null) {
- m_syncClient.setOwner(googleAccount);
- } else {
- if (BuildConfig.DEBUG) {
- m_syncClient.setOwner("TEST-ACCOUNT");
-
- //toast(R.string.sync_running_in_test_mode);
- } else {
- m_syncClient.setOwner(null);
- toast(R.string.error_sync_no_account);
-
- SharedPreferences.Editor editor = m_prefs.edit();
- editor.putBoolean("use_position_sync", false);
- editor.apply();
- }
- }
- } else {
- m_syncClient.setOwner(null);
- }
- }
-
- public void onComicArchiveSelected(String fileName) {
- //
- }
-
-
- public void onComicSelected(String fileName, int position) {
- m_databaseHelper.setLastPosition(fileName, position);
- }
-
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_settings:
- Intent intent = new Intent(CommonActivity.this,
- PreferencesActivity.class);
- startActivityForResult(intent, 0);
- return true;
- default:
- Log.d(TAG,
- "onOptionsItemSelected, unhandled id=" + item.getItemId());
- return super.onOptionsItemSelected(item);
- }
- }
-
- protected static String md5(String s) {
- try {
- MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
- digest.update(s.getBytes());
- byte messageDigest[] = digest.digest();
-
- StringBuffer hexString = new StringBuffer();
- for (int i=0; i<messageDigest.length; i++)
- hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
-
- return hexString.toString();
-
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
-
- return null;
- }
-
- public static String sha1(String s) {
- if (s != null) {
- try {
- MessageDigest digest = java.security.MessageDigest.getInstance("SHA1");
- digest.update(s.getBytes());
- byte messageDigest[] = digest.digest();
-
- StringBuffer hexString = new StringBuffer();
- for (int i=0; i<messageDigest.length; i++)
- hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
-
- return hexString.toString();
-
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- }
-
- return null;
- }
-
- public static String getCacheFileName(Context ctx, String fileName) {
- String hash = md5(fileName);
-
- File file = new File(ctx.getExternalCacheDir().getAbsolutePath() + "/" + hash + ".png");
-
- return file.getAbsolutePath();
- }
-
- public static String getGoogleAccount(Context ctx) {
- AccountManager manager = (AccountManager) ctx.getSystemService(ACCOUNT_SERVICE);
- Account[] list = manager.getAccounts();
-
- for (Account account: list) {
- if (account.type.equalsIgnoreCase("com.google")) {
- return account.name;
- }
- }
- return null;
- }
-
- public void toast(int msgId) {
- try {
- Toast toast = Toast.makeText(CommonActivity.this, msgId, Toast.LENGTH_SHORT);
- toast.show();
- } catch (RuntimeException e) {
- // might happen if UI lags
- }
- }
-
- public void toast(String msg) {
- try {
- Toast toast = Toast.makeText(CommonActivity.this, msg, Toast.LENGTH_SHORT);
- toast.show();
- } catch (RuntimeException e) {
- // might happen if UI lags
- }
- }
-
- public void cleanupCache(boolean deleteAll) {
- if (isStorageWritable()) {
- File cachePath = getExternalCacheDir();
-
- long now = new Date().getTime();
-
- if (cachePath.isDirectory()) {
- for (File file : cachePath.listFiles()) {
- if (deleteAll || now - file.lastModified() > 1000*60*60*24*7) {
- file.delete();
- }
- }
- }
- }
- }
-
- public static boolean isStorageAvailable() {
-
- String state = Environment.getExternalStorageState();
-
- return Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
- }
-
- public static boolean isStorageWritable() {
-
- String state = Environment.getExternalStorageState();
- return Environment.MEDIA_MOUNTED.equals(state);
- }
-
- /*public synchronized SQLiteDatabase getReadableDb() {
- return m_readableDb;
- }
-
- public synchronized SQLiteDatabase getWritableDb() {
- return m_writableDb;
- } */
-
- @Override
- public void onDestroy() {
- super.onDestroy();
-
-// m_readableDb.close();
-// m_writableDb.close();
- }
-
- public void selectPreviousComic() {
- ComicPager frag = (ComicPager) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_PAGER);
-
- if (frag != null && frag.isAdded() && frag.getPosition() > 0) {
- frag.setCurrentItem(frag.getPosition() - 1);
- }
- }
-
- public void selectNextComic() {
- ComicPager frag = (ComicPager) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_PAGER);
-
- if (frag != null && frag.isAdded() && frag.getPosition() < frag.getCount()-1) {
- frag.setCurrentItem(frag.getPosition() + 1);
- }
- }
-
-
- public void hideSystemUI(boolean hide) {
- View decorView = getWindow().getDecorView();
-
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
- if (hide) {
-
- decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
- | View.SYSTEM_UI_FLAG_FULLSCREEN
- | View.SYSTEM_UI_FLAG_IMMERSIVE);
-
- } else {
-
- decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
-
- }
- } else {
- if (hide) {
- decorView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);
- } else {
- decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
- }
- }
- }
-}
+package org.fox.ttcomics2;
+
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Environment;
+import android.preference.PreferenceManager;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Toast;
+
+import com.nostra13.universalimageloader.core.DisplayImageOptions;
+import com.nostra13.universalimageloader.core.ImageLoader;
+import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
+
+import org.fox.ttcomics2.sync.SyncClient;
+import org.fox.ttcomics2.utils.ByteArrayImageDownloader;
+
+import java.io.File;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Date;
+
+public class CommonActivity extends AppCompatActivity {
+ private final String TAG = this.getClass().getSimpleName();
+
+ protected static final String FRAG_COMICS_PAGER = "comic_pager";
+ protected static final String FRAG_COMICS_LIST = "comics_list";
+
+ protected final static int REQUEST_SHARE = 1;
+ protected static final int REQUEST_VIEWCOMIC = 2;
+
+ protected SharedPreferences m_prefs;
+ protected SyncClient m_syncClient = new SyncClient();
+
+ protected DatabaseHelper m_databaseHelper;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ m_databaseHelper = DatabaseHelper.getInstance(this);
+
+ if (!ImageLoader.getInstance().isInited()) {
+
+ DisplayImageOptions options = new DisplayImageOptions.Builder()
+ .cacheInMemory(true)
+ .resetViewBeforeLoading(true)
+ .cacheOnDisk(false)
+ .build();
+
+ ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
+ .defaultDisplayImageOptions(options)
+ .imageDownloader(new ByteArrayImageDownloader(this))
+ .build();
+
+ ImageLoader.getInstance().init(config);
+ }
+
+ m_prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+
+ initSync();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ initSync();
+ }
+
+ private void initSync() {
+ if (m_prefs.getBoolean("use_position_sync", false)) {
+ String googleAccount = getGoogleAccount(this);
+
+ if (googleAccount != null) {
+ m_syncClient.setOwner(googleAccount);
+ } else {
+ if (BuildConfig.DEBUG) {
+ m_syncClient.setOwner("TEST-ACCOUNT");
+
+ //toast(R.string.sync_running_in_test_mode);
+ } else {
+ m_syncClient.setOwner(null);
+ toast(R.string.error_sync_no_account);
+
+ SharedPreferences.Editor editor = m_prefs.edit();
+ editor.putBoolean("use_position_sync", false);
+ editor.apply();
+ }
+ }
+ } else {
+ m_syncClient.setOwner(null);
+ }
+ }
+
+ public void onComicArchiveSelected(String fileName) {
+ //
+ }
+
+
+ public void onComicSelected(String fileName, int position) {
+ m_databaseHelper.setLastPosition(fileName, position);
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_settings:
+ Intent intent = new Intent(CommonActivity.this,
+ PreferencesActivity.class);
+ startActivityForResult(intent, 0);
+ return true;
+ default:
+ Log.d(TAG,
+ "onOptionsItemSelected, unhandled id=" + item.getItemId());
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ protected static String md5(String s) {
+ try {
+ MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
+ digest.update(s.getBytes());
+ byte messageDigest[] = digest.digest();
+
+ StringBuffer hexString = new StringBuffer();
+ for (int i=0; i<messageDigest.length; i++)
+ hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
+
+ return hexString.toString();
+
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+ public static String sha1(String s) {
+ if (s != null) {
+ try {
+ MessageDigest digest = java.security.MessageDigest.getInstance("SHA1");
+ digest.update(s.getBytes());
+ byte messageDigest[] = digest.digest();
+
+ StringBuffer hexString = new StringBuffer();
+ for (int i=0; i<messageDigest.length; i++)
+ hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
+
+ return hexString.toString();
+
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ }
+
+ return null;
+ }
+
+ public static String getCacheFileName(Context ctx, String fileName) {
+ String hash = md5(fileName);
+
+ File file = new File(ctx.getExternalCacheDir().getAbsolutePath() + "/" + hash + ".png");
+
+ return file.getAbsolutePath();
+ }
+
+ public static String getGoogleAccount(Context ctx) {
+ AccountManager manager = (AccountManager) ctx.getSystemService(ACCOUNT_SERVICE);
+ Account[] list = manager.getAccounts();
+
+ for (Account account: list) {
+ if (account.type.equalsIgnoreCase("com.google")) {
+ return account.name;
+ }
+ }
+ return null;
+ }
+
+ public void toast(int msgId) {
+ try {
+ Toast toast = Toast.makeText(CommonActivity.this, msgId, Toast.LENGTH_SHORT);
+ toast.show();
+ } catch (RuntimeException e) {
+ // might happen if UI lags
+ }
+ }
+
+ public void toast(String msg) {
+ try {
+ Toast toast = Toast.makeText(CommonActivity.this, msg, Toast.LENGTH_SHORT);
+ toast.show();
+ } catch (RuntimeException e) {
+ // might happen if UI lags
+ }
+ }
+
+ public void cleanupCache(boolean deleteAll) {
+ if (isStorageWritable()) {
+ File cachePath = getExternalCacheDir();
+
+ long now = new Date().getTime();
+
+ if (cachePath.isDirectory()) {
+ for (File file : cachePath.listFiles()) {
+ if (deleteAll || now - file.lastModified() > 1000*60*60*24*7) {
+ file.delete();
+ }
+ }
+ }
+ }
+ }
+
+ public static boolean isStorageAvailable() {
+
+ String state = Environment.getExternalStorageState();
+
+ return Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
+ }
+
+ public static boolean isStorageWritable() {
+
+ String state = Environment.getExternalStorageState();
+ return Environment.MEDIA_MOUNTED.equals(state);
+ }
+
+ /*public synchronized SQLiteDatabase getReadableDb() {
+ return m_readableDb;
+ }
+
+ public synchronized SQLiteDatabase getWritableDb() {
+ return m_writableDb;
+ } */
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+
+// m_readableDb.close();
+// m_writableDb.close();
+ }
+
+ public void selectPreviousComic() {
+ ComicPager frag = (ComicPager) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_PAGER);
+
+ if (frag != null && frag.isAdded() && frag.getPosition() > 0) {
+ frag.setCurrentItem(frag.getPosition() - 1);
+ }
+ }
+
+ public void selectNextComic() {
+ ComicPager frag = (ComicPager) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_PAGER);
+
+ if (frag != null && frag.isAdded() && frag.getPosition() < frag.getCount()-1) {
+ frag.setCurrentItem(frag.getPosition() + 1);
+ }
+ }
+
+
+ public void hideSystemUI(boolean hide) {
+ View decorView = getWindow().getDecorView();
+
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
+ if (hide) {
+
+ decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_IMMERSIVE);
+
+ } else {
+
+ decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+
+ }
+ } else {
+ if (hide) {
+ decorView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);
+ } else {
+ decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+ }
+ }
+ }
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DatabaseHelper.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DatabaseHelper.java
index 749a82a..a07614e 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DatabaseHelper.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DatabaseHelper.java
@@ -1,383 +1,383 @@
-package org.fox.ttcomics2;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.database.SQLException;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.database.sqlite.SQLiteStatement;
-import android.os.AsyncTask;
-import android.provider.BaseColumns;
-
-import org.fox.ttcomics2.archive.CbzComicArchive;
-import org.fox.ttcomics2.archive.ComicArchive;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-public class DatabaseHelper extends SQLiteOpenHelper {
-
- public static final String DATABASE_NAME = "ComicsCache.db";
- public static final int DATABASE_VERSION = 2;
- private Context m_context;
- private static DatabaseHelper m_instance;
-
- public static synchronized DatabaseHelper getInstance(Context context) {
-
- if (m_instance == null) {
- m_instance = new DatabaseHelper(context.getApplicationContext());
- }
-
- return m_instance;
- }
-
- public interface DirectoryScanListener {
- void onProgressUpdate(int progress, int max);
- void onPostExecute(int result);
- }
-
- private DatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
- m_context = context;
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- db.execSQL("DROP TABLE IF EXISTS comics_cache;");
-
- db.execSQL("CREATE TABLE IF NOT EXISTS comics_cache (" +
- BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
- "filename TEXT, " +
- "path TEXT, " + //v2
- "checksum TEXT, " + //v2
- "size INTEGER, " +
- "position INTEGER, " +
- "max_position INTEGER" +
- ");");
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- if (oldVersion == 1 && newVersion == 2) {
-
- db.execSQL("ALTER TABLE comics_cache ADD COLUMN path TEXT;");
- db.execSQL("ALTER TABLE comics_cache ADD COLUMN checksum TEXT;");
-
- Cursor c = db.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("filename"));
-
- File file = new File(fileName);
-
- SQLiteStatement stmt = db.compileStatement("UPDATE comics_cache SET filename = ?, path = ? WHERE " + BaseColumns._ID + " = ?");
- stmt.bindString(1, file.getName());
- stmt.bindString(2, file.getParentFile().getAbsolutePath());
- stmt.bindLong(3, id);
- stmt.execute();
-
- c.moveToNext();
- }
- }
-
- c.close();
- }
- }
-
- public Cursor findComicByFileName(String fileName) {
- File file = new File(fileName);
-
- if (getWritableDatabase() == null)
- return null;
-
- Cursor c = getWritableDatabase().query("comics_cache", null,
- "filename = ? AND path = ?",
- new String[]{file.getName(), file.getParentFile().getAbsolutePath()}, null, null, null);
-
- if (c.moveToFirst()) {
- return c;
- } else {
- c.close();
-
- SQLiteStatement stmt = getWritableDatabase().compileStatement("INSERT INTO comics_cache " +
- "(filename, path, position, max_position, size, checksum) VALUES (?, ?, 0, 0, -1, '')");
- stmt.bindString(1, file.getName());
- stmt.bindString(2, file.getParentFile().getAbsolutePath());
- stmt.execute();
-
- c = getWritableDatabase().query("comics_cache", null,
- "filename = ? AND path = ?",
- new String[] { file.getName(), file.getParentFile().getAbsolutePath() }, null, null, null);
-
- if (c.moveToFirst()) {
- return c;
- } else {
- c.close();
- }
- }
-
- return null;
- }
-
- public void setSize(String fileName, int size) {
- Cursor c = findComicByFileName(fileName);
-
- if (c != null) {
- c.close();
-
- File file = new File(fileName);
-
- SQLiteStatement stmt = getWritableDatabase().compileStatement("UPDATE comics_cache SET size = ? WHERE filename = ? AND path = ?");
- stmt.bindLong(1, size);
- stmt.bindString(2, file.getName());
- stmt.bindString(3, file.getParentFile().getAbsolutePath());
- stmt.execute();
- stmt.close();
- }
- }
-
- public void setLastPosition(String fileName, int position) {
- int lastPosition = getLastPosition(fileName);
-
- Cursor c = findComicByFileName(fileName);
-
- if (c != null) {
- c.close();
-
- File file = new File(fileName);
-
- SQLiteStatement stmt = getWritableDatabase().compileStatement("UPDATE comics_cache SET position = ?, max_position = ? WHERE filename = ? AND path = ?");
- stmt.bindLong(1, position);
- stmt.bindLong(2, Math.max(position, lastPosition));
- stmt.bindString(3, file.getName());
- stmt.bindString(4, file.getParentFile().getAbsolutePath());
- stmt.execute();
- stmt.close();
- }
-
- }
-
- public void setLastMaxPosition(String fileName, int position) {
-
- Cursor c = findComicByFileName(fileName);
-
- if (c != null) {
- c.close();
-
- File file = new File(fileName);
-
- SQLiteStatement stmt = getWritableDatabase().compileStatement("UPDATE comics_cache SET max_position = ? WHERE filename = ? AND path = ?");
- stmt.bindLong(1, position);
- stmt.bindString(2, file.getName());
- stmt.bindString(3, file.getParentFile().getAbsolutePath());
- stmt.execute();
- stmt.close();
- }
- }
-
- public int getLastPosition(String fileName) {
- int position = 0;
-
- File file = new File(fileName);
-
- Cursor c = getWritableDatabase().query("comics_cache", new String[]{"position"},
- "filename = ? AND path = ?",
- new String[]{file.getName(), file.getParentFile().getAbsolutePath()}, null, null, null);
-
- if (c.moveToFirst()) {
- position = c.getInt(c.getColumnIndex("position"));
- }
-
- c.close();
-
- return position;
-
- }
-
- public int getCachedItemCount(String baseDir) {
- Cursor c = getWritableDatabase().query("comics_cache", new String[] { "COUNT(*)" },
- "path = ?",
- new String[] { baseDir }, null, null, null);
-
- c.moveToFirst();
- int count = c.getInt(0);
- c.close();
-
- //Log.d(TAG, "getCachedItemCount:" + baseDir + "=" + count);
-
- return count;
- }
-
- public int getMaxPosition(String fileName) {
- int position = 0;
-
- File file = new File(fileName);
-
- Cursor c = getWritableDatabase().query("comics_cache", new String[]{"max_position"},
- "filename = ? AND path = ?",
- new String[]{file.getName(), file.getParentFile().getAbsolutePath()}, null, null, null);
-
- if (c.moveToFirst()) {
- position = c.getInt(c.getColumnIndex("max_position"));
- }
-
- c.close();
-
- return position;
- }
-
- public int getSize(String fileName) {
- int size = -1;
-
- File file = new File(fileName);
-
- Cursor c = getWritableDatabase().query("comics_cache", new String[] { "size" },
- "filename = ? AND path = ?",
- new String[] { file.getName(), file.getParentFile().getAbsolutePath() }, null, null, null);
-
- if (c.moveToFirst()) {
- size = c.getInt(c.getColumnIndex("size"));
- }
-
- c.close();
-
- //Log.d(TAG, "getSize:" + fileName + "=" + size);
-
- return size;
- }
-
- public void cleanupSqliteCache(String baseDir) {
- Cursor c = getWritableDatabase().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 = getWritableDatabase().compileStatement("DELETE FROM comics_cache WHERE " + BaseColumns._ID + " = ?");
- stmt.bindLong(1, id);
- stmt.execute();
- }
-
- c.moveToNext();
- }
- }
-
- c.close();
- }
-
- public void rescanDirectory(String comicsDir, final boolean fullRescan, final DirectoryScanListener listener) {
-
- AsyncTask<String, Integer, Integer> task = new AsyncTask<String, Integer, Integer>() {
-
- @Override
- protected void onProgressUpdate(Integer... progress) {
- listener.onProgressUpdate(progress[0], progress[1]);
- }
-
- @Override
- protected void onPostExecute(Integer result) {
- listener.onPostExecute(result);
- }
-
- @Override
- protected Integer doInBackground(String... params) {
- try {
-
- String comicsDir = params[0];
- File dir = new File(comicsDir);
-
- int fileIndex = 0;
-
- if (dir.isDirectory()) {
- File archives[] = dir.listFiles();
-
- java.util.Arrays.sort(archives);
-
- for (File archive : archives) {
- String filePath = archive.getAbsolutePath();
-
- if (archive.isDirectory()) {
- setSize(filePath, ComicListFragment.SIZE_DIR);
-
- } else if (archive.getName().toLowerCase().matches(".*\\.(cbz|zip)")) {
- try {
- int size = getSize(filePath);
-
- if (size == -1 || fullRescan) {
-
- ComicArchive cba = null;
-
- if (archive.getName().toLowerCase().matches(".*\\.(cbz|zip)")) {
- cba = new CbzComicArchive(filePath);
- }
-
- if (cba != null && cba.getCount() > 0) {
- // Get cover
-
- try {
- File thumbnailFile = new File(CommonActivity.getCacheFileName(m_context, filePath));
-
- if (CommonActivity.isStorageWritable() && (!thumbnailFile.exists() || fullRescan)) {
- InputStream is = cba.getItem(0);
-
- if (is != null) {
- FileOutputStream fos = new FileOutputStream(thumbnailFile);
-
- byte[] buffer = new byte[1024];
- int len;
- while ((len = is.read(buffer)) != -1) {
- fos.write(buffer, 0, len);
- }
-
- fos.close();
- is.close();
- }
- }
-
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- size = cba.getCount();
-
- setSize(filePath, size);
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- ++fileIndex;
-
- publishProgress(Integer.valueOf(fileIndex), Integer.valueOf(archives.length));
- }
- }
-
- cleanupSqliteCache(comicsDir);
-
- return fileIndex;
-
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- return 0;
- }
- };
-
- task.execute(comicsDir);
- }
-}
+package org.fox.ttcomics2;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteStatement;
+import android.os.AsyncTask;
+import android.provider.BaseColumns;
+
+import org.fox.ttcomics2.archive.CbzComicArchive;
+import org.fox.ttcomics2.archive.ComicArchive;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class DatabaseHelper extends SQLiteOpenHelper {
+
+ public static final String DATABASE_NAME = "ComicsCache.db";
+ public static final int DATABASE_VERSION = 2;
+ private Context m_context;
+ private static DatabaseHelper m_instance;
+
+ public static synchronized DatabaseHelper getInstance(Context context) {
+
+ if (m_instance == null) {
+ m_instance = new DatabaseHelper(context.getApplicationContext());
+ }
+
+ return m_instance;
+ }
+
+ public interface DirectoryScanListener {
+ void onProgressUpdate(int progress, int max);
+ void onPostExecute(int result);
+ }
+
+ private DatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ m_context = context;
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.execSQL("DROP TABLE IF EXISTS comics_cache;");
+
+ db.execSQL("CREATE TABLE IF NOT EXISTS comics_cache (" +
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "filename TEXT, " +
+ "path TEXT, " + //v2
+ "checksum TEXT, " + //v2
+ "size INTEGER, " +
+ "position INTEGER, " +
+ "max_position INTEGER" +
+ ");");
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ if (oldVersion == 1 && newVersion == 2) {
+
+ db.execSQL("ALTER TABLE comics_cache ADD COLUMN path TEXT;");
+ db.execSQL("ALTER TABLE comics_cache ADD COLUMN checksum TEXT;");
+
+ Cursor c = db.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("filename"));
+
+ File file = new File(fileName);
+
+ SQLiteStatement stmt = db.compileStatement("UPDATE comics_cache SET filename = ?, path = ? WHERE " + BaseColumns._ID + " = ?");
+ stmt.bindString(1, file.getName());
+ stmt.bindString(2, file.getParentFile().getAbsolutePath());
+ stmt.bindLong(3, id);
+ stmt.execute();
+
+ c.moveToNext();
+ }
+ }
+
+ c.close();
+ }
+ }
+
+ public Cursor findComicByFileName(String fileName) {
+ File file = new File(fileName);
+
+ if (getWritableDatabase() == null)
+ return null;
+
+ Cursor c = getWritableDatabase().query("comics_cache", null,
+ "filename = ? AND path = ?",
+ new String[]{file.getName(), file.getParentFile().getAbsolutePath()}, null, null, null);
+
+ if (c.moveToFirst()) {
+ return c;
+ } else {
+ c.close();
+
+ SQLiteStatement stmt = getWritableDatabase().compileStatement("INSERT INTO comics_cache " +
+ "(filename, path, position, max_position, size, checksum) VALUES (?, ?, 0, 0, -1, '')");
+ stmt.bindString(1, file.getName());
+ stmt.bindString(2, file.getParentFile().getAbsolutePath());
+ stmt.execute();
+
+ c = getWritableDatabase().query("comics_cache", null,
+ "filename = ? AND path = ?",
+ new String[] { file.getName(), file.getParentFile().getAbsolutePath() }, null, null, null);
+
+ if (c.moveToFirst()) {
+ return c;
+ } else {
+ c.close();
+ }
+ }
+
+ return null;
+ }
+
+ public void setSize(String fileName, int size) {
+ Cursor c = findComicByFileName(fileName);
+
+ if (c != null) {
+ c.close();
+
+ File file = new File(fileName);
+
+ SQLiteStatement stmt = getWritableDatabase().compileStatement("UPDATE comics_cache SET size = ? WHERE filename = ? AND path = ?");
+ stmt.bindLong(1, size);
+ stmt.bindString(2, file.getName());
+ stmt.bindString(3, file.getParentFile().getAbsolutePath());
+ stmt.execute();
+ stmt.close();
+ }
+ }
+
+ public void setLastPosition(String fileName, int position) {
+ int lastPosition = getLastPosition(fileName);
+
+ Cursor c = findComicByFileName(fileName);
+
+ if (c != null) {
+ c.close();
+
+ File file = new File(fileName);
+
+ SQLiteStatement stmt = getWritableDatabase().compileStatement("UPDATE comics_cache SET position = ?, max_position = ? WHERE filename = ? AND path = ?");
+ stmt.bindLong(1, position);
+ stmt.bindLong(2, Math.max(position, lastPosition));
+ stmt.bindString(3, file.getName());
+ stmt.bindString(4, file.getParentFile().getAbsolutePath());
+ stmt.execute();
+ stmt.close();
+ }
+
+ }
+
+ public void setLastMaxPosition(String fileName, int position) {
+
+ Cursor c = findComicByFileName(fileName);
+
+ if (c != null) {
+ c.close();
+
+ File file = new File(fileName);
+
+ SQLiteStatement stmt = getWritableDatabase().compileStatement("UPDATE comics_cache SET max_position = ? WHERE filename = ? AND path = ?");
+ stmt.bindLong(1, position);
+ stmt.bindString(2, file.getName());
+ stmt.bindString(3, file.getParentFile().getAbsolutePath());
+ stmt.execute();
+ stmt.close();
+ }
+ }
+
+ public int getLastPosition(String fileName) {
+ int position = 0;
+
+ File file = new File(fileName);
+
+ Cursor c = getWritableDatabase().query("comics_cache", new String[]{"position"},
+ "filename = ? AND path = ?",
+ new String[]{file.getName(), file.getParentFile().getAbsolutePath()}, null, null, null);
+
+ if (c.moveToFirst()) {
+ position = c.getInt(c.getColumnIndex("position"));
+ }
+
+ c.close();
+
+ return position;
+
+ }
+
+ public int getCachedItemCount(String baseDir) {
+ Cursor c = getWritableDatabase().query("comics_cache", new String[] { "COUNT(*)" },
+ "path = ?",
+ new String[] { baseDir }, null, null, null);
+
+ c.moveToFirst();
+ int count = c.getInt(0);
+ c.close();
+
+ //Log.d(TAG, "getCachedItemCount:" + baseDir + "=" + count);
+
+ return count;
+ }
+
+ public int getMaxPosition(String fileName) {
+ int position = 0;
+
+ File file = new File(fileName);
+
+ Cursor c = getWritableDatabase().query("comics_cache", new String[]{"max_position"},
+ "filename = ? AND path = ?",
+ new String[]{file.getName(), file.getParentFile().getAbsolutePath()}, null, null, null);
+
+ if (c.moveToFirst()) {
+ position = c.getInt(c.getColumnIndex("max_position"));
+ }
+
+ c.close();
+
+ return position;
+ }
+
+ public int getSize(String fileName) {
+ int size = -1;
+
+ File file = new File(fileName);
+
+ Cursor c = getWritableDatabase().query("comics_cache", new String[] { "size" },
+ "filename = ? AND path = ?",
+ new String[] { file.getName(), file.getParentFile().getAbsolutePath() }, null, null, null);
+
+ if (c.moveToFirst()) {
+ size = c.getInt(c.getColumnIndex("size"));
+ }
+
+ c.close();
+
+ //Log.d(TAG, "getSize:" + fileName + "=" + size);
+
+ return size;
+ }
+
+ public void cleanupSqliteCache(String baseDir) {
+ Cursor c = getWritableDatabase().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 = getWritableDatabase().compileStatement("DELETE FROM comics_cache WHERE " + BaseColumns._ID + " = ?");
+ stmt.bindLong(1, id);
+ stmt.execute();
+ }
+
+ c.moveToNext();
+ }
+ }
+
+ c.close();
+ }
+
+ public void rescanDirectory(String comicsDir, final boolean fullRescan, final DirectoryScanListener listener) {
+
+ AsyncTask<String, Integer, Integer> task = new AsyncTask<String, Integer, Integer>() {
+
+ @Override
+ protected void onProgressUpdate(Integer... progress) {
+ listener.onProgressUpdate(progress[0], progress[1]);
+ }
+
+ @Override
+ protected void onPostExecute(Integer result) {
+ listener.onPostExecute(result);
+ }
+
+ @Override
+ protected Integer doInBackground(String... params) {
+ try {
+
+ String comicsDir = params[0];
+ File dir = new File(comicsDir);
+
+ int fileIndex = 0;
+
+ if (dir.isDirectory()) {
+ File archives[] = dir.listFiles();
+
+ java.util.Arrays.sort(archives);
+
+ for (File archive : archives) {
+ String filePath = archive.getAbsolutePath();
+
+ if (archive.isDirectory()) {
+ setSize(filePath, ComicListFragment.SIZE_DIR);
+
+ } else if (archive.getName().toLowerCase().matches(".*\\.(cbz|zip)")) {
+ try {
+ int size = getSize(filePath);
+
+ if (size == -1 || fullRescan) {
+
+ ComicArchive cba = null;
+
+ if (archive.getName().toLowerCase().matches(".*\\.(cbz|zip)")) {
+ cba = new CbzComicArchive(filePath);
+ }
+
+ if (cba != null && cba.getCount() > 0) {
+ // Get cover
+
+ try {
+ File thumbnailFile = new File(CommonActivity.getCacheFileName(m_context, filePath));
+
+ if (CommonActivity.isStorageWritable() && (!thumbnailFile.exists() || fullRescan)) {
+ InputStream is = cba.getItem(0);
+
+ if (is != null) {
+ FileOutputStream fos = new FileOutputStream(thumbnailFile);
+
+ byte[] buffer = new byte[1024];
+ int len;
+ while ((len = is.read(buffer)) != -1) {
+ fos.write(buffer, 0, len);
+ }
+
+ fos.close();
+ is.close();
+ }
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ size = cba.getCount();
+
+ setSize(filePath, size);
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ ++fileIndex;
+
+ publishProgress(Integer.valueOf(fileIndex), Integer.valueOf(archives.length));
+ }
+ }
+
+ cleanupSqliteCache(comicsDir);
+
+ return fileIndex;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return 0;
+ }
+ };
+
+ task.execute(comicsDir);
+ }
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DirectoryPicker.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DirectoryPicker.java
index 2a602bd..30509d4 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DirectoryPicker.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/DirectoryPicker.java
@@ -1,173 +1,173 @@
-package org.fox.ttcomics2;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Environment;
-import android.support.v7.widget.Toolbar;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.ListView;
-import android.widget.Toast;
-
-import org.fox.ttcomics2.utils.CompatListActivity;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-
-/**
-Copyright (C) 2011 by Brad Greco <[email protected]>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
- */
-
-public class DirectoryPicker extends CompatListActivity {
-
- public static final String START_DIR = "startDir";
- public static final String ONLY_DIRS = "onlyDirs";
- public static final String SHOW_HIDDEN = "showHidden";
- public static final String CHOSEN_DIRECTORY = "chosenDir";
- public static final int PICK_DIRECTORY = 128;
- private File dir;
- private boolean showHidden = false;
- private boolean onlyDirs = true ;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Bundle extras = getIntent().getExtras();
- dir = Environment.getExternalStorageDirectory();
- if (extras != null) {
- String preferredStartDir = extras.getString(START_DIR);
- showHidden = extras.getBoolean(SHOW_HIDDEN, false);
- onlyDirs = extras.getBoolean(ONLY_DIRS, true);
- if(preferredStartDir != null) {
- File startDir = new File(preferredStartDir);
- if(startDir.isDirectory()) {
- dir = startDir;
- }
- }
- }
-
- setContentView(R.layout.activity_directory_picker);
- setSupportActionBar((Toolbar)findViewById(R.id.toolbar));
-
- setTitle(dir.getAbsolutePath());
- Button btnChoose = (Button) findViewById(R.id.btnChoose);
- String name = dir.getName();
- if(name.length() == 0)
- name = "/";
- btnChoose.setText(getString(R.string.picker_choose, name));
- btnChoose.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- returnDir(dir.getAbsolutePath());
- }
- });
-
- Button btnParent = (Button) findViewById(R.id.btnParent);
- btnParent.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- Intent intent = new Intent(DirectoryPicker.this, DirectoryPicker.class);
- intent.putExtra(DirectoryPicker.START_DIR, dir.getParent());
- intent.putExtra(DirectoryPicker.SHOW_HIDDEN, showHidden);
- intent.putExtra(DirectoryPicker.ONLY_DIRS, onlyDirs);
- startActivityForResult(intent, PICK_DIRECTORY);
- }
- });
-
- if (dir.getParent() == null) {
- btnParent.setVisibility(View.GONE);
- }
-
- ListView lv = getListView();
- lv.setTextFilterEnabled(true);
-
- if(!dir.canRead()) {
- Context context = getApplicationContext();
- String msg = getString(R.string.error_could_not_read_folder_contents_);
- Toast toast = Toast.makeText(context, msg, Toast.LENGTH_LONG);
- toast.show();
- return;
- }
-
- final ArrayList<File> files = filter(dir.listFiles(), onlyDirs, showHidden);
- String[] names = names(files);
- setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names));
-
-
- lv.setOnItemClickListener(new OnItemClickListener() {
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- if(!files.get(position).isDirectory())
- return;
- String path = files.get(position).getAbsolutePath();
- Intent intent = new Intent(DirectoryPicker.this, DirectoryPicker.class);
- intent.putExtra(DirectoryPicker.START_DIR, path);
- intent.putExtra(DirectoryPicker.SHOW_HIDDEN, showHidden);
- intent.putExtra(DirectoryPicker.ONLY_DIRS, onlyDirs);
- startActivityForResult(intent, PICK_DIRECTORY);
- }
- });
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if(requestCode == PICK_DIRECTORY && resultCode == RESULT_OK) {
- Bundle extras = data.getExtras();
- String path = (String) extras.get(DirectoryPicker.CHOSEN_DIRECTORY);
- returnDir(path);
- }
- }
-
- private void returnDir(String path) {
- Intent result = new Intent();
- result.putExtra(CHOSEN_DIRECTORY, path);
- setResult(RESULT_OK, result);
- finish();
- }
-
- public ArrayList<File> filter(File[] file_list, boolean onlyDirs, boolean showHidden) {
- ArrayList<File> files = new ArrayList<File>();
-
- for(File file: file_list) {
- if(onlyDirs && !file.isDirectory())
- continue;
- if(!showHidden && file.isHidden())
- continue;
- files.add(file);
- }
- Collections.sort(files);
-
- return files;
- }
-
- public String[] names(ArrayList<File> files) {
- String[] names = new String[files.size()];
- int i = 0;
- for(File file: files) {
- names[i] = file.getName();
- i++;
- }
- return names;
- }
-}
-
+package org.fox.ttcomics2;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Environment;
+import android.support.v7.widget.Toolbar;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import org.fox.ttcomics2.utils.CompatListActivity;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+Copyright (C) 2011 by Brad Greco <[email protected]>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+ */
+
+public class DirectoryPicker extends CompatListActivity {
+
+ public static final String START_DIR = "startDir";
+ public static final String ONLY_DIRS = "onlyDirs";
+ public static final String SHOW_HIDDEN = "showHidden";
+ public static final String CHOSEN_DIRECTORY = "chosenDir";
+ public static final int PICK_DIRECTORY = 128;
+ private File dir;
+ private boolean showHidden = false;
+ private boolean onlyDirs = true ;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Bundle extras = getIntent().getExtras();
+ dir = Environment.getExternalStorageDirectory();
+ if (extras != null) {
+ String preferredStartDir = extras.getString(START_DIR);
+ showHidden = extras.getBoolean(SHOW_HIDDEN, false);
+ onlyDirs = extras.getBoolean(ONLY_DIRS, true);
+ if(preferredStartDir != null) {
+ File startDir = new File(preferredStartDir);
+ if(startDir.isDirectory()) {
+ dir = startDir;
+ }
+ }
+ }
+
+ setContentView(R.layout.activity_directory_picker);
+ setSupportActionBar((Toolbar)findViewById(R.id.toolbar));
+
+ setTitle(dir.getAbsolutePath());
+ Button btnChoose = (Button) findViewById(R.id.btnChoose);
+ String name = dir.getName();
+ if(name.length() == 0)
+ name = "/";
+ btnChoose.setText(getString(R.string.picker_choose, name));
+ btnChoose.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ returnDir(dir.getAbsolutePath());
+ }
+ });
+
+ Button btnParent = (Button) findViewById(R.id.btnParent);
+ btnParent.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ Intent intent = new Intent(DirectoryPicker.this, DirectoryPicker.class);
+ intent.putExtra(DirectoryPicker.START_DIR, dir.getParent());
+ intent.putExtra(DirectoryPicker.SHOW_HIDDEN, showHidden);
+ intent.putExtra(DirectoryPicker.ONLY_DIRS, onlyDirs);
+ startActivityForResult(intent, PICK_DIRECTORY);
+ }
+ });
+
+ if (dir.getParent() == null) {
+ btnParent.setVisibility(View.GONE);
+ }
+
+ ListView lv = getListView();
+ lv.setTextFilterEnabled(true);
+
+ if(!dir.canRead()) {
+ Context context = getApplicationContext();
+ String msg = getString(R.string.error_could_not_read_folder_contents_);
+ Toast toast = Toast.makeText(context, msg, Toast.LENGTH_LONG);
+ toast.show();
+ return;
+ }
+
+ final ArrayList<File> files = filter(dir.listFiles(), onlyDirs, showHidden);
+ String[] names = names(files);
+ setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names));
+
+
+ lv.setOnItemClickListener(new OnItemClickListener() {
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ if(!files.get(position).isDirectory())
+ return;
+ String path = files.get(position).getAbsolutePath();
+ Intent intent = new Intent(DirectoryPicker.this, DirectoryPicker.class);
+ intent.putExtra(DirectoryPicker.START_DIR, path);
+ intent.putExtra(DirectoryPicker.SHOW_HIDDEN, showHidden);
+ intent.putExtra(DirectoryPicker.ONLY_DIRS, onlyDirs);
+ startActivityForResult(intent, PICK_DIRECTORY);
+ }
+ });
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if(requestCode == PICK_DIRECTORY && resultCode == RESULT_OK) {
+ Bundle extras = data.getExtras();
+ String path = (String) extras.get(DirectoryPicker.CHOSEN_DIRECTORY);
+ returnDir(path);
+ }
+ }
+
+ private void returnDir(String path) {
+ Intent result = new Intent();
+ result.putExtra(CHOSEN_DIRECTORY, path);
+ setResult(RESULT_OK, result);
+ finish();
+ }
+
+ public ArrayList<File> filter(File[] file_list, boolean onlyDirs, boolean showHidden) {
+ ArrayList<File> files = new ArrayList<File>();
+
+ for(File file: file_list) {
+ if(onlyDirs && !file.isDirectory())
+ continue;
+ if(!showHidden && file.isHidden())
+ continue;
+ files.add(file);
+ }
+ Collections.sort(files);
+
+ return files;
+ }
+
+ public String[] names(ArrayList<File> files) {
+ String[] names = new String[files.size()];
+ int i = 0;
+ for(File file: files) {
+ names[i] = file.getName();
+ i++;
+ }
+ return names;
+ }
+}
+
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/MainActivity.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/MainActivity.java
index 8910d4b..b7933e8 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/MainActivity.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/MainActivity.java
@@ -1,382 +1,382 @@
-package org.fox.ttcomics2;
-
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.ProgressDialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v7.app.ActionBar;
-import android.support.v7.widget.Toolbar;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import org.fox.ttcomics2.sync.SyncClient;
-import org.fox.ttcomics2.sync.SyncFolderService;
-
-import java.io.File;
-import java.util.Arrays;
-
-import it.neokree.materialtabs.MaterialTab;
-import it.neokree.materialtabs.MaterialTabHost;
-import it.neokree.materialtabs.MaterialTabListener;
-
-public class MainActivity extends CommonActivity implements MaterialTabListener, SharedPreferences.OnSharedPreferenceChangeListener {
- private final String TAG = this.getClass().getSimpleName();
- private final static int TRIAL_DAYS = 7;
-
- private int m_selectedTab;
- private MaterialTabHost tabHost;
- private ProgressDialog m_progressDialog;
- private boolean m_needRestart;
-
- private BroadcastReceiver m_serviceReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (SyncFolderService.INTENT_ACTION_FILE_PROCESSED.equals(intent.getAction())) {
-
- int count = intent.getExtras().getInt("count");
- int index = intent.getExtras().getInt("index");
-
- m_progressDialog.setCancelable(false);
- m_progressDialog.setTitle("Synchronizing...");
- m_progressDialog.setMessage("File " + index + " of " + count);
- m_progressDialog.show();
- }
-
- if (SyncFolderService.INTENT_ACTION_SCAN_COMPLETE.equals(intent.getAction())) {
- m_progressDialog.dismiss();
- updateComicsList();
- }
-
- }
- };
-
- @SuppressLint("NewApi")
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- m_prefs.registerOnSharedPreferenceChangeListener(this);
-
- setContentView(R.layout.activity_main);
- setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
- setTitle(R.string.app_name);
-
- m_progressDialog = new ProgressDialog(this);
-
- tabHost = (MaterialTabHost) this.findViewById(R.id.materialTabHost);
-
- if (savedInstanceState == null) {
- m_selectedTab = getIntent().getIntExtra("selectedTab", 0);
-
- //Log.d(TAG, "selTab=" + m_selectedTab);
-
- ComicListFragment frag = new ComicListFragment();
- frag.setMode(m_selectedTab);
-
- if (getIntent().getStringExtra("baseDir") != null) {
- frag.setBaseDirectory(getIntent().getStringExtra("baseDir"));
- } else {
- frag.setBaseDirectory(m_prefs.getString("comics_directory", ""));
- }
-
- FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
- ft.replace(R.id.comics_list, frag, FRAG_COMICS_LIST);
- ft.commit();
- } else {
- //m_baseDirectory = savedInstanceState.getString("baseDir");
- }
-
- m_selectedTab = -1;
-
- tabHost.addTab(tabHost.newTab()
- .setText(getString(R.string.tab_all_comics))
- .setTabListener(this));
-
- tabHost.addTab(tabHost.newTab()
- .setText(getString(R.string.tab_unread))
- .setTabListener(this));
-
- tabHost.addTab(tabHost.newTab()
- .setText(getString(R.string.tab_unfinished))
- .setTabListener(this));
-
- tabHost.addTab(tabHost.newTab()
- .setText(getString(R.string.tab_read))
- .setTabListener(this));
-
- if (savedInstanceState != null) {
- m_selectedTab = savedInstanceState.getInt("selectedTab");
- } else {
- m_selectedTab = getIntent().getIntExtra("selectedTab", 0);
- }
-
- if (m_selectedTab != -1)
- tabHost.setSelectedNavigationItem(m_selectedTab);
-
- ActionBar actionBar = getSupportActionBar();
- //actionBar.setDisplayHomeAsUpEnabled(m_baseDirectory.length() > 0);
-
- if (m_prefs.getString("comics_directory", null) == null) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage(R.string.dialog_need_prefs_message)
- .setCancelable(false)
- .setPositiveButton(R.string.dialog_need_prefs_preferences, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- Intent intent = new Intent(MainActivity.this,
- PreferencesActivity.class);
- startActivityForResult(intent, 0);
- }
- })
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- dialog.cancel();
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
- }
-
- //if (m_baseDirectory.length() > 0) {
- //setTitle(new File(m_baseDirectory).getName());
- //}
-
- //((ViewGroup)findViewById(R.id.comics_list)).setLayoutTransition(new LayoutTransition());
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- IntentFilter filter = new IntentFilter();
- filter.addAction(SyncFolderService.INTENT_ACTION_FILE_PROCESSED);
- filter.addAction(SyncFolderService.INTENT_ACTION_SCAN_COMPLETE);
- filter.addCategory(Intent.CATEGORY_DEFAULT);
-
- registerReceiver(m_serviceReceiver, filter);
-
- //if (m_enableFab != m_prefs.getBoolean("enable_fab", true)) {
-
- if (m_needRestart) {
- Log.d(TAG, "shared preferences changed, restarting");
-
- finish();
- startActivity(getIntent());
- }
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_main, menu);
-
- menu.findItem(R.id.menu_sync_directory).setVisible(m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner());
-
- return true;
- }
-
- @Override
- public void onSaveInstanceState(Bundle out) {
- super.onSaveInstanceState(out);
-
- out.putInt("selectedTab", m_selectedTab);
- }
-
- public int getMode() {
- return m_selectedTab;
- }
-
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_sync_directory:
- if (true) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage("Get synchronized last read page for listed files?")
- .setCancelable(true)
- .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- ComicListFragment frag = (ComicListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_LIST);
-
- if (frag != null && frag.isAdded()) {
- String baseDir = frag.getBaseDirectory();
-
- updateLastRead(baseDir);
- }
-
- }
- })
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- dialog.cancel();
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
-
- }
- return true;
- case android.R.id.home:
- onBackPressed();
- return true;
- default:
- Log.d(TAG,
- "onOptionsItemSelected, unhandled id=" + item.getItemId());
- return super.onOptionsItemSelected(item);
- }
- }
-
- private void updateLastRead(String baseDir) {
- Intent serviceIntent = new Intent(MainActivity.this, SyncFolderService.class);
- serviceIntent.putExtra("baseDir", baseDir);
- startService(serviceIntent);
- }
-
- @Override
- public void onComicArchiveSelected(String fileName) {
- super.onComicArchiveSelected(fileName);
-
- File file = new File(fileName);
-
- if (file.isDirectory()) {
-
- Intent intent = new Intent(MainActivity.this,
- MainActivity.class);
-
- intent.putExtra("selectedTab", m_selectedTab);
- intent.putExtra("baseDir", fileName);
-
- startActivity(intent);
-
- } else if (file.canRead()) {
- Intent intent = new Intent(MainActivity.this,
- ViewComicActivity.class);
-
- intent.putExtra("fileName", fileName);
-
- startActivityForResult(intent, REQUEST_VIEWCOMIC);
- } else {
- toast(getString(R.string.error_cant_open_file, fileName));
-
- ComicListFragment frag = (ComicListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_LIST);
-
- if (frag != null && frag.isAdded()) {
- frag.rescan(true);
- }
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
- if (requestCode == REQUEST_VIEWCOMIC && resultCode == Activity.RESULT_OK) {
- String fileName = intent.getStringExtra("fileName");
- Log.d(TAG, "finished viewing comic: " + fileName);
-
- if (m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner()) {
- toast(R.string.sync_uploading);
- m_syncClient.setPosition(sha1(new File(fileName).getName()), m_databaseHelper.getLastPosition(fileName));
- }
-
- updateComicsList();
- }
-
- System.gc();
-
- super.onActivityResult(requestCode, resultCode, intent);
- }
-
- @Override
- public void onTabSelected(MaterialTab tab) {
-
- tabHost.setSelectedNavigationItem(tab.getPosition());
-
- FragmentTransaction sft = getSupportFragmentManager().beginTransaction();
-
- if (m_selectedTab != tab.getPosition() && m_selectedTab != -1) {
-
- ComicListFragment frag = (ComicListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_LIST);
-
- if (frag != null && frag.isAdded()) {
- frag.setMode(tab.getPosition());
- frag.updateWithoutRescan();
- }
- }
-
- m_selectedTab = tab.getPosition();
-
- sft.commit();
- }
-
- @Override
- public void onTabReselected(MaterialTab materialTab) {
-
- }
-
- @Override
- public void onTabUnselected(MaterialTab materialTab) {
-
- }
-
- private void updateComicsList() {
- ComicListFragment frag = (ComicListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_LIST);
-
- if (frag != null && frag.isAdded()) {
- frag.updateWithoutRescan();
- }
- }
-
- public void resetProgress(final String fileName) {
-
- if (m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner()) {
- m_databaseHelper.setLastPosition(fileName, 0);
- m_databaseHelper.setLastMaxPosition(fileName, 0);
- updateComicsList();
-
- if (m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner()) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage(R.string.reset_remove_synced_progress)
- .setCancelable(true)
- .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- m_syncClient.clearData(sha1(new File(fileName).getName()), new SyncClient.DataClearedListener() {
- @Override
- public void onDataCleared(boolean result) {
- updateComicsList();
- }
- });
- }
- })
- .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- dialog.cancel();
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
- }
-
- }
-
- }
-
- @Override
- public void onPause() {
- super.onPause();
-
- unregisterReceiver(m_serviceReceiver);
- }
-
- @Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- String[] filter = new String[] { "enable_fab", "comics_directory", "use_position_sync" };
-
- m_needRestart = Arrays.asList(filter).indexOf(key) != -1;
- }
-}
+package org.fox.ttcomics2;
+
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.ProgressDialog;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v7.app.ActionBar;
+import android.support.v7.widget.Toolbar;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import org.fox.ttcomics2.sync.SyncClient;
+import org.fox.ttcomics2.sync.SyncFolderService;
+
+import java.io.File;
+import java.util.Arrays;
+
+import it.neokree.materialtabs.MaterialTab;
+import it.neokree.materialtabs.MaterialTabHost;
+import it.neokree.materialtabs.MaterialTabListener;
+
+public class MainActivity extends CommonActivity implements MaterialTabListener, SharedPreferences.OnSharedPreferenceChangeListener {
+ private final String TAG = this.getClass().getSimpleName();
+ private final static int TRIAL_DAYS = 7;
+
+ private int m_selectedTab;
+ private MaterialTabHost tabHost;
+ private ProgressDialog m_progressDialog;
+ private boolean m_needRestart;
+
+ private BroadcastReceiver m_serviceReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (SyncFolderService.INTENT_ACTION_FILE_PROCESSED.equals(intent.getAction())) {
+
+ int count = intent.getExtras().getInt("count");
+ int index = intent.getExtras().getInt("index");
+
+ m_progressDialog.setCancelable(false);
+ m_progressDialog.setTitle("Synchronizing...");
+ m_progressDialog.setMessage("File " + index + " of " + count);
+ m_progressDialog.show();
+ }
+
+ if (SyncFolderService.INTENT_ACTION_SCAN_COMPLETE.equals(intent.getAction())) {
+ m_progressDialog.dismiss();
+ updateComicsList();
+ }
+
+ }
+ };
+
+ @SuppressLint("NewApi")
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ m_prefs.registerOnSharedPreferenceChangeListener(this);
+
+ setContentView(R.layout.activity_main);
+ setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
+ setTitle(R.string.app_name);
+
+ m_progressDialog = new ProgressDialog(this);
+
+ tabHost = (MaterialTabHost) this.findViewById(R.id.materialTabHost);
+
+ if (savedInstanceState == null) {
+ m_selectedTab = getIntent().getIntExtra("selectedTab", 0);
+
+ //Log.d(TAG, "selTab=" + m_selectedTab);
+
+ ComicListFragment frag = new ComicListFragment();
+ frag.setMode(m_selectedTab);
+
+ if (getIntent().getStringExtra("baseDir") != null) {
+ frag.setBaseDirectory(getIntent().getStringExtra("baseDir"));
+ } else {
+ frag.setBaseDirectory(m_prefs.getString("comics_directory", ""));
+ }
+
+ FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+ ft.replace(R.id.comics_list, frag, FRAG_COMICS_LIST);
+ ft.commit();
+ } else {
+ //m_baseDirectory = savedInstanceState.getString("baseDir");
+ }
+
+ m_selectedTab = -1;
+
+ tabHost.addTab(tabHost.newTab()
+ .setText(getString(R.string.tab_all_comics))
+ .setTabListener(this));
+
+ tabHost.addTab(tabHost.newTab()
+ .setText(getString(R.string.tab_unread))
+ .setTabListener(this));
+
+ tabHost.addTab(tabHost.newTab()
+ .setText(getString(R.string.tab_unfinished))
+ .setTabListener(this));
+
+ tabHost.addTab(tabHost.newTab()
+ .setText(getString(R.string.tab_read))
+ .setTabListener(this));
+
+ if (savedInstanceState != null) {
+ m_selectedTab = savedInstanceState.getInt("selectedTab");
+ } else {
+ m_selectedTab = getIntent().getIntExtra("selectedTab", 0);
+ }
+
+ if (m_selectedTab != -1)
+ tabHost.setSelectedNavigationItem(m_selectedTab);
+
+ ActionBar actionBar = getSupportActionBar();
+ //actionBar.setDisplayHomeAsUpEnabled(m_baseDirectory.length() > 0);
+
+ if (m_prefs.getString("comics_directory", null) == null) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setMessage(R.string.dialog_need_prefs_message)
+ .setCancelable(false)
+ .setPositiveButton(R.string.dialog_need_prefs_preferences, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ Intent intent = new Intent(MainActivity.this,
+ PreferencesActivity.class);
+ startActivityForResult(intent, 0);
+ }
+ })
+ .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+ }
+
+ //if (m_baseDirectory.length() > 0) {
+ //setTitle(new File(m_baseDirectory).getName());
+ //}
+
+ //((ViewGroup)findViewById(R.id.comics_list)).setLayoutTransition(new LayoutTransition());
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(SyncFolderService.INTENT_ACTION_FILE_PROCESSED);
+ filter.addAction(SyncFolderService.INTENT_ACTION_SCAN_COMPLETE);
+ filter.addCategory(Intent.CATEGORY_DEFAULT);
+
+ registerReceiver(m_serviceReceiver, filter);
+
+ //if (m_enableFab != m_prefs.getBoolean("enable_fab", true)) {
+
+ if (m_needRestart) {
+ Log.d(TAG, "shared preferences changed, restarting");
+
+ finish();
+ startActivity(getIntent());
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.activity_main, menu);
+
+ menu.findItem(R.id.menu_sync_directory).setVisible(m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner());
+
+ return true;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putInt("selectedTab", m_selectedTab);
+ }
+
+ public int getMode() {
+ return m_selectedTab;
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_sync_directory:
+ if (true) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setMessage("Get synchronized last read page for listed files?")
+ .setCancelable(true)
+ .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ ComicListFragment frag = (ComicListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_LIST);
+
+ if (frag != null && frag.isAdded()) {
+ String baseDir = frag.getBaseDirectory();
+
+ updateLastRead(baseDir);
+ }
+
+ }
+ })
+ .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+
+ }
+ return true;
+ case android.R.id.home:
+ onBackPressed();
+ return true;
+ default:
+ Log.d(TAG,
+ "onOptionsItemSelected, unhandled id=" + item.getItemId());
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private void updateLastRead(String baseDir) {
+ Intent serviceIntent = new Intent(MainActivity.this, SyncFolderService.class);
+ serviceIntent.putExtra("baseDir", baseDir);
+ startService(serviceIntent);
+ }
+
+ @Override
+ public void onComicArchiveSelected(String fileName) {
+ super.onComicArchiveSelected(fileName);
+
+ File file = new File(fileName);
+
+ if (file.isDirectory()) {
+
+ Intent intent = new Intent(MainActivity.this,
+ MainActivity.class);
+
+ intent.putExtra("selectedTab", m_selectedTab);
+ intent.putExtra("baseDir", fileName);
+
+ startActivity(intent);
+
+ } else if (file.canRead()) {
+ Intent intent = new Intent(MainActivity.this,
+ ViewComicActivity.class);
+
+ intent.putExtra("fileName", fileName);
+
+ startActivityForResult(intent, REQUEST_VIEWCOMIC);
+ } else {
+ toast(getString(R.string.error_cant_open_file, fileName));
+
+ ComicListFragment frag = (ComicListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_LIST);
+
+ if (frag != null && frag.isAdded()) {
+ frag.rescan(true);
+ }
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ if (requestCode == REQUEST_VIEWCOMIC && resultCode == Activity.RESULT_OK) {
+ String fileName = intent.getStringExtra("fileName");
+ Log.d(TAG, "finished viewing comic: " + fileName);
+
+ if (m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner()) {
+ toast(R.string.sync_uploading);
+ m_syncClient.setPosition(sha1(new File(fileName).getName()), m_databaseHelper.getLastPosition(fileName));
+ }
+
+ updateComicsList();
+ }
+
+ System.gc();
+
+ super.onActivityResult(requestCode, resultCode, intent);
+ }
+
+ @Override
+ public void onTabSelected(MaterialTab tab) {
+
+ tabHost.setSelectedNavigationItem(tab.getPosition());
+
+ FragmentTransaction sft = getSupportFragmentManager().beginTransaction();
+
+ if (m_selectedTab != tab.getPosition() && m_selectedTab != -1) {
+
+ ComicListFragment frag = (ComicListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_LIST);
+
+ if (frag != null && frag.isAdded()) {
+ frag.setMode(tab.getPosition());
+ frag.updateWithoutRescan();
+ }
+ }
+
+ m_selectedTab = tab.getPosition();
+
+ sft.commit();
+ }
+
+ @Override
+ public void onTabReselected(MaterialTab materialTab) {
+
+ }
+
+ @Override
+ public void onTabUnselected(MaterialTab materialTab) {
+
+ }
+
+ private void updateComicsList() {
+ ComicListFragment frag = (ComicListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_LIST);
+
+ if (frag != null && frag.isAdded()) {
+ frag.updateWithoutRescan();
+ }
+ }
+
+ public void resetProgress(final String fileName) {
+
+ if (m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner()) {
+ m_databaseHelper.setLastPosition(fileName, 0);
+ m_databaseHelper.setLastMaxPosition(fileName, 0);
+ updateComicsList();
+
+ if (m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner()) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setMessage(R.string.reset_remove_synced_progress)
+ .setCancelable(true)
+ .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ m_syncClient.clearData(sha1(new File(fileName).getName()), new SyncClient.DataClearedListener() {
+ @Override
+ public void onDataCleared(boolean result) {
+ updateComicsList();
+ }
+ });
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+ }
+
+ }
+
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+
+ unregisterReceiver(m_serviceReceiver);
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ String[] filter = new String[] { "enable_fab", "comics_directory", "use_position_sync" };
+
+ m_needRestart = Arrays.asList(filter).indexOf(key) != -1;
+ }
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/PreferencesFragment.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/PreferencesFragment.java
index 593a73f..aa6174b 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/PreferencesFragment.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/PreferencesFragment.java
@@ -1,145 +1,145 @@
-package org.fox.ttcomics2;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceManager;
-import android.widget.Toast;
-
-import org.fox.ttcomics2.sync.SyncClient;
-
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-public class PreferencesFragment extends PreferenceFragment {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- addPreferencesFromResource(R.xml.preferences);
-
- }
-
- public void onResume() {
- super.onResume();
-
- String version = "?";
- int versionCode = -1;
- String buildTimestamp = "N/A";
-
- try {
- Activity activity = getActivity();
-
- PackageInfo packageInfo = activity.getPackageManager().
- getPackageInfo(activity.getPackageName(), 0);
-
- version = packageInfo.versionName;
- versionCode = packageInfo.versionCode;
-
- ApplicationInfo appInfo = activity.getPackageManager().
- getApplicationInfo(activity.getPackageName(), 0);
-
- ZipFile zf = new ZipFile(appInfo.sourceDir);
- ZipEntry ze = zf.getEntry("classes.dex");
- long time = ze.getTime();
-
- buildTimestamp = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss",
- Locale.getDefault()).format(time);
-
-
- findPreference("version").setSummary(getString(R.string.prefs_version, version, versionCode));
- findPreference("build_timestamp").setSummary(getString(R.string.prefs_build_timestamp, buildTimestamp));
-
- } catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- final SharedPreferences prefs = PreferenceManager
- .getDefaultSharedPreferences(getActivity().getApplicationContext());
-
- Preference dirPref = findPreference("comics_directory");
- dirPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- ((PreferencesActivity)getActivity()).startPicker();
- return true;
- }
- });
-
- Preference clearPref = findPreference("clear_sync_data");
- clearPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- builder.setMessage(R.string.dialog_clear_data_title)
- .setCancelable(false)
- .setPositiveButton(R.string.dialog_clear_data, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
-
- String googleAccount = getGoogleAccount();
- SyncClient m_syncClient = new SyncClient();
-
- if (googleAccount != null) {
- m_syncClient.setOwner(googleAccount);
- } else {
- if (Build.HARDWARE.equals("goldfish")) {
- m_syncClient.setOwner("TEST-ACCOUNT");
- } else {
- m_syncClient.setOwner(null);
-
- SharedPreferences.Editor editor = prefs.edit();
- editor.putBoolean("use_position_sync", false);
- editor.apply();
-
- Toast toast = Toast.makeText(getActivity(), R.string.error_sync_no_account, Toast.LENGTH_SHORT);
- toast.show();
- }
- }
-
- if (m_syncClient.hasOwner()) {
- m_syncClient.clearData(null);
- }
- }
- })
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- dialog.cancel();
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
-
- return false;
- }
- });
- }
-
- public String getGoogleAccount() {
- AccountManager manager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE);
- Account[] list = manager.getAccounts();
-
- for (Account account: list) {
- if (account.type.equalsIgnoreCase("com.google")) {
- return account.name;
- }
- }
- return null;
- }
+package org.fox.ttcomics2;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceManager;
+import android.widget.Toast;
+
+import org.fox.ttcomics2.sync.SyncClient;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class PreferencesFragment extends PreferenceFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ addPreferencesFromResource(R.xml.preferences);
+
+ }
+
+ public void onResume() {
+ super.onResume();
+
+ String version = "?";
+ int versionCode = -1;
+ String buildTimestamp = "N/A";
+
+ try {
+ Activity activity = getActivity();
+
+ PackageInfo packageInfo = activity.getPackageManager().
+ getPackageInfo(activity.getPackageName(), 0);
+
+ version = packageInfo.versionName;
+ versionCode = packageInfo.versionCode;
+
+ ApplicationInfo appInfo = activity.getPackageManager().
+ getApplicationInfo(activity.getPackageName(), 0);
+
+ ZipFile zf = new ZipFile(appInfo.sourceDir);
+ ZipEntry ze = zf.getEntry("classes.dex");
+ long time = ze.getTime();
+
+ buildTimestamp = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss",
+ Locale.getDefault()).format(time);
+
+
+ findPreference("version").setSummary(getString(R.string.prefs_version, version, versionCode));
+ findPreference("build_timestamp").setSummary(getString(R.string.prefs_build_timestamp, buildTimestamp));
+
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ final SharedPreferences prefs = PreferenceManager
+ .getDefaultSharedPreferences(getActivity().getApplicationContext());
+
+ Preference dirPref = findPreference("comics_directory");
+ dirPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ ((PreferencesActivity)getActivity()).startPicker();
+ return true;
+ }
+ });
+
+ Preference clearPref = findPreference("clear_sync_data");
+ clearPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setMessage(R.string.dialog_clear_data_title)
+ .setCancelable(false)
+ .setPositiveButton(R.string.dialog_clear_data, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+
+ String googleAccount = getGoogleAccount();
+ SyncClient m_syncClient = new SyncClient();
+
+ if (googleAccount != null) {
+ m_syncClient.setOwner(googleAccount);
+ } else {
+ if (Build.HARDWARE.equals("goldfish")) {
+ m_syncClient.setOwner("TEST-ACCOUNT");
+ } else {
+ m_syncClient.setOwner(null);
+
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putBoolean("use_position_sync", false);
+ editor.apply();
+
+ Toast toast = Toast.makeText(getActivity(), R.string.error_sync_no_account, Toast.LENGTH_SHORT);
+ toast.show();
+ }
+ }
+
+ if (m_syncClient.hasOwner()) {
+ m_syncClient.clearData(null);
+ }
+ }
+ })
+ .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+
+ return false;
+ }
+ });
+ }
+
+ public String getGoogleAccount() {
+ AccountManager manager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE);
+ Account[] list = manager.getAccounts();
+
+ for (Account account: list) {
+ if (account.type.equalsIgnoreCase("com.google")) {
+ return account.name;
+ }
+ }
+ return null;
+ }
} \ No newline at end of file
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ViewComicActivity.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ViewComicActivity.java
index 8b3e13e..9f443d0 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ViewComicActivity.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/ViewComicActivity.java
@@ -1,341 +1,341 @@
-package org.fox.ttcomics2;
-
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.pm.ActivityInfo;
-import android.content.res.Configuration;
-import android.net.Uri;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v7.widget.Toolbar;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.NumberPicker;
-
-import com.nostra13.universalimageloader.core.ImageLoader;
-
-import org.fox.ttcomics2.sync.SyncClient;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-public class ViewComicActivity extends CommonActivity {
- private final String TAG = this.getClass().getSimpleName();
-
- private String m_fileName;
- private String m_tmpFileName;
-
- @SuppressLint("NewApi")
- @Override
- public void onCreate(Bundle savedInstanceState) {
- m_prefs = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext());
-
- setTheme(m_prefs.getBoolean("use_dark_theme", false) ? R.style.ViewDarkTheme : R.style.ViewLightTheme);
-
- super.onCreate(savedInstanceState);
-
- ImageLoader.getInstance().clearMemoryCache();
-
- if (m_prefs.getBoolean("prevent_screen_sleep", false)) {
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- }
-
- setContentView(R.layout.activity_view_comic);
- setSupportActionBar((Toolbar) findViewById(R.id.toolbar));;
-
- if (m_prefs.getBoolean("use_full_screen", false)) {
- hideSystemUI(true);
- }
-
- if (savedInstanceState == null) {
- m_fileName = getIntent().getStringExtra("fileName");
-
- ComicPager cp = new ComicPager();
- cp.setFileName(m_fileName);
-
- FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
- ft.replace(R.id.comics_pager_container, cp, FRAG_COMICS_PAGER);
- ft.commit();
- } else {
- m_fileName = savedInstanceState.getString("fileName");
- m_tmpFileName = savedInstanceState.getString("tmpFileName");
- }
-
- setOrientationLock(isOrientationLocked(), true);
-
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
-
- setTitle(new File(m_fileName).getName());
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_view_comic, menu);
-
- menu.findItem(R.id.menu_sync_location).setVisible(m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner());
-
- return true;
- }
-
- @Override
- public void onSaveInstanceState(Bundle out) {
- super.onSaveInstanceState(out);
-
- out.putString("fileName", m_fileName);
- out.putString("tmpFileName", m_tmpFileName);
- }
-
- @Override
- public void onComicSelected(String fileName, int position) {
- super.onComicSelected(fileName, position);
- }
-
- public void onPause() {
- super.onPause();
-
- // upload progress
- if (m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner()) {
- //toast(R.string.sync_uploading);
- m_syncClient.setPosition(sha1(new File(m_fileName).getName()), m_databaseHelper.getLastPosition(m_fileName));
- }
- }
-
- private void shareComic() {
-
- ComicPager pager = (ComicPager) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_PAGER);
-
- if (pager != null) {
-
- try {
- File tmpFile = File.createTempFile("trcshare" + sha1(m_fileName + " " + pager.getPosition()), ".jpg", getExternalCacheDir());
-
- Log.d(TAG, "FILE=" + tmpFile);
-
- InputStream is = pager.getArchive().getItem(pager.getPosition());
-
- FileOutputStream fos = new FileOutputStream(tmpFile);
-
- byte[] buffer = new byte[1024];
- int len = 0;
- while ((len = is.read(buffer)) != -1) {
- fos.write(buffer, 0, len);
- }
-
- fos.close();
- is.close();
-
- Intent shareIntent = new Intent(Intent.ACTION_SEND);
-
- shareIntent.setType("image/jpeg");
- shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tmpFile));
-
- m_tmpFileName = tmpFile.getAbsolutePath();
-
- startActivityForResult(Intent.createChooser(shareIntent, getString(R.string.share_comic)), REQUEST_SHARE);
-
- } catch (IOException e) {
- toast(getString(R.string.error_could_not_prepare_file_for_sharing));
- e.printStackTrace();
- }
-
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
- if (requestCode == REQUEST_SHARE) {
- File tmpFile = new File(m_tmpFileName);
-
- if (tmpFile.exists()) {
- tmpFile.delete();
- }
-
- }
- super.onActivityResult(requestCode, resultCode, intent);
- }
-
- protected boolean isOrientationLocked() {
- return m_prefs.getBoolean("prefs_lock_orientation", false);
- }
-
- private void setOrientationLock(boolean locked, boolean restoreLast) {
- if (locked) {
-
- int currentOrientation = restoreLast ? m_prefs.getInt("last_orientation", getResources().getConfiguration().orientation) :
- getResources().getConfiguration().orientation;
-
- if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
- } else {
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
- }
- } else {
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
- }
-
- if (locked != isOrientationLocked()) {
- SharedPreferences.Editor editor = m_prefs.edit();
- editor.putBoolean("prefs_lock_orientation", locked);
- editor.putInt("last_orientation", getResources().getConfiguration().orientation);
- editor.apply();
- }
- }
-
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_share:
- shareComic();
- return true;
- case R.id.menu_toggle_orientation_lock:
- setOrientationLock(!isOrientationLocked(), false);
- return true;
- case R.id.menu_sync_location:
- m_syncClient.getPosition(sha1(new File(m_fileName).getName()), new SyncClient.PositionReceivedListener() {
- @Override
- public void onPositionReceived(final int position) {
- final ComicPager pager = (ComicPager) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_PAGER);
-
- if (pager != null && pager.isAdded()) {
- int localPosition = pager.getPosition();
-
- if (position > localPosition) {
- AlertDialog.Builder builder = new AlertDialog.Builder(ViewComicActivity.this);
- builder.setMessage(getString(R.string.sync_server_has_further_page, localPosition + 1, position + 1))
- .setCancelable(true)
- .setPositiveButton(R.string.dialog_open_page, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- pager.setCurrentItem(position);
- }
- })
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- dialog.cancel();
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
- } else if (position == -1) {
- toast("Could not contact sync server.");
- } else {
- toast(R.string.error_sync_no_data);
- }
-
- }
- }
- });
- return true;
- case R.id.menu_go_location:
- Dialog dialog = new Dialog(ViewComicActivity.this);
- AlertDialog.Builder builder = new AlertDialog.Builder(ViewComicActivity.this)
- .setTitle("Go to...")
- .setItems(
- new String[] {
- getString(R.string.dialog_location_beginning),
- getString(R.string.dialog_location_furthest),
- getString(R.string.dialog_location_location),
- getString(R.string.dialog_location_end)
- },
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
-
- final ComicPager cp = (ComicPager) getSupportFragmentManager().findFragmentByTag(CommonActivity.FRAG_COMICS_PAGER);
-
- switch (which) {
- case 0:
- cp.setCurrentItem(0);
- break;
- case 1:
- cp.setCurrentItem(m_databaseHelper.getMaxPosition(m_fileName));
- break;
- case 2:
- if (true) {
- LayoutInflater inflater = getLayoutInflater();
- View contentView = inflater.inflate(R.layout.dialog_location, null);
-
- final NumberPicker picker = (NumberPicker) contentView.findViewById(R.id.number_picker);
-
- picker.setMinValue(1);
- picker.setMaxValue(m_databaseHelper.getSize(m_fileName));
- picker.setValue(cp.getPosition() + 1);
-
- Dialog seekDialog = new Dialog(ViewComicActivity.this);
- AlertDialog.Builder seekBuilder = new AlertDialog.Builder(ViewComicActivity.this)
- .setTitle(R.string.dialog_open_location)
- .setView(contentView)
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- dialog.cancel();
- }
- }).setPositiveButton(R.string.dialog_open_location, new DialogInterface.OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- dialog.cancel();
-
- cp.setCurrentItem(picker.getValue()-1);
-
- }
- });
-
- seekDialog = seekBuilder.create();
- seekDialog.show();
- }
-
- break;
- case 3:
- cp.setCurrentItem(cp.getCount() - 1);
- break;
- }
-
- dialog.cancel();
- }
- });
-
- dialog = builder.create();
- dialog.show();
-
- return true;
- case android.R.id.home:
- onBackPressed();
- return true;
- default:
- Log.d(TAG,
- "onOptionsItemSelected, unhandled id=" + item.getItemId());
- return super.onOptionsItemSelected(item);
- }
- }
-
- public void hideSeekBar(boolean hide) {
- ComicPager pager = (ComicPager) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_PAGER);
-
- if (pager != null) {
- pager.hideReadingUI(hide);
- }
- }
-
- @Override
- public void onBackPressed() {
- Intent resultIntent = new Intent();
- resultIntent.putExtra("fileName", m_fileName);
-
- setResult(Activity.RESULT_OK, resultIntent);
-
- super.onBackPressed();
- }
-
-}
+package org.fox.ttcomics2;
+
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.net.Uri;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v7.widget.Toolbar;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.NumberPicker;
+
+import com.nostra13.universalimageloader.core.ImageLoader;
+
+import org.fox.ttcomics2.sync.SyncClient;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ViewComicActivity extends CommonActivity {
+ private final String TAG = this.getClass().getSimpleName();
+
+ private String m_fileName;
+ private String m_tmpFileName;
+
+ @SuppressLint("NewApi")
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ m_prefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext());
+
+ setTheme(m_prefs.getBoolean("use_dark_theme", false) ? R.style.ViewDarkTheme : R.style.ViewLightTheme);
+
+ super.onCreate(savedInstanceState);
+
+ ImageLoader.getInstance().clearMemoryCache();
+
+ if (m_prefs.getBoolean("prevent_screen_sleep", false)) {
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+
+ setContentView(R.layout.activity_view_comic);
+ setSupportActionBar((Toolbar) findViewById(R.id.toolbar));;
+
+ if (m_prefs.getBoolean("use_full_screen", false)) {
+ hideSystemUI(true);
+ }
+
+ if (savedInstanceState == null) {
+ m_fileName = getIntent().getStringExtra("fileName");
+
+ ComicPager cp = new ComicPager();
+ cp.setFileName(m_fileName);
+
+ FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+ ft.replace(R.id.comics_pager_container, cp, FRAG_COMICS_PAGER);
+ ft.commit();
+ } else {
+ m_fileName = savedInstanceState.getString("fileName");
+ m_tmpFileName = savedInstanceState.getString("tmpFileName");
+ }
+
+ setOrientationLock(isOrientationLocked(), true);
+
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+ setTitle(new File(m_fileName).getName());
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.activity_view_comic, menu);
+
+ menu.findItem(R.id.menu_sync_location).setVisible(m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner());
+
+ return true;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.putString("fileName", m_fileName);
+ out.putString("tmpFileName", m_tmpFileName);
+ }
+
+ @Override
+ public void onComicSelected(String fileName, int position) {
+ super.onComicSelected(fileName, position);
+ }
+
+ public void onPause() {
+ super.onPause();
+
+ // upload progress
+ if (m_prefs.getBoolean("use_position_sync", false) && m_syncClient.hasOwner()) {
+ //toast(R.string.sync_uploading);
+ m_syncClient.setPosition(sha1(new File(m_fileName).getName()), m_databaseHelper.getLastPosition(m_fileName));
+ }
+ }
+
+ private void shareComic() {
+
+ ComicPager pager = (ComicPager) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_PAGER);
+
+ if (pager != null) {
+
+ try {
+ File tmpFile = File.createTempFile("trcshare" + sha1(m_fileName + " " + pager.getPosition()), ".jpg", getExternalCacheDir());
+
+ Log.d(TAG, "FILE=" + tmpFile);
+
+ InputStream is = pager.getArchive().getItem(pager.getPosition());
+
+ FileOutputStream fos = new FileOutputStream(tmpFile);
+
+ byte[] buffer = new byte[1024];
+ int len = 0;
+ while ((len = is.read(buffer)) != -1) {
+ fos.write(buffer, 0, len);
+ }
+
+ fos.close();
+ is.close();
+
+ Intent shareIntent = new Intent(Intent.ACTION_SEND);
+
+ shareIntent.setType("image/jpeg");
+ shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tmpFile));
+
+ m_tmpFileName = tmpFile.getAbsolutePath();
+
+ startActivityForResult(Intent.createChooser(shareIntent, getString(R.string.share_comic)), REQUEST_SHARE);
+
+ } catch (IOException e) {
+ toast(getString(R.string.error_could_not_prepare_file_for_sharing));
+ e.printStackTrace();
+ }
+
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ if (requestCode == REQUEST_SHARE) {
+ File tmpFile = new File(m_tmpFileName);
+
+ if (tmpFile.exists()) {
+ tmpFile.delete();
+ }
+
+ }
+ super.onActivityResult(requestCode, resultCode, intent);
+ }
+
+ protected boolean isOrientationLocked() {
+ return m_prefs.getBoolean("prefs_lock_orientation", false);
+ }
+
+ private void setOrientationLock(boolean locked, boolean restoreLast) {
+ if (locked) {
+
+ int currentOrientation = restoreLast ? m_prefs.getInt("last_orientation", getResources().getConfiguration().orientation) :
+ getResources().getConfiguration().orientation;
+
+ if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
+ } else {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
+ }
+ } else {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
+ }
+
+ if (locked != isOrientationLocked()) {
+ SharedPreferences.Editor editor = m_prefs.edit();
+ editor.putBoolean("prefs_lock_orientation", locked);
+ editor.putInt("last_orientation", getResources().getConfiguration().orientation);
+ editor.apply();
+ }
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_share:
+ shareComic();
+ return true;
+ case R.id.menu_toggle_orientation_lock:
+ setOrientationLock(!isOrientationLocked(), false);
+ return true;
+ case R.id.menu_sync_location:
+ m_syncClient.getPosition(sha1(new File(m_fileName).getName()), new SyncClient.PositionReceivedListener() {
+ @Override
+ public void onPositionReceived(final int position) {
+ final ComicPager pager = (ComicPager) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_PAGER);
+
+ if (pager != null && pager.isAdded()) {
+ int localPosition = pager.getPosition();
+
+ if (position > localPosition) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(ViewComicActivity.this);
+ builder.setMessage(getString(R.string.sync_server_has_further_page, localPosition + 1, position + 1))
+ .setCancelable(true)
+ .setPositiveButton(R.string.dialog_open_page, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ pager.setCurrentItem(position);
+ }
+ })
+ .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+ } else if (position == -1) {
+ toast("Could not contact sync server.");
+ } else {
+ toast(R.string.error_sync_no_data);
+ }
+
+ }
+ }
+ });
+ return true;
+ case R.id.menu_go_location:
+ Dialog dialog = new Dialog(ViewComicActivity.this);
+ AlertDialog.Builder builder = new AlertDialog.Builder(ViewComicActivity.this)
+ .setTitle("Go to...")
+ .setItems(
+ new String[] {
+ getString(R.string.dialog_location_beginning),
+ getString(R.string.dialog_location_furthest),
+ getString(R.string.dialog_location_location),
+ getString(R.string.dialog_location_end)
+ },
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ final ComicPager cp = (ComicPager) getSupportFragmentManager().findFragmentByTag(CommonActivity.FRAG_COMICS_PAGER);
+
+ switch (which) {
+ case 0:
+ cp.setCurrentItem(0);
+ break;
+ case 1:
+ cp.setCurrentItem(m_databaseHelper.getMaxPosition(m_fileName));
+ break;
+ case 2:
+ if (true) {
+ LayoutInflater inflater = getLayoutInflater();
+ View contentView = inflater.inflate(R.layout.dialog_location, null);
+
+ final NumberPicker picker = (NumberPicker) contentView.findViewById(R.id.number_picker);
+
+ picker.setMinValue(1);
+ picker.setMaxValue(m_databaseHelper.getSize(m_fileName));
+ picker.setValue(cp.getPosition() + 1);
+
+ Dialog seekDialog = new Dialog(ViewComicActivity.this);
+ AlertDialog.Builder seekBuilder = new AlertDialog.Builder(ViewComicActivity.this)
+ .setTitle(R.string.dialog_open_location)
+ .setView(contentView)
+ .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.cancel();
+ }
+ }).setPositiveButton(R.string.dialog_open_location, new DialogInterface.OnClickListener() {
+
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.cancel();
+
+ cp.setCurrentItem(picker.getValue()-1);
+
+ }
+ });
+
+ seekDialog = seekBuilder.create();
+ seekDialog.show();
+ }
+
+ break;
+ case 3:
+ cp.setCurrentItem(cp.getCount() - 1);
+ break;
+ }
+
+ dialog.cancel();
+ }
+ });
+
+ dialog = builder.create();
+ dialog.show();
+
+ return true;
+ case android.R.id.home:
+ onBackPressed();
+ return true;
+ default:
+ Log.d(TAG,
+ "onOptionsItemSelected, unhandled id=" + item.getItemId());
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ public void hideSeekBar(boolean hide) {
+ ComicPager pager = (ComicPager) getSupportFragmentManager().findFragmentByTag(FRAG_COMICS_PAGER);
+
+ if (pager != null) {
+ pager.hideReadingUI(hide);
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ Intent resultIntent = new Intent();
+ resultIntent.putExtra("fileName", m_fileName);
+
+ setResult(Activity.RESULT_OK, resultIntent);
+
+ super.onBackPressed();
+ }
+
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/archive/CbzComicArchive.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/archive/CbzComicArchive.java
index f6612fe..dc68fd1 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/archive/CbzComicArchive.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/archive/CbzComicArchive.java
@@ -1,94 +1,94 @@
-package org.fox.ttcomics2.archive;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import org.fox.ttcomics2.utils.NaturalOrderComparator;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-public class CbzComicArchive extends ComicArchive {
- private final String TAG = this.getClass().getSimpleName();
-
- private String m_fileName;
- private ZipFile m_zipFile;
- private int m_count;
- private ArrayList<ZipEntry> m_entries = new ArrayList<ZipEntry>();
-
- @Override
- public int getCount() {
- return m_count;
- }
-
- @Override
- public InputStream getItem(int index) throws IOException {
- return m_zipFile.getInputStream(m_entries.get(index));
- }
-
- protected void initialize() throws IOException {
- m_zipFile = new ZipFile(m_fileName);
-
- Enumeration<? extends ZipEntry> e = m_zipFile.entries();
-
- while (e.hasMoreElements()) {
- ZipEntry ze = e.nextElement();
- if (!ze.isDirectory() && isValidComic(ze.getName())) {
- m_entries.add(ze);
- m_count++;
- }
- }
-
- Collections.sort(m_entries, new NaturalOrderComparator());
- }
-
- public CbzComicArchive(String fileName) throws IOException {
- m_fileName = fileName;
-
- initialize();
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- out.writeString(m_fileName);
- }
-
- public void readFromParcel(Parcel in) {
- m_fileName = in.readString();
- }
-
- public CbzComicArchive(Parcel in) throws IOException {
- readFromParcel(in);
-
- initialize();
- }
-
- @SuppressWarnings("rawtypes")
- public static final Parcelable.Creator CREATOR =
- new Parcelable.Creator() {
- public CbzComicArchive createFromParcel(Parcel in) {
- try {
- return new CbzComicArchive(in);
- } catch (IOException e) {
- e.printStackTrace();
-
- return null;
- }
- }
-
- public CbzComicArchive[] newArray(int size) {
- return new CbzComicArchive[size];
- }
- };
-
-}
+package org.fox.ttcomics2.archive;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import org.fox.ttcomics2.utils.NaturalOrderComparator;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class CbzComicArchive extends ComicArchive {
+ private final String TAG = this.getClass().getSimpleName();
+
+ private String m_fileName;
+ private ZipFile m_zipFile;
+ private int m_count;
+ private ArrayList<ZipEntry> m_entries = new ArrayList<ZipEntry>();
+
+ @Override
+ public int getCount() {
+ return m_count;
+ }
+
+ @Override
+ public InputStream getItem(int index) throws IOException {
+ return m_zipFile.getInputStream(m_entries.get(index));
+ }
+
+ protected void initialize() throws IOException {
+ m_zipFile = new ZipFile(m_fileName);
+
+ Enumeration<? extends ZipEntry> e = m_zipFile.entries();
+
+ while (e.hasMoreElements()) {
+ ZipEntry ze = e.nextElement();
+ if (!ze.isDirectory() && isValidComic(ze.getName())) {
+ m_entries.add(ze);
+ m_count++;
+ }
+ }
+
+ Collections.sort(m_entries, new NaturalOrderComparator());
+ }
+
+ public CbzComicArchive(String fileName) throws IOException {
+ m_fileName = fileName;
+
+ initialize();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString(m_fileName);
+ }
+
+ public void readFromParcel(Parcel in) {
+ m_fileName = in.readString();
+ }
+
+ public CbzComicArchive(Parcel in) throws IOException {
+ readFromParcel(in);
+
+ initialize();
+ }
+
+ @SuppressWarnings("rawtypes")
+ public static final Parcelable.Creator CREATOR =
+ new Parcelable.Creator() {
+ public CbzComicArchive createFromParcel(Parcel in) {
+ try {
+ return new CbzComicArchive(in);
+ } catch (IOException e) {
+ e.printStackTrace();
+
+ return null;
+ }
+ }
+
+ public CbzComicArchive[] newArray(int size) {
+ return new CbzComicArchive[size];
+ }
+ };
+
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/archive/ComicArchive.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/archive/ComicArchive.java
index 7e8d79d..94212ff 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/archive/ComicArchive.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/archive/ComicArchive.java
@@ -1,29 +1,29 @@
-package org.fox.ttcomics2.archive;
-
-import android.os.Parcelable;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-public abstract class ComicArchive implements Parcelable {
- public abstract int getCount();
- public abstract InputStream getItem(int index) throws IOException;
- public boolean isValidComic(String fileName) {
- return fileName.toLowerCase().matches(".*\\.(jpe?g|bmp|gif|png)$");
- }
- public byte[] getByteArray(int m_page) throws IOException {
- InputStream is = getItem(m_page);
-
- int size = 16384;
- byte[] buf = new byte[size];
- int len = 0;
-
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- buf = new byte[size];
- while ((len = is.read(buf, 0, size)) != -1)
- bos.write(buf, 0, len);
-
- return bos.toByteArray();
- }
-}
+package org.fox.ttcomics2.archive;
+
+import android.os.Parcelable;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public abstract class ComicArchive implements Parcelable {
+ public abstract int getCount();
+ public abstract InputStream getItem(int index) throws IOException;
+ public boolean isValidComic(String fileName) {
+ return fileName.toLowerCase().matches(".*\\.(jpe?g|bmp|gif|png)$");
+ }
+ public byte[] getByteArray(int m_page) throws IOException {
+ InputStream is = getItem(m_page);
+
+ int size = 16384;
+ byte[] buf = new byte[size];
+ int len = 0;
+
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ buf = new byte[size];
+ while ((len = is.read(buf, 0, size)) != -1)
+ bos.write(buf, 0, len);
+
+ return bos.toByteArray();
+ }
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/sync/SyncClient.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/sync/SyncClient.java
index 861eb31..0d27817 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/sync/SyncClient.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/sync/SyncClient.java
@@ -1,204 +1,204 @@
-package org.fox.ttcomics2.sync;
-
-import android.os.AsyncTask;
-import android.util.Log;
-
-import org.fox.ttcomics2.CommonActivity;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-
-public class SyncClient {
- public interface PositionReceivedListener {
- void onPositionReceived(int position);
- }
-
- public interface DataClearedListener {
- void onDataCleared(boolean result);
- }
-
- private class HttpTask extends AsyncTask<String, Integer, Boolean> {
- protected String m_response = null;
- protected int m_responseCode = -1;
-
- @Override
- protected Boolean doInBackground(String... params) {
-
- try {
- HttpURLConnection conn = doSyncHttpRequest(params);
-
- if (conn != null) {
- m_responseCode = conn.getResponseCode();
-
- if (m_responseCode == HttpURLConnection.HTTP_OK) {
- m_response = readHttpResponse(conn);
-
- //Log.d(TAG, "<<< " + m_response);
-
- if (m_response != null && m_response.indexOf("ERROR") == -1) {
- return true;
- } else {
- return false;
- }
- } else {
- Log.d(TAG, "HTTP error, code: " + m_responseCode);
- }
-
- conn.disconnect();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- return false;
- }
-
- }
-
- private final String TAG = this.getClass().getSimpleName();
- private static final String SYNC_ENDPOINT = "http://tt-rss.org/tcrsync/";
- private String m_owner = null;
-
- public void setOwner(String owner) {
- m_owner = CommonActivity.sha1(owner);
- }
-
- public int getPosition(String hash, final PositionReceivedListener listener) {
- if (m_owner != null) {
- Log.d(TAG, "Requesting sync data...");
-
- HttpTask task = new HttpTask() {
- @Override
- protected void onPostExecute(Boolean result) {
- if (result) {
- try {
- listener.onPositionReceived(Integer.valueOf(m_response));
- } catch (NumberFormatException e) {
- e.printStackTrace();
- }
- } else {
- listener.onPositionReceived(-1);
- }
- }
- };
-
- task.execute("get", hash);
-
- }
- return -1;
- }
-
- public void setPosition(String hash, int position) {
- if (m_owner != null) {
- Log.d(TAG, "Uploading sync data...");
-
- HttpTask task = new HttpTask();
-
- task.execute("set", hash, String.valueOf(position));
- }
- }
-
- public void clearData(final DataClearedListener listener) {
- if (m_owner != null) {
- Log.d(TAG, "Clearing sync data...");
-
- HttpTask task = new HttpTask() {
- @Override
- protected void onPostExecute(Boolean result) {
- if (listener != null) listener.onDataCleared(result);
- }
- };
-
- task.execute("clear");
- }
- }
-
- public void clearData(String hash, final DataClearedListener listener) {
- if (m_owner != null) {
- Log.d(TAG, "Clearing sync data: " + hash);
-
- HttpTask task = new HttpTask() {
- @Override
- protected void onPostExecute(Boolean result) {
- if (listener != null) listener.onDataCleared(result);
- }
- };
-
-
- task.execute("clear", hash);
- }
- }
-
- public HttpURLConnection doSyncHttpRequest(String ... params) {
- String requestStr = null;
- String op = params[0];
-
- if (op.equals("set")) {
- requestStr = String.format("op=set&owner=%1$s&hash=%2$s&position=%3$s", m_owner, params[1], params[2]);
- } else if (op.equals("get")) {
- requestStr = String.format("op=get&owner=%1$s&hash=%2$s", m_owner, params[1]);
- } else if (op.equals("clear")) {
- if (params.length > 1) {
- requestStr = String.format("op=clear&owner=%1$s&hash=%2$s", m_owner, params[1]);
- } else {
- requestStr = String.format("op=clear&owner=%1$s", m_owner);
- }
- }
-
- requestStr += "&version=2";
-
- Log.d(TAG, requestStr);
-
- if (requestStr == null) return null;
-
- try {
- byte[] postData = requestStr.getBytes("UTF-8");
-
- URL url = new URL(SYNC_ENDPOINT);
-
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setDoInput(true);
- conn.setDoOutput(true);
- conn.setUseCaches(false);
- conn.setRequestMethod("POST");
-
- OutputStream out = conn.getOutputStream();
- out.write(postData);
- out.close();
-
- return conn;
-
- } catch (Exception e) {
- }
-
- return null;
- }
-
- public String readHttpResponse(HttpURLConnection conn) {
- try {
- StringBuffer response = new StringBuffer();
- InputStreamReader in = new InputStreamReader(conn.getInputStream(), "UTF-8");
-
- char[] buf = new char[1024];
- int read = 0;
-
- while ((read = in.read(buf)) >= 0) {
- response.append(buf, 0, read);
- }
-
- //Log.d(TAG, "<<< " + response);
-
- return response.toString();
- } catch (IOException e) {
- return null;
- }
- }
-
- public boolean hasOwner() {
- return m_owner != null;
- }
-
-}
+package org.fox.ttcomics2.sync;
+
+import android.os.AsyncTask;
+import android.util.Log;
+
+import org.fox.ttcomics2.CommonActivity;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class SyncClient {
+ public interface PositionReceivedListener {
+ void onPositionReceived(int position);
+ }
+
+ public interface DataClearedListener {
+ void onDataCleared(boolean result);
+ }
+
+ private class HttpTask extends AsyncTask<String, Integer, Boolean> {
+ protected String m_response = null;
+ protected int m_responseCode = -1;
+
+ @Override
+ protected Boolean doInBackground(String... params) {
+
+ try {
+ HttpURLConnection conn = doSyncHttpRequest(params);
+
+ if (conn != null) {
+ m_responseCode = conn.getResponseCode();
+
+ if (m_responseCode == HttpURLConnection.HTTP_OK) {
+ m_response = readHttpResponse(conn);
+
+ //Log.d(TAG, "<<< " + m_response);
+
+ if (m_response != null && m_response.indexOf("ERROR") == -1) {
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ Log.d(TAG, "HTTP error, code: " + m_responseCode);
+ }
+
+ conn.disconnect();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return false;
+ }
+
+ }
+
+ private final String TAG = this.getClass().getSimpleName();
+ private static final String SYNC_ENDPOINT = "http://tt-rss.org/tcrsync/";
+ private String m_owner = null;
+
+ public void setOwner(String owner) {
+ m_owner = CommonActivity.sha1(owner);
+ }
+
+ public int getPosition(String hash, final PositionReceivedListener listener) {
+ if (m_owner != null) {
+ Log.d(TAG, "Requesting sync data...");
+
+ HttpTask task = new HttpTask() {
+ @Override
+ protected void onPostExecute(Boolean result) {
+ if (result) {
+ try {
+ listener.onPositionReceived(Integer.valueOf(m_response));
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ } else {
+ listener.onPositionReceived(-1);
+ }
+ }
+ };
+
+ task.execute("get", hash);
+
+ }
+ return -1;
+ }
+
+ public void setPosition(String hash, int position) {
+ if (m_owner != null) {
+ Log.d(TAG, "Uploading sync data...");
+
+ HttpTask task = new HttpTask();
+
+ task.execute("set", hash, String.valueOf(position));
+ }
+ }
+
+ public void clearData(final DataClearedListener listener) {
+ if (m_owner != null) {
+ Log.d(TAG, "Clearing sync data...");
+
+ HttpTask task = new HttpTask() {
+ @Override
+ protected void onPostExecute(Boolean result) {
+ if (listener != null) listener.onDataCleared(result);
+ }
+ };
+
+ task.execute("clear");
+ }
+ }
+
+ public void clearData(String hash, final DataClearedListener listener) {
+ if (m_owner != null) {
+ Log.d(TAG, "Clearing sync data: " + hash);
+
+ HttpTask task = new HttpTask() {
+ @Override
+ protected void onPostExecute(Boolean result) {
+ if (listener != null) listener.onDataCleared(result);
+ }
+ };
+
+
+ task.execute("clear", hash);
+ }
+ }
+
+ public HttpURLConnection doSyncHttpRequest(String ... params) {
+ String requestStr = null;
+ String op = params[0];
+
+ if (op.equals("set")) {
+ requestStr = String.format("op=set&owner=%1$s&hash=%2$s&position=%3$s", m_owner, params[1], params[2]);
+ } else if (op.equals("get")) {
+ requestStr = String.format("op=get&owner=%1$s&hash=%2$s", m_owner, params[1]);
+ } else if (op.equals("clear")) {
+ if (params.length > 1) {
+ requestStr = String.format("op=clear&owner=%1$s&hash=%2$s", m_owner, params[1]);
+ } else {
+ requestStr = String.format("op=clear&owner=%1$s", m_owner);
+ }
+ }
+
+ requestStr += "&version=2";
+
+ Log.d(TAG, requestStr);
+
+ if (requestStr == null) return null;
+
+ try {
+ byte[] postData = requestStr.getBytes("UTF-8");
+
+ URL url = new URL(SYNC_ENDPOINT);
+
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.setDoInput(true);
+ conn.setDoOutput(true);
+ conn.setUseCaches(false);
+ conn.setRequestMethod("POST");
+
+ OutputStream out = conn.getOutputStream();
+ out.write(postData);
+ out.close();
+
+ return conn;
+
+ } catch (Exception e) {
+ }
+
+ return null;
+ }
+
+ public String readHttpResponse(HttpURLConnection conn) {
+ try {
+ StringBuffer response = new StringBuffer();
+ InputStreamReader in = new InputStreamReader(conn.getInputStream(), "UTF-8");
+
+ char[] buf = new char[1024];
+ int read = 0;
+
+ while ((read = in.read(buf)) >= 0) {
+ response.append(buf, 0, read);
+ }
+
+ //Log.d(TAG, "<<< " + response);
+
+ return response.toString();
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ public boolean hasOwner() {
+ return m_owner != null;
+ }
+
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/sync/SyncFolderService.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/sync/SyncFolderService.java
index 66ac766..95e9eeb 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/sync/SyncFolderService.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/sync/SyncFolderService.java
@@ -1,123 +1,123 @@
-package org.fox.ttcomics2.sync;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.AsyncTask;
-import android.os.Binder;
-import android.os.IBinder;
-import android.util.Log;
-
-import org.fox.ttcomics2.BuildConfig;
-import org.fox.ttcomics2.CommonActivity;
-import org.fox.ttcomics2.DatabaseHelper;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.HttpURLConnection;
-
-public class SyncFolderService extends Service {
- private final String TAG = this.getClass().getSimpleName();
-
- public final static String INTENT_ACTION_FILE_PROCESSED = "org.fox.ttcomics2.intent.action.FileProcessed";
- public final static String INTENT_ACTION_SCAN_COMPLETE = "org.fox.ttcomics2.intent.action.ScanComplete";
-
- private DatabaseHelper m_databaseHelper;
- private final IBinder m_binder = new LocalBinder();
-
- public class LocalBinder extends Binder {
- SyncFolderService getService() {
- return SyncFolderService.this;
- }
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- m_databaseHelper = DatabaseHelper.getInstance(this);
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return m_binder;
- }
-
- @Override
- public void onStart(Intent intent, int startId) {
- String baseDir = intent.getExtras().getString("baseDir");
-
- AsyncTask<String, Integer, Integer> task = new AsyncTask<String, Integer, Integer>() {
- @Override
- protected Integer doInBackground(String... params) {
- File rootDir = new File(params[0]);
-
- if (rootDir.exists() && rootDir.isDirectory()) {
-
- int index = 0;
- int count = rootDir.listFiles().length;
-
- for (File file : rootDir.listFiles()) {
- ++index;
-
- Log.d(TAG, "file=" + file.getAbsolutePath());
-
- SyncClient m_syncClient = new SyncClient();
-
- String googleAccount = CommonActivity.getGoogleAccount(getApplicationContext());
-
- if (googleAccount != null) {
- m_syncClient.setOwner(googleAccount);
- } else if (BuildConfig.DEBUG) {
- m_syncClient.setOwner("TEST-ACCOUNT");
- }
-
- HttpURLConnection conn = m_syncClient.doSyncHttpRequest("get", CommonActivity.sha1(file.getName()));
-
- try {
- if (conn != null && conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
- String result = m_syncClient.readHttpResponse(conn);
-
- if (result != null) {
- //Log.d(TAG, "GOT=" + result);
-
- int position = Integer.valueOf(result);
-
- if (position > 0) {
-
- if (position > m_databaseHelper.getLastPosition(file.getAbsolutePath())) {
- m_databaseHelper.setLastPosition(file.getAbsolutePath(), position);
- }
- }
-
- }
-
- Thread.sleep(250);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- Intent broadcast = new Intent();
- broadcast.setAction(INTENT_ACTION_FILE_PROCESSED);
- broadcast.putExtra("index", index);
- broadcast.putExtra("count", count);
- broadcast.addCategory(Intent.CATEGORY_DEFAULT);
- sendBroadcast(broadcast);
- }
- }
-
- Intent broadcast = new Intent();
- broadcast.setAction(INTENT_ACTION_SCAN_COMPLETE);
- broadcast.addCategory(Intent.CATEGORY_DEFAULT);
- sendBroadcast(broadcast);
-
- return null;
- }
- };
-
- task.execute(baseDir);
- }
-
-}
+package org.fox.ttcomics2.sync;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Binder;
+import android.os.IBinder;
+import android.util.Log;
+
+import org.fox.ttcomics2.BuildConfig;
+import org.fox.ttcomics2.CommonActivity;
+import org.fox.ttcomics2.DatabaseHelper;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+
+public class SyncFolderService extends Service {
+ private final String TAG = this.getClass().getSimpleName();
+
+ public final static String INTENT_ACTION_FILE_PROCESSED = "org.fox.ttcomics2.intent.action.FileProcessed";
+ public final static String INTENT_ACTION_SCAN_COMPLETE = "org.fox.ttcomics2.intent.action.ScanComplete";
+
+ private DatabaseHelper m_databaseHelper;
+ private final IBinder m_binder = new LocalBinder();
+
+ public class LocalBinder extends Binder {
+ SyncFolderService getService() {
+ return SyncFolderService.this;
+ }
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ m_databaseHelper = DatabaseHelper.getInstance(this);
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return m_binder;
+ }
+
+ @Override
+ public void onStart(Intent intent, int startId) {
+ String baseDir = intent.getExtras().getString("baseDir");
+
+ AsyncTask<String, Integer, Integer> task = new AsyncTask<String, Integer, Integer>() {
+ @Override
+ protected Integer doInBackground(String... params) {
+ File rootDir = new File(params[0]);
+
+ if (rootDir.exists() && rootDir.isDirectory()) {
+
+ int index = 0;
+ int count = rootDir.listFiles().length;
+
+ for (File file : rootDir.listFiles()) {
+ ++index;
+
+ Log.d(TAG, "file=" + file.getAbsolutePath());
+
+ SyncClient m_syncClient = new SyncClient();
+
+ String googleAccount = CommonActivity.getGoogleAccount(getApplicationContext());
+
+ if (googleAccount != null) {
+ m_syncClient.setOwner(googleAccount);
+ } else if (BuildConfig.DEBUG) {
+ m_syncClient.setOwner("TEST-ACCOUNT");
+ }
+
+ HttpURLConnection conn = m_syncClient.doSyncHttpRequest("get", CommonActivity.sha1(file.getName()));
+
+ try {
+ if (conn != null && conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
+ String result = m_syncClient.readHttpResponse(conn);
+
+ if (result != null) {
+ //Log.d(TAG, "GOT=" + result);
+
+ int position = Integer.valueOf(result);
+
+ if (position > 0) {
+
+ if (position > m_databaseHelper.getLastPosition(file.getAbsolutePath())) {
+ m_databaseHelper.setLastPosition(file.getAbsolutePath(), position);
+ }
+ }
+
+ }
+
+ Thread.sleep(250);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ Intent broadcast = new Intent();
+ broadcast.setAction(INTENT_ACTION_FILE_PROCESSED);
+ broadcast.putExtra("index", index);
+ broadcast.putExtra("count", count);
+ broadcast.addCategory(Intent.CATEGORY_DEFAULT);
+ sendBroadcast(broadcast);
+ }
+ }
+
+ Intent broadcast = new Intent();
+ broadcast.setAction(INTENT_ACTION_SCAN_COMPLETE);
+ broadcast.addCategory(Intent.CATEGORY_DEFAULT);
+ sendBroadcast(broadcast);
+
+ return null;
+ }
+ };
+
+ task.execute(baseDir);
+ }
+
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/ByteArrayImageDownloader.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/ByteArrayImageDownloader.java
index 0a36ccf..89f5260 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/ByteArrayImageDownloader.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/ByteArrayImageDownloader.java
@@ -1,29 +1,29 @@
-package org.fox.ttcomics2.utils;
-
-import android.content.Context;
-
-import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-public class ByteArrayImageDownloader extends BaseImageDownloader {
- private static final String SCHEME_STREAM = "stream";
- private static final String STREAM_URI_PREFIX = SCHEME_STREAM + "://";
-
- public ByteArrayImageDownloader(Context context) {
- super(context);
- }
-
- @Override
- protected InputStream getStreamFromOtherSource(String imageUri, Object extra) throws IOException {
- if (imageUri.startsWith(STREAM_URI_PREFIX)) {
- InputStream is = new ByteArrayInputStream((byte[])extra);
-
- return is;
- } else {
- return super.getStreamFromOtherSource(imageUri, extra);
- }
- }
-}
+package org.fox.ttcomics2.utils;
+
+import android.content.Context;
+
+import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ByteArrayImageDownloader extends BaseImageDownloader {
+ private static final String SCHEME_STREAM = "stream";
+ private static final String STREAM_URI_PREFIX = SCHEME_STREAM + "://";
+
+ public ByteArrayImageDownloader(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected InputStream getStreamFromOtherSource(String imageUri, Object extra) throws IOException {
+ if (imageUri.startsWith(STREAM_URI_PREFIX)) {
+ InputStream is = new ByteArrayInputStream((byte[])extra);
+
+ return is;
+ } else {
+ return super.getStreamFromOtherSource(imageUri, extra);
+ }
+ }
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/CompatListActivity.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/CompatListActivity.java
index 53ca9fd..2e04b2a 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/CompatListActivity.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/CompatListActivity.java
@@ -1,33 +1,33 @@
-package org.fox.ttcomics2.utils;
-
-import android.support.v7.app.AppCompatActivity;
-import android.widget.HeaderViewListAdapter;
-import android.widget.ListAdapter;
-import android.widget.ListView;
-
-// http://stackoverflow.com/questions/18403647/actionbaractivity-of-android-support-v7-appcompat-and-listactivity-in-same-act
-
-public abstract class CompatListActivity extends AppCompatActivity {
-
- private ListView mListView;
-
- protected ListView getListView() {
- if (mListView == null) {
- mListView = (ListView) findViewById(android.R.id.list);
- }
- return mListView;
- }
-
- protected void setListAdapter(ListAdapter adapter) {
- getListView().setAdapter(adapter);
- }
-
- protected ListAdapter getListAdapter() {
- ListAdapter adapter = getListView().getAdapter();
- if (adapter instanceof HeaderViewListAdapter) {
- return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
- } else {
- return adapter;
- }
- }
-}
+package org.fox.ttcomics2.utils;
+
+import android.support.v7.app.AppCompatActivity;
+import android.widget.HeaderViewListAdapter;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+
+// http://stackoverflow.com/questions/18403647/actionbaractivity-of-android-support-v7-appcompat-and-listactivity-in-same-act
+
+public abstract class CompatListActivity extends AppCompatActivity {
+
+ private ListView mListView;
+
+ protected ListView getListView() {
+ if (mListView == null) {
+ mListView = (ListView) findViewById(android.R.id.list);
+ }
+ return mListView;
+ }
+
+ protected void setListAdapter(ListAdapter adapter) {
+ getListView().setAdapter(adapter);
+ }
+
+ protected ListAdapter getListAdapter() {
+ ListAdapter adapter = getListView().getAdapter();
+ if (adapter instanceof HeaderViewListAdapter) {
+ return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
+ } else {
+ return adapter;
+ }
+ }
+}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/IVTViewPager.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/IVTViewPager.java
index 8360afe..814c4f2 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/IVTViewPager.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/IVTViewPager.java
@@ -1,39 +1,39 @@
-package org.fox.ttcomics2.utils;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-
-import it.sephiroth.android.library.imagezoom.ImageViewTouch;
-
-public class IVTViewPager extends android.support.v4.view.ViewPager {
- public IVTViewPager(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
- if (v instanceof ImageViewTouch) {
- ImageViewTouch ivt = (ImageViewTouch) v;
- try {
- return ivt.canScroll(dx);
- } catch (NullPointerException e) {
- // bad image, etc
- return false;
- }
- } else {
- return super.canScroll(v, checkV, dx, x, y);
- }
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- return super.onTouchEvent(event);
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent event) {
- return super.onInterceptTouchEvent(event);
- }
+package org.fox.ttcomics2.utils;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import it.sephiroth.android.library.imagezoom.ImageViewTouch;
+
+public class IVTViewPager extends android.support.v4.view.ViewPager {
+ public IVTViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
+ if (v instanceof ImageViewTouch) {
+ ImageViewTouch ivt = (ImageViewTouch) v;
+ try {
+ return ivt.canScroll(dx);
+ } catch (NullPointerException e) {
+ // bad image, etc
+ return false;
+ }
+ } else {
+ return super.canScroll(v, checkV, dx, x, y);
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ return super.onTouchEvent(event);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent event) {
+ return super.onInterceptTouchEvent(event);
+ }
} \ No newline at end of file
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/NaturalOrderComparator.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/NaturalOrderComparator.java
index 8994f51..6f2dc51 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/NaturalOrderComparator.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/utils/NaturalOrderComparator.java
@@ -1,191 +1,191 @@
-package org.fox.ttcomics2.utils;
-
-/*
- NaturalOrderComparator.java -- Perform 'natural order' comparisons of strings in Java.
- Copyright (C) 2003 by Pierre-Luc Paour <[email protected]>
-
- Based on the C version by Martin Pool, of which this is more or less a straight conversion.
- Copyright (C) 2000 by Martin Pool <[email protected]>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- */
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-public class NaturalOrderComparator implements Comparator
-{
- int compareRight(String a, String b)
- {
- int bias = 0;
- int ia = 0;
- int ib = 0;
-
- // The longest run of digits wins. That aside, the greatest
- // value wins, but we can't know that it will until we've scanned
- // both numbers to know that they have the same magnitude, so we
- // remember it in BIAS.
- for (;; ia++, ib++)
- {
- char ca = charAt(a, ia);
- char cb = charAt(b, ib);
-
- if (!Character.isDigit(ca) && !Character.isDigit(cb))
- {
- return bias;
- }
- else if (!Character.isDigit(ca))
- {
- return -1;
- }
- else if (!Character.isDigit(cb))
- {
- return +1;
- }
- else if (ca < cb)
- {
- if (bias == 0)
- {
- bias = -1;
- }
- }
- else if (ca > cb)
- {
- if (bias == 0)
- bias = +1;
- }
- else if (ca == 0 && cb == 0)
- {
- return bias;
- }
- }
- }
-
- public int compare(Object o1, Object o2)
- {
- String a = o1.toString();
- String b = o2.toString();
-
- int ia = 0, ib = 0;
- int nza = 0, nzb = 0;
- char ca, cb;
- int result;
-
- while (true)
- {
- // only count the number of zeroes leading the last number compared
- nza = nzb = 0;
-
- ca = charAt(a, ia);
- cb = charAt(b, ib);
-
- // skip over leading spaces or zeros
- while (Character.isSpaceChar(ca) || ca == '0')
- {
- if (ca == '0')
- {
- nza++;
- }
- else
- {
- // only count consecutive zeroes
- nza = 0;
- }
-
- ca = charAt(a, ++ia);
- }
-
- while (Character.isSpaceChar(cb) || cb == '0')
- {
- if (cb == '0')
- {
- nzb++;
- }
- else
- {
- // only count consecutive zeroes
- nzb = 0;
- }
-
- cb = charAt(b, ++ib);
- }
-
- // process run of digits
- if (Character.isDigit(ca) && Character.isDigit(cb))
- {
- if ((result = compareRight(a.substring(ia), b.substring(ib))) != 0)
- {
- return result;
- }
- }
-
- if (ca == 0 && cb == 0)
- {
- // The strings compare the same. Perhaps the caller
- // will want to call strcmp to break the tie.
- return nza - nzb;
- }
-
- if (ca < cb)
- {
- return -1;
- }
- else if (ca > cb)
- {
- return +1;
- }
-
- ++ia;
- ++ib;
- }
- }
-
- static char charAt(String s, int i)
- {
- if (i >= s.length())
- {
- return 0;
- }
- else
- {
- return s.charAt(i);
- }
- }
-
- public static void main(String[] args)
- {
- String[] strings = new String[] { "1-2", "1-02", "1-20", "10-20", "fred", "jane", "pic01",
- "pic2", "pic02", "pic02a", "pic3", "pic4", "pic 4 else", "pic 5", "pic05", "pic 5",
- "pic 5 something", "pic 6", "pic 7", "pic100", "pic100a", "pic120", "pic121",
- "pic02000", "tom", "x2-g8", "x2-y7", "x2-y08", "x8-y8" };
-
- List orig = Arrays.asList(strings);
-
- System.out.println("Original: " + orig);
-
- List scrambled = Arrays.asList(strings);
- Collections.shuffle(scrambled);
-
- System.out.println("Scrambled: " + scrambled);
-
- Collections.sort(scrambled, new NaturalOrderComparator());
-
- System.out.println("Sorted: " + scrambled);
- }
+package org.fox.ttcomics2.utils;
+
+/*
+ NaturalOrderComparator.java -- Perform 'natural order' comparisons of strings in Java.
+ Copyright (C) 2003 by Pierre-Luc Paour <[email protected]>
+
+ Based on the C version by Martin Pool, of which this is more or less a straight conversion.
+ Copyright (C) 2000 by Martin Pool <[email protected]>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+ */
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class NaturalOrderComparator implements Comparator
+{
+ int compareRight(String a, String b)
+ {
+ int bias = 0;
+ int ia = 0;
+ int ib = 0;
+
+ // The longest run of digits wins. That aside, the greatest
+ // value wins, but we can't know that it will until we've scanned
+ // both numbers to know that they have the same magnitude, so we
+ // remember it in BIAS.
+ for (;; ia++, ib++)
+ {
+ char ca = charAt(a, ia);
+ char cb = charAt(b, ib);
+
+ if (!Character.isDigit(ca) && !Character.isDigit(cb))
+ {
+ return bias;
+ }
+ else if (!Character.isDigit(ca))
+ {
+ return -1;
+ }
+ else if (!Character.isDigit(cb))
+ {
+ return +1;
+ }
+ else if (ca < cb)
+ {
+ if (bias == 0)
+ {
+ bias = -1;
+ }
+ }
+ else if (ca > cb)
+ {
+ if (bias == 0)
+ bias = +1;
+ }
+ else if (ca == 0 && cb == 0)
+ {
+ return bias;
+ }
+ }
+ }
+
+ public int compare(Object o1, Object o2)
+ {
+ String a = o1.toString();
+ String b = o2.toString();
+
+ int ia = 0, ib = 0;
+ int nza = 0, nzb = 0;
+ char ca, cb;
+ int result;
+
+ while (true)
+ {
+ // only count the number of zeroes leading the last number compared
+ nza = nzb = 0;
+
+ ca = charAt(a, ia);
+ cb = charAt(b, ib);
+
+ // skip over leading spaces or zeros
+ while (Character.isSpaceChar(ca) || ca == '0')
+ {
+ if (ca == '0')
+ {
+ nza++;
+ }
+ else
+ {
+ // only count consecutive zeroes
+ nza = 0;
+ }
+
+ ca = charAt(a, ++ia);
+ }
+
+ while (Character.isSpaceChar(cb) || cb == '0')
+ {
+ if (cb == '0')
+ {
+ nzb++;
+ }
+ else
+ {
+ // only count consecutive zeroes
+ nzb = 0;
+ }
+
+ cb = charAt(b, ++ib);
+ }
+
+ // process run of digits
+ if (Character.isDigit(ca) && Character.isDigit(cb))
+ {
+ if ((result = compareRight(a.substring(ia), b.substring(ib))) != 0)
+ {
+ return result;
+ }
+ }
+
+ if (ca == 0 && cb == 0)
+ {
+ // The strings compare the same. Perhaps the caller
+ // will want to call strcmp to break the tie.
+ return nza - nzb;
+ }
+
+ if (ca < cb)
+ {
+ return -1;
+ }
+ else if (ca > cb)
+ {
+ return +1;
+ }
+
+ ++ia;
+ ++ib;
+ }
+ }
+
+ static char charAt(String s, int i)
+ {
+ if (i >= s.length())
+ {
+ return 0;
+ }
+ else
+ {
+ return s.charAt(i);
+ }
+ }
+
+ public static void main(String[] args)
+ {
+ String[] strings = new String[] { "1-2", "1-02", "1-20", "10-20", "fred", "jane", "pic01",
+ "pic2", "pic02", "pic02a", "pic3", "pic4", "pic 4 else", "pic 5", "pic05", "pic 5",
+ "pic 5 something", "pic 6", "pic 7", "pic100", "pic100a", "pic120", "pic121",
+ "pic02000", "tom", "x2-g8", "x2-y7", "x2-y08", "x8-y8" };
+
+ List orig = Arrays.asList(strings);
+
+ System.out.println("Original: " + orig);
+
+ List scrambled = Arrays.asList(strings);
+ Collections.shuffle(scrambled);
+
+ System.out.println("Scrambled: " + scrambled);
+
+ Collections.sort(scrambled, new NaturalOrderComparator());
+
+ System.out.println("Sorted: " + scrambled);
+ }
} \ No newline at end of file
diff --git a/org.fox.ttcomics/src/main/res/layout/fragment_comics_pager.xml b/org.fox.ttcomics/src/main/res/layout/fragment_comics_pager.xml
index 021fa41..59b1a25 100755
--- a/org.fox.ttcomics/src/main/res/layout/fragment_comics_pager.xml
+++ b/org.fox.ttcomics/src/main/res/layout/fragment_comics_pager.xml
@@ -1,66 +1,66 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/comics_pager_container"
- android:layout_width="fill_parent"
- android:animateLayoutChanges="true"
- android:layout_height="fill_parent" >
-
- <org.fox.ttcomics2.utils.IVTViewPager
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:id="@+id/comics_pager"
- android:layout_alignParentBottom="true" />
-
- <RelativeLayout
- android:background="?colorButtonNormal"
- android:id="@+id/comics_bottom_bar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true">
-
- <SeekBar
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/comics_seek_bar"
- android:layout_alignParentBottom="false"
- android:layout_toRightOf="@+id/comics_page"
- android:layout_toLeftOf="@+id/comics_total_pages"
- android:layout_toStartOf="@+id/comics_total_pages" />
-
- <TextView
- android:layout_width="60dp"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:text="1123"
- android:id="@+id/comics_total_pages"
- android:layout_alignParentRight="true"
- android:layout_alignParentEnd="true"
- android:singleLine="true"
- android:layout_alignTop="@+id/comics_seek_bar"
- android:gravity="center"
- android:layout_alignBottom="@+id/comics_seek_bar"
- tools:ignore="HardcodedText" />
-
- <TextView
- android:layout_width="60dp"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:text="1"
- android:id="@+id/comics_page"
- android:singleLine="true"
- android:gravity="center"
- android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true"
- android:layout_alignParentBottom="false"
- android:layout_alignTop="@+id/comics_seek_bar"
- android:layout_alignBottom="@+id/comics_seek_bar"
- tools:ignore="HardcodedText" />
-
-
- </RelativeLayout>
-
-
-
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/comics_pager_container"
+ android:layout_width="fill_parent"
+ android:animateLayoutChanges="true"
+ android:layout_height="fill_parent" >
+
+ <org.fox.ttcomics2.utils.IVTViewPager
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:id="@+id/comics_pager"
+ android:layout_alignParentBottom="true" />
+
+ <RelativeLayout
+ android:background="?colorButtonNormal"
+ android:id="@+id/comics_bottom_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true">
+
+ <SeekBar
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/comics_seek_bar"
+ android:layout_alignParentBottom="false"
+ android:layout_toRightOf="@+id/comics_page"
+ android:layout_toLeftOf="@+id/comics_total_pages"
+ android:layout_toStartOf="@+id/comics_total_pages" />
+
+ <TextView
+ android:layout_width="60dp"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:text="1123"
+ android:id="@+id/comics_total_pages"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
+ android:singleLine="true"
+ android:layout_alignTop="@+id/comics_seek_bar"
+ android:gravity="center"
+ android:layout_alignBottom="@+id/comics_seek_bar"
+ tools:ignore="HardcodedText" />
+
+ <TextView
+ android:layout_width="60dp"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:text="1"
+ android:id="@+id/comics_page"
+ android:singleLine="true"
+ android:gravity="center"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentBottom="false"
+ android:layout_alignTop="@+id/comics_seek_bar"
+ android:layout_alignBottom="@+id/comics_seek_bar"
+ tools:ignore="HardcodedText" />
+
+
+ </RelativeLayout>
+
+
+
</RelativeLayout> \ No newline at end of file
diff --git a/org.fox.ttcomics/src/main/res/xml/preferences.xml b/org.fox.ttcomics/src/main/res/xml/preferences.xml
index 7305a3d..8d5f05b 100644
--- a/org.fox.ttcomics/src/main/res/xml/preferences.xml
+++ b/org.fox.ttcomics/src/main/res/xml/preferences.xml
@@ -1,71 +1,71 @@
-<?xml version="1.0" encoding="utf-8"?>
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
-
- <PreferenceCategory android:title="@string/prefs_general" >
- <Preference
- android:key="comics_directory"
- android:hint="@string/comics_directory_default"
- android:summary="@string/prefs_comics_directory_summary"
- android:title="@string/prefs_comics_directory" >
- </Preference>
- <SwitchPreference
- android:defaultValue="true"
- android:key="enable_fab"
- android:summary="Show floating action button"
- android:title="Enable FAB" />
- </PreferenceCategory>
- <PreferenceCategory android:title="@string/prefs_sync" >
- <SwitchPreference
- android:defaultValue="false"
- android:key="use_position_sync"
- android:title="@string/prefs_use_position_sync"
- android:summary="@string/prefs_use_position_sync_summary"
- />
-
- <Preference
- android:dependency="use_position_sync"
- android:key="clear_sync_data"
- android:title="@string/prefs_clear_sync_data"
- android:summary="@string/prefs_clear_sync_data_summary" >
- </Preference>
-
- </PreferenceCategory>
-
- <PreferenceCategory android:title="@string/prefs_reading" android:key="prefs_reading">
- <SwitchPreference
- android:defaultValue="false"
- android:key="use_dark_theme"
- android:title="@string/prefs_dark_theme" />
-
- <!-- <SwitchPreference
- android:defaultValue="false"
- android:key="dim_status_bar"
- android:title="@string/prefs_dim_status_bar" /> -->
-
- <SwitchPreference
- android:defaultValue="false"
- android:key="use_full_screen"
- android:title="@string/prefs_use_full_screen" />
-
- <SwitchPreference
- android:defaultValue="false"
- android:key="fit_to_width"
- android:title="@string/prefs_fit_to_width" />
-
- <SwitchPreference
- android:defaultValue="false"
- android:key="prevent_screen_sleep"
- android:title="@string/prefs_prevent_screen_sleep" />
-
- </PreferenceCategory>
-
- <Preference
- android:key="version"
- android:enabled="false"
- android:title="@string/prefs_version_title" />
-
- <Preference
- android:key="build_timestamp"
- android:enabled="false"
- android:title="@string/prefs_build_timestamp_title" />
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <PreferenceCategory android:title="@string/prefs_general" >
+ <Preference
+ android:key="comics_directory"
+ android:hint="@string/comics_directory_default"
+ android:summary="@string/prefs_comics_directory_summary"
+ android:title="@string/prefs_comics_directory" >
+ </Preference>
+ <SwitchPreference
+ android:defaultValue="true"
+ android:key="enable_fab"
+ android:summary="Show floating action button"
+ android:title="Enable FAB" />
+ </PreferenceCategory>
+ <PreferenceCategory android:title="@string/prefs_sync" >
+ <SwitchPreference
+ android:defaultValue="false"
+ android:key="use_position_sync"
+ android:title="@string/prefs_use_position_sync"
+ android:summary="@string/prefs_use_position_sync_summary"
+ />
+
+ <Preference
+ android:dependency="use_position_sync"
+ android:key="clear_sync_data"
+ android:title="@string/prefs_clear_sync_data"
+ android:summary="@string/prefs_clear_sync_data_summary" >
+ </Preference>
+
+ </PreferenceCategory>
+
+ <PreferenceCategory android:title="@string/prefs_reading" android:key="prefs_reading">
+ <SwitchPreference
+ android:defaultValue="false"
+ android:key="use_dark_theme"
+ android:title="@string/prefs_dark_theme" />
+
+ <!-- <SwitchPreference
+ android:defaultValue="false"
+ android:key="dim_status_bar"
+ android:title="@string/prefs_dim_status_bar" /> -->
+
+ <SwitchPreference
+ android:defaultValue="false"
+ android:key="use_full_screen"
+ android:title="@string/prefs_use_full_screen" />
+
+ <SwitchPreference
+ android:defaultValue="false"
+ android:key="fit_to_width"
+ android:title="@string/prefs_fit_to_width" />
+
+ <SwitchPreference
+ android:defaultValue="false"
+ android:key="prevent_screen_sleep"
+ android:title="@string/prefs_prevent_screen_sleep" />
+
+ </PreferenceCategory>
+
+ <Preference
+ android:key="version"
+ android:enabled="false"
+ android:title="@string/prefs_version_title" />
+
+ <Preference
+ android:key="build_timestamp"
+ android:enabled="false"
+ android:title="@string/prefs_build_timestamp_title" />
</PreferenceScreen> \ No newline at end of file