Organized project.

captchafix
Florens Douwes 11 years ago
parent 4b1fb7b358
commit d825ebc5ad
  1. 95
      Chan/AndroidManifest.xml
  2. 0
      Chan/libs/ormlite-android-4.48-javadoc.jar
  3. 0
      Chan/libs/ormlite-android-4.48-sources.jar
  4. 0
      Chan/libs/ormlite-core-4.48-javadoc.jar
  5. 0
      Chan/libs/ormlite-core-4.48-sources.jar
  6. 4
      Chan/res/layout/board_edit.xml
  7. 18
      Chan/res/layout/floatlabel_edittext.xml
  8. 4
      Chan/res/layout/image_pager.xml
  9. 8
      Chan/res/layout/reply_view.xml
  10. 2
      Chan/res/values/dimens.xml
  11. 6
      Chan/res/xml/preference.xml
  12. 35
      Chan/src/org/floens/chan/ChanApplication.java
  13. 2
      Chan/src/org/floens/chan/chan/ChanUrls.java
  14. 2
      Chan/src/org/floens/chan/core/ChanPreferences.java
  15. 2
      Chan/src/org/floens/chan/core/loader/EndOfLineException.java
  16. 7
      Chan/src/org/floens/chan/core/loader/Loader.java
  17. 4
      Chan/src/org/floens/chan/core/loader/LoaderPool.java
  18. 94
      Chan/src/org/floens/chan/core/manager/BoardManager.java
  19. 25
      Chan/src/org/floens/chan/core/manager/PinnedManager.java
  20. 153
      Chan/src/org/floens/chan/core/manager/ReplyManager.java
  21. 42
      Chan/src/org/floens/chan/core/manager/ThreadManager.java
  22. 2
      Chan/src/org/floens/chan/core/model/Board.java
  23. 2
      Chan/src/org/floens/chan/core/model/Loadable.java
  24. 4
      Chan/src/org/floens/chan/core/model/Pin.java
  25. 8
      Chan/src/org/floens/chan/core/model/Post.java
  26. 2
      Chan/src/org/floens/chan/core/model/PostLinkable.java
  27. 2
      Chan/src/org/floens/chan/core/model/Reply.java
  28. 2
      Chan/src/org/floens/chan/core/model/SavedReply.java
  29. 4
      Chan/src/org/floens/chan/core/net/BoardsRequest.java
  30. 2
      Chan/src/org/floens/chan/core/net/ByteArrayRequest.java
  31. 12
      Chan/src/org/floens/chan/core/net/ChanReaderRequest.java
  32. 4
      Chan/src/org/floens/chan/core/net/GIFRequest.java
  33. 10
      Chan/src/org/floens/chan/core/watch/PinWatcher.java
  34. 10
      Chan/src/org/floens/chan/core/watch/WatchNotifier.java
  35. 6
      Chan/src/org/floens/chan/database/DatabaseHelper.java
  36. 54
      Chan/src/org/floens/chan/database/DatabaseManager.java
  37. 12
      Chan/src/org/floens/chan/service/PinnedService.java
  38. 2
      Chan/src/org/floens/chan/ui/ScrollerRunnable.java
  39. 2
      Chan/src/org/floens/chan/ui/SwipeDismissListViewTouchListener.java
  40. 2
      Chan/src/org/floens/chan/ui/ViewFlipperAnimations.java
  41. 2
      Chan/src/org/floens/chan/ui/activity/AboutActivity.java
  42. 25
      Chan/src/org/floens/chan/ui/activity/BaseActivity.java
  43. 31
      Chan/src/org/floens/chan/ui/activity/BoardActivity.java
  44. 16
      Chan/src/org/floens/chan/ui/activity/BoardEditor.java
  45. 8
      Chan/src/org/floens/chan/ui/activity/DeveloperActivity.java
  46. 8
      Chan/src/org/floens/chan/ui/activity/ImagePickActivity.java
  47. 10
      Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java
  48. 6
      Chan/src/org/floens/chan/ui/activity/ReplyActivity.java
  49. 4
      Chan/src/org/floens/chan/ui/activity/SettingsActivity.java
  50. 4
      Chan/src/org/floens/chan/ui/activity/WatchSettingsActivity.java
  51. 6
      Chan/src/org/floens/chan/ui/adapter/BoardEditAdapter.java
  52. 8
      Chan/src/org/floens/chan/ui/adapter/ImageViewAdapter.java
  53. 8
      Chan/src/org/floens/chan/ui/adapter/PinnedAdapter.java
  54. 12
      Chan/src/org/floens/chan/ui/adapter/PostAdapter.java
  55. 12
      Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java
  56. 8
      Chan/src/org/floens/chan/ui/fragment/PostRepliesFragment.java
  57. 28
      Chan/src/org/floens/chan/ui/fragment/ReplyFragment.java
  58. 6
      Chan/src/org/floens/chan/ui/fragment/SettingsFragment.java
  59. 18
      Chan/src/org/floens/chan/ui/fragment/ThreadFragment.java
  60. 4
      Chan/src/org/floens/chan/ui/view/DynamicListView.java
  61. 2
      Chan/src/org/floens/chan/ui/view/GIFView.java
  62. 2
      Chan/src/org/floens/chan/ui/view/HackyViewPager.java
  63. 4
      Chan/src/org/floens/chan/ui/view/LoadView.java
  64. 4
      Chan/src/org/floens/chan/ui/view/NetworkPhotoView.java
  65. 10
      Chan/src/org/floens/chan/ui/view/PostView.java
  66. 6
      Chan/src/org/floens/chan/ui/view/ThreadWatchCounterView.java
  67. 7
      Chan/src/org/floens/chan/utils/ImageSaver.java
  68. 7
      Chan/src/uk/co/senab/photoview/PhotoView.java
  69. 3
      Chan/src/uk/co/senab/photoview/gestures/EclairGestureDetector.java

@ -1,17 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.floens.chan" package="org.floens.chan"
android:installLocation="auto"
android:versionCode="12" android:versionCode="12"
android:versionName="v0.10" android:versionName="v0.10" >
android:installLocation="auto" >
<uses-sdk <uses-sdk
android:minSdkVersion="14" android:minSdkVersion="14"
android:targetSdkVersion="19" /> android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.NFC" />
<application <application
android:name="org.floens.chan.ChanApplication" android:name="org.floens.chan.ChanApplication"
android:allowBackup="true" android:allowBackup="true"
@ -19,80 +20,98 @@
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" > android:theme="@style/AppTheme" >
<activity <activity
android:name="org.floens.chan.activity.BoardActivity" android:name="org.floens.chan.ui.activity.BoardActivity"
android:label="@string/app_name" android:configChanges="keyboardHidden|orientation|screenSize"
android:configChanges="keyboardHidden|orientation|screenSize" > android:label="@string/app_name" >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<action android:name="android.nfc.action.NDEF_DISCOVERED"></action> <action android:name="android.nfc.action.NDEF_DISCOVERED" >
</action>
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:host="4chan.org" android:scheme="http" android:pathPrefix="/" /> <data
<data android:host="4chan.org" android:scheme="https" android:pathPrefix="/" /> android:host="4chan.org"
<data android:host="www.4chan.org" android:scheme="http" android:pathPrefix="/" /> android:pathPrefix="/"
<data android:host="www.4chan.org" android:scheme="https" android:pathPrefix="/" /> android:scheme="http" />
<data android:host="boards.4chan.org" android:scheme="http" android:pathPrefix="/" /> <data
<data android:host="boards.4chan.org" android:scheme="https" android:pathPrefix="/" /> android:host="4chan.org"
android:pathPrefix="/"
android:scheme="https" />
<data
android:host="www.4chan.org"
android:pathPrefix="/"
android:scheme="http" />
<data
android:host="www.4chan.org"
android:pathPrefix="/"
android:scheme="https" />
<data
android:host="boards.4chan.org"
android:pathPrefix="/"
android:scheme="http" />
<data
android:host="boards.4chan.org"
android:pathPrefix="/"
android:scheme="https" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name="org.floens.chan.activity.ReplyActivity" android:name="org.floens.chan.ui.activity.ReplyActivity"
android:windowSoftInputMode="adjustResize" android:configChanges="keyboardHidden|orientation|screenSize"
android:configChanges="keyboardHidden|orientation|screenSize" > android:windowSoftInputMode="adjustResize" >
</activity> </activity>
<activity <activity
android:name="org.floens.chan.activity.SettingsActivity"
android:label="@string/action_settings" android:label="@string/action_settings"
android:parentActivityName="org.floens.chan.activity.BoardActivity" > android:name="org.floens.chan.ui.activity.SettingsActivity"
android:parentActivityName="org.floens.chan.ui.activity.BoardActivity" >
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.activity.BoardActivity" /> android:value="org.floens.chan.ui.activity.BoardActivity" />
</activity> </activity>
<activity <activity
android:name="org.floens.chan.activity.WatchSettingsActivity" android:name="org.floens.chan.ui.activity.WatchSettingsActivity"
android:label="@string/preference_watch_settings" android:label="@string/preference_watch_settings"
android:parentActivityName="org.floens.chan.activity.BoardActivity" > android:parentActivityName="org.floens.chan.ui.activity.BoardActivity" >
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.activity.BoardActivity" /> android:value="org.floens.chan.ui.activity.BoardActivity" />
</activity> </activity>
<activity <activity
android:name="org.floens.chan.activity.AboutActivity" android:name="org.floens.chan.ui.activity.AboutActivity"
android:label="@string/preference_about" android:label="@string/preference_about"
android:parentActivityName="org.floens.chan.activity.BoardActivity" > android:parentActivityName="org.floens.chan.ui.activity.BoardActivity" >
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.activity.BoardActivity" /> android:value="org.floens.chan.ui.activity.BoardActivity" />
</activity> </activity>
<activity <activity
android:name="org.floens.chan.activity.BoardEditor" android:name="org.floens.chan.ui.activity.BoardEditor"
android:label="@string/board_edit" android:label="@string/board_edit"
android:parentActivityName="org.floens.chan.activity.BoardActivity" > android:parentActivityName="org.floens.chan.ui.activity.BoardActivity" >
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value="org.floens.chan.activity.BoardActivity" /> android:value="org.floens.chan.ui.activity.BoardActivity" />
</activity> </activity>
<activity <activity
android:name="org.floens.chan.imageview.activity.ImageViewActivity" android:name="org.floens.chan.ui.activity.ImageViewActivity"
android:configChanges="keyboardHidden|orientation|screenSize" android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@style/Theme.ImageList" > android:theme="@style/Theme.ImageList" >
</activity> </activity>
<activity <activity android:name="org.floens.chan.ui.activity.ImagePickActivity" >
android:name="org.floens.chan.activity.ImagePickActivity" >
</activity> </activity>
<activity <activity android:name="org.floens.chan.ui.activity.DeveloperActivity" >
android:name="org.floens.chan.activity.DeveloperActivity" >
</activity> </activity>
<service <service
android:name="org.floens.chan.service.PinnedService" android:name="org.floens.chan.service.PinnedService"
android:exported="false" > android:exported="false" >
</service> </service>
</application> </application>
</manifest>
</manifest>

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<org.floens.chan.view.DynamicListView xmlns:android="http://schemas.android.com/apk/res/android" <org.floens.chan.ui.view.DynamicListView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:id="@+id/board_edit_list" > android:id="@+id/board_edit_list" >
</org.floens.chan.view.DynamicListView> </org.floens.chan.ui.view.DynamicListView>

@ -1,20 +1,20 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_marginTop="5dp" android:layout_width="wrap_content"
android:orientation="vertical" android:layout_height="wrap_content"
android:layout_width="wrap_content" android:layout_marginTop="5dp"
android:layout_height="wrap_content"> android:orientation="vertical" >
<TextView <TextView
android:id="@+id/floating_label_hint" android:id="@+id/floating_label_hint"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:visibility="invisible"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="-8dp"/> android:layout_marginBottom="-8dp"
android:visibility="invisible" />
<EditText <EditText
android:id="@+id/floating_label_edit_text" android:id="@+id/floating_label_edit_text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:hint="tmp" android:layout_height="wrap_content" />
android:layout_height="wrap_content"/>
</LinearLayout> </LinearLayout>

@ -5,10 +5,10 @@
android:background="@color/image_list_background" android:background="@color/image_list_background"
android:orientation="vertical" > android:orientation="vertical" >
<org.floens.chan.view.HackyViewPager xmlns:android="http://schemas.android.com/apk/res/android" <org.floens.chan.ui.view.HackyViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/image_pager" android:id="@+id/image_pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
</org.floens.chan.view.HackyViewPager> </org.floens.chan.ui.view.HackyViewPager>
</RelativeLayout> </RelativeLayout>

@ -96,7 +96,7 @@
android:text="@string/reply_file_delete" /> android:text="@string/reply_file_delete" />
</LinearLayout> </LinearLayout>
<org.floens.chan.utils.LoadView <org.floens.chan.ui.view.LoadView
android:id="@+id/reply_image" android:id="@+id/reply_image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -115,7 +115,7 @@
android:padding="8dp" android:padding="8dp"
android:orientation="vertical" > android:orientation="vertical" >
<org.floens.chan.utils.LoadView <org.floens.chan.ui.view.LoadView
android:id="@+id/reply_captcha_container" android:id="@+id/reply_captcha_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" android:layout_height="200dp"
@ -136,13 +136,13 @@
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
<org.floens.chan.utils.LoadView <org.floens.chan.ui.view.LoadView
android:id="@+id/reply_response" android:id="@+id/reply_response"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" > android:orientation="vertical" >
</org.floens.chan.utils.LoadView> </org.floens.chan.ui.view.LoadView>
</ViewFlipper> </ViewFlipper>
<LinearLayout <LinearLayout
android:orientation="horizontal" android:orientation="horizontal"

@ -12,7 +12,5 @@
<dimen name="post_icon_height">14dp</dimen> <dimen name="post_icon_height">14dp</dimen>
<dimen name="post_max_height">200dp</dimen> <dimen name="post_max_height">200dp</dimen>
<dimen name="about_text_padding">11dp</dimen>
<dimen name="image_popup_padding">8dp</dimen> <dimen name="image_popup_padding">8dp</dimen>
</resources> </resources>

@ -6,13 +6,13 @@
android:title="@string/preference_watch_settings" > android:title="@string/preference_watch_settings" >
<intent <intent
android:action="android.intent.action.VIEW" android:action="android.intent.action.VIEW"
android:targetClass="org.floens.chan.activity.WatchSettingsActivity" android:targetClass="org.floens.chan.ui.activity.WatchSettingsActivity"
android:targetPackage="org.floens.chan" /> android:targetPackage="org.floens.chan" />
</Preference> </Preference>
<Preference android:title="@string/board_edit" > <Preference android:title="@string/board_edit" >
<intent <intent
android:action="android.intent.action.VIEW" android:action="android.intent.action.VIEW"
android:targetClass="org.floens.chan.activity.BoardEditor" android:targetClass="org.floens.chan.ui.activity.BoardEditor"
android:targetPackage="org.floens.chan" /> android:targetPackage="org.floens.chan" />
</Preference> </Preference>
@ -44,7 +44,7 @@
android:title="@string/preference_developer" > android:title="@string/preference_developer" >
<intent <intent
android:action="android.intent.action.VIEW" android:action="android.intent.action.VIEW"
android:targetClass="org.floens.chan.activity.DeveloperActivity" android:targetClass="org.floens.chan.ui.activity.DeveloperActivity"
android:targetPackage="org.floens.chan" /> android:targetPackage="org.floens.chan" />
</Preference> </Preference>
</PreferenceCategory> </PreferenceCategory>

@ -1,9 +1,9 @@
package org.floens.chan; package org.floens.chan;
import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.manager.PinnedManager;
import org.floens.chan.core.manager.ReplyManager;
import org.floens.chan.database.DatabaseManager; import org.floens.chan.database.DatabaseManager;
import org.floens.chan.manager.BoardManager;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.manager.ReplyManager;
import org.floens.chan.service.PinnedService; import org.floens.chan.service.PinnedService;
import org.floens.chan.utils.IconCache; import org.floens.chan.utils.IconCache;
@ -23,6 +23,10 @@ public class ChanApplication extends Application {
private static ChanApplication instance; private static ChanApplication instance;
private static RequestQueue volleyRequestQueue; private static RequestQueue volleyRequestQueue;
private static ImageLoader imageLoader; private static ImageLoader imageLoader;
private static BoardManager boardManager;
private static PinnedManager pinnedManager;
private static ReplyManager replyManager;
private static DatabaseManager databaseManager;
public ChanApplication() { public ChanApplication() {
instance = this; instance = this;
@ -40,6 +44,22 @@ public class ChanApplication extends Application {
return imageLoader; return imageLoader;
} }
public static BoardManager getBoardManager() {
return boardManager;
}
public static PinnedManager getPinnedManager() {
return pinnedManager;
}
public static ReplyManager getReplyManager() {
return replyManager;
}
public static DatabaseManager getDatabaseManager() {
return databaseManager;
}
public static SharedPreferences getPreferences() { public static SharedPreferences getPreferences() {
return PreferenceManager.getDefaultSharedPreferences(instance); return PreferenceManager.getDefaultSharedPreferences(instance);
} }
@ -65,11 +85,10 @@ public class ChanApplication extends Application {
volleyRequestQueue = Volley.newRequestQueue(this); volleyRequestQueue = Volley.newRequestQueue(this);
imageLoader = new ImageLoader(volleyRequestQueue, new BitmapLruImageCache(1024 * 1024 * 8)); imageLoader = new ImageLoader(volleyRequestQueue, new BitmapLruImageCache(1024 * 1024 * 8));
new DatabaseManager(this); databaseManager = new DatabaseManager(this);
boardManager = new BoardManager(this);
new BoardManager(this); pinnedManager = new PinnedManager(this);
new PinnedManager(this); replyManager = new ReplyManager(this);
new ReplyManager(this);
PinnedService.updateRunningState(this); PinnedService.updateRunningState(this);
} }

@ -1,4 +1,4 @@
package org.floens.chan.net; package org.floens.chan.chan;
import java.util.Locale; import java.util.Locale;

@ -1,4 +1,4 @@
package org.floens.chan.utils; package org.floens.chan.core;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.service.PinnedService; import org.floens.chan.service.PinnedService;

@ -1,4 +1,4 @@
package org.floens.chan.loader; package org.floens.chan.core.loader;
import com.android.volley.NetworkResponse; import com.android.volley.NetworkResponse;
import com.android.volley.VolleyError; import com.android.volley.VolleyError;

@ -1,11 +1,12 @@
package org.floens.chan.loader; package org.floens.chan.core.loader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.model.Loadable; import org.floens.chan.core.model.Loadable;
import org.floens.chan.model.Post; import org.floens.chan.core.model.Post;
import org.floens.chan.core.net.ChanReaderRequest;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import android.os.Handler; import android.os.Handler;

@ -1,9 +1,9 @@
package org.floens.chan.loader; package org.floens.chan.core.loader;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.floens.chan.model.Loadable; import org.floens.chan.core.model.Loadable;
public class LoaderPool { public class LoaderPool {
// private static final String TAG = "LoaderPool"; // private static final String TAG = "LoaderPool";

@ -1,13 +1,13 @@
package org.floens.chan.manager; package org.floens.chan.core.manager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Scanner; import java.util.Scanner;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.model.Board; import org.floens.chan.chan.ChanUrls;
import org.floens.chan.net.BoardsRequest; import org.floens.chan.core.model.Board;
import org.floens.chan.net.ChanUrls; import org.floens.chan.core.net.BoardsRequest;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import android.content.Context; import android.content.Context;
@ -18,31 +18,23 @@ import com.android.volley.VolleyError;
public class BoardManager { public class BoardManager {
private static final String TAG = "BoardManager"; private static final String TAG = "BoardManager";
private static BoardManager instance;
private final Context context; private final Context context;
// Including nsfw ones // Including nsfw ones
private ArrayList<Board> allBoards = new ArrayList<Board>(); private ArrayList<Board> allBoards = new ArrayList<Board>();
private ArrayList<Board> myBoards = new ArrayList<Board>(); private ArrayList<Board> myBoards = new ArrayList<Board>();
private final ArrayList<String> myBoardsKeys = new ArrayList<String>(); private final ArrayList<String> myBoardsKeys = new ArrayList<String>();
private final ArrayList<String> myBoardsValues = new ArrayList<String>(); private final ArrayList<String> myBoardsValues = new ArrayList<String>();
public BoardManager(Context context) { public BoardManager(Context context) {
instance = this;
this.context = context; this.context = context;
loadFromServer(); loadFromServer();
myBoards = loadMyBoards(); myBoards = loadMyBoards();
updateMyBoardsKeysAndValues(myBoards); updateMyBoardsKeysAndValues(myBoards);
} }
public static BoardManager getInstance() {
return instance;
}
/** /**
* Avoid having 0 boards, which causes graphical problems * Avoid having 0 boards, which causes graphical problems
* @param list * @param list
@ -81,56 +73,56 @@ public class BoardManager {
} }
return list; return list;
} }
public ArrayList<Board> getMyBoards() { public ArrayList<Board> getMyBoards() {
return myBoards; return myBoards;
} }
public void setMyBoards(ArrayList<Board> list) { public void setMyBoards(ArrayList<Board> list) {
myBoards.clear(); myBoards.clear();
myBoards = list; myBoards = list;
updateMyBoardsKeysAndValues(list); updateMyBoardsKeysAndValues(list);
storeBoardListInDatabase("myBoards", myBoards); storeBoardListInDatabase("myBoards", myBoards);
} }
private void updateMyBoardsKeysAndValues(ArrayList<Board> list) { private void updateMyBoardsKeysAndValues(ArrayList<Board> list) {
myBoardsKeys.clear(); myBoardsKeys.clear();
myBoardsValues.clear(); myBoardsValues.clear();
for (Board board : list) { for (Board board : list) {
myBoardsKeys.add(board.key); myBoardsKeys.add(board.key);
myBoardsValues.add(board.value); myBoardsValues.add(board.value);
} }
} }
public ArrayList<String> getMyBoardsKeys() { public ArrayList<String> getMyBoardsKeys() {
return myBoardsKeys; return myBoardsKeys;
} }
public ArrayList<String> getMyBoardsValues() { public ArrayList<String> getMyBoardsValues() {
return myBoardsValues; return myBoardsValues;
} }
public boolean getBoardExists(String board) { public boolean getBoardExists(String board) {
for (Board e : allBoards) { for (Board e : allBoards) {
if (e.value.equals(board)) { if (e.value.equals(board)) {
return true; return true;
} }
} }
return false; return false;
} }
public String getBoardKey(String value) { public String getBoardKey(String value) {
for (Board e : allBoards) { for (Board e : allBoards) {
if (e.value.equals(value)) { if (e.value.equals(value)) {
return e.key; return e.key;
} }
} }
return null; return null;
} }
/** /**
* Try to add value to the supplied list. * Try to add value to the supplied list.
* @param list * @param list
@ -140,87 +132,87 @@ public class BoardManager {
for (Board board : list) { for (Board board : list) {
if (board.value.equals(value)) { if (board.value.equals(value)) {
Toast.makeText(context, R.string.board_add_duplicate, Toast.LENGTH_LONG).show(); Toast.makeText(context, R.string.board_add_duplicate, Toast.LENGTH_LONG).show();
return; return;
} }
} }
for (Board board : allBoards) { for (Board board : allBoards) {
if (board.value.equals(value)) { if (board.value.equals(value)) {
list.add(board); list.add(board);
String text = context.getString(R.string.board_add_success) + " " + board.key; String text = context.getString(R.string.board_add_success) + " " + board.key;
Toast.makeText(context, text, Toast.LENGTH_LONG).show(); Toast.makeText(context, text, Toast.LENGTH_LONG).show();
return; return;
} }
} }
Toast.makeText(context, R.string.board_add_fail, Toast.LENGTH_LONG).show(); Toast.makeText(context, R.string.board_add_fail, Toast.LENGTH_LONG).show();
} }
private ArrayList<Board> loadMyBoards() { private ArrayList<Board> loadMyBoards() {
ArrayList<Board> list = getBoardListFromDatabase("myBoards"); ArrayList<Board> list = getBoardListFromDatabase("myBoards");
if (list == null || list.size() == 0) { if (list == null || list.size() == 0) {
list = getDefaultBoards(); list = getDefaultBoards();
storeBoardListInDatabase("myBoards", list); storeBoardListInDatabase("myBoards", list);
} }
return list; return list;
} }
private void storeBoardListInDatabase(String key, ArrayList<Board> list) { private void storeBoardListInDatabase(String key, ArrayList<Board> list) {
String total = ""; String total = "";
for (Board board : list) { for (Board board : list) {
total += board.key + "|" + board.value + "\n"; total += board.key + "|" + board.value + "\n";
} }
ChanApplication.getPreferences().edit().putString(key, total).commit(); ChanApplication.getPreferences().edit().putString(key, total).commit();
} }
private ArrayList<Board> getBoardListFromDatabase(String key) { private ArrayList<Board> getBoardListFromDatabase(String key) {
String total = ChanApplication.getPreferences().getString(key, null); String total = ChanApplication.getPreferences().getString(key, null);
if (total == null) return null; if (total == null) return null;
ArrayList<Board> list = new ArrayList<Board>(); ArrayList<Board> list = new ArrayList<Board>();
Scanner scanner = new Scanner(total); Scanner scanner = new Scanner(total);
while (scanner.hasNextLine()) { while (scanner.hasNextLine()) {
String line = scanner.nextLine(); String line = scanner.nextLine();
String[] splitted = line.split("\\|"); String[] splitted = line.split("\\|");
if (splitted.length < 2) continue; if (splitted.length < 2) continue;
Board board = new Board(); Board board = new Board();
board.key = splitted[0]; board.key = splitted[0];
board.value = splitted[1]; board.value = splitted[1];
if (!board.finish()) { if (!board.finish()) {
Logger.wtf(TAG, "board.finish in loadfrompreferences threw up"); Logger.wtf(TAG, "board.finish in loadfrompreferences threw up");
} }
list.add(board); list.add(board);
} }
scanner.close(); scanner.close();
return list; return list;
} }
private void loadFromServer() { private void loadFromServer() {
ArrayList<Board> temp = getBoardListFromDatabase("allBoards"); ArrayList<Board> temp = getBoardListFromDatabase("allBoards");
if (temp != null) { if (temp != null) {
allBoards = temp; allBoards = temp;
} }
ChanApplication.getVolleyRequestQueue().add(new BoardsRequest(ChanUrls.getBoardsUrl(), new Response.Listener<ArrayList<Board>>() { ChanApplication.getVolleyRequestQueue().add(new BoardsRequest(ChanUrls.getBoardsUrl(), new Response.Listener<ArrayList<Board>>() {
@Override @Override
public void onResponse(ArrayList<Board> data) { public void onResponse(ArrayList<Board> data) {
storeBoardListInDatabase("allBoards", data); storeBoardListInDatabase("allBoards", data);
allBoards = data; allBoards = data;
Logger.i(TAG, "Got boards from server"); Logger.i(TAG, "Got boards from server");
} }
}, new Response.ErrorListener() { }, new Response.ErrorListener() {

@ -1,27 +1,20 @@
package org.floens.chan.manager; package org.floens.chan.core.manager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.floens.chan.database.DatabaseManager; import org.floens.chan.ChanApplication;
import org.floens.chan.model.Loadable; import org.floens.chan.core.model.Loadable;
import org.floens.chan.model.Pin; import org.floens.chan.core.model.Pin;
import android.content.Context; import android.content.Context;
public class PinnedManager { public class PinnedManager {
private static PinnedManager instance;
private final List<PinListener> listeners = new ArrayList<PinListener>(); private final List<PinListener> listeners = new ArrayList<PinListener>();
private final List<Pin> pins; private final List<Pin> pins;
public PinnedManager(Context context) { public PinnedManager(Context context) {
instance = this; pins = ChanApplication.getDatabaseManager().getPinned();
pins = DatabaseManager.getInstance().getPinned();
}
public static PinnedManager getInstance() {
return instance;
} }
public void addPinListener(PinListener l) { public void addPinListener(PinListener l) {
@ -65,7 +58,7 @@ public class PinnedManager {
} }
pins.add(pin); pins.add(pin);
DatabaseManager.getInstance().addPin(pin); ChanApplication.getDatabaseManager().addPin(pin);
onPinsChanged(); onPinsChanged();
@ -78,7 +71,7 @@ public class PinnedManager {
*/ */
public void remove(Pin pin) { public void remove(Pin pin) {
pins.remove(pin); pins.remove(pin);
DatabaseManager.getInstance().removePin(pin); ChanApplication.getDatabaseManager().removePin(pin);
pin.destroy(); pin.destroy();
onPinsChanged(); onPinsChanged();
@ -89,7 +82,7 @@ public class PinnedManager {
* @param pin * @param pin
*/ */
public void update(Pin pin) { public void update(Pin pin) {
DatabaseManager.getInstance().updatePin(pin); ChanApplication.getDatabaseManager().updatePin(pin);
onPinsChanged(); onPinsChanged();
} }
@ -103,7 +96,7 @@ public class PinnedManager {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
DatabaseManager.getInstance().updatePins(pins); ChanApplication.getDatabaseManager().updatePins(pins);
} }
}).start(); }).start();
} }

@ -1,4 +1,4 @@
package org.floens.chan.manager; package org.floens.chan.core.manager;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -8,11 +8,11 @@ import java.util.Random;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.floens.chan.activity.ImagePickActivity; import org.floens.chan.ChanApplication;
import org.floens.chan.database.DatabaseManager; import org.floens.chan.chan.ChanUrls;
import org.floens.chan.model.Reply; import org.floens.chan.core.model.Reply;
import org.floens.chan.model.SavedReply; import org.floens.chan.core.model.SavedReply;
import org.floens.chan.net.ChanUrls; import org.floens.chan.ui.activity.ImagePickActivity;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
@ -35,43 +35,36 @@ import ch.boye.httpclientandroidlib.util.EntityUtils;
*/ */
public class ReplyManager { public class ReplyManager {
private static final String TAG = "ReplyManager"; private static final String TAG = "ReplyManager";
private static ReplyManager instance;
private static final Pattern challengePattern = Pattern.compile("challenge.?:.?'([\\w-]+)'"); private static final Pattern challengePattern = Pattern.compile("challenge.?:.?'([\\w-]+)'");
private static final Pattern responsePattern = Pattern.compile("<!-- thread:([0-9]+),no:([0-9]+) -->"); private static final Pattern responsePattern = Pattern.compile("<!-- thread:([0-9]+),no:([0-9]+) -->");
private static final int POST_TIMEOUT = 10000; private static final int POST_TIMEOUT = 10000;
private final Context context; private final Context context;
private Reply draft; private Reply draft;
private FileListener fileListener; private FileListener fileListener;
private final Random random = new Random(); private final Random random = new Random();
public ReplyManager(Context context) { public ReplyManager(Context context) {
ReplyManager.instance = this;
this.context = context; this.context = context;
draft = new Reply(); draft = new Reply();
} }
public static ReplyManager getInstance() {
return instance;
}
/** /**
* Clear the draft * Clear the draft
*/ */
public void removeReplyDraft() { public void removeReplyDraft() {
draft = new Reply(); draft = new Reply();
} }
/** /**
* Set an reply draft. * Set an reply draft.
* @param value the draft to save. * @param value the draft to save.
*/ */
public void setReplyDraft(Reply value) { public void setReplyDraft(Reply value) {
draft = value; draft = value;
} }
/** /**
* Gets the saved reply draft. * Gets the saved reply draft.
* @return the saved draft or an empty draft. * @return the saved draft or an empty draft.
@ -79,7 +72,7 @@ public class ReplyManager {
public Reply getReplyDraft() { public Reply getReplyDraft() {
return draft; return draft;
} }
/** /**
* Add an quote to the comment field. Looks like >>123456789\n * Add an quote to the comment field. Looks like >>123456789\n
* @param no the raw no to quote to. * @param no the raw no to quote to.
@ -87,19 +80,19 @@ public class ReplyManager {
public void quote(int no) { public void quote(int no) {
draft.comment = draft.comment + ">>" + no + "\n"; draft.comment = draft.comment + ">>" + no + "\n";
} }
/** /**
* Pick an file. Starts up the ImagePickActivity. * Pick an file. Starts up the ImagePickActivity.
* @param listener FileListener to listen on. * @param listener FileListener to listen on.
*/ */
public void pickFile(FileListener listener) { public void pickFile(FileListener listener) {
fileListener = listener; fileListener = listener;
Intent intent = new Intent(context, ImagePickActivity.class); Intent intent = new Intent(context, ImagePickActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent); context.startActivity(intent);
} }
/** /**
* Called from ImagePickActivity, sends onFileLoading to the fileListener. * Called from ImagePickActivity, sends onFileLoading to the fileListener.
*/ */
@ -108,7 +101,7 @@ public class ReplyManager {
fileListener.onFileLoading(); fileListener.onFileLoading();
} }
} }
/** /**
* Called from ImagePickActivity. Sends the file to the listening fileListener, and deletes the fileListener. * Called from ImagePickActivity. Sends the file to the listening fileListener, and deletes the fileListener.
*/ */
@ -118,14 +111,14 @@ public class ReplyManager {
} }
fileListener = null; fileListener = null;
} }
/** /**
* Delete the fileListener. * Delete the fileListener.
*/ */
public void removeFileListener() { public void removeFileListener() {
fileListener = null; fileListener = null;
} }
/** /**
* Get the CAPTCHA challenge hash from an JSON response. * Get the CAPTCHA challenge hash from an JSON response.
* @param total The total response from the server * @param total The total response from the server
@ -134,54 +127,54 @@ public class ReplyManager {
public static String getChallenge(String total) { public static String getChallenge(String total) {
Matcher matcher = challengePattern.matcher(total); Matcher matcher = challengePattern.matcher(total);
matcher.find(); matcher.find();
if (matcher.groupCount() == 1) { if (matcher.groupCount() == 1) {
return matcher.group(1); return matcher.group(1);
} else { } else {
return null; return null;
} }
} }
/** /**
* Send an reply off to the server. * Send an reply off to the server.
* @param reply The reply object with all data needed, like captcha and the file. * @param reply The reply object with all data needed, like captcha and the file.
* @param listener The listener, after server response. * @param listener The listener, after server response.
*/ */
public void sendDelete(final SavedReply reply, boolean onlyImageDelete, final DeleteListener listener) { public void sendDelete(final SavedReply reply, boolean onlyImageDelete, final DeleteListener listener) {
Logger.i(TAG, "Sending delete request: " + reply.board + ", " + reply.no); Logger.i(TAG, "Sending delete request: " + reply.board + ", " + reply.no);
HttpPost httpPost = new HttpPost(ChanUrls.getDeleteUrl(reply.board)); HttpPost httpPost = new HttpPost(ChanUrls.getDeleteUrl(reply.board));
MultipartEntity entity = new MultipartEntity(); MultipartEntity entity = new MultipartEntity();
try { try {
entity.addPart(Integer.toString(reply.no), new StringBody("delete")); entity.addPart(Integer.toString(reply.no), new StringBody("delete"));
if (onlyImageDelete) { if (onlyImageDelete) {
entity.addPart("onlyimgdel", new StringBody("on")); entity.addPart("onlyimgdel", new StringBody("on"));
} }
// res not necessary // res not necessary
entity.addPart("mode", new StringBody("usrdel")); entity.addPart("mode", new StringBody("usrdel"));
entity.addPart("pwd", new StringBody(reply.password)); entity.addPart("pwd", new StringBody(reply.password));
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
e.printStackTrace(); e.printStackTrace();
return; return;
} }
httpPost.setEntity(entity); httpPost.setEntity(entity);
sendHttpPost(httpPost, new HttpPostSendListener() { sendHttpPost(httpPost, new HttpPostSendListener() {
@Override @Override
public void onReponse(String responseString) { public void onReponse(String responseString) {
DeleteResponse e = new DeleteResponse(); DeleteResponse e = new DeleteResponse();
if (responseString == null) { if (responseString == null) {
e.isNetworkError = true; e.isNetworkError = true;
} else { } else {
e.responseData = responseString; e.responseData = responseString;
if (responseString.contains("You must wait longer before deleting this post")) { if (responseString.contains("You must wait longer before deleting this post")) {
e.isUserError = true; e.isUserError = true;
e.isTooSoonError = true; e.isTooSoonError = true;
@ -195,43 +188,43 @@ public class ReplyManager {
e.isSuccessful = true; e.isSuccessful = true;
} }
} }
listener.onResponse(e); listener.onResponse(e);
} }
}); });
} }
/** /**
* Send an reply off to the server. * Send an reply off to the server.
* @param reply The reply object with all data needed, like captcha and the file. * @param reply The reply object with all data needed, like captcha and the file.
* @param listener The listener, after server response. * @param listener The listener, after server response.
*/ */
public void sendReply(final Reply reply, final ReplyListener listener) { public void sendReply(final Reply reply, final ReplyListener listener) {
Logger.i(TAG, "Sending reply request: " + reply.board + ", " + reply.resto); Logger.i(TAG, "Sending reply request: " + reply.board + ", " + reply.resto);
HttpPost httpPost = new HttpPost(ChanUrls.getPostUrl(reply.board)); HttpPost httpPost = new HttpPost(ChanUrls.getPostUrl(reply.board));
MultipartEntity entity = new MultipartEntity(); MultipartEntity entity = new MultipartEntity();
reply.password = Long.toHexString(random.nextLong()); reply.password = Long.toHexString(random.nextLong());
try { try {
entity.addPart("name", new StringBody(reply.name)); entity.addPart("name", new StringBody(reply.name));
entity.addPart("email", new StringBody(reply.email)); entity.addPart("email", new StringBody(reply.email));
entity.addPart("sub", new StringBody(reply.subject)); entity.addPart("sub", new StringBody(reply.subject));
entity.addPart("com", new StringBody(reply.comment)); entity.addPart("com", new StringBody(reply.comment));
if (reply.resto >= 0) { if (reply.resto >= 0) {
entity.addPart("resto", new StringBody(Integer.toString(reply.resto))); entity.addPart("resto", new StringBody(Integer.toString(reply.resto)));
} }
entity.addPart("recaptcha_challenge_field", new StringBody(reply.captchaChallenge)); entity.addPart("recaptcha_challenge_field", new StringBody(reply.captchaChallenge));
entity.addPart("recaptcha_response_field", new StringBody(reply.captchaResponse)); entity.addPart("recaptcha_response_field", new StringBody(reply.captchaResponse));
entity.addPart("mode", new StringBody("regist")); entity.addPart("mode", new StringBody("regist"));
entity.addPart("pwd", new StringBody(reply.password)); entity.addPart("pwd", new StringBody(reply.password));
if (reply.file != null) { if (reply.file != null) {
entity.addPart("upfile", new FileBody(reply.file, reply.fileName, "application/octet-stream", "UTF-8")); entity.addPart("upfile", new FileBody(reply.file, reply.fileName, "application/octet-stream", "UTF-8"));
} }
@ -239,23 +232,23 @@ public class ReplyManager {
e.printStackTrace(); e.printStackTrace();
return; return;
} }
httpPost.setEntity(entity); httpPost.setEntity(entity);
sendHttpPost(httpPost, new HttpPostSendListener() { sendHttpPost(httpPost, new HttpPostSendListener() {
@Override @Override
public void onReponse(String responseString) { public void onReponse(String responseString) {
ReplyResponse e = new ReplyResponse(); ReplyResponse e = new ReplyResponse();
if (responseString == null) { if (responseString == null) {
e.isNetworkError = true; e.isNetworkError = true;
} else { } else {
e.responseData = responseString; e.responseData = responseString;
if (responseString.contains("No file selected")) { if (responseString.contains("No file selected")) {
e.isUserError = true; e.isUserError = true;
e.isFileError = true; e.isFileError = true;
} else if (responseString.contains("You forgot to solve the CAPTCHA") || } else if (responseString.contains("You forgot to solve the CAPTCHA") ||
responseString.contains("You seem to have mistyped the CAPTCHA")) { responseString.contains("You seem to have mistyped the CAPTCHA")) {
e.isUserError = true; e.isUserError = true;
e.isCaptchaError = true; e.isCaptchaError = true;
@ -263,18 +256,18 @@ public class ReplyManager {
e.isSuccessful = true; e.isSuccessful = true;
} }
} }
if (e.isSuccessful) { if (e.isSuccessful) {
Matcher matcher = responsePattern.matcher(e.responseData); Matcher matcher = responsePattern.matcher(e.responseData);
if (matcher.find() && matcher.groupCount() == 2) { if (matcher.find() && matcher.groupCount() == 2) {
try { try {
SavedReply savedReply = new SavedReply(); SavedReply savedReply = new SavedReply();
savedReply.board = reply.board; savedReply.board = reply.board;
savedReply.no = Integer.parseInt(matcher.group(2)); savedReply.no = Integer.parseInt(matcher.group(2));
savedReply.password = reply.password; savedReply.password = reply.password;
DatabaseManager.getInstance().saveReply(savedReply); ChanApplication.getDatabaseManager().saveReply(savedReply);
} catch (NumberFormatException err) { } catch (NumberFormatException err) {
err.printStackTrace(); err.printStackTrace();
} }
@ -282,12 +275,12 @@ public class ReplyManager {
Logger.w(TAG, "No thread & no in the response"); Logger.w(TAG, "No thread & no in the response");
} }
} }
listener.onResponse(e); listener.onResponse(e);
} }
}); });
} }
/** /**
* Async task to send an reply to the server. * Async task to send an reply to the server.
* Uses HttpClient. Since Android 4.4 there is an updated version of HttpClient, 4.2, given with Android. * Uses HttpClient. Since Android 4.4 there is an updated version of HttpClient, 4.2, given with Android.
@ -302,11 +295,11 @@ public class ReplyManager {
HttpParams httpParameters = new BasicHttpParams(); HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, POST_TIMEOUT); HttpConnectionParams.setConnectionTimeout(httpParameters, POST_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, POST_TIMEOUT); HttpConnectionParams.setSoTimeout(httpParameters, POST_TIMEOUT);
DefaultHttpClient client = new DefaultHttpClient(httpParameters); DefaultHttpClient client = new DefaultHttpClient(httpParameters);
String responseString = null; String responseString = null;
try { try {
HttpResponse response = client.execute(post); HttpResponse response = client.execute(post);
responseString = EntityUtils.toString(response.getEntity(), "UTF-8"); responseString = EntityUtils.toString(response.getEntity(), "UTF-8");
@ -315,23 +308,23 @@ public class ReplyManager {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
final String finalResponseString = responseString; final String finalResponseString = responseString;
Utils.runOnUiThread(new Runnable() { Utils.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
listener.onReponse(finalResponseString); listener.onReponse(finalResponseString);
} }
}); });
} }
}).start(); }).start();
} }
private static interface HttpPostSendListener { private static interface HttpPostSendListener {
public void onReponse(String responseString); public void onReponse(String responseString);
} }
public static abstract class FileListener { public static abstract class FileListener {
/** /**
* When a file is picked. * When a file is picked.
@ -343,11 +336,11 @@ public class ReplyManager {
*/ */
public abstract void onFileLoading(); public abstract void onFileLoading();
} }
public static interface DeleteListener { public static interface DeleteListener {
public void onResponse(DeleteResponse response); public void onResponse(DeleteResponse response);
} }
public static class DeleteResponse { public static class DeleteResponse {
public boolean isNetworkError = false; public boolean isNetworkError = false;
public boolean isUserError = false; public boolean isUserError = false;
@ -357,37 +350,37 @@ public class ReplyManager {
public boolean isSuccessful = false; public boolean isSuccessful = false;
public String responseData = ""; public String responseData = "";
} }
public static interface ReplyListener { public static interface ReplyListener {
public void onResponse(ReplyResponse response); public void onResponse(ReplyResponse response);
} }
public static class ReplyResponse { public static class ReplyResponse {
/** /**
* No response from server. * No response from server.
*/ */
public boolean isNetworkError = false; public boolean isNetworkError = false;
/** /**
* Some user error, like no file or captcha wrong. * Some user error, like no file or captcha wrong.
*/ */
public boolean isUserError = false; public boolean isUserError = false;
/** /**
* The userError was an fileError * The userError was an fileError
*/ */
public boolean isFileError = false; public boolean isFileError = false;
/** /**
* The userError was an captchaError * The userError was an captchaError
*/ */
public boolean isCaptchaError = false; public boolean isCaptchaError = false;
/** /**
* Received 'post successful' * Received 'post successful'
*/ */
public boolean isSuccessful = false; public boolean isSuccessful = false;
/** /**
* Raw html from the response. Used to set html in an WebView to the client, when the error was not * Raw html from the response. Used to set html in an WebView to the client, when the error was not
* recognized by Chan. * recognized by Chan.

@ -1,23 +1,23 @@
package org.floens.chan.manager; package org.floens.chan.core.manager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.activity.ReplyActivity; import org.floens.chan.core.ChanPreferences;
import org.floens.chan.database.DatabaseManager; import org.floens.chan.core.loader.Loader;
import org.floens.chan.fragment.PostRepliesFragment; import org.floens.chan.core.loader.LoaderPool;
import org.floens.chan.fragment.ReplyFragment; import org.floens.chan.core.manager.ReplyManager.DeleteListener;
import org.floens.chan.loader.Loader; import org.floens.chan.core.manager.ReplyManager.DeleteResponse;
import org.floens.chan.loader.LoaderPool; import org.floens.chan.core.model.Loadable;
import org.floens.chan.manager.ReplyManager.DeleteListener; import org.floens.chan.core.model.Pin;
import org.floens.chan.manager.ReplyManager.DeleteResponse; import org.floens.chan.core.model.Post;
import org.floens.chan.model.Loadable; import org.floens.chan.core.model.PostLinkable;
import org.floens.chan.model.Pin; import org.floens.chan.core.model.SavedReply;
import org.floens.chan.model.Post; import org.floens.chan.ui.activity.ReplyActivity;
import org.floens.chan.model.PostLinkable; import org.floens.chan.ui.fragment.PostRepliesFragment;
import org.floens.chan.model.SavedReply; import org.floens.chan.ui.fragment.ReplyFragment;
import org.floens.chan.utils.ChanPreferences;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import android.app.Activity; import android.app.Activity;
@ -102,9 +102,9 @@ public class ThreadManager implements Loader.LoaderListener {
public void bottomPostViewed() { public void bottomPostViewed() {
if (loader != null && loader.getLoadable().isThreadMode()) { if (loader != null && loader.getLoadable().isThreadMode()) {
Pin pin = PinnedManager.getInstance().findPinByLoadable(loader.getLoadable()); Pin pin = ChanApplication.getPinnedManager().findPinByLoadable(loader.getLoadable());
if (pin != null) { if (pin != null) {
PinnedManager.getInstance().onPinViewed(pin); ChanApplication.getPinnedManager().onPinViewed(pin);
} }
} }
} }
@ -175,7 +175,7 @@ public class ThreadManager implements Loader.LoaderListener {
String[] temp = activity.getResources().getStringArray(R.array.post_options); String[] temp = activity.getResources().getStringArray(R.array.post_options);
// Only add the delete option when the post is a saved reply // Only add the delete option when the post is a saved reply
if (DatabaseManager.getInstance().isSavedReply(post.board, post.no)) { if (ChanApplication.getDatabaseManager().isSavedReply(post.board, post.no)) {
items = new String[temp.length + 1]; items = new String[temp.length + 1];
System.arraycopy(temp, 0, items, 0, temp.length); System.arraycopy(temp, 0, items, 0, temp.length);
items[items.length - 1] = activity.getString(R.string.delete); items[items.length - 1] = activity.getString(R.string.delete);
@ -191,7 +191,7 @@ public class ThreadManager implements Loader.LoaderListener {
openReply(true); // todo if tablet openReply(true); // todo if tablet
// Pass through // Pass through
case 1: // Quote case 1: // Quote
ReplyManager.getInstance().quote(post.no); ChanApplication.getReplyManager().quote(post.no);
break; break;
case 2: // Info case 2: // Info
showPostInfo(post); showPostInfo(post);
@ -468,7 +468,7 @@ public class ThreadManager implements Loader.LoaderListener {
} }
private void doDeletePost(Post post, boolean onlyImageDelete) { private void doDeletePost(Post post, boolean onlyImageDelete) {
SavedReply reply = DatabaseManager.getInstance().getSavedReply(post.board, post.no); SavedReply reply = ChanApplication.getDatabaseManager().getSavedReply(post.board, post.no);
if (reply == null) { if (reply == null) {
/* /*
* reply = new SavedReply(); reply.board = "g"; reply.no = 1234; * reply = new SavedReply(); reply.board = "g"; reply.no = 1234;
@ -479,7 +479,7 @@ public class ThreadManager implements Loader.LoaderListener {
final ProgressDialog dialog = ProgressDialog.show(activity, null, activity.getString(R.string.delete_wait)); final ProgressDialog dialog = ProgressDialog.show(activity, null, activity.getString(R.string.delete_wait));
ReplyManager.getInstance().sendDelete(reply, onlyImageDelete, new DeleteListener() { ChanApplication.getReplyManager().sendDelete(reply, onlyImageDelete, new DeleteListener() {
@Override @Override
public void onResponse(DeleteResponse response) { public void onResponse(DeleteResponse response) {
dialog.dismiss(); dialog.dismiss();

@ -1,4 +1,4 @@
package org.floens.chan.model; package org.floens.chan.core.model;
/** /**
* Board key and value. * Board key and value.

@ -1,4 +1,4 @@
package org.floens.chan.model; package org.floens.chan.core.model;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;

@ -1,6 +1,6 @@
package org.floens.chan.model; package org.floens.chan.core.model;
import org.floens.chan.watch.PinWatcher; import org.floens.chan.core.watch.PinWatcher;
import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable; import com.j256.ormlite.table.DatabaseTable;

@ -1,12 +1,12 @@
package org.floens.chan.model; package org.floens.chan.core.model;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.floens.chan.model.PostLinkable.Type; import org.floens.chan.chan.ChanUrls;
import org.floens.chan.net.ChanUrls; import org.floens.chan.core.model.PostLinkable.Type;
import org.floens.chan.view.PostView; import org.floens.chan.ui.view.PostView;
import org.jsoup.Jsoup; import org.jsoup.Jsoup;
import org.jsoup.nodes.Document; import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element; import org.jsoup.nodes.Element;

@ -1,4 +1,4 @@
package org.floens.chan.model; package org.floens.chan.core.model;
import android.graphics.Color; import android.graphics.Color;
import android.text.TextPaint; import android.text.TextPaint;

@ -1,4 +1,4 @@
package org.floens.chan.model; package org.floens.chan.core.model;
import java.io.File; import java.io.File;

@ -1,4 +1,4 @@
package org.floens.chan.model; package org.floens.chan.core.model;
import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable; import com.j256.ormlite.table.DatabaseTable;

@ -1,9 +1,9 @@
package org.floens.chan.net; package org.floens.chan.core.net;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import org.floens.chan.model.Board; import org.floens.chan.core.model.Board;
import android.util.JsonReader; import android.util.JsonReader;

@ -1,4 +1,4 @@
package org.floens.chan.net; package org.floens.chan.core.net;
import com.android.volley.NetworkResponse; import com.android.volley.NetworkResponse;
import com.android.volley.Request; import com.android.volley.Request;

@ -1,13 +1,13 @@
package org.floens.chan.loader; package org.floens.chan.core.net;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.floens.chan.database.DatabaseManager; import org.floens.chan.ChanApplication;
import org.floens.chan.model.Loadable; import org.floens.chan.chan.ChanUrls;
import org.floens.chan.model.Post; import org.floens.chan.core.model.Loadable;
import org.floens.chan.net.ChanUrls; import org.floens.chan.core.model.Post;
import android.util.JsonReader; import android.util.JsonReader;
@ -87,7 +87,7 @@ public class ChanReaderRequest extends JsonReaderRequest<List<Post>> {
} }
} }
post.isSavedReply = DatabaseManager.getInstance().isSavedReply(post.board, post.no); post.isSavedReply = ChanApplication.getDatabaseManager().isSavedReply(post.board, post.no);
} }
} }

@ -1,6 +1,6 @@
package org.floens.chan.net; package org.floens.chan.core.net;
import org.floens.chan.view.GIFView; import org.floens.chan.ui.view.GIFView;
import android.content.Context; import android.content.Context;

@ -1,11 +1,11 @@
package org.floens.chan.watch; package org.floens.chan.core.watch;
import java.util.List; import java.util.List;
import org.floens.chan.loader.Loader; import org.floens.chan.core.loader.Loader;
import org.floens.chan.loader.LoaderPool; import org.floens.chan.core.loader.LoaderPool;
import org.floens.chan.model.Pin; import org.floens.chan.core.model.Pin;
import org.floens.chan.model.Post; import org.floens.chan.core.model.Post;
import org.floens.chan.service.PinnedService; import org.floens.chan.service.PinnedService;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;

@ -1,12 +1,12 @@
package org.floens.chan.watch; package org.floens.chan.core.watch;
import java.util.List; import java.util.List;
import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.activity.BoardActivity; import org.floens.chan.core.model.Pin;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.model.Pin;
import org.floens.chan.service.PinnedService; import org.floens.chan.service.PinnedService;
import org.floens.chan.ui.activity.BoardActivity;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationManager; import android.app.NotificationManager;
@ -26,7 +26,7 @@ public class WatchNotifier {
} }
public void update() { public void update() {
List<Pin> pins = PinnedManager.getInstance().getPins(); List<Pin> pins = ChanApplication.getPinnedManager().getPins();
int count = 0; int count = 0;
int pinCount = 0; int pinCount = 0;

@ -2,9 +2,9 @@ package org.floens.chan.database;
import java.sql.SQLException; import java.sql.SQLException;
import org.floens.chan.model.Loadable; import org.floens.chan.core.model.Loadable;
import org.floens.chan.model.Pin; import org.floens.chan.core.model.Pin;
import org.floens.chan.model.SavedReply; import org.floens.chan.core.model.SavedReply;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import android.content.Context; import android.content.Context;

@ -3,61 +3,53 @@ package org.floens.chan.database;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import org.floens.chan.model.Pin; import org.floens.chan.core.model.Pin;
import org.floens.chan.model.SavedReply; import org.floens.chan.core.model.SavedReply;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import android.content.Context; import android.content.Context;
public class DatabaseManager { public class DatabaseManager {
private static final String TAG = "DatabaseManager"; private static final String TAG = "DatabaseManager";
private static DatabaseManager instance;
private final DatabaseHelper helper; private final DatabaseHelper helper;
private List<SavedReply> savedReplies; private List<SavedReply> savedReplies;
public DatabaseManager(Context context) { public DatabaseManager(Context context) {
instance = this;
helper = new DatabaseHelper(context); helper = new DatabaseHelper(context);
} }
public static DatabaseManager getInstance() {
return instance;
}
public void saveReply(SavedReply saved) { public void saveReply(SavedReply saved) {
Logger.e(TAG, "Saving " + saved.board + ", " + saved.no); Logger.e(TAG, "Saving " + saved.board + ", " + saved.no);
try { try {
helper.savedDao.create(saved); helper.savedDao.create(saved);
} catch (SQLException e) { } catch (SQLException e) {
Logger.e(TAG, "Error saving reply", e); Logger.e(TAG, "Error saving reply", e);
} }
loadSavedReplies(); loadSavedReplies();
} }
public SavedReply getSavedReply(String board, int no) { public SavedReply getSavedReply(String board, int no) {
if (savedReplies == null) { if (savedReplies == null) {
loadSavedReplies(); loadSavedReplies();
} }
// TODO: optimize this // TODO: optimize this
for (SavedReply r : savedReplies) { for (SavedReply r : savedReplies) {
if (r.board.equals(board) && r.no == no) { if (r.board.equals(board) && r.no == no) {
return r; return r;
} }
} }
return null; return null;
} }
public boolean isSavedReply(String board, int no) { public boolean isSavedReply(String board, int no) {
return getSavedReply(board, no) != null; return getSavedReply(board, no) != null;
} }
private void loadSavedReplies() { private void loadSavedReplies() {
// TODO trim the table if it gets too large // TODO trim the table if it gets too large
try { try {
@ -66,7 +58,7 @@ public class DatabaseManager {
Logger.e(TAG, "Error loading saved replies", e); Logger.e(TAG, "Error loading saved replies", e);
} }
} }
public void addPin(Pin pin) { public void addPin(Pin pin) {
try { try {
helper.loadableDao.create(pin.loadable); helper.loadableDao.create(pin.loadable);
@ -75,7 +67,7 @@ public class DatabaseManager {
Logger.e(TAG, "Error adding pin to db", e); Logger.e(TAG, "Error adding pin to db", e);
} }
} }
public void removePin(Pin pin) { public void removePin(Pin pin) {
try { try {
helper.pinDao.delete(pin); helper.pinDao.delete(pin);
@ -84,7 +76,7 @@ public class DatabaseManager {
Logger.e(TAG, "Error removing pin from db", e); Logger.e(TAG, "Error removing pin from db", e);
} }
} }
public void updatePin(Pin pin) { public void updatePin(Pin pin) {
try { try {
helper.pinDao.update(pin); helper.pinDao.update(pin);
@ -93,13 +85,13 @@ public class DatabaseManager {
Logger.e(TAG, "Error updating pin in db", e); Logger.e(TAG, "Error updating pin in db", e);
} }
} }
public void updatePins(List<Pin> pins) { public void updatePins(List<Pin> pins) {
try { try {
for (Pin pin : pins) { for (Pin pin : pins) {
helper.pinDao.update(pin); helper.pinDao.update(pin);
} }
for (Pin pin : pins) { for (Pin pin : pins) {
helper.loadableDao.update(pin.loadable); helper.loadableDao.update(pin.loadable);
} }
@ -107,7 +99,7 @@ public class DatabaseManager {
Logger.e(TAG, "Error updating pins in db", e); Logger.e(TAG, "Error updating pins in db", e);
} }
} }
public List<Pin> getPinned() { public List<Pin> getPinned() {
List<Pin> list = null; List<Pin> list = null;
try { try {
@ -118,13 +110,13 @@ public class DatabaseManager {
} catch (SQLException e) { } catch (SQLException e) {
Logger.e(TAG, "Error getting pins from db", e); Logger.e(TAG, "Error getting pins from db", e);
} }
return list; return list;
} }
public String getSummary() { public String getSummary() {
String o = ""; String o = "";
try { try {
o += "Loadable rows: " + helper.loadableDao.countOf() + "\n"; o += "Loadable rows: " + helper.loadableDao.countOf() + "\n";
o += "Pin rows: " + helper.pinDao.countOf() + "\n"; o += "Pin rows: " + helper.pinDao.countOf() + "\n";
@ -132,10 +124,10 @@ public class DatabaseManager {
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
return o; return o;
} }
public void reset() { public void reset() {
helper.reset(); helper.reset();
loadSavedReplies(); loadSavedReplies();

@ -2,11 +2,11 @@ package org.floens.chan.service;
import java.util.List; import java.util.List;
import org.floens.chan.manager.PinnedManager; import org.floens.chan.ChanApplication;
import org.floens.chan.model.Pin; import org.floens.chan.core.ChanPreferences;
import org.floens.chan.utils.ChanPreferences; import org.floens.chan.core.model.Pin;
import org.floens.chan.core.watch.WatchNotifier;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import org.floens.chan.watch.WatchNotifier;
import android.app.Service; import android.app.Service;
import android.content.Context; import android.content.Context;
@ -77,7 +77,7 @@ public class PinnedService extends Service {
new Handler(Looper.getMainLooper()).post(new Runnable() { new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override @Override
public void run() { public void run() {
PinnedManager.getInstance().onPinsChanged(); ChanApplication.getPinnedManager().onPinsChanged();
} }
}); });
} }
@ -151,7 +151,7 @@ public class PinnedService extends Service {
} }
private void update() { private void update() {
List<Pin> pins = PinnedManager.getInstance().getPins(); List<Pin> pins = ChanApplication.getPinnedManager().getPins();
for (Pin pin : pins) { for (Pin pin : pins) {
pin.updateWatch(); pin.updateWatch();
} }

@ -1,4 +1,4 @@
package org.floens.chan.utils; package org.floens.chan.ui;
import android.view.View; import android.view.View;
import android.view.ViewConfiguration; import android.view.ViewConfiguration;

@ -1,4 +1,4 @@
package org.floens.chan.animation; package org.floens.chan.ui;
/* /*
* Copyright 2013 Google Inc. * Copyright 2013 Google Inc.

@ -1,4 +1,4 @@
package org.floens.chan.utils; package org.floens.chan.ui;
import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Animation; import android.view.animation.Animation;

@ -1,4 +1,4 @@
package org.floens.chan.activity; package org.floens.chan.ui.activity;
import android.app.Activity; import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;

@ -1,12 +1,13 @@
package org.floens.chan.activity; package org.floens.chan.ui.activity;
import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.adapter.PinnedAdapter; import org.floens.chan.core.manager.PinnedManager;
import org.floens.chan.animation.SwipeDismissListViewTouchListener; import org.floens.chan.core.model.Pin;
import org.floens.chan.animation.SwipeDismissListViewTouchListener.DismissCallbacks; import org.floens.chan.core.model.Post;
import org.floens.chan.manager.PinnedManager; import org.floens.chan.ui.SwipeDismissListViewTouchListener;
import org.floens.chan.model.Pin; import org.floens.chan.ui.SwipeDismissListViewTouchListener.DismissCallbacks;
import org.floens.chan.model.Post; import org.floens.chan.ui.adapter.PinnedAdapter;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
@ -72,14 +73,14 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
threadPane = (SlidingPaneLayout) findViewById(R.id.pane_container); threadPane = (SlidingPaneLayout) findViewById(R.id.pane_container);
initPane(); initPane();
PinnedManager.getInstance().addPinListener(this); ChanApplication.getPinnedManager().addPinListener(this);
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
PinnedManager.getInstance().removePinListener(this); ChanApplication.getPinnedManager().removePinListener(this);
} }
private void initPane() { private void initPane() {
@ -151,15 +152,15 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
} }
public void addPin(Pin pin) { public void addPin(Pin pin) {
PinnedManager.getInstance().add(pin); ChanApplication.getPinnedManager().add(pin);
} }
public void removePin(Pin pin) { public void removePin(Pin pin) {
PinnedManager.getInstance().remove(pin); ChanApplication.getPinnedManager().remove(pin);
} }
public void updatePin(Pin pin) { public void updatePin(Pin pin) {
PinnedManager.getInstance().update(pin); ChanApplication.getPinnedManager().update(pin);
} }
private void changePinTitle(final Pin pin) { private void changePinTitle(final Pin pin) {

@ -1,17 +1,16 @@
package org.floens.chan.activity; package org.floens.chan.ui.activity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.fragment.ThreadFragment; import org.floens.chan.chan.ChanUrls;
import org.floens.chan.manager.BoardManager; import org.floens.chan.core.model.Loadable;
import org.floens.chan.manager.PinnedManager; import org.floens.chan.core.model.Pin;
import org.floens.chan.model.Loadable; import org.floens.chan.core.model.Post;
import org.floens.chan.model.Pin;
import org.floens.chan.model.Post;
import org.floens.chan.net.ChanUrls;
import org.floens.chan.service.PinnedService; import org.floens.chan.service.PinnedService;
import org.floens.chan.ui.fragment.ThreadFragment;
import android.app.ActionBar; import android.app.ActionBar;
import android.app.AlertDialog; import android.app.AlertDialog;
@ -58,7 +57,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
actionBar.getThemedContext(), actionBar.getThemedContext(),
R.layout.board_select_spinner, R.layout.board_select_spinner,
android.R.id.text1, android.R.id.text1,
BoardManager.getInstance().getMyBoardsKeys() ChanApplication.getBoardManager().getMyBoardsKeys()
), this); ), this);
Intent startIntent = getIntent(); Intent startIntent = getIntent();
@ -107,7 +106,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
PinnedManager.getInstance().updateAll(); ChanApplication.getPinnedManager().updateAll();
} }
@Override @Override
@ -121,7 +120,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
@Override @Override
public boolean onNavigationItemSelected(int position, long id) { public boolean onNavigationItemSelected(int position, long id) {
if (!boardSetByIntent) { if (!boardSetByIntent) {
boardLoadable = new Loadable(BoardManager.getInstance().getMyBoardsValues().get(position)); boardLoadable = new Loadable(ChanApplication.getBoardManager().getMyBoardsValues().get(position));
startLoadingBoard(boardLoadable); startLoadingBoard(boardLoadable);
} }
@ -316,7 +315,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
private void startLoadingThread(Loadable loadable) { private void startLoadingThread(Loadable loadable) {
if (loadable.mode == Loadable.Mode.INVALID) return; if (loadable.mode == Loadable.Mode.INVALID) return;
Pin pin = PinnedManager.getInstance().findPinByLoadable(loadable); Pin pin = ChanApplication.getPinnedManager().findPinByLoadable(loadable);
if (pin != null) { if (pin != null) {
// Use the loadable from the pin. // Use the loadable from the pin.
// This way we can store the listview position in the pin loadable, // This way we can store the listview position in the pin loadable,
@ -351,7 +350,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
// Board mode // Board mode
String rawBoard = parts.get(0); String rawBoard = parts.get(0);
if (BoardManager.getInstance().getBoardExists(rawBoard)) { if (ChanApplication.getBoardManager().getBoardExists(rawBoard)) {
boardSetByIntent = true; boardSetByIntent = true;
startLoadingBoard(new Loadable(rawBoard)); startLoadingBoard(new Loadable(rawBoard));
@ -360,7 +359,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
if (!setNavigationFromBoardValue(rawBoard)) { if (!setNavigationFromBoardValue(rawBoard)) {
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true); actionBar.setDisplayShowTitleEnabled(true);
String value = BoardManager.getInstance().getBoardKey(rawBoard); String value = ChanApplication.getBoardManager().getBoardKey(rawBoard);
actionBar.setTitle(value == null ? ("/" + rawBoard + "/") : value); actionBar.setTitle(value == null ? ("/" + rawBoard + "/") : value);
} }
@ -377,7 +376,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
no = Integer.parseInt(parts.get(2)); no = Integer.parseInt(parts.get(2));
} catch (NumberFormatException e) {} } catch (NumberFormatException e) {}
if (no >= 0 && BoardManager.getInstance().getBoardExists(rawBoard)) { if (no >= 0 && ChanApplication.getBoardManager().getBoardExists(rawBoard)) {
boardSetByIntent = true; boardSetByIntent = true;
startLoadingBoard(new Loadable(rawBoard)); startLoadingBoard(new Loadable(rawBoard));
@ -421,7 +420,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
* @return true if spinner was set, false otherwise * @return true if spinner was set, false otherwise
*/ */
private boolean setNavigationFromBoardValue(String boardValue) { private boolean setNavigationFromBoardValue(String boardValue) {
ArrayList<String> list = BoardManager.getInstance().getMyBoardsValues(); ArrayList<String> list = ChanApplication.getBoardManager().getMyBoardsValues();
int foundIndex = -1; int foundIndex = -1;
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals(boardValue)) { if (list.get(i).equals(boardValue)) {

@ -1,12 +1,12 @@
package org.floens.chan.activity; package org.floens.chan.ui.activity;
import java.util.ArrayList; import java.util.ArrayList;
import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.adapter.BoardEditAdapter; import org.floens.chan.core.model.Board;
import org.floens.chan.manager.BoardManager; import org.floens.chan.ui.adapter.BoardEditAdapter;
import org.floens.chan.model.Board; import org.floens.chan.ui.view.DynamicListView;
import org.floens.chan.view.DynamicListView;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
@ -35,7 +35,7 @@ public class BoardEditor extends Activity {
setContentView(R.layout.board_edit); setContentView(R.layout.board_edit);
// Copy not a reference // Copy not a reference
list = (ArrayList<Board>) BoardManager.getInstance().getMyBoards().clone(); list = (ArrayList<Board>) ChanApplication.getBoardManager().getMyBoards().clone();
adapter = new BoardEditAdapter(this, R.layout.board_view, list, this); adapter = new BoardEditAdapter(this, R.layout.board_view, list, this);
listView = (DynamicListView<Board>) findViewById(R.id.board_edit_list); listView = (DynamicListView<Board>) findViewById(R.id.board_edit_list);
@ -51,7 +51,7 @@ public class BoardEditor extends Activity {
// For runtime changes // For runtime changes
if (list.size() > 0) { if (list.size() > 0) {
BoardManager.getInstance().setMyBoards((ArrayList<Board>) list.clone()); ChanApplication.getBoardManager().setMyBoards((ArrayList<Board>) list.clone());
} }
} }
@ -65,7 +65,7 @@ public class BoardEditor extends Activity {
} }
private void addBoard(String value) { private void addBoard(String value) {
BoardManager.getInstance().addBoard(list, value); ChanApplication.getBoardManager().addBoard(list, value);
adapter = new BoardEditAdapter(this, R.layout.board_view, list, this); adapter = new BoardEditAdapter(this, R.layout.board_view, list, this);
listView.setArrayList(list); listView.setArrayList(list);

@ -1,6 +1,6 @@
package org.floens.chan.activity; package org.floens.chan.ui.activity;
import org.floens.chan.database.DatabaseManager; import org.floens.chan.ChanApplication;
import android.app.Activity; import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;
@ -33,7 +33,7 @@ public class DeveloperActivity extends Activity {
String dbSummary = ""; String dbSummary = "";
dbSummary += "Database summary:\n"; dbSummary += "Database summary:\n";
dbSummary += DatabaseManager.getInstance().getSummary(); dbSummary += ChanApplication.getDatabaseManager().getSummary();
TextView db = new TextView(this); TextView db = new TextView(this);
db.setPadding(0, 25, 0, 0); db.setPadding(0, 25, 0, 0);
@ -44,7 +44,7 @@ public class DeveloperActivity extends Activity {
resetDbButton.setOnClickListener(new View.OnClickListener() { resetDbButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
DatabaseManager.getInstance().reset(); ChanApplication.getDatabaseManager().reset();
System.exit(0); System.exit(0);
} }
}); });

@ -1,12 +1,12 @@
package org.floens.chan.activity; package org.floens.chan.ui.activity;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.manager.ReplyManager;
import org.floens.chan.utils.IOUtils; import org.floens.chan.utils.IOUtils;
import android.app.Activity; import android.app.Activity;
@ -43,7 +43,7 @@ public class ImagePickActivity extends Activity {
if (data != null) { if (data != null) {
final Uri uri = data.getData(); final Uri uri = data.getData();
ReplyManager.getInstance()._onPickedFileLoading(); ChanApplication.getReplyManager()._onPickedFileLoading();
// Async load the stream into "pickedFileCache", an file in the cache root // Async load the stream into "pickedFileCache", an file in the cache root
new Thread(new Runnable() { new Thread(new Runnable() {
@ -64,7 +64,7 @@ public class ImagePickActivity extends Activity {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
ReplyManager.getInstance()._onPickedFile(cacheFile); ChanApplication.getReplyManager()._onPickedFile(cacheFile);
} }
}); });

@ -1,12 +1,12 @@
package org.floens.chan.imageview.activity; package org.floens.chan.ui.activity;
import java.util.ArrayList; import java.util.ArrayList;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.adapter.PostAdapter; import org.floens.chan.core.model.Post;
import org.floens.chan.imageview.ImageSaver; import org.floens.chan.ui.adapter.ImageViewAdapter;
import org.floens.chan.imageview.adapter.ImageViewAdapter; import org.floens.chan.ui.adapter.PostAdapter;
import org.floens.chan.model.Post; import org.floens.chan.utils.ImageSaver;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import android.app.ActionBar; import android.app.ActionBar;

@ -1,7 +1,7 @@
package org.floens.chan.activity; package org.floens.chan.ui.activity;
import org.floens.chan.fragment.ReplyFragment; import org.floens.chan.core.model.Loadable;
import org.floens.chan.model.Loadable; import org.floens.chan.ui.fragment.ReplyFragment;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import android.app.Activity; import android.app.Activity;

@ -1,6 +1,6 @@
package org.floens.chan.activity; package org.floens.chan.ui.activity;
import org.floens.chan.fragment.SettingsFragment; import org.floens.chan.ui.fragment.SettingsFragment;
import android.app.Activity; import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;

@ -1,7 +1,7 @@
package org.floens.chan.activity; package org.floens.chan.ui.activity;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.utils.ChanPreferences; import org.floens.chan.core.ChanPreferences;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
import android.app.Activity; import android.app.Activity;

@ -14,14 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package org.floens.chan.adapter; package org.floens.chan.ui.adapter;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.activity.BoardEditor; import org.floens.chan.core.model.Board;
import org.floens.chan.model.Board; import org.floens.chan.ui.activity.BoardEditor;
import android.content.Context; import android.content.Context;
import android.view.LayoutInflater; import android.view.LayoutInflater;

@ -1,10 +1,10 @@
package org.floens.chan.imageview.adapter; package org.floens.chan.ui.adapter;
import java.util.ArrayList; import java.util.ArrayList;
import org.floens.chan.imageview.activity.ImageViewActivity; import org.floens.chan.core.model.Post;
import org.floens.chan.imageview.fragment.ImageViewFragment; import org.floens.chan.ui.activity.ImageViewActivity;
import org.floens.chan.model.Post; import org.floens.chan.ui.fragment.ImageViewFragment;
import android.app.Fragment; import android.app.Fragment;
import android.app.FragmentManager; import android.app.FragmentManager;

@ -1,11 +1,11 @@
package org.floens.chan.adapter; package org.floens.chan.ui.adapter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.manager.PinnedManager; import org.floens.chan.core.model.Pin;
import org.floens.chan.model.Pin;
import android.content.Context; import android.content.Context;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -69,7 +69,7 @@ public class PinnedAdapter extends ArrayAdapter<Pin> {
header.type = Pin.Type.HEADER; header.type = Pin.Type.HEADER;
add(header); add(header);
addAll(PinnedManager.getInstance().getPins()); addAll(ChanApplication.getPinnedManager().getPins());
notifyDataSetChanged(); notifyDataSetChanged();
} }

@ -1,15 +1,15 @@
package org.floens.chan.adapter; package org.floens.chan.ui.adapter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.manager.ThreadManager; import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.model.Post; import org.floens.chan.core.model.Post;
import org.floens.chan.utils.ScrollerRunnable; import org.floens.chan.ui.ScrollerRunnable;
import org.floens.chan.ui.view.PostView;
import org.floens.chan.ui.view.ThreadWatchCounterView;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
import org.floens.chan.view.PostView;
import org.floens.chan.view.ThreadWatchCounterView;
import android.content.Context; import android.content.Context;
import android.view.Gravity; import android.view.Gravity;

@ -1,12 +1,12 @@
package org.floens.chan.imageview.fragment; package org.floens.chan.ui.fragment;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.imageview.activity.ImageViewActivity; import org.floens.chan.core.model.Post;
import org.floens.chan.imageview.view.NetworkPhotoView; import org.floens.chan.core.net.GIFRequest;
import org.floens.chan.model.Post; import org.floens.chan.ui.activity.ImageViewActivity;
import org.floens.chan.net.GIFRequest; import org.floens.chan.ui.view.GIFView;
import org.floens.chan.view.GIFView; import org.floens.chan.ui.view.NetworkPhotoView;
import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener; import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener;
import android.app.Fragment; import android.app.Fragment;

@ -1,11 +1,11 @@
package org.floens.chan.fragment; package org.floens.chan.ui.fragment;
import java.util.List; import java.util.List;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.manager.ThreadManager; import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.model.Post; import org.floens.chan.core.model.Post;
import org.floens.chan.view.PostView; import org.floens.chan.ui.view.PostView;
import android.app.DialogFragment; import android.app.DialogFragment;
import android.content.DialogInterface; import android.content.DialogInterface;

@ -1,19 +1,19 @@
package org.floens.chan.fragment; package org.floens.chan.ui.fragment;
import java.io.File; import java.io.File;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.manager.ReplyManager; import org.floens.chan.chan.ChanUrls;
import org.floens.chan.manager.ReplyManager.ReplyResponse; import org.floens.chan.core.ChanPreferences;
import org.floens.chan.model.Loadable; import org.floens.chan.core.manager.ReplyManager;
import org.floens.chan.model.Reply; import org.floens.chan.core.manager.ReplyManager.ReplyResponse;
import org.floens.chan.net.ChanUrls; import org.floens.chan.core.model.Loadable;
import org.floens.chan.utils.ChanPreferences; import org.floens.chan.core.model.Reply;
import org.floens.chan.ui.ViewFlipperAnimations;
import org.floens.chan.ui.view.LoadView;
import org.floens.chan.utils.ImageDecoder; import org.floens.chan.utils.ImageDecoder;
import org.floens.chan.utils.LoadView;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import org.floens.chan.utils.ViewFlipperAnimations;
import android.app.Dialog; import android.app.Dialog;
import android.app.DialogFragment; import android.app.DialogFragment;
@ -123,7 +123,7 @@ public class ReplyFragment extends DialogFragment {
}); });
} }
Reply draft = ReplyManager.getInstance().getReplyDraft(); Reply draft = ChanApplication.getReplyManager().getReplyDraft();
if (TextUtils.isEmpty(draft.name)) { if (TextUtils.isEmpty(draft.name)) {
draft.name = ChanPreferences.getDefaultName(); draft.name = ChanPreferences.getDefaultName();
@ -150,7 +150,7 @@ public class ReplyFragment extends DialogFragment {
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
ReplyManager replyManager = ReplyManager.getInstance(); ReplyManager replyManager = ChanApplication.getReplyManager();
if (shouldSaveDraft) { if (shouldSaveDraft) {
draft.name = nameView.getText().toString(); draft.name = nameView.getText().toString();
@ -169,7 +169,7 @@ public class ReplyFragment extends DialogFragment {
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
ReplyManager replyManager = ReplyManager.getInstance(); ReplyManager replyManager = ChanApplication.getReplyManager();
replyManager.removeFileListener(); replyManager.removeFileListener();
} }
@ -210,7 +210,7 @@ public class ReplyFragment extends DialogFragment {
fileButton.setOnClickListener(new OnClickListener() { fileButton.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
ReplyManager.getInstance().pickFile(new ReplyManager.FileListener() { ChanApplication.getReplyManager().pickFile(new ReplyManager.FileListener() {
@Override @Override
public void onFile(File file) { public void onFile(File file) {
setFile(file); setFile(file);
@ -397,7 +397,7 @@ public class ReplyFragment extends DialogFragment {
draft.resto = loadable.isBoardMode() ? -1 : loadable.no; draft.resto = loadable.isBoardMode() ? -1 : loadable.no;
draft.board = loadable.board; draft.board = loadable.board;
ReplyManager.getInstance().sendReply(draft, new ReplyManager.ReplyListener() { ChanApplication.getReplyManager().sendReply(draft, new ReplyManager.ReplyListener() {
@Override @Override
public void onResponse(ReplyResponse response) { public void onResponse(ReplyResponse response) {
handleSubmitResponse(response); handleSubmitResponse(response);

@ -1,8 +1,8 @@
package org.floens.chan.fragment; package org.floens.chan.ui.fragment;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.activity.AboutActivity; import org.floens.chan.core.ChanPreferences;
import org.floens.chan.utils.ChanPreferences; import org.floens.chan.ui.activity.AboutActivity;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;

@ -1,16 +1,16 @@
package org.floens.chan.fragment; package org.floens.chan.ui.fragment;
import java.util.List; import java.util.List;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.activity.BaseActivity; import org.floens.chan.core.loader.EndOfLineException;
import org.floens.chan.adapter.PostAdapter; import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.imageview.activity.ImageViewActivity; import org.floens.chan.core.model.Loadable;
import org.floens.chan.loader.EndOfLineException; import org.floens.chan.core.model.Post;
import org.floens.chan.manager.ThreadManager; import org.floens.chan.ui.activity.BaseActivity;
import org.floens.chan.model.Loadable; import org.floens.chan.ui.activity.ImageViewActivity;
import org.floens.chan.model.Post; import org.floens.chan.ui.adapter.PostAdapter;
import org.floens.chan.utils.LoadView; import org.floens.chan.ui.view.LoadView;
import android.app.Fragment; import android.app.Fragment;
import android.content.Intent; import android.content.Intent;

@ -14,11 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
package org.floens.chan.view; package org.floens.chan.ui.view;
import java.util.ArrayList; import java.util.ArrayList;
import org.floens.chan.adapter.BoardEditAdapter; import org.floens.chan.ui.adapter.BoardEditAdapter;
import android.animation.Animator; import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;

@ -1,4 +1,4 @@
package org.floens.chan.view; package org.floens.chan.ui.view;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;

@ -1,4 +1,4 @@
package org.floens.chan.view; package org.floens.chan.ui.view;
import android.content.Context; import android.content.Context;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;

@ -1,4 +1,6 @@
package org.floens.chan.utils; package org.floens.chan.ui.view;
import org.floens.chan.utils.SimpleAnimatorListener;
import android.animation.Animator; import android.animation.Animator;
import android.content.Context; import android.content.Context;

@ -1,7 +1,7 @@
package org.floens.chan.imageview.view; package org.floens.chan.ui.view;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.imageview.fragment.ImageViewFragment; import org.floens.chan.ui.fragment.ImageViewFragment;
import uk.co.senab.photoview.PhotoViewAttacher; import uk.co.senab.photoview.PhotoViewAttacher;
import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener; import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener;

@ -1,11 +1,11 @@
package org.floens.chan.view; package org.floens.chan.ui.view;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.manager.ThreadManager; import org.floens.chan.chan.ChanUrls;
import org.floens.chan.model.Post; import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.model.PostLinkable; import org.floens.chan.core.model.Post;
import org.floens.chan.net.ChanUrls; import org.floens.chan.core.model.PostLinkable;
import org.floens.chan.utils.IconCache; import org.floens.chan.utils.IconCache;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;

@ -1,7 +1,7 @@
package org.floens.chan.view; package org.floens.chan.ui.view;
import org.floens.chan.loader.Loader; import org.floens.chan.core.loader.Loader;
import org.floens.chan.manager.ThreadManager; import org.floens.chan.core.manager.ThreadManager;
import android.content.Context; import android.content.Context;
import android.os.Handler; import android.os.Handler;

@ -1,4 +1,4 @@
package org.floens.chan.imageview; package org.floens.chan.utils;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -6,9 +6,8 @@ import java.io.IOException;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.net.ByteArrayRequest; import org.floens.chan.core.ChanPreferences;
import org.floens.chan.utils.ChanPreferences; import org.floens.chan.core.net.ByteArrayRequest;
import org.floens.chan.utils.Logger;
import android.content.Context; import android.content.Context;
import android.media.MediaScannerConnection; import android.media.MediaScannerConnection;

@ -15,6 +15,9 @@
*******************************************************************************/ *******************************************************************************/
package uk.co.senab.photoview; package uk.co.senab.photoview;
import uk.co.senab.photoview.PhotoViewAttacher.OnMatrixChangedListener;
import uk.co.senab.photoview.PhotoViewAttacher.OnPhotoTapListener;
import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Matrix; import android.graphics.Matrix;
@ -24,10 +27,6 @@ import android.net.Uri;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.widget.ImageView; import android.widget.ImageView;
import uk.co.senab.photoview.PhotoViewAttacher.OnMatrixChangedListener;
import uk.co.senab.photoview.PhotoViewAttacher.OnPhotoTapListener;
import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener;
public class PhotoView extends ImageView implements IPhotoView { public class PhotoView extends ImageView implements IPhotoView {
private final PhotoViewAttacher mAttacher; private final PhotoViewAttacher mAttacher;

@ -15,12 +15,11 @@
*******************************************************************************/ *******************************************************************************/
package uk.co.senab.photoview.gestures; package uk.co.senab.photoview.gestures;
import uk.co.senab.photoview.Compat;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.view.MotionEvent; import android.view.MotionEvent;
import uk.co.senab.photoview.Compat;
@TargetApi(5) @TargetApi(5)
public class EclairGestureDetector extends CupcakeGestureDetector { public class EclairGestureDetector extends CupcakeGestureDetector {

Loading…
Cancel
Save