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

@ -1,6 +1,6 @@
<?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_height="match_parent"
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"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_marginTop="5dp"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="vertical" >
<TextView
android:id="@+id/floating_label_hint"
android:layout_width="wrap_content"
android:visibility="invisible"
android:layout_height="wrap_content"
android:layout_marginBottom="-8dp"/>
android:layout_marginBottom="-8dp"
android:visibility="invisible" />
<EditText
android:id="@+id/floating_label_edit_text"
android:layout_width="wrap_content"
android:hint="tmp"
android:layout_height="wrap_content"/>
android:layout_height="wrap_content" />
</LinearLayout>

@ -5,10 +5,10 @@
android:background="@color/image_list_background"
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:layout_width="match_parent"
android:layout_height="wrap_content">
</org.floens.chan.view.HackyViewPager>
</org.floens.chan.ui.view.HackyViewPager>
</RelativeLayout>

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

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

@ -6,13 +6,13 @@
android:title="@string/preference_watch_settings" >
<intent
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" />
</Preference>
<Preference android:title="@string/board_edit" >
<intent
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" />
</Preference>
@ -44,7 +44,7 @@
android:title="@string/preference_developer" >
<intent
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" />
</Preference>
</PreferenceCategory>

@ -1,9 +1,9 @@
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.manager.BoardManager;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.manager.ReplyManager;
import org.floens.chan.service.PinnedService;
import org.floens.chan.utils.IconCache;
@ -23,6 +23,10 @@ public class ChanApplication extends Application {
private static ChanApplication instance;
private static RequestQueue volleyRequestQueue;
private static ImageLoader imageLoader;
private static BoardManager boardManager;
private static PinnedManager pinnedManager;
private static ReplyManager replyManager;
private static DatabaseManager databaseManager;
public ChanApplication() {
instance = this;
@ -40,6 +44,22 @@ public class ChanApplication extends Application {
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() {
return PreferenceManager.getDefaultSharedPreferences(instance);
}
@ -65,11 +85,10 @@ public class ChanApplication extends Application {
volleyRequestQueue = Volley.newRequestQueue(this);
imageLoader = new ImageLoader(volleyRequestQueue, new BitmapLruImageCache(1024 * 1024 * 8));
new DatabaseManager(this);
new BoardManager(this);
new PinnedManager(this);
new ReplyManager(this);
databaseManager = new DatabaseManager(this);
boardManager = new BoardManager(this);
pinnedManager = new PinnedManager(this);
replyManager = new ReplyManager(this);
PinnedService.updateRunningState(this);
}

@ -1,4 +1,4 @@
package org.floens.chan.net;
package org.floens.chan.chan;
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.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.VolleyError;

@ -1,11 +1,12 @@
package org.floens.chan.loader;
package org.floens.chan.core.loader;
import java.util.ArrayList;
import java.util.List;
import org.floens.chan.ChanApplication;
import org.floens.chan.model.Loadable;
import org.floens.chan.model.Post;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.net.ChanReaderRequest;
import org.floens.chan.utils.Logger;
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.Map;
import org.floens.chan.model.Loadable;
import org.floens.chan.core.model.Loadable;
public class 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.Scanner;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.model.Board;
import org.floens.chan.net.BoardsRequest;
import org.floens.chan.net.ChanUrls;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.model.Board;
import org.floens.chan.core.net.BoardsRequest;
import org.floens.chan.utils.Logger;
import android.content.Context;
@ -18,31 +18,23 @@ import com.android.volley.VolleyError;
public class BoardManager {
private static final String TAG = "BoardManager";
private static BoardManager instance;
private final Context context;
// Including nsfw ones
private ArrayList<Board> allBoards = new ArrayList<Board>();
private ArrayList<Board> myBoards = new ArrayList<Board>();
private final ArrayList<String> myBoardsKeys = new ArrayList<String>();
private final ArrayList<String> myBoardsValues = new ArrayList<String>();
public BoardManager(Context context) {
instance = this;
this.context = context;
loadFromServer();
myBoards = loadMyBoards();
updateMyBoardsKeysAndValues(myBoards);
}
public static BoardManager getInstance() {
return instance;
}
/**
* Avoid having 0 boards, which causes graphical problems
* @param list
@ -81,56 +73,56 @@ public class BoardManager {
}
return list;
}
public ArrayList<Board> getMyBoards() {
return myBoards;
}
public void setMyBoards(ArrayList<Board> list) {
myBoards.clear();
myBoards = list;
updateMyBoardsKeysAndValues(list);
storeBoardListInDatabase("myBoards", myBoards);
}
private void updateMyBoardsKeysAndValues(ArrayList<Board> list) {
myBoardsKeys.clear();
myBoardsValues.clear();
for (Board board : list) {
myBoardsKeys.add(board.key);
myBoardsValues.add(board.value);
}
}
public ArrayList<String> getMyBoardsKeys() {
return myBoardsKeys;
}
public ArrayList<String> getMyBoardsValues() {
return myBoardsValues;
}
public boolean getBoardExists(String board) {
for (Board e : allBoards) {
if (e.value.equals(board)) {
return true;
}
}
return false;
}
public String getBoardKey(String value) {
for (Board e : allBoards) {
if (e.value.equals(value)) {
return e.key;
}
}
return null;
}
/**
* Try to add value to the supplied list.
* @param list
@ -140,87 +132,87 @@ public class BoardManager {
for (Board board : list) {
if (board.value.equals(value)) {
Toast.makeText(context, R.string.board_add_duplicate, Toast.LENGTH_LONG).show();
return;
}
}
for (Board board : allBoards) {
if (board.value.equals(value)) {
list.add(board);
String text = context.getString(R.string.board_add_success) + " " + board.key;
Toast.makeText(context, text, Toast.LENGTH_LONG).show();
return;
}
}
Toast.makeText(context, R.string.board_add_fail, Toast.LENGTH_LONG).show();
}
private ArrayList<Board> loadMyBoards() {
ArrayList<Board> list = getBoardListFromDatabase("myBoards");
if (list == null || list.size() == 0) {
list = getDefaultBoards();
storeBoardListInDatabase("myBoards", list);
}
return list;
}
private void storeBoardListInDatabase(String key, ArrayList<Board> list) {
String total = "";
for (Board board : list) {
total += board.key + "|" + board.value + "\n";
}
ChanApplication.getPreferences().edit().putString(key, total).commit();
}
private ArrayList<Board> getBoardListFromDatabase(String key) {
String total = ChanApplication.getPreferences().getString(key, null);
if (total == null) return null;
ArrayList<Board> list = new ArrayList<Board>();
Scanner scanner = new Scanner(total);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] splitted = line.split("\\|");
if (splitted.length < 2) continue;
Board board = new Board();
board.key = splitted[0];
board.value = splitted[1];
if (!board.finish()) {
Logger.wtf(TAG, "board.finish in loadfrompreferences threw up");
}
list.add(board);
}
scanner.close();
return list;
}
private void loadFromServer() {
ArrayList<Board> temp = getBoardListFromDatabase("allBoards");
if (temp != null) {
allBoards = temp;
}
ChanApplication.getVolleyRequestQueue().add(new BoardsRequest(ChanUrls.getBoardsUrl(), new Response.Listener<ArrayList<Board>>() {
@Override
public void onResponse(ArrayList<Board> data) {
storeBoardListInDatabase("allBoards", data);
allBoards = data;
Logger.i(TAG, "Got boards from server");
}
}, 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.List;
import org.floens.chan.database.DatabaseManager;
import org.floens.chan.model.Loadable;
import org.floens.chan.model.Pin;
import org.floens.chan.ChanApplication;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin;
import android.content.Context;
public class PinnedManager {
private static PinnedManager instance;
private final List<PinListener> listeners = new ArrayList<PinListener>();
private final List<Pin> pins;
public PinnedManager(Context context) {
instance = this;
pins = DatabaseManager.getInstance().getPinned();
}
public static PinnedManager getInstance() {
return instance;
pins = ChanApplication.getDatabaseManager().getPinned();
}
public void addPinListener(PinListener l) {
@ -65,7 +58,7 @@ public class PinnedManager {
}
pins.add(pin);
DatabaseManager.getInstance().addPin(pin);
ChanApplication.getDatabaseManager().addPin(pin);
onPinsChanged();
@ -78,7 +71,7 @@ public class PinnedManager {
*/
public void remove(Pin pin) {
pins.remove(pin);
DatabaseManager.getInstance().removePin(pin);
ChanApplication.getDatabaseManager().removePin(pin);
pin.destroy();
onPinsChanged();
@ -89,7 +82,7 @@ public class PinnedManager {
* @param pin
*/
public void update(Pin pin) {
DatabaseManager.getInstance().updatePin(pin);
ChanApplication.getDatabaseManager().updatePin(pin);
onPinsChanged();
}
@ -103,7 +96,7 @@ public class PinnedManager {
new Thread(new Runnable() {
@Override
public void run() {
DatabaseManager.getInstance().updatePins(pins);
ChanApplication.getDatabaseManager().updatePins(pins);
}
}).start();
}

@ -1,4 +1,4 @@
package org.floens.chan.manager;
package org.floens.chan.core.manager;
import java.io.File;
import java.io.IOException;
@ -8,11 +8,11 @@ import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.floens.chan.activity.ImagePickActivity;
import org.floens.chan.database.DatabaseManager;
import org.floens.chan.model.Reply;
import org.floens.chan.model.SavedReply;
import org.floens.chan.net.ChanUrls;
import org.floens.chan.ChanApplication;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.model.Reply;
import org.floens.chan.core.model.SavedReply;
import org.floens.chan.ui.activity.ImagePickActivity;
import org.floens.chan.utils.Logger;
import org.floens.chan.utils.Utils;
@ -35,43 +35,36 @@ import ch.boye.httpclientandroidlib.util.EntityUtils;
*/
public class ReplyManager {
private static final String TAG = "ReplyManager";
private static ReplyManager instance;
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 int POST_TIMEOUT = 10000;
private final Context context;
private Reply draft;
private FileListener fileListener;
private final Random random = new Random();
public ReplyManager(Context context) {
ReplyManager.instance = this;
this.context = context;
draft = new Reply();
}
public static ReplyManager getInstance() {
return instance;
}
/**
* Clear the draft
*/
public void removeReplyDraft() {
draft = new Reply();
}
/**
* Set an reply draft.
* Set an reply draft.
* @param value the draft to save.
*/
public void setReplyDraft(Reply value) {
draft = value;
}
/**
* Gets the saved reply draft.
* @return the saved draft or an empty draft.
@ -79,7 +72,7 @@ public class ReplyManager {
public Reply getReplyDraft() {
return draft;
}
/**
* Add an quote to the comment field. Looks like >>123456789\n
* @param no the raw no to quote to.
@ -87,19 +80,19 @@ public class ReplyManager {
public void quote(int no) {
draft.comment = draft.comment + ">>" + no + "\n";
}
/**
* Pick an file. Starts up the ImagePickActivity.
* @param listener FileListener to listen on.
*/
public void pickFile(FileListener listener) {
fileListener = listener;
Intent intent = new Intent(context, ImagePickActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
/**
* Called from ImagePickActivity, sends onFileLoading to the fileListener.
*/
@ -108,7 +101,7 @@ public class ReplyManager {
fileListener.onFileLoading();
}
}
/**
* Called from ImagePickActivity. Sends the file to the listening fileListener, and deletes the fileListener.
*/
@ -118,14 +111,14 @@ public class ReplyManager {
}
fileListener = null;
}
/**
* Delete the fileListener.
*/
public void removeFileListener() {
fileListener = null;
}
/**
* Get the CAPTCHA challenge hash from an JSON response.
* @param total The total response from the server
@ -134,54 +127,54 @@ public class ReplyManager {
public static String getChallenge(String total) {
Matcher matcher = challengePattern.matcher(total);
matcher.find();
if (matcher.groupCount() == 1) {
return matcher.group(1);
} else {
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 listener The listener, after server response.
*/
public void sendDelete(final SavedReply reply, boolean onlyImageDelete, final DeleteListener listener) {
Logger.i(TAG, "Sending delete request: " + reply.board + ", " + reply.no);
HttpPost httpPost = new HttpPost(ChanUrls.getDeleteUrl(reply.board));
MultipartEntity entity = new MultipartEntity();
try {
entity.addPart(Integer.toString(reply.no), new StringBody("delete"));
if (onlyImageDelete) {
entity.addPart("onlyimgdel", new StringBody("on"));
}
// res not necessary
entity.addPart("mode", new StringBody("usrdel"));
entity.addPart("pwd", new StringBody(reply.password));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return;
}
httpPost.setEntity(entity);
sendHttpPost(httpPost, new HttpPostSendListener() {
@Override
public void onReponse(String responseString) {
DeleteResponse e = new DeleteResponse();
if (responseString == null) {
e.isNetworkError = true;
} else {
e.responseData = responseString;
if (responseString.contains("You must wait longer before deleting this post")) {
e.isUserError = true;
e.isTooSoonError = true;
@ -195,43 +188,43 @@ public class ReplyManager {
e.isSuccessful = true;
}
}
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 listener The listener, after server response.
*/
public void sendReply(final Reply reply, final ReplyListener listener) {
Logger.i(TAG, "Sending reply request: " + reply.board + ", " + reply.resto);
HttpPost httpPost = new HttpPost(ChanUrls.getPostUrl(reply.board));
MultipartEntity entity = new MultipartEntity();
reply.password = Long.toHexString(random.nextLong());
try {
entity.addPart("name", new StringBody(reply.name));
entity.addPart("email", new StringBody(reply.email));
entity.addPart("sub", new StringBody(reply.subject));
entity.addPart("com", new StringBody(reply.comment));
if (reply.resto >= 0) {
entity.addPart("resto", new StringBody(Integer.toString(reply.resto)));
}
entity.addPart("recaptcha_challenge_field", new StringBody(reply.captchaChallenge));
entity.addPart("recaptcha_response_field", new StringBody(reply.captchaResponse));
entity.addPart("mode", new StringBody("regist"));
entity.addPart("pwd", new StringBody(reply.password));
if (reply.file != null) {
entity.addPart("upfile", new FileBody(reply.file, reply.fileName, "application/octet-stream", "UTF-8"));
}
@ -239,23 +232,23 @@ public class ReplyManager {
e.printStackTrace();
return;
}
httpPost.setEntity(entity);
sendHttpPost(httpPost, new HttpPostSendListener() {
@Override
public void onReponse(String responseString) {
ReplyResponse e = new ReplyResponse();
if (responseString == null) {
e.isNetworkError = true;
} else {
e.responseData = responseString;
if (responseString.contains("No file selected")) {
e.isUserError = 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")) {
e.isUserError = true;
e.isCaptchaError = true;
@ -263,18 +256,18 @@ public class ReplyManager {
e.isSuccessful = true;
}
}
if (e.isSuccessful) {
Matcher matcher = responsePattern.matcher(e.responseData);
if (matcher.find() && matcher.groupCount() == 2) {
try {
SavedReply savedReply = new SavedReply();
savedReply.board = reply.board;
savedReply.no = Integer.parseInt(matcher.group(2));
savedReply.password = reply.password;
DatabaseManager.getInstance().saveReply(savedReply);
ChanApplication.getDatabaseManager().saveReply(savedReply);
} catch (NumberFormatException err) {
err.printStackTrace();
}
@ -282,12 +275,12 @@ public class ReplyManager {
Logger.w(TAG, "No thread & no in the response");
}
}
listener.onResponse(e);
}
});
}
/**
* 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.
@ -302,11 +295,11 @@ public class ReplyManager {
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, POST_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, POST_TIMEOUT);
DefaultHttpClient client = new DefaultHttpClient(httpParameters);
String responseString = null;
try {
HttpResponse response = client.execute(post);
responseString = EntityUtils.toString(response.getEntity(), "UTF-8");
@ -315,23 +308,23 @@ public class ReplyManager {
} catch (IOException e) {
e.printStackTrace();
}
final String finalResponseString = responseString;
Utils.runOnUiThread(new Runnable() {
@Override
public void run() {
listener.onReponse(finalResponseString);
}
});
}
}
}).start();
}
private static interface HttpPostSendListener {
public void onReponse(String responseString);
}
public static abstract class FileListener {
/**
* When a file is picked.
@ -343,11 +336,11 @@ public class ReplyManager {
*/
public abstract void onFileLoading();
}
public static interface DeleteListener {
public void onResponse(DeleteResponse response);
}
public static class DeleteResponse {
public boolean isNetworkError = false;
public boolean isUserError = false;
@ -357,37 +350,37 @@ public class ReplyManager {
public boolean isSuccessful = false;
public String responseData = "";
}
public static interface ReplyListener {
public void onResponse(ReplyResponse response);
}
public static class ReplyResponse {
/**
* No response from server.
*/
public boolean isNetworkError = false;
/**
* Some user error, like no file or captcha wrong.
*/
public boolean isUserError = false;
/**
* The userError was an fileError
*/
public boolean isFileError = false;
/**
* The userError was an captchaError
*/
public boolean isCaptchaError = false;
/**
* Received 'post successful'
*/
public boolean isSuccessful = false;
/**
* Raw html from the response. Used to set html in an WebView to the client, when the error was not
* 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.List;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.activity.ReplyActivity;
import org.floens.chan.database.DatabaseManager;
import org.floens.chan.fragment.PostRepliesFragment;
import org.floens.chan.fragment.ReplyFragment;
import org.floens.chan.loader.Loader;
import org.floens.chan.loader.LoaderPool;
import org.floens.chan.manager.ReplyManager.DeleteListener;
import org.floens.chan.manager.ReplyManager.DeleteResponse;
import org.floens.chan.model.Loadable;
import org.floens.chan.model.Pin;
import org.floens.chan.model.Post;
import org.floens.chan.model.PostLinkable;
import org.floens.chan.model.SavedReply;
import org.floens.chan.utils.ChanPreferences;
import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.loader.Loader;
import org.floens.chan.core.loader.LoaderPool;
import org.floens.chan.core.manager.ReplyManager.DeleteListener;
import org.floens.chan.core.manager.ReplyManager.DeleteResponse;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.model.PostLinkable;
import org.floens.chan.core.model.SavedReply;
import org.floens.chan.ui.activity.ReplyActivity;
import org.floens.chan.ui.fragment.PostRepliesFragment;
import org.floens.chan.ui.fragment.ReplyFragment;
import org.floens.chan.utils.Logger;
import android.app.Activity;
@ -102,9 +102,9 @@ public class ThreadManager implements Loader.LoaderListener {
public void bottomPostViewed() {
if (loader != null && loader.getLoadable().isThreadMode()) {
Pin pin = PinnedManager.getInstance().findPinByLoadable(loader.getLoadable());
Pin pin = ChanApplication.getPinnedManager().findPinByLoadable(loader.getLoadable());
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);
// 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];
System.arraycopy(temp, 0, items, 0, temp.length);
items[items.length - 1] = activity.getString(R.string.delete);
@ -191,7 +191,7 @@ public class ThreadManager implements Loader.LoaderListener {
openReply(true); // todo if tablet
// Pass through
case 1: // Quote
ReplyManager.getInstance().quote(post.no);
ChanApplication.getReplyManager().quote(post.no);
break;
case 2: // Info
showPostInfo(post);
@ -468,7 +468,7 @@ public class ThreadManager implements Loader.LoaderListener {
}
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) {
/*
* 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));
ReplyManager.getInstance().sendDelete(reply, onlyImageDelete, new DeleteListener() {
ChanApplication.getReplyManager().sendDelete(reply, onlyImageDelete, new DeleteListener() {
@Override
public void onResponse(DeleteResponse response) {
dialog.dismiss();

@ -1,4 +1,4 @@
package org.floens.chan.model;
package org.floens.chan.core.model;
/**
* 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.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.table.DatabaseTable;

@ -1,12 +1,12 @@
package org.floens.chan.model;
package org.floens.chan.core.model;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.floens.chan.model.PostLinkable.Type;
import org.floens.chan.net.ChanUrls;
import org.floens.chan.view.PostView;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.model.PostLinkable.Type;
import org.floens.chan.ui.view.PostView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
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.text.TextPaint;

@ -1,4 +1,4 @@
package org.floens.chan.model;
package org.floens.chan.core.model;
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.table.DatabaseTable;

@ -1,9 +1,9 @@
package org.floens.chan.net;
package org.floens.chan.core.net;
import java.io.IOException;
import java.util.ArrayList;
import org.floens.chan.model.Board;
import org.floens.chan.core.model.Board;
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.Request;

@ -1,13 +1,13 @@
package org.floens.chan.loader;
package org.floens.chan.core.net;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.floens.chan.database.DatabaseManager;
import org.floens.chan.model.Loadable;
import org.floens.chan.model.Post;
import org.floens.chan.net.ChanUrls;
import org.floens.chan.ChanApplication;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
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;

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

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

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

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

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

@ -1,4 +1,4 @@
package org.floens.chan.animation;
package org.floens.chan.ui;
/*
* 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.Animation;

@ -1,4 +1,4 @@
package org.floens.chan.activity;
package org.floens.chan.ui.activity;
import android.app.Activity;
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.adapter.PinnedAdapter;
import org.floens.chan.animation.SwipeDismissListViewTouchListener;
import org.floens.chan.animation.SwipeDismissListViewTouchListener.DismissCallbacks;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.model.Pin;
import org.floens.chan.model.Post;
import org.floens.chan.core.manager.PinnedManager;
import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post;
import org.floens.chan.ui.SwipeDismissListViewTouchListener;
import org.floens.chan.ui.SwipeDismissListViewTouchListener.DismissCallbacks;
import org.floens.chan.ui.adapter.PinnedAdapter;
import android.app.Activity;
import android.app.AlertDialog;
@ -72,14 +73,14 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
threadPane = (SlidingPaneLayout) findViewById(R.id.pane_container);
initPane();
PinnedManager.getInstance().addPinListener(this);
ChanApplication.getPinnedManager().addPinListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
PinnedManager.getInstance().removePinListener(this);
ChanApplication.getPinnedManager().removePinListener(this);
}
private void initPane() {
@ -151,15 +152,15 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
}
public void addPin(Pin pin) {
PinnedManager.getInstance().add(pin);
ChanApplication.getPinnedManager().add(pin);
}
public void removePin(Pin pin) {
PinnedManager.getInstance().remove(pin);
ChanApplication.getPinnedManager().remove(pin);
}
public void updatePin(Pin pin) {
PinnedManager.getInstance().update(pin);
ChanApplication.getPinnedManager().update(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.List;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.fragment.ThreadFragment;
import org.floens.chan.manager.BoardManager;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.model.Loadable;
import org.floens.chan.model.Pin;
import org.floens.chan.model.Post;
import org.floens.chan.net.ChanUrls;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post;
import org.floens.chan.service.PinnedService;
import org.floens.chan.ui.fragment.ThreadFragment;
import android.app.ActionBar;
import android.app.AlertDialog;
@ -58,7 +57,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
actionBar.getThemedContext(),
R.layout.board_select_spinner,
android.R.id.text1,
BoardManager.getInstance().getMyBoardsKeys()
ChanApplication.getBoardManager().getMyBoardsKeys()
), this);
Intent startIntent = getIntent();
@ -107,7 +106,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
protected void onPause() {
super.onPause();
PinnedManager.getInstance().updateAll();
ChanApplication.getPinnedManager().updateAll();
}
@Override
@ -121,7 +120,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
@Override
public boolean onNavigationItemSelected(int position, long id) {
if (!boardSetByIntent) {
boardLoadable = new Loadable(BoardManager.getInstance().getMyBoardsValues().get(position));
boardLoadable = new Loadable(ChanApplication.getBoardManager().getMyBoardsValues().get(position));
startLoadingBoard(boardLoadable);
}
@ -316,7 +315,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
private void startLoadingThread(Loadable loadable) {
if (loadable.mode == Loadable.Mode.INVALID) return;
Pin pin = PinnedManager.getInstance().findPinByLoadable(loadable);
Pin pin = ChanApplication.getPinnedManager().findPinByLoadable(loadable);
if (pin != null) {
// Use the loadable from the pin.
// 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
String rawBoard = parts.get(0);
if (BoardManager.getInstance().getBoardExists(rawBoard)) {
if (ChanApplication.getBoardManager().getBoardExists(rawBoard)) {
boardSetByIntent = true;
startLoadingBoard(new Loadable(rawBoard));
@ -360,7 +359,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
if (!setNavigationFromBoardValue(rawBoard)) {
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
String value = BoardManager.getInstance().getBoardKey(rawBoard);
String value = ChanApplication.getBoardManager().getBoardKey(rawBoard);
actionBar.setTitle(value == null ? ("/" + rawBoard + "/") : value);
}
@ -377,7 +376,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
no = Integer.parseInt(parts.get(2));
} catch (NumberFormatException e) {}
if (no >= 0 && BoardManager.getInstance().getBoardExists(rawBoard)) {
if (no >= 0 && ChanApplication.getBoardManager().getBoardExists(rawBoard)) {
boardSetByIntent = true;
startLoadingBoard(new Loadable(rawBoard));
@ -421,7 +420,7 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio
* @return true if spinner was set, false otherwise
*/
private boolean setNavigationFromBoardValue(String boardValue) {
ArrayList<String> list = BoardManager.getInstance().getMyBoardsValues();
ArrayList<String> list = ChanApplication.getBoardManager().getMyBoardsValues();
int foundIndex = -1;
for (int i = 0; i < list.size(); i++) {
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 org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.adapter.BoardEditAdapter;
import org.floens.chan.manager.BoardManager;
import org.floens.chan.model.Board;
import org.floens.chan.view.DynamicListView;
import org.floens.chan.core.model.Board;
import org.floens.chan.ui.adapter.BoardEditAdapter;
import org.floens.chan.ui.view.DynamicListView;
import android.app.Activity;
import android.app.AlertDialog;
@ -35,7 +35,7 @@ public class BoardEditor extends Activity {
setContentView(R.layout.board_edit);
// 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);
listView = (DynamicListView<Board>) findViewById(R.id.board_edit_list);
@ -51,7 +51,7 @@ public class BoardEditor extends Activity {
// For runtime changes
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) {
BoardManager.getInstance().addBoard(list, value);
ChanApplication.getBoardManager().addBoard(list, value);
adapter = new BoardEditAdapter(this, R.layout.board_view, list, this);
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.os.Bundle;
@ -33,7 +33,7 @@ public class DeveloperActivity extends Activity {
String dbSummary = "";
dbSummary += "Database summary:\n";
dbSummary += DatabaseManager.getInstance().getSummary();
dbSummary += ChanApplication.getDatabaseManager().getSummary();
TextView db = new TextView(this);
db.setPadding(0, 25, 0, 0);
@ -44,7 +44,7 @@ public class DeveloperActivity extends Activity {
resetDbButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatabaseManager.getInstance().reset();
ChanApplication.getDatabaseManager().reset();
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.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.manager.ReplyManager;
import org.floens.chan.utils.IOUtils;
import android.app.Activity;
@ -43,7 +43,7 @@ public class ImagePickActivity extends Activity {
if (data != null) {
final Uri uri = data.getData();
ReplyManager.getInstance()._onPickedFileLoading();
ChanApplication.getReplyManager()._onPickedFileLoading();
// Async load the stream into "pickedFileCache", an file in the cache root
new Thread(new Runnable() {
@ -64,7 +64,7 @@ public class ImagePickActivity extends Activity {
runOnUiThread(new Runnable() {
@Override
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 org.floens.chan.R;
import org.floens.chan.adapter.PostAdapter;
import org.floens.chan.imageview.ImageSaver;
import org.floens.chan.imageview.adapter.ImageViewAdapter;
import org.floens.chan.model.Post;
import org.floens.chan.core.model.Post;
import org.floens.chan.ui.adapter.ImageViewAdapter;
import org.floens.chan.ui.adapter.PostAdapter;
import org.floens.chan.utils.ImageSaver;
import org.floens.chan.utils.Logger;
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.model.Loadable;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.ui.fragment.ReplyFragment;
import org.floens.chan.utils.Logger;
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.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.utils.ChanPreferences;
import org.floens.chan.core.ChanPreferences;
import org.floens.chan.utils.Utils;
import android.app.Activity;

@ -14,14 +14,14 @@
* limitations under the License.
*/
package org.floens.chan.adapter;
package org.floens.chan.ui.adapter;
import java.util.HashMap;
import java.util.List;
import org.floens.chan.R;
import org.floens.chan.activity.BoardEditor;
import org.floens.chan.model.Board;
import org.floens.chan.core.model.Board;
import org.floens.chan.ui.activity.BoardEditor;
import android.content.Context;
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 org.floens.chan.imageview.activity.ImageViewActivity;
import org.floens.chan.imageview.fragment.ImageViewFragment;
import org.floens.chan.model.Post;
import org.floens.chan.core.model.Post;
import org.floens.chan.ui.activity.ImageViewActivity;
import org.floens.chan.ui.fragment.ImageViewFragment;
import android.app.Fragment;
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.HashMap;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.manager.PinnedManager;
import org.floens.chan.model.Pin;
import org.floens.chan.core.model.Pin;
import android.content.Context;
import android.view.LayoutInflater;
@ -69,7 +69,7 @@ public class PinnedAdapter extends ArrayAdapter<Pin> {
header.type = Pin.Type.HEADER;
add(header);
addAll(PinnedManager.getInstance().getPins());
addAll(ChanApplication.getPinnedManager().getPins());
notifyDataSetChanged();
}

@ -1,15 +1,15 @@
package org.floens.chan.adapter;
package org.floens.chan.ui.adapter;
import java.util.ArrayList;
import java.util.List;
import org.floens.chan.R;
import org.floens.chan.manager.ThreadManager;
import org.floens.chan.model.Post;
import org.floens.chan.utils.ScrollerRunnable;
import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.core.model.Post;
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.view.PostView;
import org.floens.chan.view.ThreadWatchCounterView;
import android.content.Context;
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.R;
import org.floens.chan.imageview.activity.ImageViewActivity;
import org.floens.chan.imageview.view.NetworkPhotoView;
import org.floens.chan.model.Post;
import org.floens.chan.net.GIFRequest;
import org.floens.chan.view.GIFView;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.net.GIFRequest;
import org.floens.chan.ui.activity.ImageViewActivity;
import org.floens.chan.ui.view.GIFView;
import org.floens.chan.ui.view.NetworkPhotoView;
import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener;
import android.app.Fragment;

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

@ -1,19 +1,19 @@
package org.floens.chan.fragment;
package org.floens.chan.ui.fragment;
import java.io.File;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.manager.ReplyManager;
import org.floens.chan.manager.ReplyManager.ReplyResponse;
import org.floens.chan.model.Loadable;
import org.floens.chan.model.Reply;
import org.floens.chan.net.ChanUrls;
import org.floens.chan.utils.ChanPreferences;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.manager.ReplyManager;
import org.floens.chan.core.manager.ReplyManager.ReplyResponse;
import org.floens.chan.core.model.Loadable;
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.LoadView;
import org.floens.chan.utils.Logger;
import org.floens.chan.utils.ViewFlipperAnimations;
import android.app.Dialog;
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)) {
draft.name = ChanPreferences.getDefaultName();
@ -150,7 +150,7 @@ public class ReplyFragment extends DialogFragment {
public void onPause() {
super.onPause();
ReplyManager replyManager = ReplyManager.getInstance();
ReplyManager replyManager = ChanApplication.getReplyManager();
if (shouldSaveDraft) {
draft.name = nameView.getText().toString();
@ -169,7 +169,7 @@ public class ReplyFragment extends DialogFragment {
public void onDestroy() {
super.onDestroy();
ReplyManager replyManager = ReplyManager.getInstance();
ReplyManager replyManager = ChanApplication.getReplyManager();
replyManager.removeFileListener();
}
@ -210,7 +210,7 @@ public class ReplyFragment extends DialogFragment {
fileButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
ReplyManager.getInstance().pickFile(new ReplyManager.FileListener() {
ChanApplication.getReplyManager().pickFile(new ReplyManager.FileListener() {
@Override
public void onFile(File file) {
setFile(file);
@ -397,7 +397,7 @@ public class ReplyFragment extends DialogFragment {
draft.resto = loadable.isBoardMode() ? -1 : loadable.no;
draft.board = loadable.board;
ReplyManager.getInstance().sendReply(draft, new ReplyManager.ReplyListener() {
ChanApplication.getReplyManager().sendReply(draft, new ReplyManager.ReplyListener() {
@Override
public void onResponse(ReplyResponse 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.activity.AboutActivity;
import org.floens.chan.utils.ChanPreferences;
import org.floens.chan.core.ChanPreferences;
import org.floens.chan.ui.activity.AboutActivity;
import android.content.Intent;
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 org.floens.chan.R;
import org.floens.chan.activity.BaseActivity;
import org.floens.chan.adapter.PostAdapter;
import org.floens.chan.imageview.activity.ImageViewActivity;
import org.floens.chan.loader.EndOfLineException;
import org.floens.chan.manager.ThreadManager;
import org.floens.chan.model.Loadable;
import org.floens.chan.model.Post;
import org.floens.chan.utils.LoadView;
import org.floens.chan.core.loader.EndOfLineException;
import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
import org.floens.chan.ui.activity.BaseActivity;
import org.floens.chan.ui.activity.ImageViewActivity;
import org.floens.chan.ui.adapter.PostAdapter;
import org.floens.chan.ui.view.LoadView;
import android.app.Fragment;
import android.content.Intent;

@ -14,11 +14,11 @@
* limitations under the License.
*/
package org.floens.chan.view;
package org.floens.chan.ui.view;
import java.util.ArrayList;
import org.floens.chan.adapter.BoardEditAdapter;
import org.floens.chan.ui.adapter.BoardEditAdapter;
import android.animation.Animator;
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.graphics.Canvas;

@ -1,4 +1,4 @@
package org.floens.chan.view;
package org.floens.chan.ui.view;
import android.content.Context;
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.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.imageview.fragment.ImageViewFragment;
import org.floens.chan.ui.fragment.ImageViewFragment;
import uk.co.senab.photoview.PhotoViewAttacher;
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.R;
import org.floens.chan.manager.ThreadManager;
import org.floens.chan.model.Post;
import org.floens.chan.model.PostLinkable;
import org.floens.chan.net.ChanUrls;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.model.PostLinkable;
import org.floens.chan.utils.IconCache;
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.manager.ThreadManager;
import org.floens.chan.core.loader.Loader;
import org.floens.chan.core.manager.ThreadManager;
import android.content.Context;
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.FileOutputStream;
@ -6,9 +6,8 @@ import java.io.IOException;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.net.ByteArrayRequest;
import org.floens.chan.utils.ChanPreferences;
import org.floens.chan.utils.Logger;
import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.net.ByteArrayRequest;
import android.content.Context;
import android.media.MediaScannerConnection;

@ -15,6 +15,9 @@
*******************************************************************************/
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.graphics.Bitmap;
import android.graphics.Matrix;
@ -24,10 +27,6 @@ import android.net.Uri;
import android.util.AttributeSet;
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 {
private final PhotoViewAttacher mAttacher;

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

Loading…
Cancel
Save