Complete DI

Don't reload history in onShow, fix possible crash for ImagePickDelegate.
multisite
Floens 9 years ago
parent 33c5cc720e
commit 6a6055ea98
  1. 73
      Clover/app/src/main/java/org/floens/chan/Chan.java
  2. 7
      Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java
  3. 13
      Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java
  4. 13
      Clover/app/src/main/java/org/floens/chan/core/di/AppModule.java
  5. 87
      Clover/app/src/main/java/org/floens/chan/core/di/ChanGraph.java
  6. 45
      Clover/app/src/main/java/org/floens/chan/core/di/NetModule.java
  7. 2
      Clover/app/src/main/java/org/floens/chan/core/di/UserAgentProvider.java
  8. 2
      Clover/app/src/main/java/org/floens/chan/core/http/ReplyManager.java
  9. 17
      Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java
  10. 20
      Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java
  11. 5
      Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java
  12. 11
      Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java
  13. 20
      Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java
  14. 9
      Clover/app/src/main/java/org/floens/chan/core/receiver/WatchUpdateReceiver.java
  15. 18
      Clover/app/src/main/java/org/floens/chan/core/saver/ImageSaveTask.java
  16. 5
      Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java
  17. 7
      Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java
  18. 23
      Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java
  19. 9
      Clover/app/src/main/java/org/floens/chan/ui/adapter/DrawerAdapter.java
  20. 9
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PostsFilter.java
  21. 3
      Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java
  22. 2
      Clover/app/src/main/java/org/floens/chan/ui/cell/ThreadStatusCell.java
  23. 9
      Clover/app/src/main/java/org/floens/chan/ui/controller/BoardEditController.java
  24. 14
      Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java
  25. 13
      Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java
  26. 10
      Clover/app/src/main/java/org/floens/chan/ui/controller/FiltersController.java
  27. 21
      Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java
  28. 13
      Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java
  29. 7
      Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java
  30. 9
      Clover/app/src/main/java/org/floens/chan/ui/controller/PassSettingsController.java
  31. 14
      Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java
  32. 19
      Clover/app/src/main/java/org/floens/chan/ui/helper/ImagePickDelegate.java
  33. 9
      Clover/app/src/main/java/org/floens/chan/ui/layout/FilterLayout.java
  34. 16
      Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java
  35. 21
      Clover/app/src/main/java/org/floens/chan/ui/view/MultiImageView.java
  36. 4
      Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java
  37. 6
      Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java

@ -17,32 +17,21 @@
*/
package org.floens.chan;
import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.StrictMode;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
import org.floens.chan.core.UserAgentProvider;
import org.floens.chan.core.cache.FileCache;
import org.floens.chan.core.di.UserAgentProvider;
import org.floens.chan.core.database.DatabaseManager;
import org.floens.chan.core.di.AppModule;
import org.floens.chan.core.di.ChanGraph;
import org.floens.chan.core.di.DaggerChanGraph;
import org.floens.chan.core.http.ReplyManager;
import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.manager.WatchManager;
import org.floens.chan.core.net.BitmapLruImageCache;
import org.floens.chan.core.net.ProxiedHurlStack;
import org.floens.chan.utils.AndroidUtils;
import org.floens.chan.utils.Logger;
import org.floens.chan.utils.Time;
import java.io.File;
import java.util.Locale;
import javax.inject.Inject;
@ -52,16 +41,8 @@ import de.greenrobot.event.EventBus;
public class Chan extends Application implements UserAgentProvider {
private static final String TAG = "ChanApplication";
private static final long FILE_CACHE_DISK_SIZE = 50 * 1024 * 1024;
private static final String FILE_CACHE_NAME = "filecache";
private static final int VOLLEY_CACHE_SIZE = 10 * 1024 * 1024;
public static Context con;
@SuppressLint("StaticFieldLeak")
private static Chan instance;
private static RequestQueue volleyRequestQueue;
private static ImageLoader imageLoader;
private static FileCache fileCache;
private String userAgent;
private int activityForegroundCounter = 0;
@ -73,41 +54,12 @@ public class Chan extends Application implements UserAgentProvider {
public Chan() {
instance = this;
con = this;
}
public static Chan getInstance() {
return instance;
}
public static RequestQueue getVolleyRequestQueue() {
return volleyRequestQueue;
}
public static ImageLoader getVolleyImageLoader() {
return imageLoader;
}
public static BoardManager getBoardManager() {
throw new IllegalArgumentException();
}
public static WatchManager getWatchManager() {
throw new IllegalArgumentException();
}
public static ReplyManager getReplyManager() {
throw new IllegalArgumentException();
}
public static DatabaseManager getDatabaseManager() {
throw new IllegalArgumentException();
}
public static FileCache getFileCache() {
return fileCache;
}
public static ChanGraph getGraph() {
return instance.graph;
}
@ -119,29 +71,14 @@ public class Chan extends Application implements UserAgentProvider {
final long startTime = Time.startTiming();
AndroidUtils.init();
userAgent = createUserAgent();
graph = DaggerChanGraph.builder()
.appModule(new AppModule(this, this))
.build();
graph.inject(this);
userAgent = createUserAgent();
File cacheDir = getExternalCacheDir() != null ? getExternalCacheDir() : getCacheDir();
volleyRequestQueue = Volley.newRequestQueue(this, userAgent, new ProxiedHurlStack(userAgent), new File(cacheDir, Volley.DEFAULT_CACHE_DIR), VOLLEY_CACHE_SIZE);
final int runtimeMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int lruImageCacheSize = runtimeMemory / 8;
imageLoader = new ImageLoader(volleyRequestQueue, new BitmapLruImageCache(lruImageCacheSize));
fileCache = new FileCache(new File(cacheDir, FILE_CACHE_NAME), FILE_CACHE_DISK_SIZE, getUserAgent());
// sDatabaseManager = new DatabaseManager(this);
// boardManager = new BoardManager(null);
// watchManager = new WatchManager(null);
Time.endTiming("Initializing application", startTime);
// Start watching for slow disk reads and writes after the heavy initializing is done

@ -21,6 +21,7 @@ import android.net.Uri;
import org.floens.chan.Chan;
import org.floens.chan.core.database.DatabaseLoadableManager;
import org.floens.chan.core.database.DatabaseManager;
import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.model.Board;
import org.floens.chan.core.model.Loadable;
@ -29,6 +30,8 @@ import org.floens.chan.core.site.Sites;
import java.util.List;
import static org.floens.chan.Chan.getGraph;
public class ChanHelper {
public static Loadable getLoadableFromStartUri(Uri uri) {
Loadable loadable = null;
@ -40,8 +43,8 @@ public class ChanHelper {
if (parts.size() > 0) {
String rawBoard = parts.get(0);
BoardManager boardManager = Chan.getBoardManager();
DatabaseLoadableManager loadableManager = Chan.getDatabaseManager().getDatabaseLoadableManager();
DatabaseManager databaseManager = getGraph().getDatabaseManager();
DatabaseLoadableManager loadableManager = databaseManager.getDatabaseLoadableManager();
Board board = site.board(rawBoard);
if (board != null) {
if (parts.size() == 1 || (parts.size() == 2 && "catalog".equals(parts.get(1)))) {

@ -23,7 +23,6 @@ import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import org.floens.chan.Chan;
import org.floens.chan.core.exception.ChanLoaderException;
import org.floens.chan.core.model.ChanThread;
import org.floens.chan.core.model.Loadable;
@ -41,15 +40,21 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
public class ChanLoader implements Response.ErrorListener, Response.Listener<ChanReaderRequest.ChanReaderResponse> {
private static final String TAG = "ChanLoader";
private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
private static final int[] watchTimeouts = {10, 15, 20, 30, 60, 90, 120, 180, 240, 300, 600, 1800, 3600};
@Inject
RequestQueue volleyRequestQueue;
private final List<ChanLoaderCallback> listeners = new ArrayList<>();
private final Loadable loadable;
private final RequestQueue volleyRequestQueue;
private ChanThread thread;
private ChanReaderRequest request;
@ -62,11 +67,11 @@ public class ChanLoader implements Response.ErrorListener, Response.Listener<Cha
public ChanLoader(Loadable loadable) {
this.loadable = loadable;
getGraph().inject(this);
if (loadable.mode == Loadable.Mode.BOARD) {
loadable.mode = Loadable.Mode.CATALOG;
}
volleyRequestQueue = Chan.getVolleyRequestQueue();
}
/**

@ -2,7 +2,10 @@ package org.floens.chan.core.di;
import android.content.Context;
import org.floens.chan.core.UserAgentProvider;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import org.floens.chan.core.net.BitmapLruImageCache;
import javax.inject.Singleton;
@ -30,4 +33,12 @@ public class AppModule {
public UserAgentProvider provideUserAgentProvider() {
return userAgentProvider;
}
@Provides
@Singleton
public ImageLoader provideImageLoader(RequestQueue requestQueue) {
final int runtimeMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int lruImageCacheSize = runtimeMemory / 8;
return new ImageLoader(requestQueue, new BitmapLruImageCache(lruImageCacheSize));
}
}

@ -1,22 +1,65 @@
package org.floens.chan.core.di;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import org.floens.chan.Chan;
import org.floens.chan.chan.ChanLoader;
import org.floens.chan.chan.ChanParser;
import org.floens.chan.core.cache.FileCache;
import org.floens.chan.core.database.DatabaseManager;
import org.floens.chan.core.http.ReplyManager;
import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.manager.FilterEngine;
import org.floens.chan.core.net.ChanReaderRequest;
import org.floens.chan.core.presenter.ImageViewerPresenter;
import org.floens.chan.core.presenter.ReplyPresenter;
import org.floens.chan.core.presenter.ThreadPresenter;
import org.floens.chan.core.receiver.WatchUpdateReceiver;
import org.floens.chan.core.saver.ImageSaveTask;
import org.floens.chan.ui.activity.StartActivity;
import org.floens.chan.ui.adapter.DrawerAdapter;
import org.floens.chan.ui.adapter.PostsFilter;
import org.floens.chan.ui.controller.BoardEditController;
import org.floens.chan.ui.controller.BrowseController;
import org.floens.chan.ui.controller.DeveloperSettingsController;
import org.floens.chan.ui.controller.DrawerController;
import org.floens.chan.ui.controller.FiltersController;
import org.floens.chan.ui.controller.HistoryController;
import org.floens.chan.ui.controller.ImageViewerController;
import org.floens.chan.ui.controller.MainSettingsController;
import org.floens.chan.ui.controller.PassSettingsController;
import org.floens.chan.ui.controller.ViewThreadController;
import org.floens.chan.ui.helper.ImagePickDelegate;
import org.floens.chan.ui.layout.FilterLayout;
import org.floens.chan.ui.layout.ThreadLayout;
import org.floens.chan.ui.service.WatchNotifier;
import org.floens.chan.ui.view.MultiImageView;
import javax.inject.Singleton;
import dagger.Component;
@Component(modules = {
AppModule.class
AppModule.class,
NetModule.class
})
@Singleton
public interface ChanGraph {
ChanParser getChanParser();
BoardManager getBoardManager();
DatabaseManager getDatabaseManager();
ReplyManager getReplyManager();
RequestQueue getRequestQueue();
ImageLoader getImageLoader();
FileCache getFileCache();
void inject(Chan chan);
void inject(MainSettingsController mainSettingsController);
@ -29,5 +72,45 @@ public interface ChanGraph {
void inject(DeveloperSettingsController developerSettingsController);
ChanParser getChanParser();
void inject(StartActivity startActivity);
void inject(ThreadPresenter threadPresenter);
void inject(BoardEditController boardEditController);
void inject(FilterEngine filterEngine);
void inject(BrowseController browseController);
void inject(FilterLayout filterLayout);
void inject(HistoryController historyController);
void inject(DrawerController drawerController);
void inject(DrawerAdapter drawerAdapter);
void inject(WatchNotifier watchNotifier);
void inject(WatchUpdateReceiver watchUpdateReceiver);
void inject(ImagePickDelegate imagePickDelegate);
void inject(PassSettingsController passSettingsController);
void inject(FiltersController filtersController);
void inject(PostsFilter postsFilter);
void inject(ChanLoader chanLoader);
void inject(ImageViewerController imageViewerController);
void inject(ImageViewerPresenter imageViewerPresenter);
void inject(MultiImageView multiImageView);
void inject(ImageSaveTask imageSaveTask);
void inject(ViewThreadController viewThreadController);
}

@ -0,0 +1,45 @@
package org.floens.chan.core.di;
import android.content.Context;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
import org.floens.chan.core.cache.FileCache;
import org.floens.chan.core.net.ProxiedHurlStack;
import java.io.File;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
@Module
public class NetModule {
private static final int VOLLEY_CACHE_SIZE = 10 * 1024 * 1024;
private static final long FILE_CACHE_DISK_SIZE = 50 * 1024 * 1024;
private static final String FILE_CACHE_NAME = "filecache";
@Provides
@Singleton
public RequestQueue provideRequestQueue(Context applicationContext, UserAgentProvider userAgentProvider) {
File cacheDir = getCacheDir(applicationContext);
String userAgent = userAgentProvider.getUserAgent();
return Volley.newRequestQueue(applicationContext,
userAgent,
new ProxiedHurlStack(userAgent),
new File(cacheDir, Volley.DEFAULT_CACHE_DIR), VOLLEY_CACHE_SIZE);
}
@Provides
@Singleton
public FileCache provideFileCache(Context applicationContext, UserAgentProvider userAgentProvider) {
return new FileCache(new File(getCacheDir(applicationContext), FILE_CACHE_NAME), FILE_CACHE_DISK_SIZE, userAgentProvider.getUserAgent());
}
private File getCacheDir(Context applicationContext) {
return applicationContext.getExternalCacheDir() != null ? applicationContext.getExternalCacheDir() : applicationContext.getCacheDir();
}
}

@ -1,4 +1,4 @@
package org.floens.chan.core;
package org.floens.chan.core.di;
public interface UserAgentProvider {
String getUserAgent();

@ -19,7 +19,7 @@ package org.floens.chan.core.http;
import android.content.Context;
import org.floens.chan.core.UserAgentProvider;
import org.floens.chan.core.di.UserAgentProvider;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Reply;

@ -36,6 +36,10 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
public class FilterEngine {
private static final String TAG = "FilterEngine";
@ -71,14 +75,19 @@ public class FilterEngine {
private final Map<String, Pattern> patternCache = new HashMap<>();
private final DatabaseManager databaseManager;
@Inject
DatabaseManager databaseManager;
@Inject
BoardManager boardManager;
private final DatabaseFilterManager databaseFilterManager;
private List<Filter> filters;
private final List<Filter> enabledFilters = new ArrayList<>();
private FilterEngine() {
databaseManager = Chan.getDatabaseManager();
getGraph().inject(this);
databaseFilterManager = databaseManager.getDatabaseFilterManager();
update();
}
@ -222,11 +231,11 @@ public class FilterEngine {
public List<Board> getBoardsForFilter(Filter filter) {
if (filter.allBoards) {
return Chan.getBoardManager().getSavedBoards();
return boardManager.getSavedBoards();
} else if (!TextUtils.isEmpty(filter.boards)) {
List<Board> appliedBoards = new ArrayList<>();
for (String value : filter.boards.split(",")) {
Board boardByValue = Chan.getBoardManager().getBoardByCode(value);
Board boardByValue = boardManager.getBoardByCode(value);
if (boardByValue != null) {
appliedBoards.add(boardByValue);
}

@ -291,6 +291,14 @@ public class WatchManager {
}
}
public void onEvent(ChanSettings.SettingChanged<Boolean> settingChanged) {
if (settingChanged.setting == ChanSettings.watchBackground) {
onBackgroundWatchingChanged(ChanSettings.watchBackground.get());
} else if (settingChanged.setting == ChanSettings.watchEnabled) {
onWatchEnabledChanged(ChanSettings.watchEnabled.get());
}
}
// Called when the broadcast scheduled by the alarmmanager was received
public void onBroadcastReceived() {
if (currentInterval != IntervalType.BACKGROUND) {
@ -366,8 +374,12 @@ public class WatchManager {
}
}
public PinWatcher getPinWatcher(Pin pin) {
return pinWatchers.get(pin);
}
// Called when the user changes the watch enabled preference
public void onWatchEnabledChanged(boolean watchEnabled) {
private void onWatchEnabledChanged(boolean watchEnabled) {
updateState(watchEnabled, isBackgroundWatchingSettingEnabled());
List<Pin> pins = getAllPins();
for (int i = 0; i < pins.size(); i++) {
@ -377,7 +389,7 @@ public class WatchManager {
}
// Called when the user changes the watch background enabled preference
public void onBackgroundWatchingChanged(boolean backgroundEnabled) {
private void onBackgroundWatchingChanged(boolean backgroundEnabled) {
updateState(isTimerEnabled(), backgroundEnabled);
List<Pin> pins = getAllPins();
for (int i = 0; i < pins.size(); i++) {
@ -386,10 +398,6 @@ public class WatchManager {
}
}
public PinWatcher getPinWatcher(Pin pin) {
return pinWatchers.get(pin);
}
private void applyOrder() {
Collections.sort(pins, SORT_PINS);
for (int i = 0; i < pins.size(); i++) {

@ -40,6 +40,8 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
/**
@ -52,13 +54,14 @@ public class ChanReaderRequest extends JsonReaderRequest<ChanReaderRequest.ChanR
private static final boolean LOG_TIMING = false;
private static final int THREAD_COUNT;
private static ExecutorService EXECUTOR;
private static final ExecutorService EXECUTOR;
static {
THREAD_COUNT = Runtime.getRuntime().availableProcessors();
EXECUTOR = Executors.newFixedThreadPool(THREAD_COUNT);
}
@Inject
DatabaseManager databaseManager;
private Loadable loadable;

@ -20,7 +20,7 @@ package org.floens.chan.core.presenter;
import android.net.ConnectivityManager;
import android.support.v4.view.ViewPager;
import org.floens.chan.Chan;
import org.floens.chan.core.cache.FileCache;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.PostImage;
import org.floens.chan.core.settings.ChanSettings;
@ -29,6 +29,9 @@ import org.floens.chan.ui.view.MultiImageView;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.utils.AndroidUtils.isConnected;
public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager.OnPageChangeListener {
@ -36,6 +39,9 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager.
private final Callback callback;
@Inject
FileCache fileCache;
private boolean entering = true;
private boolean exiting = false;
private List<PostImage> images;
@ -49,6 +55,7 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager.
public ImageViewerPresenter(Callback callback) {
this.callback = callback;
getGraph().inject(this);
}
public void showImages(List<PostImage> images, int position, Loadable loadable) {
@ -264,7 +271,7 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager.
private boolean imageAutoLoad(PostImage postImage) {
// Auto load the image when it is cached
return Chan.getFileCache().exists(postImage.imageUrl) || shouldLoadForNetworkType(ChanSettings.imageAutoLoadNetwork.get());
return fileCache.exists(postImage.imageUrl) || shouldLoadForNetworkType(ChanSettings.imageAutoLoadNetwork.get());
}
private boolean videoAutoLoad(PostImage postImage) {

@ -54,6 +54,9 @@ import org.floens.chan.utils.AndroidUtils;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.utils.AndroidUtils.getString;
public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapter.PostAdapterCallback, PostCellInterface.PostCellCallback, ThreadStatusCell.Callback, ThreadListLayout.ThreadListLayoutPresenterCallback {
@ -73,10 +76,14 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
private static final int POST_OPTION_OPEN_BROWSER = 13;
private static final int POST_OPTION_FILTER_TRIPCODE = 14;
private WatchManager watchManager;
private DatabaseManager databaseManager;
private ReplyManager replyManager;
private BoardManager boardManager;
@Inject
WatchManager watchManager;
@Inject
DatabaseManager databaseManager;
@Inject
ReplyManager replyManager;
private ThreadPresenterCallback threadPresenterCallback;
@ -90,10 +97,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
public ThreadPresenter(ThreadPresenterCallback threadPresenterCallback) {
this.threadPresenterCallback = threadPresenterCallback;
watchManager = Chan.getWatchManager();
databaseManager = Chan.getDatabaseManager();
replyManager = Chan.getReplyManager();
boardManager = Chan.getBoardManager();
getGraph().inject(this);
}
public void bindLoadable(Loadable loadable) {

@ -25,13 +25,18 @@ import org.floens.chan.Chan;
import org.floens.chan.core.manager.WatchManager;
import org.floens.chan.utils.Logger;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
public class WatchUpdateReceiver extends BroadcastReceiver {
private static final String TAG = "WatchUpdateReceiver";
private final WatchManager watchManager;
@Inject
WatchManager watchManager;
public WatchUpdateReceiver() {
watchManager = Chan.getWatchManager();
getGraph().inject(this);
}
@Override

@ -22,7 +22,6 @@ import android.graphics.Bitmap;
import android.media.MediaScannerConnection;
import android.net.Uri;
import org.floens.chan.Chan;
import org.floens.chan.core.cache.FileCache;
import org.floens.chan.core.model.PostImage;
import org.floens.chan.utils.AndroidUtils;
@ -37,12 +36,18 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.utils.AndroidUtils.dp;
import static org.floens.chan.utils.AndroidUtils.getAppContext;
public class ImageSaveTask implements Runnable, FileCache.DownloadedCallback {
private static final String TAG = "ImageSaveTask";
@Inject
FileCache fileCache;
private PostImage postImage;
private ImageSaveTaskCallback callback;
private File destination;
@ -54,6 +59,11 @@ public class ImageSaveTask implements Runnable, FileCache.DownloadedCallback {
private boolean success = false;
public ImageSaveTask(PostImage postImage) {
getGraph().inject(this);
this.postImage = postImage;
}
public void setSubFolder(String boardName) {
this.subFolder = boardName;
}
@ -62,10 +72,6 @@ public class ImageSaveTask implements Runnable, FileCache.DownloadedCallback {
return subFolder;
}
public ImageSaveTask(PostImage postImage) {
this.postImage = postImage;
}
public void setCallback(ImageSaveTaskCallback callback) {
this.callback = callback;
}
@ -112,7 +118,7 @@ public class ImageSaveTask implements Runnable, FileCache.DownloadedCallback {
if (destination.exists()) {
onDestination();
} else {
FileCache.FileCacheDownloader fileCacheDownloader = Chan.getFileCache().downloadFile(postImage.imageUrl, this);
FileCache.FileCacheDownloader fileCacheDownloader = fileCache.downloadFile(postImage.imageUrl, this);
// If the fileCacheDownloader is null then the destination already existed and onSuccess() has been called.
// Wait otherwise for the download to finish to avoid that the next task is immediately executed.
if (fileCacheDownloader != null) {

@ -21,7 +21,6 @@ import android.content.SharedPreferences;
import android.os.Environment;
import android.text.TextUtils;
import org.floens.chan.Chan;
import org.floens.chan.R;
import org.floens.chan.core.manager.WatchManager;
import org.floens.chan.ui.adapter.PostsFilter;
@ -235,7 +234,7 @@ public class ChanSettings {
watchEnabled.addCallback(new Setting.SettingCallback<Boolean>() {
@Override
public void onValueChange(Setting setting, Boolean value) {
Chan.getWatchManager().onWatchEnabledChanged(value);
EventBus.getDefault().post(new SettingChanged<>(watchEnabled));
}
});
watchCountdown = new BooleanSetting(p, "preference_watch_countdown", false);
@ -243,7 +242,7 @@ public class ChanSettings {
watchBackground.addCallback(new Setting.SettingCallback<Boolean>() {
@Override
public void onValueChange(Setting setting, Boolean value) {
Chan.getWatchManager().onBackgroundWatchingChanged(value);
EventBus.getDefault().post(new SettingChanged<>(watchBackground));
}
});
watchBackgroundInterval = new IntegerSetting(p, "preference_watch_background_interval", WatchManager.DEFAULT_BACKGROUND_INTERVAL);

@ -3,7 +3,6 @@ package org.floens.chan.core.site.sites.chan4;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import org.floens.chan.Chan;
import org.floens.chan.core.model.Board;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
@ -18,6 +17,8 @@ import java.util.List;
import java.util.Locale;
import java.util.Random;
import static org.floens.chan.Chan.getGraph;
public class Chan4 implements Site {
private static final String TAG = "Chan4";
@ -124,7 +125,7 @@ public class Chan4 implements Site {
@Override
public Board board(String name) {
List<Board> allBoards = Chan.getBoardManager().getAllBoards();
List<Board> allBoards = getGraph().getBoardManager().getAllBoards();
for (Board board : allBoards) {
if (board.code.equals(name)) {
return board;
@ -141,7 +142,7 @@ public class Chan4 implements Site {
@Override
public void boards(final BoardsListener listener) {
Chan.getVolleyRequestQueue().add(new Chan4BoardsRequest(this, new Response.Listener<List<Board>>() {
getGraph().getRequestQueue().add(new Chan4BoardsRequest(this, new Response.Listener<List<Board>>() {
@Override
public void onResponse(List<Board> response) {
listener.onBoardsReceived(new Boards(response));

@ -38,7 +38,9 @@ import org.floens.chan.chan.ChanHelper;
import org.floens.chan.controller.Controller;
import org.floens.chan.controller.NavigationController;
import org.floens.chan.core.database.DatabaseLoadableManager;
import org.floens.chan.core.database.DatabaseManager;
import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.manager.WatchManager;
import org.floens.chan.core.model.Board;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin;
@ -61,6 +63,10 @@ import org.floens.chan.utils.Logger;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
public class StartActivity extends AppCompatActivity implements NfcAdapter.CreateNdefMessageCallback {
private static final String TAG = "StartActivity";
@ -69,7 +75,6 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat
private ViewGroup contentView;
private List<Controller> stack = new ArrayList<>();
private final BoardManager boardManager;
private DrawerController drawerController;
private NavigationController mainNavigationController;
private BrowseController browseController;
@ -77,13 +82,19 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat
private ImagePickDelegate imagePickDelegate;
private RuntimePermissionsHelper runtimePermissionsHelper;
public StartActivity() {
boardManager = Chan.getBoardManager();
}
@Inject
DatabaseManager databaseManager;
@Inject
BoardManager boardManager;
@Inject
WatchManager watchManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getGraph().inject(this);
ThemeHelper.getInstance().setupContext(this);
@ -118,7 +129,7 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat
if (chanState == null) {
Logger.w(TAG, "savedInstanceState was not null, but no ChanState was found!");
} else {
DatabaseLoadableManager loadableManager = Chan.getDatabaseManager().getDatabaseLoadableManager();
DatabaseLoadableManager loadableManager = databaseManager.getDatabaseLoadableManager();
chanState.board = loadableManager.get(chanState.board);
chanState.thread = loadableManager.get(chanState.thread);
@ -220,7 +231,7 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat
if (pinId == -1) {
drawerController.onMenuClicked();
} else {
Pin pin = Chan.getWatchManager().findPinById(pinId);
Pin pin = watchManager.findPinById(pinId);
if (pin != null) {
browseController.showThread(pin.loadable, false);
}

@ -41,6 +41,9 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.ui.theme.ThemeHelper.theme;
import static org.floens.chan.utils.AndroidUtils.ROBOTO_MEDIUM;
import static org.floens.chan.utils.AndroidUtils.dp;
@ -68,13 +71,15 @@ public class DrawerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
}
};
private final WatchManager watchManager;
@Inject
WatchManager watchManager;
private final Callback callback;
private List<Pin> pins = new ArrayList<>();
private Pin highlighted;
public DrawerAdapter(Callback callback) {
watchManager = Chan.getWatchManager();
getGraph().inject(this);
this.callback = callback;
setHasStableIds(true);
}

@ -30,6 +30,10 @@ import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
public class PostsFilter {
public static final Comparator<Post> IMAGE_COMPARATOR = new Comparator<Post>() {
@Override
@ -59,7 +63,8 @@ public class PostsFilter {
}
};
private final DatabaseManager databaseManager;
@Inject
DatabaseManager databaseManager;
private Order order;
private String query;
@ -67,7 +72,7 @@ public class PostsFilter {
public PostsFilter(Order order, String query) {
this.order = order;
this.query = query;
databaseManager = Chan.getDatabaseManager();
getGraph().inject(this);
}
/**

@ -76,6 +76,7 @@ import java.util.ArrayList;
import java.util.List;
import static android.text.TextUtils.isEmpty;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.utils.AndroidUtils.ROBOTO_CONDENSED_REGULAR;
import static org.floens.chan.utils.AndroidUtils.dp;
import static org.floens.chan.utils.AndroidUtils.getString;
@ -673,7 +674,7 @@ public class PostCell extends LinearLayout implements PostCellInterface {
countryTextColor = theme.detailsColor;
countryTextSize = textSize;
countryIconRequest = Chan.getVolleyImageLoader().get(post.countryUrl, new ImageLoader.ImageListener() {
countryIconRequest = getGraph().getImageLoader().get(post.countryUrl, new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
if (response.getBitmap() != null) {

@ -122,7 +122,7 @@ public class ThreadStatusCell extends LinearLayout implements View.OnClickListen
Post op = chanThread.op;
Board board = Chan.getBoardManager().getBoardByCode(chanThread.loadable.boardCode);
Board board = op.board;
if (board != null) {
SpannableString replies = new SpannableString(op.replies + "R");
if (op.replies >= board.bumpLimit) {

@ -58,6 +58,9 @@ import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.ui.theme.ThemeHelper.theme;
import static org.floens.chan.utils.AndroidUtils.dp;
import static org.floens.chan.utils.AndroidUtils.fixSnackbarText;
@ -66,7 +69,8 @@ import static org.floens.chan.utils.AndroidUtils.getString;
public class BoardEditController extends Controller implements View.OnClickListener, ToolbarMenuItem.ToolbarMenuItemCallback {
private static final int OPTION_SORT_A_Z = 1;
private final BoardManager boardManager = Chan.getBoardManager();
@Inject
BoardManager boardManager;
private RecyclerView recyclerView;
private BoardEditAdapter adapter;
@ -82,6 +86,7 @@ public class BoardEditController extends Controller implements View.OnClickListe
@Override
public void onCreate() {
super.onCreate();
getGraph().inject(this);
navigationItem.setTitle(R.string.board_edit);
@ -239,7 +244,7 @@ public class BoardEditController extends Controller implements View.OnClickListe
}
// Normal add
List<Board> all = Chan.getBoardManager().getAllBoards();
List<Board> all = boardManager.getAllBoards();
for (Board board : all) {
if (board.code.equals(value)) {
board.saved = true;

@ -49,6 +49,9 @@ import org.floens.chan.utils.AndroidUtils;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.utils.AndroidUtils.getString;
public class BrowseController extends ThreadController implements ToolbarMenuItem.ToolbarMenuItemCallback, ThreadLayout.ThreadLayoutCallback, FloatingMenu.FloatingMenuCallback {
@ -60,7 +63,11 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
private static final int ORDER_ID = 105;
private static final int OPEN_BROWSER_ID = 106;
private final DatabaseManager databaseManager;
@Inject
DatabaseManager databaseManager;
@Inject
BoardManager boardManager;
private ChanSettings.PostViewMode postViewMode;
private PostsFilter.Order order;
@ -75,12 +82,12 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
public BrowseController(Context context) {
super(context);
databaseManager = Chan.getDatabaseManager();
}
@Override
public void onCreate() {
super.onCreate();
getGraph().inject(this);
postViewMode = ChanSettings.boardViewMode.get();
order = PostsFilter.Order.find(ChanSettings.boardOrder.get());
@ -303,7 +310,6 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
}
public void loadDefault() {
BoardManager boardManager = Chan.getBoardManager();
List<Board> savedBoards = boardManager.getSavedBoards();
if (!savedBoards.isEmpty()) {
loadBoard(savedBoards.get(0));
@ -334,7 +340,7 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
* board change event.
*/
private void loadBoards() {
List<Board> boards = Chan.getBoardManager().getSavedBoards();
List<Board> boards = boardManager.getSavedBoards();
if (boards.isEmpty()) {
if (waitingForBoardsDialog == null) {

@ -46,16 +46,17 @@ import org.floens.chan.utils.AndroidUtils;
import java.util.List;
import javax.inject.Inject;
import de.greenrobot.event.EventBus;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.ui.theme.ThemeHelper.theme;
import static org.floens.chan.utils.AndroidUtils.ROBOTO_MEDIUM;
import static org.floens.chan.utils.AndroidUtils.dp;
import static org.floens.chan.utils.AndroidUtils.fixSnackbarText;
public class DrawerController extends Controller implements DrawerAdapter.Callback, View.OnClickListener {
private WatchManager watchManager;
protected FrameLayout container;
protected DrawerLayout drawerLayout;
protected LinearLayout drawer;
@ -63,6 +64,9 @@ public class DrawerController extends Controller implements DrawerAdapter.Callba
protected LinearLayout settings;
protected DrawerAdapter drawerAdapter;
@Inject
WatchManager watchManager;
public DrawerController(Context context) {
super(context);
}
@ -70,8 +74,7 @@ public class DrawerController extends Controller implements DrawerAdapter.Callba
@Override
public void onCreate() {
super.onCreate();
watchManager = Chan.getWatchManager();
getGraph().inject(this);
EventBus.getDefault().register(this);
@ -207,7 +210,7 @@ public class DrawerController extends Controller implements DrawerAdapter.Callba
if (!TextUtils.isEmpty(value)) {
pin.loadable.title = value;
Chan.getWatchManager().updatePin(pin);
watchManager.updatePin(pin);
}
}
})

@ -47,8 +47,11 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import de.greenrobot.event.EventBus;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.ui.theme.ThemeHelper.theme;
import static org.floens.chan.utils.AndroidUtils.getAttrColor;
import static org.floens.chan.utils.AndroidUtils.getString;
@ -57,8 +60,11 @@ public class FiltersController extends Controller implements ToolbarMenuItem.Too
private static final int SEARCH_ID = 1;
private static final int CLEAR_ID = 101;
@Inject
DatabaseManager databaseManager;
private FilterEngine filterEngine;
private DatabaseManager databaseManager;
private RecyclerView recyclerView;
private FloatingActionButton add;
private FilterAdapter adapter;
@ -100,9 +106,9 @@ public class FiltersController extends Controller implements ToolbarMenuItem.Too
@Override
public void onCreate() {
super.onCreate();
getGraph().inject(this);
filterEngine = FilterEngine.getInstance();
databaseManager = Chan.getDatabaseManager();
navigationItem.setTitle(R.string.filters_screen);
navigationItem.menu = new ToolbarMenu(context);

@ -53,6 +53,9 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.ui.theme.ThemeHelper.theme;
import static org.floens.chan.utils.AndroidUtils.dp;
@ -61,10 +64,14 @@ public class HistoryController extends Controller implements CompoundButton.OnCh
private static final int CLEAR_ID = 101;
private static final int SAVED_REPLY_CLEAR_ID = 102;
private DatabaseManager databaseManager;
@Inject
DatabaseManager databaseManager;
@Inject
BoardManager boardManager;
private DatabaseHistoryManager databaseHistoryManager;
private DatabaseSavedReplyManager databaseSavedReplyManager;
private BoardManager boardManager;
private CrossfadeView crossfade;
private RecyclerView recyclerView;
@ -77,11 +84,10 @@ public class HistoryController extends Controller implements CompoundButton.OnCh
@Override
public void onCreate() {
super.onCreate();
getGraph().inject(this);
databaseManager = Chan.getDatabaseManager();
databaseHistoryManager = databaseManager.getDatabaseHistoryManager();
databaseSavedReplyManager = databaseManager.getDatabaseSavedReplyManager();
boardManager = Chan.getBoardManager();
navigationItem.setTitle(R.string.history_screen);
List<FloatingMenuItem> items = new ArrayList<>();
@ -105,18 +111,13 @@ public class HistoryController extends Controller implements CompoundButton.OnCh
adapter = new HistoryAdapter();
recyclerView.setAdapter(adapter);
adapter.load();
if (ChanSettings.historyOpenCounter.increase() == 1) {
HintPopup.show(context, historyEnabledSwitch, R.string.history_toggle_hint);
}
}
@Override
public void onShow() {
super.onShow();
adapter.load();
}
@Override
public void onMenuItemClicked(ToolbarMenuItem item) {
if ((Integer) item.getId() == SEARCH_ID) {

@ -45,7 +45,6 @@ import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.davemorrissey.labs.subscaleview.ImageViewState;
import org.floens.chan.Chan;
import org.floens.chan.R;
import org.floens.chan.chan.ImageSearch;
import org.floens.chan.controller.Controller;
@ -72,6 +71,9 @@ import org.floens.chan.utils.Logger;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.utils.AndroidUtils.dp;
import static org.floens.chan.utils.AndroidUtils.getString;
@ -87,6 +89,9 @@ public class ImageViewerController extends Controller implements ImageViewerPres
private static final int SEARCH_ID = 105;
private static final int SAVE_ALBUM = 106;
@Inject
ImageLoader imageLoader;
private int statusBarColorPrevious;
private AnimatorSet startAnimation;
private AnimatorSet endAnimation;
@ -104,6 +109,8 @@ public class ImageViewerController extends Controller implements ImageViewerPres
public ImageViewerController(Context context, Toolbar toolbar) {
super(context);
getGraph().inject(this);
this.toolbar = toolbar;
presenter = new ImageViewerPresenter(this);
@ -366,7 +373,7 @@ public class ImageViewerController extends Controller implements ImageViewerPres
}
});
Chan.getVolleyImageLoader().get(postImage.thumbnailUrl, new ImageLoader.ImageListener() {
imageLoader.get(postImage.thumbnailUrl, new ImageLoader.ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "onErrorResponse for preview in transition in ImageViewerController, cannot show correct transition bitmap");
@ -388,7 +395,7 @@ public class ImageViewerController extends Controller implements ImageViewerPres
return;
}
Chan.getVolleyImageLoader().get(postImage.thumbnailUrl, new ImageLoader.ImageListener() {
imageLoader.get(postImage.thumbnailUrl, new ImageLoader.ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "onErrorResponse for preview out transition in ImageViewerController, cannot show correct transition bitmap");

@ -87,6 +87,9 @@ public class MainSettingsController extends SettingsController implements Toolba
@Inject
DatabaseManager databaseManager;
@Inject
BoardManager boardManager;
public MainSettingsController(Context context) {
super(context);
}
@ -319,7 +322,7 @@ public class MainSettingsController extends SettingsController implements Toolba
browsing.add(new LinkSettingView(this, R.string.setting_clear_thread_hides, 0, new View.OnClickListener() {
@Override
public void onClick(View v) {
Chan.getDatabaseManager().clearAllThreadHides();
databaseManager.clearAllThreadHides();
Toast.makeText(context, R.string.setting_cleared_thread_hides, Toast.LENGTH_LONG).show();
EventBus.getDefault().post(new RefreshUIMessage("clearhides"));
}
@ -434,7 +437,7 @@ public class MainSettingsController extends SettingsController implements Toolba
}
private void updateBoardLinkDescription() {
List<Board> savedBoards = Chan.getBoardManager().getSavedBoards();
List<Board> savedBoards = boardManager.getSavedBoards();
boardEditorView.setDescription(context.getResources().getQuantityString(R.plurals.board, savedBoards.size(), savedBoards.size()));
}

@ -36,9 +36,15 @@ import org.floens.chan.ui.view.CrossfadeView;
import org.floens.chan.utils.AndroidUtils;
import org.floens.chan.utils.AnimationUtils;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.utils.AndroidUtils.getString;
public class PassSettingsController extends Controller implements View.OnClickListener, ReplyManager.HttpCallback<PassHttpCall> {
@Inject
ReplyManager replyManager;
private LinearLayout container;
private CrossfadeView crossfadeView;
private TextView errors;
@ -55,6 +61,7 @@ public class PassSettingsController extends Controller implements View.OnClickLi
@Override
public void onCreate() {
super.onCreate();
getGraph().inject(this);
navigationItem.setTitle(R.string.settings_screen_pass);
@ -163,7 +170,7 @@ public class PassSettingsController extends Controller implements View.OnClickLi
ChanSettings.passToken.set(inputToken.getText().toString());
ChanSettings.passPin.set(inputPin.getText().toString());
Chan.getReplyManager().makeHttpCall(new PassHttpCall(ChanSettings.passToken.get(), ChanSettings.passPin.get()), this);
replyManager.makeHttpCall(new PassHttpCall(ChanSettings.passToken.get(), ChanSettings.passPin.get()), this);
}
private void showError(String error) {

@ -22,7 +22,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import org.floens.chan.Chan;
import org.floens.chan.R;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.controller.Controller;
@ -42,6 +41,9 @@ import org.floens.chan.utils.AndroidUtils;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.utils.AndroidUtils.dp;
import static org.floens.chan.utils.AndroidUtils.getAttrColor;
@ -56,6 +58,9 @@ public class ViewThreadController extends ThreadController implements ThreadLayo
private static final int DOWN_ID = 107;
private static final int OPEN_BROWSER_ID = 108;
@Inject
WatchManager watchManager;
private ToolbarMenuItem pinItem;
private ToolbarMenuItem overflowItem;
private Loadable loadable;
@ -71,6 +76,7 @@ public class ViewThreadController extends ThreadController implements ThreadLayo
@Override
public void onCreate() {
super.onCreate();
getGraph().inject(this);
threadLayout.setPostViewMode(ChanSettings.PostViewMode.LIST);
@ -216,8 +222,7 @@ public class ViewThreadController extends ThreadController implements ThreadLayo
}
private void updateDrawerHighlighting(Loadable loadable) {
WatchManager wm = Chan.getWatchManager();
Pin pin = loadable == null ? null : wm.findPinByLoadable(loadable);
Pin pin = loadable == null ? null : watchManager.findPinByLoadable(loadable);
if (navigationController.parentController instanceof DrawerController) {
((DrawerController) navigationController.parentController).setPinHighlighted(pin);
@ -251,8 +256,7 @@ public class ViewThreadController extends ThreadController implements ThreadLayo
}
private void setPinIconState() {
WatchManager wm = Chan.getWatchManager();
setPinIconState(wm.findPinByLoadable(loadable) != null);
setPinIconState(watchManager.findPinByLoadable(loadable) != null);
}
private void setPinIconState(boolean pinned) {

@ -21,6 +21,7 @@ import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.provider.OpenableColumns;
@ -36,6 +37,9 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.utils.AndroidUtils.runOnUiThread;
public class ImagePickDelegate implements Runnable {
@ -45,7 +49,9 @@ public class ImagePickDelegate implements Runnable {
private static final long MAX_FILE_SIZE = 15 * 1024 * 1024;
private static final String DEFAULT_FILE_NAME = "file";
private ReplyManager replyManager;
@Inject
ReplyManager replyManager;
private Activity activity;
private ImagePickCallback callback;
@ -56,8 +62,7 @@ public class ImagePickDelegate implements Runnable {
public ImagePickDelegate(Activity activity) {
this.activity = activity;
replyManager = Chan.getReplyManager();
getGraph().inject(this);
}
public boolean pick(ImagePickCallback callback) {
@ -143,7 +148,13 @@ public class ImagePickDelegate implements Runnable {
} catch (IOException | SecurityException e) {
Logger.e(TAG, "Error copying file from the file descriptor", e);
} finally {
IOUtils.closeQuietly(fileDescriptor);
// FileDescriptor isn't closeable on API 15
if (fileDescriptor != null) {
try {
fileDescriptor.close();
} catch (IOException ignored) {
}
}
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}

@ -55,6 +55,9 @@ import org.floens.chan.ui.view.FloatingMenuItem;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.ui.theme.ThemeHelper.theme;
import static org.floens.chan.utils.AndroidUtils.dp;
import static org.floens.chan.utils.AndroidUtils.getAttrColor;
@ -73,7 +76,8 @@ public class FilterLayout extends LinearLayout implements View.OnClickListener {
private LinearLayout colorContainer;
private View colorPreview;
private BoardManager boardManager;
@Inject
BoardManager boardManager;
private FilterLayoutCallback callback;
private Filter filter;
@ -95,8 +99,7 @@ public class FilterLayout extends LinearLayout implements View.OnClickListener {
@Override
protected void onFinishInflate() {
super.onFinishInflate();
boardManager = Chan.getBoardManager();
getGraph().inject(this);
typeText = (TextView) findViewById(R.id.type);
boardsSelector = (TextView) findViewById(R.id.boards);

@ -41,6 +41,10 @@ import java.util.Comparator;
import java.util.List;
import java.util.regex.Pattern;
import javax.inject.Inject;
import static org.floens.chan.Chan.getGraph;
public class WatchNotifier extends Service {
private static final String TAG = "WatchNotifier";
private static final int NOTIFICATION_ID = 1;
@ -50,7 +54,9 @@ public class WatchNotifier extends Service {
private static final Pattern SHORTEN_NO_PATTERN = Pattern.compile(">>\\d+(?=\\d{3})(\\d{3})");
private NotificationManager nm;
private WatchManager wm;
@Inject
WatchManager watchManager;
@Override
public IBinder onBind(final Intent intent) {
@ -60,9 +66,9 @@ public class WatchNotifier extends Service {
@Override
public void onCreate() {
super.onCreate();
getGraph().inject(this);
nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
wm = Chan.getWatchManager();
startForeground(NOTIFICATION_ID, createNotification());
}
@ -89,7 +95,7 @@ public class WatchNotifier extends Service {
}
public void pausePins() {
wm.pauseAll();
watchManager.pauseAll();
}
private Notification createNotification() {
@ -105,8 +111,8 @@ public class WatchNotifier extends Service {
boolean sound = false;
boolean peek = false;
for (Pin pin : wm.getWatchingPins()) {
WatchManager.PinWatcher watcher = wm.getPinWatcher(pin);
for (Pin pin : watchManager.getWatchingPins()) {
WatchManager.PinWatcher watcher = watchManager.getPinWatcher(pin);
if (watcher == null || pin.isError) {
continue;
}

@ -36,7 +36,6 @@ import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageContainer;
import com.davemorrissey.labs.subscaleview.ImageSource;
import org.floens.chan.Chan;
import org.floens.chan.R;
import org.floens.chan.core.cache.FileCache;
import org.floens.chan.core.model.PostImage;
@ -47,9 +46,13 @@ import org.floens.chan.utils.Logger;
import java.io.File;
import java.io.IOException;
import javax.inject.Inject;
import pl.droidsonroids.gif.GifDrawable;
import pl.droidsonroids.gif.GifImageView;
import static org.floens.chan.Chan.getGraph;
public class MultiImageView extends FrameLayout implements View.OnClickListener {
public enum Mode {
UNLOADED, LOWRES, BIGIMAGE, GIF, MOVIE
@ -57,6 +60,12 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
private static final String TAG = "MultiImageView";
@Inject
FileCache fileCache;
@Inject
ImageLoader imageLoader;
private ImageView playView;
private PostImage postImage;
@ -89,6 +98,8 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
}
private void init() {
getGraph().inject(this);
setOnClickListener(this);
playView = new ImageView(getContext());
@ -176,7 +187,7 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
}
// Also use volley for the thumbnails
thumbnailRequest = Chan.getVolleyImageLoader().get(thumbnailUrl, new ImageLoader.ImageListener() {
thumbnailRequest = imageLoader.get(thumbnailUrl, new ImageLoader.ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
thumbnailRequest = null;
@ -214,7 +225,7 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
}
callback.showProgress(this, true);
bigImageRequest = Chan.getFileCache().downloadFile(imageUrl, new FileCache.DownloadedCallback() {
bigImageRequest = fileCache.downloadFile(imageUrl, new FileCache.DownloadedCallback() {
@Override
public void onProgress(long downloaded, long total, boolean done) {
callback.onProgress(MultiImageView.this, downloaded, total);
@ -256,7 +267,7 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
}
callback.showProgress(this, true);
gifRequest = Chan.getFileCache().downloadFile(gifUrl, new FileCache.DownloadedCallback() {
gifRequest = fileCache.downloadFile(gifUrl, new FileCache.DownloadedCallback() {
@Override
public void onProgress(long downloaded, long total, boolean done) {
callback.onProgress(MultiImageView.this, downloaded, total);
@ -320,7 +331,7 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
}
callback.showProgress(this, true);
videoRequest = Chan.getFileCache().downloadFile(videoUrl, new FileCache.DownloadedCallback() {
videoRequest = fileCache.downloadFile(videoUrl, new FileCache.DownloadedCallback() {
@Override
public void onProgress(long downloaded, long total, boolean done) {
callback.onProgress(MultiImageView.this, downloaded, total);

@ -40,9 +40,9 @@ import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import org.floens.chan.Chan;
import org.floens.chan.R;
import static org.floens.chan.Chan.getGraph;
import static org.floens.chan.utils.AndroidUtils.getString;
import static org.floens.chan.utils.AndroidUtils.sp;
@ -105,7 +105,7 @@ public class ThumbnailView extends View implements ImageLoader.ImageListener {
}
if (!TextUtils.isEmpty(url)) {
container = Chan.getVolleyImageLoader().get(url, this, width, height);
container = getGraph().getImageLoader().get(url, this, width, height);
}
}

@ -78,11 +78,11 @@ public class AndroidUtils {
}
public static Resources getRes() {
return Chan.con.getResources();
return Chan.getInstance().getResources();
}
public static Context getAppContext() {
return Chan.con;
return Chan.getInstance();
}
public static String getString(int res) {
@ -90,7 +90,7 @@ public class AndroidUtils {
}
public static SharedPreferences getPreferences() {
return PreferenceManager.getDefaultSharedPreferences(Chan.con);
return PreferenceManager.getDefaultSharedPreferences(Chan.getInstance());
}
/**

Loading…
Cancel
Save