From 6a6055ea985fcf6e8ad4d3c58f75aef2219850f1 Mon Sep 17 00:00:00 2001 From: Floens Date: Tue, 3 Jan 2017 12:43:03 +0100 Subject: [PATCH] Complete DI Don't reload history in onShow, fix possible crash for ImagePickDelegate. --- .../src/main/java/org/floens/chan/Chan.java | 73 ++-------------- .../java/org/floens/chan/chan/ChanHelper.java | 7 +- .../java/org/floens/chan/chan/ChanLoader.java | 13 ++- .../org/floens/chan/core/di/AppModule.java | 13 ++- .../org/floens/chan/core/di/ChanGraph.java | 87 ++++++++++++++++++- .../org/floens/chan/core/di/NetModule.java | 45 ++++++++++ .../chan/core/{ => di}/UserAgentProvider.java | 2 +- .../floens/chan/core/http/ReplyManager.java | 2 +- .../chan/core/manager/FilterEngine.java | 17 +++- .../chan/core/manager/WatchManager.java | 20 +++-- .../chan/core/net/ChanReaderRequest.java | 5 +- .../core/presenter/ImageViewerPresenter.java | 11 ++- .../chan/core/presenter/ThreadPresenter.java | 20 +++-- .../core/receiver/WatchUpdateReceiver.java | 9 +- .../floens/chan/core/saver/ImageSaveTask.java | 18 ++-- .../chan/core/settings/ChanSettings.java | 5 +- .../chan/core/site/sites/chan4/Chan4.java | 7 +- .../chan/ui/activity/StartActivity.java | 23 +++-- .../floens/chan/ui/adapter/DrawerAdapter.java | 9 +- .../floens/chan/ui/adapter/PostsFilter.java | 9 +- .../org/floens/chan/ui/cell/PostCell.java | 3 +- .../floens/chan/ui/cell/ThreadStatusCell.java | 2 +- .../ui/controller/BoardEditController.java | 9 +- .../chan/ui/controller/BrowseController.java | 14 ++- .../chan/ui/controller/DrawerController.java | 13 +-- .../chan/ui/controller/FiltersController.java | 10 ++- .../chan/ui/controller/HistoryController.java | 21 ++--- .../ui/controller/ImageViewerController.java | 13 ++- .../ui/controller/MainSettingsController.java | 7 +- .../ui/controller/PassSettingsController.java | 9 +- .../ui/controller/ViewThreadController.java | 14 +-- .../chan/ui/helper/ImagePickDelegate.java | 19 +++- .../floens/chan/ui/layout/FilterLayout.java | 9 +- .../floens/chan/ui/service/WatchNotifier.java | 16 ++-- .../floens/chan/ui/view/MultiImageView.java | 21 +++-- .../floens/chan/ui/view/ThumbnailView.java | 4 +- .../org/floens/chan/utils/AndroidUtils.java | 6 +- 37 files changed, 403 insertions(+), 182 deletions(-) create mode 100644 Clover/app/src/main/java/org/floens/chan/core/di/NetModule.java rename Clover/app/src/main/java/org/floens/chan/core/{ => di}/UserAgentProvider.java (67%) diff --git a/Clover/app/src/main/java/org/floens/chan/Chan.java b/Clover/app/src/main/java/org/floens/chan/Chan.java index 22121660..debd1a30 100644 --- a/Clover/app/src/main/java/org/floens/chan/Chan.java +++ b/Clover/app/src/main/java/org/floens/chan/Chan.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 diff --git a/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java b/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java index 974de6a5..f2c1e48e 100644 --- a/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java @@ -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)))) { diff --git a/Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java b/Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java index c4b406e4..f9da753a 100644 --- a/Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java +++ b/Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java @@ -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 { 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 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 patternCache = new HashMap<>(); - private final DatabaseManager databaseManager; + @Inject + DatabaseManager databaseManager; + + @Inject + BoardManager boardManager; + private final DatabaseFilterManager databaseFilterManager; private List filters; private final List enabledFilters = new ArrayList<>(); private FilterEngine() { - databaseManager = Chan.getDatabaseManager(); + getGraph().inject(this); databaseFilterManager = databaseManager.getDatabaseFilterManager(); update(); } @@ -222,11 +231,11 @@ public class FilterEngine { public List getBoardsForFilter(Filter filter) { if (filter.allBoards) { - return Chan.getBoardManager().getSavedBoards(); + return boardManager.getSavedBoards(); } else if (!TextUtils.isEmpty(filter.boards)) { List 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); } diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java index b9775d7c..bbc58705 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java @@ -291,6 +291,14 @@ public class WatchManager { } } + public void onEvent(ChanSettings.SettingChanged 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 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 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++) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java b/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java index 53e588f8..f43a41aa 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java +++ b/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java @@ -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 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 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) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java index 183e71be..6f8e9467 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java @@ -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) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/receiver/WatchUpdateReceiver.java b/Clover/app/src/main/java/org/floens/chan/core/receiver/WatchUpdateReceiver.java index 2bd775d7..ba5316d7 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/receiver/WatchUpdateReceiver.java +++ b/Clover/app/src/main/java/org/floens/chan/core/receiver/WatchUpdateReceiver.java @@ -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 diff --git a/Clover/app/src/main/java/org/floens/chan/core/saver/ImageSaveTask.java b/Clover/app/src/main/java/org/floens/chan/core/saver/ImageSaveTask.java index 9a2a23d5..f2b297aa 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/saver/ImageSaveTask.java +++ b/Clover/app/src/main/java/org/floens/chan/core/saver/ImageSaveTask.java @@ -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) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java b/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java index 3a417987..f7d42941 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java +++ b/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java @@ -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() { @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() { @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); diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java index 2eb436fb..0bdb6740 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java @@ -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 allBoards = Chan.getBoardManager().getAllBoards(); + List 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>() { + getGraph().getRequestQueue().add(new Chan4BoardsRequest(this, new Response.Listener>() { @Override public void onResponse(List response) { listener.onBoardsReceived(new Boards(response)); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java index d908cb4c..4a0bbfd1 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java @@ -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 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); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/DrawerAdapter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/DrawerAdapter.java index ba158934..fdf36ea1 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/DrawerAdapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/DrawerAdapter.java @@ -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 } }; - private final WatchManager watchManager; + @Inject + WatchManager watchManager; + private final Callback callback; private List pins = new ArrayList<>(); private Pin highlighted; public DrawerAdapter(Callback callback) { - watchManager = Chan.getWatchManager(); + getGraph().inject(this); this.callback = callback; setHasStableIds(true); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostsFilter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostsFilter.java index 63c6f639..c12f8bdc 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostsFilter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostsFilter.java @@ -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 IMAGE_COMPARATOR = new Comparator() { @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); } /** diff --git a/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java b/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java index f42f33a5..81f61643 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCell.java @@ -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) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/cell/ThreadStatusCell.java b/Clover/app/src/main/java/org/floens/chan/ui/cell/ThreadStatusCell.java index 64a34f2f..1d5398c2 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/cell/ThreadStatusCell.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/cell/ThreadStatusCell.java @@ -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) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardEditController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardEditController.java index 6fe03d98..723a7c62 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardEditController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardEditController.java @@ -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 all = Chan.getBoardManager().getAllBoards(); + List all = boardManager.getAllBoards(); for (Board board : all) { if (board.code.equals(value)) { board.saved = true; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java index 22a4143e..a60b5004 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java @@ -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 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 boards = Chan.getBoardManager().getSavedBoards(); + List boards = boardManager.getSavedBoards(); if (boards.isEmpty()) { if (waitingForBoardsDialog == null) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java index 2a873c58..09084468 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java @@ -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); } } }) diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/FiltersController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/FiltersController.java index f986c62b..0e9a2f12 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/FiltersController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/FiltersController.java @@ -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); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java index 6238e909..91c8170f 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java @@ -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 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) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java index 45e958dc..336a8dae 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java @@ -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"); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java index 61c0ce7d..2a19a5d3 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java @@ -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 savedBoards = Chan.getBoardManager().getSavedBoards(); + List savedBoards = boardManager.getSavedBoards(); boardEditorView.setDescription(context.getResources().getQuantityString(R.plurals.board, savedBoards.size(), savedBoards.size())); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/PassSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/PassSettingsController.java index ccae7dce..7ffbf7af 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/PassSettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/PassSettingsController.java @@ -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 { + @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) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java index 6d0228d6..b8d4a684 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java @@ -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) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/helper/ImagePickDelegate.java b/Clover/app/src/main/java/org/floens/chan/ui/helper/ImagePickDelegate.java index 0c994005..b266e78c 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/helper/ImagePickDelegate.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/helper/ImagePickDelegate.java @@ -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); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/FilterLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/FilterLayout.java index 3ef41d79..28da0bd3 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/FilterLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/FilterLayout.java @@ -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); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java b/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java index 571dca96..b95b424a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java @@ -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; } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/MultiImageView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/MultiImageView.java index b5642e65..9bea0ecc 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/MultiImageView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/MultiImageView.java @@ -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); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java index f123b1e4..d4a608f0 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailView.java @@ -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); } } diff --git a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java index ae49458f..1f00ff5d 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java @@ -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()); } /**