Organized project.

captchafix
Florens Douwes 11 years ago
parent 4b1fb7b358
commit d825ebc5ad
  1. 85
      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. 16
      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. 16
      Chan/src/org/floens/chan/core/manager/BoardManager.java
  19. 25
      Chan/src/org/floens/chan/core/manager/PinnedManager.java
  20. 21
      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. 12
      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,13 +1,14 @@
<?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" />
@ -19,74 +20,92 @@
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
@ -94,5 +113,5 @@
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:orientation="vertical"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:layout_marginTop="5dp"
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;
@ -19,8 +19,6 @@ 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>();
@ -30,8 +28,6 @@ public class BoardManager {
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();
@ -39,10 +35,6 @@ public class BoardManager {
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

@ -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;
@ -36,8 +36,6 @@ 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;
@ -48,15 +46,10 @@ public class ReplyManager {
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
*/ */
@ -274,7 +267,7 @@ public class ReplyManager {
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();
} }

@ -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,8 +3,8 @@ 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;
@ -12,21 +12,13 @@ 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);

@ -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