diff options
author | Andrew Dolgov <[email protected]> | 2015-06-12 12:08:47 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2015-06-12 12:08:47 +0300 |
commit | 8c2e73b5344e1770a536cee6b9f88a2101791334 (patch) | |
tree | 47e4ac2091f728c31041c1760b4369779a49e408 /org.fox.ttcomics | |
parent | 4d1f07884c7ecf55cce1b5e4a9d2204a6b5e6232 (diff) |
add icons & gpl license files
Diffstat (limited to 'org.fox.ttcomics')
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 |