diff --git a/Clover/app/build.gradle b/Clover/app/build.gradle index 2919ac3d..e1b95926 100644 --- a/Clover/app/build.gradle +++ b/Clover/app/build.gradle @@ -137,6 +137,7 @@ dependencies { compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'de.greenrobot:eventbus:2.4.0' compile 'org.nibor.autolink:autolink:0.6.0' + compile 'com.google.code.gson:gson:2.8.1' // Yes that's dagger 1, "deprecated". // There's little wrong with it, except that it might be slow at runtime. @@ -145,5 +146,5 @@ dependencies { // compiling, so our builds become way slower, and I rather have faster builds. // Move to gradle 2 when incremental compiling supports annotation processors. compile 'com.squareup.dagger:dagger:1.2.5' - compile 'com.squareup.dagger:dagger-compiler:1.2.5' + provided 'com.squareup.dagger:dagger-compiler:1.2.5' } diff --git a/Clover/app/proguard.cfg b/Clover/app/proguard.cfg index 810d3043..8e89b91e 100644 --- a/Clover/app/proguard.cfg +++ b/Clover/app/proguard.cfg @@ -76,7 +76,9 @@ -keepclassmembers interface com.j256.** { *; } # Clover database models --keep class org.floens.chan.core.model.** { *; } +-keep class org.floens.chan.core.model.orm.** { *; } +# And JSON models +-keep class org.floens.chan.core.model.json.** { *; } # Required for the gif library -keep public class pl.droidsonroids.gif.GifIOException{(int);} @@ -106,3 +108,5 @@ # Some reflection is used on RecyclerView and SlidingPaneLayout -keep public class android.support.v7.widget.RecyclerView -keep public class android.support.v4.widget.SlidingPaneLayout + +-dontwarn dagger.internal.** 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 479b6967..20f9fb86 100644 --- a/Clover/app/src/main/java/org/floens/chan/Chan.java +++ b/Clover/app/src/main/java/org/floens/chan/Chan.java @@ -27,6 +27,7 @@ import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.di.AppModule; import org.floens.chan.core.di.NetModule; import org.floens.chan.core.di.UserAgentProvider; +import org.floens.chan.core.site.SiteManager; import org.floens.chan.utils.AndroidUtils; import org.floens.chan.utils.Logger; import org.floens.chan.utils.Time; @@ -49,6 +50,9 @@ public class Chan extends Application implements UserAgentProvider { protected ObjectGraph graph; + @Inject + SiteManager siteManager; + @Inject DatabaseManager databaseManager; @@ -78,6 +82,8 @@ public class Chan extends Application implements UserAgentProvider { graph.inject(this); + siteManager.initialize(); + 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 a43ce75a..716ac2c3 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,8 +21,8 @@ import android.net.Uri; import org.floens.chan.core.database.DatabaseLoadableManager; import org.floens.chan.core.database.DatabaseManager; -import org.floens.chan.core.model.Board; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Board; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.site.Site; import org.floens.chan.core.site.Sites; 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 fa2d520a..1ece12a0 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 @@ -25,7 +25,7 @@ import com.android.volley.VolleyError; import org.floens.chan.core.exception.ChanLoaderException; import org.floens.chan.core.model.ChanThread; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; import org.floens.chan.ui.helper.PostHelper; import org.floens.chan.utils.AndroidUtils; diff --git a/Clover/app/src/main/java/org/floens/chan/chan/ChanLoaderRequestParams.java b/Clover/app/src/main/java/org/floens/chan/chan/ChanLoaderRequestParams.java index e8d75b6d..0536bf1d 100644 --- a/Clover/app/src/main/java/org/floens/chan/chan/ChanLoaderRequestParams.java +++ b/Clover/app/src/main/java/org/floens/chan/chan/ChanLoaderRequestParams.java @@ -20,7 +20,7 @@ package org.floens.chan.chan; import com.android.volley.Response; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; import java.util.List; diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java index cdabe2e2..383ee3dd 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java @@ -1,6 +1,6 @@ package org.floens.chan.core.database; -import org.floens.chan.core.model.Board; +import org.floens.chan.core.model.orm.Board; import org.floens.chan.core.site.Site; import org.floens.chan.core.site.Sites; import org.floens.chan.utils.Logger; diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseFilterManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseFilterManager.java index cbff6e5a..93dbc6c8 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseFilterManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseFilterManager.java @@ -17,7 +17,7 @@ */ package org.floens.chan.core.database; -import org.floens.chan.core.model.Filter; +import org.floens.chan.core.model.orm.Filter; import java.util.List; import java.util.concurrent.Callable; diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHelper.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHelper.java index 84088905..ae4a7abf 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHelper.java @@ -25,14 +25,14 @@ import com.j256.ormlite.dao.Dao; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; -import org.floens.chan.core.model.Board; -import org.floens.chan.core.model.Filter; -import org.floens.chan.core.model.History; -import org.floens.chan.core.model.Loadable; -import org.floens.chan.core.model.Pin; -import org.floens.chan.core.model.SavedReply; -import org.floens.chan.core.model.SiteModel; -import org.floens.chan.core.model.ThreadHide; +import org.floens.chan.core.model.orm.Board; +import org.floens.chan.core.model.orm.Filter; +import org.floens.chan.core.model.orm.History; +import org.floens.chan.core.model.orm.Loadable; +import org.floens.chan.core.model.orm.Pin; +import org.floens.chan.core.model.orm.SavedReply; +import org.floens.chan.core.model.orm.SiteModel; +import org.floens.chan.core.model.orm.ThreadHide; import org.floens.chan.utils.Logger; import java.sql.SQLException; @@ -44,7 +44,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { private static final String TAG = "DatabaseHelper"; private static final String DATABASE_NAME = "ChanDB"; - private static final int DATABASE_VERSION = 22; + private static final int DATABASE_VERSION = 23; public Dao pinDao; public Dao loadableDao; @@ -70,8 +70,9 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { threadHideDao = getDao(ThreadHide.class); historyDao = getDao(History.class); filterDao = getDao(Filter.class); + siteDao = getDao(SiteModel.class); } catch (SQLException e) { - Logger.e(TAG, "Error creating Daos", e); + Logger.e(TAG, "Error creating dao's", e); } } @@ -85,6 +86,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { TableUtils.createTable(connectionSource, ThreadHide.class); TableUtils.createTable(connectionSource, History.class); TableUtils.createTable(connectionSource, Filter.class); + TableUtils.createTable(connectionSource, SiteModel.class); } catch (SQLException e) { Logger.e(TAG, "Error creating db", e); throw new RuntimeException(e); @@ -216,6 +218,14 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { Logger.e(TAG, "Error upgrading to version 22", e); } } + + if (oldVersion < 23) { + try { + siteDao.executeRawNoArgs("CREATE TABLE `site` (`configuration` VARCHAR , `id` INTEGER PRIMARY KEY AUTOINCREMENT , `userSettings` VARCHAR );"); + } catch (SQLException e) { + Logger.e(TAG, "Error upgrading to version 23", e); + } + } } public void reset() { diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHistoryManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHistoryManager.java index eb1e5aff..137877de 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHistoryManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHistoryManager.java @@ -20,7 +20,7 @@ package org.floens.chan.core.database; import com.j256.ormlite.stmt.QueryBuilder; import com.j256.ormlite.table.TableUtils; -import org.floens.chan.core.model.History; +import org.floens.chan.core.model.orm.History; import org.floens.chan.utils.Time; import java.util.List; diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseLoadableManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseLoadableManager.java index 17e91cbf..101f2856 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseLoadableManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseLoadableManager.java @@ -21,7 +21,7 @@ import android.util.Log; import com.j256.ormlite.stmt.QueryBuilder; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.site.Sites; import org.floens.chan.utils.Logger; import org.floens.chan.utils.Time; diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java index 3d9f0caf..9e4647a2 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java @@ -27,7 +27,7 @@ import com.j256.ormlite.table.TableUtils; import org.floens.chan.Chan; import org.floens.chan.core.model.Post; -import org.floens.chan.core.model.ThreadHide; +import org.floens.chan.core.model.orm.ThreadHide; import org.floens.chan.utils.Logger; import org.floens.chan.utils.Time; diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabasePinManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabasePinManager.java index 4eb288ec..1002a6ef 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabasePinManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabasePinManager.java @@ -17,7 +17,7 @@ */ package org.floens.chan.core.database; -import org.floens.chan.core.model.Pin; +import org.floens.chan.core.model.orm.Pin; import java.util.List; import java.util.concurrent.Callable; diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSavedReplyManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSavedReplyManager.java index 678efea8..54bad1f0 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSavedReplyManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSavedReplyManager.java @@ -22,7 +22,7 @@ import android.support.annotation.AnyThread; import com.j256.ormlite.stmt.QueryBuilder; import com.j256.ormlite.table.TableUtils; -import org.floens.chan.core.model.SavedReply; +import org.floens.chan.core.model.orm.SavedReply; import org.floens.chan.utils.Time; import java.util.ArrayList; diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSiteManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSiteManager.java index af688c40..d84f5e2c 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSiteManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSiteManager.java @@ -18,12 +18,59 @@ package org.floens.chan.core.database; +import org.floens.chan.core.model.orm.SiteModel; + +import java.util.List; +import java.util.concurrent.Callable; + public class DatabaseSiteManager { private DatabaseManager databaseManager; - private DatabaseHelper databaseHelper; + private DatabaseHelper helper; - public DatabaseSiteManager(DatabaseManager databaseManager, DatabaseHelper databaseHelper) { + public DatabaseSiteManager(DatabaseManager databaseManager, DatabaseHelper helper) { this.databaseManager = databaseManager; - this.databaseHelper = databaseHelper; + this.helper = helper; + } + + public Callable> getAll() { + return new Callable>() { + @Override + public List call() throws Exception { + return helper.siteDao.queryForAll(); + } + }; + } + + public Callable add(final SiteModel site) { + return new Callable() { + @Override + public SiteModel call() throws Exception { + helper.siteDao.create(site); + + return site; + } + }; + } + + public Callable update(final SiteModel site) { + return new Callable() { + @Override + public SiteModel call() throws Exception { + helper.siteDao.update(site); + + return site; + } + }; + } + + public Callable updateId(final SiteModel site, final int newId) { + return new Callable() { + @Override + public SiteModel call() throws Exception { + helper.siteDao.updateId(site, newId); + + return site; + } + }; } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/di/AppModule.java b/Clover/app/src/main/java/org/floens/chan/core/di/AppModule.java index 885985ca..0531c588 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/di/AppModule.java +++ b/Clover/app/src/main/java/org/floens/chan/core/di/AppModule.java @@ -13,7 +13,8 @@ import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.manager.FilterEngine; import org.floens.chan.core.manager.ReplyManager; -import org.floens.chan.core.manager.SiteManager; +import org.floens.chan.core.presenter.SetupPresenter; +import org.floens.chan.core.site.SiteManager; import org.floens.chan.core.manager.WatchManager; import org.floens.chan.core.net.BitmapLruImageCache; import org.floens.chan.core.presenter.ImageViewerPresenter; @@ -91,6 +92,7 @@ import dagger.Provides; WatchManager.PinWatcher.class, UpdateManager.class, SiteManager.class, + SetupPresenter.class, Chan4.class, }, diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java index 04279fb9..c0ed715c 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java @@ -18,7 +18,7 @@ package org.floens.chan.core.manager; import org.floens.chan.core.database.DatabaseManager; -import org.floens.chan.core.model.Board; +import org.floens.chan.core.model.orm.Board; import org.floens.chan.core.site.Boards; import org.floens.chan.core.site.Site; import org.floens.chan.core.site.Sites; diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java b/Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java index bd431547..f72f8deb 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java @@ -22,7 +22,7 @@ import android.text.TextUtils; import org.floens.chan.core.database.DatabaseFilterManager; import org.floens.chan.core.database.DatabaseManager; -import org.floens.chan.core.model.Filter; +import org.floens.chan.core.model.orm.Filter; import org.floens.chan.core.model.Post; import org.floens.chan.core.site.Sites; import org.floens.chan.utils.Logger; diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/ReplyManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/ReplyManager.java index 949fa7a8..94735ce8 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/ReplyManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/ReplyManager.java @@ -19,7 +19,7 @@ package org.floens.chan.core.manager; import android.content.Context; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.site.http.Reply; import java.io.File; 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 43ca7fb9..77a61458 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 @@ -32,8 +32,8 @@ import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.database.DatabasePinManager; import org.floens.chan.core.exception.ChanLoaderException; import org.floens.chan.core.model.ChanThread; -import org.floens.chan.core.model.Loadable; -import org.floens.chan.core.model.Pin; +import org.floens.chan.core.model.orm.Loadable; +import org.floens.chan.core.model.orm.Pin; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.pool.ChanLoaderFactory; diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/BoardReference.java b/Clover/app/src/main/java/org/floens/chan/core/model/BoardReference.java index f396331e..a3aadad6 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/BoardReference.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/BoardReference.java @@ -18,6 +18,8 @@ package org.floens.chan.core.model; +import org.floens.chan.core.model.orm.Board; + public interface BoardReference { /** * Get the Board object that this model references. diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/ChanThread.java b/Clover/app/src/main/java/org/floens/chan/core/model/ChanThread.java index 1faa77e8..134c2eda 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/ChanThread.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/ChanThread.java @@ -17,6 +17,8 @@ */ package org.floens.chan.core.model; +import org.floens.chan.core.model.orm.Loadable; + import java.util.List; public class ChanThread { diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Post.java b/Clover/app/src/main/java/org/floens/chan/core/model/Post.java index 944a2206..6ef00fcd 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Post.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Post.java @@ -19,6 +19,8 @@ package org.floens.chan.core.model; import android.support.annotation.MainThread; +import org.floens.chan.core.model.orm.Board; + import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/json/site/SiteConfig.java b/Clover/app/src/main/java/org/floens/chan/core/model/json/site/SiteConfig.java new file mode 100644 index 00000000..83db7402 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/model/json/site/SiteConfig.java @@ -0,0 +1,28 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.floens.chan.core.model.json.site; + +import com.google.gson.annotations.SerializedName; + +public class SiteConfig { + @SerializedName("external") + public boolean external; + + @SerializedName("internal_site_id") + public int classId; +} diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/SiteManager.java b/Clover/app/src/main/java/org/floens/chan/core/model/json/site/SiteUserSettings.java similarity index 80% rename from Clover/app/src/main/java/org/floens/chan/core/manager/SiteManager.java rename to Clover/app/src/main/java/org/floens/chan/core/model/json/site/SiteUserSettings.java index b7c5b7d9..45be61c6 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/SiteManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/json/site/SiteUserSettings.java @@ -15,15 +15,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core.manager; +package org.floens.chan.core.model.json.site; -import javax.inject.Inject; -import javax.inject.Singleton; - -@Singleton -public class SiteManager { - @Inject - public SiteManager() { - } +public class SiteUserSettings { } diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Board.java b/Clover/app/src/main/java/org/floens/chan/core/model/orm/Board.java similarity index 97% rename from Clover/app/src/main/java/org/floens/chan/core/model/Board.java rename to Clover/app/src/main/java/org/floens/chan/core/model/orm/Board.java index 2b14c3d5..21f8ac73 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Board.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/orm/Board.java @@ -15,16 +15,17 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core.model; +package org.floens.chan.core.model.orm; import android.text.TextUtils; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; +import org.floens.chan.core.model.SiteReference; import org.floens.chan.core.site.Site; -@DatabaseTable +@DatabaseTable(tableName = "board") public class Board implements SiteReference { public Board() { } diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Filter.java b/Clover/app/src/main/java/org/floens/chan/core/model/orm/Filter.java similarity index 96% rename from Clover/app/src/main/java/org/floens/chan/core/model/Filter.java rename to Clover/app/src/main/java/org/floens/chan/core/model/orm/Filter.java index fe3dc478..d7ffd3ee 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Filter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/orm/Filter.java @@ -15,14 +15,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core.model; +package org.floens.chan.core.model.orm; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; import org.floens.chan.core.manager.FilterType; -@DatabaseTable +@DatabaseTable(tableName = "filter") public class Filter { @DatabaseField(generatedId = true) public int id; diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/History.java b/Clover/app/src/main/java/org/floens/chan/core/model/orm/History.java similarity index 93% rename from Clover/app/src/main/java/org/floens/chan/core/model/History.java rename to Clover/app/src/main/java/org/floens/chan/core/model/orm/History.java index 54998f4c..ff5bf657 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/History.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/orm/History.java @@ -15,12 +15,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core.model; +package org.floens.chan.core.model.orm; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; -@DatabaseTable +@DatabaseTable(tableName = "history") public class History { @DatabaseField(generatedId = true) public int id; diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java b/Clover/app/src/main/java/org/floens/chan/core/model/orm/Loadable.java similarity index 97% rename from Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java rename to Clover/app/src/main/java/org/floens/chan/core/model/orm/Loadable.java index c7a749fa..15679d53 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/orm/Loadable.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core.model; +package org.floens.chan.core.model.orm; import android.os.Parcel; import android.text.TextUtils; @@ -23,6 +23,9 @@ import android.text.TextUtils; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; +import org.floens.chan.core.model.BoardReference; +import org.floens.chan.core.model.Post; +import org.floens.chan.core.model.SiteReference; import org.floens.chan.core.site.Site; /** @@ -34,7 +37,7 @@ import org.floens.chan.core.site.Site; *

Obtain Loadables through {@link org.floens.chan.core.database.DatabaseLoadableManager} to make sure everyone * references the same loadable and that the loadable is properly saved in the database. */ -@DatabaseTable +@DatabaseTable(tableName = "loadable") public class Loadable implements SiteReference, BoardReference { @DatabaseField(generatedId = true) public int id; diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java b/Clover/app/src/main/java/org/floens/chan/core/model/orm/Pin.java similarity index 97% rename from Clover/app/src/main/java/org/floens/chan/core/model/Pin.java rename to Clover/app/src/main/java/org/floens/chan/core/model/orm/Pin.java index 07c587ae..f8756f88 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/orm/Pin.java @@ -15,12 +15,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core.model; +package org.floens.chan.core.model.orm; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; -@DatabaseTable +@DatabaseTable(tableName = "pin") public class Pin { @DatabaseField(generatedId = true) public int id; diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/SavedReply.java b/Clover/app/src/main/java/org/floens/chan/core/model/orm/SavedReply.java similarity index 95% rename from Clover/app/src/main/java/org/floens/chan/core/model/SavedReply.java rename to Clover/app/src/main/java/org/floens/chan/core/model/orm/SavedReply.java index 60447c05..bd92bd89 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/SavedReply.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/orm/SavedReply.java @@ -15,12 +15,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core.model; +package org.floens.chan.core.model.orm; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; -@DatabaseTable +@DatabaseTable(tableName = "savedreply") public class SavedReply { public SavedReply() { } diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/SiteModel.java b/Clover/app/src/main/java/org/floens/chan/core/model/orm/SiteModel.java similarity index 76% rename from Clover/app/src/main/java/org/floens/chan/core/model/SiteModel.java rename to Clover/app/src/main/java/org/floens/chan/core/model/orm/SiteModel.java index bf08005f..230cc546 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/SiteModel.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/orm/SiteModel.java @@ -15,23 +15,22 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core.model; +package org.floens.chan.core.model.orm; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; -/** - * Only for storing what sites we know of, for hardcoded sites the sites we have enabled, - * and for dynamic sites all settings for it. - */ -@DatabaseTable +@DatabaseTable(tableName = "site") public class SiteModel { - @DatabaseField(id = true, unique = true) + @DatabaseField(generatedId = true, allowGeneratedIdInsert = true) public int id; @DatabaseField - public String name; + public String configuration; @DatabaseField - public String options; + public String userSettings; + + public SiteModel() { + } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/ThreadHide.java b/Clover/app/src/main/java/org/floens/chan/core/model/orm/ThreadHide.java similarity index 95% rename from Clover/app/src/main/java/org/floens/chan/core/model/ThreadHide.java rename to Clover/app/src/main/java/org/floens/chan/core/model/orm/ThreadHide.java index a88e74ba..a352ebd8 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/ThreadHide.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/orm/ThreadHide.java @@ -15,12 +15,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core.model; +package org.floens.chan.core.model.orm; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; -@DatabaseTable +@DatabaseTable(tableName = "threadhide") public class ThreadHide { @DatabaseField(generatedId = true) public int id; diff --git a/Clover/app/src/main/java/org/floens/chan/core/pool/ChanLoaderFactory.java b/Clover/app/src/main/java/org/floens/chan/core/pool/ChanLoaderFactory.java index 0a1de06a..0555e56b 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/pool/ChanLoaderFactory.java +++ b/Clover/app/src/main/java/org/floens/chan/core/pool/ChanLoaderFactory.java @@ -20,7 +20,7 @@ package org.floens.chan.core.pool; import android.util.LruCache; import org.floens.chan.chan.ChanLoader; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import java.util.HashMap; import java.util.Map; diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java index 1263f4f5..d0169b86 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java @@ -21,7 +21,7 @@ import android.net.ConnectivityManager; import android.support.v4.view.ViewPager; import org.floens.chan.core.cache.FileCache; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.view.MultiImageView; diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java index f9ab3d7c..7d819beb 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java @@ -25,11 +25,11 @@ import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.manager.ReplyManager; 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.orm.Board; import org.floens.chan.core.model.ChanThread; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; -import org.floens.chan.core.model.SavedReply; +import org.floens.chan.core.model.orm.SavedReply; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.core.site.Site; import org.floens.chan.core.site.SiteAuthentication; diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/SetupPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/SetupPresenter.java index bf69e257..ae8edb6d 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/SetupPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/SetupPresenter.java @@ -18,28 +18,35 @@ package org.floens.chan.core.presenter; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; +import org.floens.chan.core.site.Site; +import org.floens.chan.core.site.SiteManager; +import org.floens.chan.core.site.Sites; -import org.floens.chan.utils.AndroidUtils; - -import java.io.IOException; import java.util.ArrayList; import java.util.List; -import static org.floens.chan.utils.AndroidUtils.getAppContext; -import static org.floens.chan.utils.AndroidUtils.getRes; +import javax.inject.Inject; + +import static org.floens.chan.Chan.getGraph; public class SetupPresenter { + @Inject + SiteManager siteManager; + private Callback callback; - private List sites = new ArrayList<>(); + private List sites = new ArrayList<>(); + + @Inject + public SetupPresenter() { + getGraph().inject(this); + } public void create(Callback callback) { this.callback = callback; + sites.addAll(Sites.ALL_SITES); + this.callback.setAddedSites(sites); this.callback.setNextAllowed(!sites.isEmpty(), false); @@ -52,13 +59,17 @@ public class SetupPresenter { public void onUrlSubmitClicked(String url) { callback.goToUrlSubmittedState(); - AndroidUtils.runOnUiThread(new Runnable() { + siteManager.addSite(url, new SiteManager.SiteAddCallback() { + @Override + public void onSiteAdded(Site site) { + siteAdded(site); + } + @Override - public void run() { - siteAdded(getTestSite()); + public void onSiteAddFailed(String message) { + callback.showUrlHint(message); } - }, 500); -// callback.showUrlHint("foo bar baz"); + }); } public void onNextClicked() { @@ -67,8 +78,10 @@ public class SetupPresenter { } } - private void siteAdded(AddedSite site) { - sites.add(site); + private void siteAdded(Site site) { + sites.clear(); + sites.addAll(Sites.ALL_SITES); + callback.setAddedSites(sites); callback.runSiteAddedAnimation(site); @@ -77,33 +90,12 @@ public class SetupPresenter { private int counter; - private AddedSite getTestSite() { - AddedSite site = new AddedSite(); - site.id = counter++; - site.title = "4chan.org"; - - Bitmap bitmap; - try { - BitmapFactory.Options opts = new BitmapFactory.Options(); - opts.inScaled = false; - bitmap = BitmapFactory.decodeStream(getAppContext().getAssets().open("icons/4chan.png"), null, opts); - } catch (IOException e) { - throw new RuntimeException(e); - } - - BitmapDrawable drawable = new BitmapDrawable(getRes(), bitmap); - drawable = (BitmapDrawable) drawable.mutate(); - drawable.getPaint().setFilterBitmap(false); - site.drawable = drawable; - return site; - } - public interface Callback { void goToUrlSubmittedState(); - void runSiteAddedAnimation(AddedSite site); + void runSiteAddedAnimation(Site site); - void setAddedSites(List sites); + void setAddedSites(List sites); void setNextAllowed(boolean nextAllowed, boolean animate); @@ -111,10 +103,4 @@ public class SetupPresenter { void moveToSavedBoards(); } - - public static class AddedSite { - public int id; - public String title; - public Drawable drawable; - } } 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 07a8b8f9..7662f107 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 @@ -27,15 +27,15 @@ import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.exception.ChanLoaderException; import org.floens.chan.core.manager.ReplyManager; import org.floens.chan.core.manager.WatchManager; -import org.floens.chan.core.model.Board; +import org.floens.chan.core.model.orm.Board; import org.floens.chan.core.model.ChanThread; -import org.floens.chan.core.model.History; -import org.floens.chan.core.model.Loadable; -import org.floens.chan.core.model.Pin; +import org.floens.chan.core.model.orm.History; +import org.floens.chan.core.model.orm.Loadable; +import org.floens.chan.core.model.orm.Pin; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.model.PostLinkable; -import org.floens.chan.core.model.SavedReply; +import org.floens.chan.core.model.orm.SavedReply; import org.floens.chan.core.pool.ChanLoaderFactory; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.core.site.Site; diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/Boards.java b/Clover/app/src/main/java/org/floens/chan/core/site/Boards.java index 729fb12c..db0f1b02 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/Boards.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/Boards.java @@ -1,6 +1,6 @@ package org.floens.chan.core.site; -import org.floens.chan.core.model.Board; +import org.floens.chan.core.model.orm.Board; import java.util.List; diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/Resolvable.java b/Clover/app/src/main/java/org/floens/chan/core/site/Resolvable.java new file mode 100644 index 00000000..6fdf0554 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/site/Resolvable.java @@ -0,0 +1,14 @@ +package org.floens.chan.core.site; + + +public interface Resolvable { + enum ResolveResult { + NO, + NAME_MATCH, + FULL_MATCH + } + + ResolveResult resolve(String value); + + Class getSiteClass(); +} diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/Site.java b/Clover/app/src/main/java/org/floens/chan/core/site/Site.java index 71e73ccb..991bd7d3 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/Site.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/Site.java @@ -21,9 +21,11 @@ import android.support.annotation.Nullable; import org.floens.chan.chan.ChanLoaderRequest; import org.floens.chan.chan.ChanLoaderRequestParams; -import org.floens.chan.core.model.Board; -import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Post; +import org.floens.chan.core.model.json.site.SiteConfig; +import org.floens.chan.core.model.json.site.SiteUserSettings; +import org.floens.chan.core.model.orm.Board; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.site.http.DeleteRequest; import org.floens.chan.core.site.http.DeleteResponse; import org.floens.chan.core.site.http.HttpCall; @@ -101,9 +103,11 @@ public interface Site { INFINITE } + void initialize(int id, SiteConfig config, SiteUserSettings userSettings); + /** * Global positive (>0) integer that uniquely identifies this site.
- * This id will be persisted in the database. + * Use the id received from {@link #initialize(int, SiteConfig, SiteUserSettings)}. * * @return a positive (>0) integer that uniquely identifies this site. */ diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/SiteBase.java b/Clover/app/src/main/java/org/floens/chan/core/site/SiteBase.java new file mode 100644 index 00000000..a112d382 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/site/SiteBase.java @@ -0,0 +1,40 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.floens.chan.core.site; + + +import org.floens.chan.core.model.json.site.SiteConfig; +import org.floens.chan.core.model.json.site.SiteUserSettings; + +public abstract class SiteBase implements Site { + protected int id; + protected SiteConfig config; + protected SiteUserSettings userSettings; + + @Override + public void initialize(int id, SiteConfig config, SiteUserSettings userSettings) { + this.id = id; + this.config = config; + this.userSettings = userSettings; + } + + @Override + public int id() { + return id; + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/SiteEndpoints.java b/Clover/app/src/main/java/org/floens/chan/core/site/SiteEndpoints.java index ab199c95..64c58592 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/SiteEndpoints.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/SiteEndpoints.java @@ -17,8 +17,8 @@ */ package org.floens.chan.core.site; -import org.floens.chan.core.model.Board; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Board; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; import java.util.Map; diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java b/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java new file mode 100644 index 00000000..6cba35e4 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java @@ -0,0 +1,183 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.floens.chan.core.site; + + +import android.util.Pair; + +import com.google.gson.Gson; + +import org.floens.chan.core.database.DatabaseManager; +import org.floens.chan.core.model.json.site.SiteConfig; +import org.floens.chan.core.model.json.site.SiteUserSettings; +import org.floens.chan.core.model.orm.SiteModel; +import org.floens.chan.core.site.sites.chan4.Chan4; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class SiteManager { + @Inject + DatabaseManager databaseManager; + + private SiteResolver resolver; + + private Gson gson = new Gson(); + + @Inject + public SiteManager() { + resolver = new SiteResolver(); + } + + public void addSite(String url, SiteAddCallback callback) { + SiteResolver.SiteResolverResult resolve = resolver.resolve(url); + + Site site; + if (resolve.match == SiteResolver.SiteResolverResult.Match.BUILTIN) { + site = instantiateSiteClass(resolve.builtinResult); + } else if (resolve.match == SiteResolver.SiteResolverResult.Match.EXTERNAL) { + callback.onSiteAddFailed("external todo"); + return; + } else { + callback.onSiteAddFailed("not a url"); + return; + } + + site = createNewSite(site); + + List newAllSites = new ArrayList<>(Sites.ALL_SITES); + newAllSites.add(site); + Sites.initialize(newAllSites); + + callback.onSiteAdded(site); + } + + public void initialize() { + List sites = loadSitesFromDatabase(); + + if (sites.isEmpty()) { + Site site = new Chan4(); + + SiteConfig config = new SiteConfig(); + config.classId = Sites.SITE_CLASSES.indexOfValue(site.getClass()); + config.external = false; + + SiteUserSettings userSettings = new SiteUserSettings(); + + SiteModel siteModel = new SiteModel(); + storeConfigFields(siteModel, config, userSettings); + siteModel = databaseManager.runTaskSync(databaseManager.getDatabaseSiteManager().add(siteModel)); + databaseManager.runTaskSync(databaseManager.getDatabaseSiteManager().updateId(siteModel, 0)); + + sites.add(site); + } + + Sites.initialize(sites); + } + + private List loadSitesFromDatabase() { + List sites = new ArrayList<>(); + + List siteModels = databaseManager.runTaskSync(databaseManager.getDatabaseSiteManager().getAll()); + + for (SiteModel siteModel : siteModels) { + Pair configPair = loadConfigFields(siteModel); + SiteConfig config = configPair.first; + SiteUserSettings userSettings = configPair.second; + + Site site = loadSiteFromModel(siteModel, config, userSettings); + sites.add(site); + } + + return sites; + } + + private Site createNewSite(Site site) { + SiteConfig config = new SiteConfig(); + config.classId = Sites.SITE_CLASSES.indexOfValue(site.getClass()); + config.external = false; + + SiteUserSettings userSettings = new SiteUserSettings(); + + SiteModel siteModel = createNewSiteModel(site, config, userSettings); + + initializeSite(site, siteModel.id, config, userSettings); + + return site; + } + + private SiteModel createNewSiteModel(Site site, SiteConfig config, SiteUserSettings userSettings) { + SiteModel siteModel = new SiteModel(); + storeConfigFields(siteModel, config, userSettings); + siteModel = databaseManager.runTaskSync(databaseManager.getDatabaseSiteManager().add(siteModel)); + return siteModel; + } + + private void storeConfigFields(SiteModel siteModel, SiteConfig config, SiteUserSettings userSettings) { + siteModel.configuration = gson.toJson(config); + siteModel.userSettings = gson.toJson(userSettings); + } + + private Pair loadConfigFields(SiteModel siteModel) { + SiteConfig config = gson.fromJson(siteModel.configuration, SiteConfig.class); + SiteUserSettings userSettings = gson.fromJson(siteModel.userSettings, SiteUserSettings.class); + return Pair.create(config, userSettings); + } + + private Site loadSiteFromModel(SiteModel model, SiteConfig config, SiteUserSettings userSettings) { + Site site = instantiateSiteFromConfig(config); + return initializeSite(site, model.id, config, userSettings); + } + + private Site initializeSite(Site site, int id, SiteConfig config, SiteUserSettings userSettings) { + site.initialize(id, config, userSettings); + return site; + } + + private Site instantiateSiteFromConfig(SiteConfig siteConfig) { + int siteClassId = siteConfig.classId; + Class clazz = Sites.SITE_CLASSES.get(siteClassId); + if (clazz == null) { + throw new IllegalArgumentException(); + } + return instantiateSiteClass(clazz); + } + + private Site instantiateSiteClass(Class clazz) { + Site site; + //noinspection TryWithIdenticalCatches + try { + site = clazz.newInstance(); + } catch (InstantiationException e) { + throw new IllegalArgumentException(); + } catch (IllegalAccessException e) { + throw new IllegalArgumentException(); + } + return site; + } + + public interface SiteAddCallback { + void onSiteAdded(Site site); + + void onSiteAddFailed(String message); + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java b/Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java new file mode 100644 index 00000000..c7587434 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java @@ -0,0 +1,81 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.floens.chan.core.site; + + +import java.util.List; + +import okhttp3.HttpUrl; + +class SiteResolver { + SiteResolverResult resolve(String url) { + List resolvables = Sites.RESOLVABLES; + + HttpUrl httpUrl = HttpUrl.parse(url); + + if (httpUrl == null) { + httpUrl = HttpUrl.parse("https://" + url); + } + + if (httpUrl != null) { + if (httpUrl.host().indexOf('.') < 0) { + httpUrl = null; + } + } + + if (httpUrl == null) { + for (Resolvable resolvable : resolvables) { + if (resolvable.resolve(url) == Resolvable.ResolveResult.NAME_MATCH) { + return new SiteResolverResult(SiteResolverResult.Match.BUILTIN, resolvable.getSiteClass(), null); + } + } + + return new SiteResolverResult(SiteResolverResult.Match.NONE, null, null); + } + + if (!httpUrl.scheme().equals("https")) { + httpUrl = httpUrl.newBuilder().scheme("https").build(); + } + + for (Resolvable resolvable : resolvables) { + if (resolvable.resolve(httpUrl.toString()) == Resolvable.ResolveResult.FULL_MATCH) { + return new SiteResolverResult(SiteResolverResult.Match.BUILTIN, resolvable.getSiteClass(), null); + } + } + + return new SiteResolverResult(SiteResolverResult.Match.EXTERNAL, null, httpUrl); + } + + static class SiteResolverResult { + enum Match { + NONE, + BUILTIN, + EXTERNAL + } + + Match match; + Class builtinResult; + HttpUrl externalResult; + + public SiteResolverResult(Match match, Class builtinResult, HttpUrl externalResult) { + this.match = match; + this.builtinResult = builtinResult; + this.externalResult = externalResult; + } + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/Sites.java b/Clover/app/src/main/java/org/floens/chan/core/site/Sites.java index d3ee243d..b816b908 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/Sites.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/Sites.java @@ -1,44 +1,52 @@ package org.floens.chan.core.site; -import android.content.SharedPreferences; +import android.util.SparseArray; import org.floens.chan.core.site.sites.chan4.Chan4; -import org.floens.chan.utils.AndroidUtils; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; public class Sites { - public static final Chan4 CHAN4 = new Chan4(); + public static final SparseArray> SITE_CLASSES = new SparseArray<>(); - public static final List ALL_SITES = Arrays.asList( - CHAN4 - ); + static { + // This id-siteclass mapping is used to look up the correct site class at deserialization. + // This differs from the Site.id() id, that id is used for site instance linking, this is just to + // find the correct class to use. + SITE_CLASSES.put(0, Chan4.class); + } - private static final Site[] BY_ID; + public static final List RESOLVABLES = new ArrayList<>(); static { - int highestId = 0; + RESOLVABLES.add(Chan4.RESOLVABLE); + } + + public static final List ALL_SITES = new ArrayList<>(); + + @Deprecated + private static Site defaultSite; + + public static Site forId(int id) { + // TODO: better datastructure for (Site site : ALL_SITES) { - if (site.id() > highestId) { - highestId = site.id(); + if (site.id() == id) { + return site; } } - BY_ID = new Site[highestId + 1]; - for (Site site : ALL_SITES) { - BY_ID[site.id()] = site; - } - } - public static Site forId(int id) { - return BY_ID[id]; + return null; } + @Deprecated public static Site defaultSite() { - return CHAN4; + return defaultSite; } - public static SharedPreferences getPreferences(Site site) { - return AndroidUtils.getPreferences(site.id() + "_site_preferences"); + static void initialize(List sites) { + Sites.defaultSite = sites.isEmpty() ? null : sites.get(0); + Sites.ALL_SITES.clear(); + Sites.ALL_SITES.addAll(sites); } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/http/DeleteRequest.java b/Clover/app/src/main/java/org/floens/chan/core/site/http/DeleteRequest.java index 6bb68843..cdefbf84 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/http/DeleteRequest.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/http/DeleteRequest.java @@ -19,7 +19,7 @@ package org.floens.chan.core.site.http; import org.floens.chan.core.model.Post; -import org.floens.chan.core.model.SavedReply; +import org.floens.chan.core.model.orm.SavedReply; public class DeleteRequest { public final Post post; diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/http/Reply.java b/Clover/app/src/main/java/org/floens/chan/core/site/http/Reply.java index 3acf40c2..480256eb 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/http/Reply.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/http/Reply.java @@ -17,7 +17,7 @@ */ package org.floens.chan.core.site.http; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import java.io.File; 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 c8d84bda..e53ab491 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 @@ -29,13 +29,15 @@ import com.android.volley.VolleyError; import org.floens.chan.chan.ChanLoaderRequest; import org.floens.chan.chan.ChanLoaderRequestParams; import org.floens.chan.core.manager.BoardManager; -import org.floens.chan.core.model.Board; -import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Post; +import org.floens.chan.core.model.orm.Board; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.settings.StringSetting; import org.floens.chan.core.site.Boards; +import org.floens.chan.core.site.Resolvable; import org.floens.chan.core.site.Site; import org.floens.chan.core.site.SiteAuthentication; +import org.floens.chan.core.site.SiteBase; import org.floens.chan.core.site.SiteEndpoints; import org.floens.chan.core.site.SiteIcon; import org.floens.chan.core.site.SiteRequestModifier; @@ -62,7 +64,25 @@ import okhttp3.Request; import static org.floens.chan.Chan.getGraph; -public class Chan4 implements Site { +public class Chan4 extends SiteBase { + public static final Resolvable RESOLVABLE = new Resolvable() { + @Override + public ResolveResult resolve(String value) { + if (value.equals("4chan")) { + return ResolveResult.NAME_MATCH; + } else if (value.equals("https://4chan.org/")) { + return ResolveResult.FULL_MATCH; + } else { + return ResolveResult.NO; + } + } + + @Override + public Class getSiteClass() { + return Chan4.class; + } + }; + private static final String TAG = "Chan4"; private static final Random random = new Random(); @@ -265,17 +285,6 @@ public class Chan4 implements Site { passToken = new StringSetting(p, "preference_pass_id", ""); } - /** - * Note: very special case, only this site may have 0 as the return value.
- * This is for backwards compatibility when we didn't support multi-site yet.
- * - * @return {@inheritDoc} - */ - @Override - public int id() { - return 0; - } - @Override public String name() { return "4chan"; diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4BoardsRequest.java b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4BoardsRequest.java index c5886843..090011fb 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4BoardsRequest.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4BoardsRequest.java @@ -22,7 +22,7 @@ import android.util.JsonReader; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; -import org.floens.chan.core.model.Board; +import org.floens.chan.core.model.orm.Board; import org.floens.chan.core.net.JsonReaderRequest; import org.floens.chan.core.site.Site; diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4ReaderRequest.java b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4ReaderRequest.java index da6722b1..e7888062 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4ReaderRequest.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4ReaderRequest.java @@ -25,8 +25,8 @@ import org.floens.chan.chan.ChanParser; import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.database.DatabaseSavedReplyManager; import org.floens.chan.core.manager.FilterEngine; -import org.floens.chan.core.model.Filter; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Filter; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostHttpIcon; import org.floens.chan.core.model.PostImage; diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/PostParseCallable.java b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/PostParseCallable.java index 16807a3b..c8df3f26 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/PostParseCallable.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/PostParseCallable.java @@ -20,7 +20,7 @@ package org.floens.chan.core.site.sites.chan4; import org.floens.chan.chan.ChanParser; import org.floens.chan.core.database.DatabaseSavedReplyManager; import org.floens.chan.core.manager.FilterEngine; -import org.floens.chan.core.model.Filter; +import org.floens.chan.core.model.orm.Filter; import org.floens.chan.core.model.Post; import java.util.List; 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 15ec5346..829d0815 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 @@ -42,9 +42,9 @@ 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; +import org.floens.chan.core.model.orm.Board; +import org.floens.chan.core.model.orm.Loadable; +import org.floens.chan.core.model.orm.Pin; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.core.site.Site; import org.floens.chan.core.site.Sites; 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 f157c14f..b937a134 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 @@ -29,7 +29,7 @@ import android.widget.TextView; import org.floens.chan.R; import org.floens.chan.core.manager.WatchManager; -import org.floens.chan.core.model.Pin; +import org.floens.chan.core.model.orm.Pin; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.helper.PostHelper; import org.floens.chan.ui.view.ThumbnailView; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java index 84ba2d1e..dbfda9b1 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java @@ -24,7 +24,7 @@ import android.view.ViewGroup; import org.floens.chan.R; import org.floens.chan.core.model.ChanThread; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.cell.PostCellInterface; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCellInterface.java b/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCellInterface.java index b195da01..6f2c291a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCellInterface.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/cell/PostCellInterface.java @@ -17,7 +17,7 @@ */ package org.floens.chan.ui.cell; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostLinkable; import org.floens.chan.core.settings.ChanSettings; 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 abc0b046..6ec8309b 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 @@ -30,7 +30,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import org.floens.chan.R; -import org.floens.chan.core.model.Board; +import org.floens.chan.core.model.orm.Board; import org.floens.chan.core.model.ChanThread; import org.floens.chan.core.model.Post; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumDownloadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumDownloadController.java index 03b9b4b6..1c799ca5 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumDownloadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumDownloadController.java @@ -33,7 +33,7 @@ import android.widget.ImageView; import org.floens.chan.R; import org.floens.chan.controller.Controller; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.saver.ImageSaveTask; import org.floens.chan.core.saver.ImageSaver; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumViewController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumViewController.java index 41ef9068..85242ee8 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumViewController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumViewController.java @@ -26,7 +26,7 @@ import android.view.ViewGroup; import org.floens.chan.R; import org.floens.chan.controller.Controller; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.PostImage; import org.floens.chan.ui.cell.AlbumViewCell; import org.floens.chan.ui.toolbar.ToolbarMenu; 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 723a7c62..e4a035b2 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 @@ -40,11 +40,10 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import org.floens.chan.Chan; import org.floens.chan.R; import org.floens.chan.controller.Controller; import org.floens.chan.core.manager.BoardManager; -import org.floens.chan.core.model.Board; +import org.floens.chan.core.model.orm.Board; import org.floens.chan.ui.drawable.ThumbDrawable; import org.floens.chan.ui.helper.BoardHelper; import org.floens.chan.ui.toolbar.ToolbarMenu; 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 7a5a4f88..06b5c6b6 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 @@ -32,9 +32,9 @@ import org.floens.chan.R; import org.floens.chan.chan.ChanUrls; 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; -import org.floens.chan.core.model.Pin; +import org.floens.chan.core.model.orm.Board; +import org.floens.chan.core.model.orm.Loadable; +import org.floens.chan.core.model.orm.Pin; import org.floens.chan.core.presenter.ThreadPresenter; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.adapter.PostsFilter; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/DeveloperSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/DeveloperSettingsController.java index f2d1347c..576f92d0 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/DeveloperSettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/DeveloperSettingsController.java @@ -27,7 +27,7 @@ import android.widget.TextView; import org.floens.chan.R; import org.floens.chan.controller.Controller; import org.floens.chan.core.database.DatabaseManager; -import org.floens.chan.core.model.SavedReply; +import org.floens.chan.core.model.orm.SavedReply; import java.util.Random; 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 09084468..ab0aeebf 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 @@ -34,12 +34,11 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import org.floens.chan.Chan; import org.floens.chan.R; import org.floens.chan.controller.Controller; import org.floens.chan.controller.NavigationController; import org.floens.chan.core.manager.WatchManager; -import org.floens.chan.core.model.Pin; +import org.floens.chan.core.model.orm.Pin; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.adapter.DrawerAdapter; import org.floens.chan.utils.AndroidUtils; 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 2c913e4e..2ecb83d1 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 @@ -35,7 +35,7 @@ import org.floens.chan.controller.Controller; import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.manager.FilterEngine; import org.floens.chan.core.manager.FilterType; -import org.floens.chan.core.model.Filter; +import org.floens.chan.core.model.orm.Filter; import org.floens.chan.ui.helper.RefreshUIMessage; import org.floens.chan.ui.layout.FilterLayout; import org.floens.chan.ui.toolbar.ToolbarMenu; 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 e66a1ef6..8e1d5cb9 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 @@ -37,8 +37,8 @@ import org.floens.chan.core.database.DatabaseHistoryManager; import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.database.DatabaseSavedReplyManager; import org.floens.chan.core.manager.BoardManager; -import org.floens.chan.core.model.Board; -import org.floens.chan.core.model.History; +import org.floens.chan.core.model.orm.Board; +import org.floens.chan.core.model.orm.History; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.helper.HintPopup; import org.floens.chan.ui.toolbar.ToolbarMenu; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerNavigationController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerNavigationController.java index 845d0ed6..109e3f0b 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerNavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerNavigationController.java @@ -21,7 +21,7 @@ import android.content.Context; import org.floens.chan.R; import org.floens.chan.controller.ui.NavigationControllerContainerLayout; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.PostImage; import org.floens.chan.ui.toolbar.Toolbar; 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 7c0b0bad..576e2e0a 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 @@ -31,7 +31,7 @@ import android.widget.Toast; import org.floens.chan.R; 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.orm.Board; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.core.site.Sites; import org.floens.chan.ui.activity.StartActivity; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/SiteSetupController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/SiteSetupController.java index 7367bc5e..3cc1d5ec 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/SiteSetupController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/SiteSetupController.java @@ -29,6 +29,7 @@ import android.content.Context; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; +import android.graphics.drawable.Drawable; import android.os.Build; import android.support.v4.view.animation.PathInterpolatorCompat; import android.support.v7.widget.LinearLayoutManager; @@ -45,6 +46,8 @@ import android.widget.TextView; import org.floens.chan.R; import org.floens.chan.controller.transition.FadeInTransition; import org.floens.chan.core.presenter.SetupPresenter; +import org.floens.chan.core.site.Site; +import org.floens.chan.core.site.SiteIcon; import org.floens.chan.ui.animation.AnimationUtils; import java.util.ArrayList; @@ -65,7 +68,7 @@ public class SiteSetupController extends StyledToolbarNavigationController imple private RecyclerView sitesRecyclerview; private SitesAdapter sitesAdapter; - private List sites = new ArrayList<>(); + private List sites = new ArrayList<>(); public SiteSetupController(Context context) { super(context); @@ -127,7 +130,7 @@ public class SiteSetupController extends StyledToolbarNavigationController imple } @Override - public void runSiteAddedAnimation(final SetupPresenter.AddedSite site) { + public void runSiteAddedAnimation(Site site) { spinner.setVisibility(View.INVISIBLE); urlSubmit.setVisibility(View.VISIBLE); @@ -147,7 +150,7 @@ public class SiteSetupController extends StyledToolbarNavigationController imple } @Override - public void setAddedSites(List sites) { + public void setAddedSites(List sites) { this.sites.clear(); this.sites.addAll(sites); sitesAdapter.notifyDataSetChanged(); @@ -172,7 +175,7 @@ public class SiteSetupController extends StyledToolbarNavigationController imple } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) - private void runSiteAddedAnimationInternal(SetupPresenter.AddedSite site) { + private void runSiteAddedAnimationInternal(Site site) { blocked = true; sitesAdapter.invisibleSiteOnBind = site; @@ -197,7 +200,7 @@ public class SiteSetupController extends StyledToolbarNavigationController imple view.getLocationInWindow(viewWinLoc); String urlText = url.getText().toString(); - int indexOf = urlText.indexOf(site.title); + int indexOf = urlText.indexOf(site.name()); int offsetLeft = 0; if (indexOf > 0) { Paint paint = new Paint(); @@ -308,7 +311,7 @@ public class SiteSetupController extends StyledToolbarNavigationController imple } private class SitesAdapter extends RecyclerView.Adapter { - private SetupPresenter.AddedSite invisibleSiteOnBind; + private Site invisibleSiteOnBind; public SitesAdapter() { setHasStableIds(true); @@ -316,7 +319,7 @@ public class SiteSetupController extends StyledToolbarNavigationController imple @Override public long getItemId(int position) { - return sites.get(position).id; + return sites.get(position).id(); } @Override @@ -326,7 +329,7 @@ public class SiteSetupController extends StyledToolbarNavigationController imple @Override public void onBindViewHolder(SiteCell holder, int position) { - SetupPresenter.AddedSite site = sites.get(position); + Site site = sites.get(position); holder.setSite(site); if (site == invisibleSiteOnBind) { holder.itemView.setVisibility(View.INVISIBLE); @@ -342,6 +345,7 @@ public class SiteSetupController extends StyledToolbarNavigationController imple private class SiteCell extends RecyclerView.ViewHolder { private ImageView image; private TextView text; + private SiteIcon siteIcon; public SiteCell(View itemView) { super(itemView); @@ -349,9 +353,18 @@ public class SiteSetupController extends StyledToolbarNavigationController imple text = (TextView) itemView.findViewById(R.id.text); } - private void setSite(SetupPresenter.AddedSite site) { - image.setImageDrawable(site.drawable); - text.setText(site.title); + private void setSite(Site site) { + siteIcon = site.icon(); + siteIcon.get(new SiteIcon.SiteIconResult() { + @Override + public void onSiteIcon(SiteIcon siteIcon, Drawable icon) { + if (SiteCell.this.siteIcon == siteIcon) { + image.setImageDrawable(icon); + } + } + }); + + text.setText(site.name()); } } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThemeSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThemeSettingsController.java index 01404730..848c53aa 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThemeSettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThemeSettingsController.java @@ -39,8 +39,8 @@ import android.widget.TextView; import org.floens.chan.R; import org.floens.chan.chan.ChanParser; import org.floens.chan.controller.Controller; -import org.floens.chan.core.model.Board; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Board; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostLinkable; import org.floens.chan.core.settings.ChanSettings; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java index 3b85c1b0..629cb9ef 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java @@ -31,9 +31,9 @@ import org.floens.chan.R; import org.floens.chan.chan.ChanUrls; import org.floens.chan.controller.Controller; import org.floens.chan.core.manager.FilterType; -import org.floens.chan.core.model.Filter; -import org.floens.chan.core.model.Loadable; -import org.floens.chan.core.model.Pin; +import org.floens.chan.core.model.orm.Filter; +import org.floens.chan.core.model.orm.Loadable; +import org.floens.chan.core.model.orm.Pin; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.settings.ChanSettings; 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 b8d4a684..8b0c0d3b 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 @@ -27,8 +27,8 @@ import org.floens.chan.chan.ChanUrls; import org.floens.chan.controller.Controller; import org.floens.chan.controller.NavigationController; import org.floens.chan.core.manager.WatchManager; -import org.floens.chan.core.model.Loadable; -import org.floens.chan.core.model.Pin; +import org.floens.chan.core.model.orm.Loadable; +import org.floens.chan.core.model.orm.Pin; import org.floens.chan.core.presenter.ThreadPresenter; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.helper.HintPopup; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/helper/BoardHelper.java b/Clover/app/src/main/java/org/floens/chan/ui/helper/BoardHelper.java index 0363d1cc..daa5f29d 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/helper/BoardHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/helper/BoardHelper.java @@ -17,7 +17,7 @@ */ package org.floens.chan.ui.helper; -import org.floens.chan.core.model.Board; +import org.floens.chan.core.model.orm.Board; import org.jsoup.parser.Parser; public class BoardHelper { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/helper/PostHelper.java b/Clover/app/src/main/java/org/floens/chan/ui/helper/PostHelper.java index fadc64bb..28938ef6 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/helper/PostHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/helper/PostHelper.java @@ -25,7 +25,7 @@ import android.text.TextUtils; import android.text.style.ImageSpan; import org.floens.chan.R; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; import org.floens.chan.utils.AndroidUtils; 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 6c506ff2..3fa352ba 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 @@ -47,7 +47,7 @@ import org.floens.chan.R; import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.manager.FilterEngine; import org.floens.chan.core.manager.FilterType; -import org.floens.chan.core.model.Filter; +import org.floens.chan.core.model.orm.Filter; import org.floens.chan.core.site.Site; import org.floens.chan.core.site.Sites; import org.floens.chan.ui.controller.FiltersController; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java index 00950eb2..ccdb0799 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java @@ -36,7 +36,7 @@ import android.widget.Toast; import org.floens.chan.R; import org.floens.chan.core.model.ChanThread; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.site.http.Reply; import org.floens.chan.core.presenter.ReplyPresenter; import org.floens.chan.ui.activity.StartActivity; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java index 5dca4300..18fc826f 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java @@ -45,11 +45,11 @@ import org.floens.chan.controller.Controller; import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.exception.ChanLoaderException; import org.floens.chan.core.model.ChanThread; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.model.PostLinkable; -import org.floens.chan.core.model.ThreadHide; +import org.floens.chan.core.model.orm.ThreadHide; import org.floens.chan.core.presenter.ThreadPresenter; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.adapter.PostsFilter; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java index 17f5d67e..8452bd00 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java @@ -34,7 +34,7 @@ import android.widget.TextView; import org.floens.chan.R; import org.floens.chan.core.model.ChanThread; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.presenter.ReplyPresenter; 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 f08c4651..6ac08d71 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 @@ -30,7 +30,7 @@ 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.core.model.Pin; +import org.floens.chan.core.model.orm.Pin; import org.floens.chan.core.model.Post; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.activity.BoardActivity; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java b/Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java index 35dcdbae..37dbca39 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java @@ -20,7 +20,7 @@ package org.floens.chan.ui.state; import android.os.Parcel; import android.os.Parcelable; -import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.model.orm.Loadable; public class ChanState implements Parcelable { public Loadable board;