More site model infrastructure

Added json models.
Seperated normal models, orm models and json models packages.
multisite
Floens 8 years ago
parent e7f0038bbd
commit 345c22de7f
  1. 3
      Clover/app/build.gradle
  2. 6
      Clover/app/proguard.cfg
  3. 6
      Clover/app/src/main/java/org/floens/chan/Chan.java
  4. 4
      Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java
  5. 2
      Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java
  6. 2
      Clover/app/src/main/java/org/floens/chan/chan/ChanLoaderRequestParams.java
  7. 2
      Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java
  8. 2
      Clover/app/src/main/java/org/floens/chan/core/database/DatabaseFilterManager.java
  9. 30
      Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHelper.java
  10. 2
      Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHistoryManager.java
  11. 2
      Clover/app/src/main/java/org/floens/chan/core/database/DatabaseLoadableManager.java
  12. 2
      Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java
  13. 2
      Clover/app/src/main/java/org/floens/chan/core/database/DatabasePinManager.java
  14. 2
      Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSavedReplyManager.java
  15. 53
      Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSiteManager.java
  16. 4
      Clover/app/src/main/java/org/floens/chan/core/di/AppModule.java
  17. 2
      Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java
  18. 2
      Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java
  19. 2
      Clover/app/src/main/java/org/floens/chan/core/manager/ReplyManager.java
  20. 4
      Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java
  21. 2
      Clover/app/src/main/java/org/floens/chan/core/model/BoardReference.java
  22. 2
      Clover/app/src/main/java/org/floens/chan/core/model/ChanThread.java
  23. 2
      Clover/app/src/main/java/org/floens/chan/core/model/Post.java
  24. 28
      Clover/app/src/main/java/org/floens/chan/core/model/json/site/SiteConfig.java
  25. 11
      Clover/app/src/main/java/org/floens/chan/core/model/json/site/SiteUserSettings.java
  26. 5
      Clover/app/src/main/java/org/floens/chan/core/model/orm/Board.java
  27. 4
      Clover/app/src/main/java/org/floens/chan/core/model/orm/Filter.java
  28. 4
      Clover/app/src/main/java/org/floens/chan/core/model/orm/History.java
  29. 7
      Clover/app/src/main/java/org/floens/chan/core/model/orm/Loadable.java
  30. 4
      Clover/app/src/main/java/org/floens/chan/core/model/orm/Pin.java
  31. 4
      Clover/app/src/main/java/org/floens/chan/core/model/orm/SavedReply.java
  32. 17
      Clover/app/src/main/java/org/floens/chan/core/model/orm/SiteModel.java
  33. 4
      Clover/app/src/main/java/org/floens/chan/core/model/orm/ThreadHide.java
  34. 2
      Clover/app/src/main/java/org/floens/chan/core/pool/ChanLoaderFactory.java
  35. 2
      Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java
  36. 6
      Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java
  37. 78
      Clover/app/src/main/java/org/floens/chan/core/presenter/SetupPresenter.java
  38. 10
      Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java
  39. 2
      Clover/app/src/main/java/org/floens/chan/core/site/Boards.java
  40. 14
      Clover/app/src/main/java/org/floens/chan/core/site/Resolvable.java
  41. 10
      Clover/app/src/main/java/org/floens/chan/core/site/Site.java
  42. 40
      Clover/app/src/main/java/org/floens/chan/core/site/SiteBase.java
  43. 4
      Clover/app/src/main/java/org/floens/chan/core/site/SiteEndpoints.java
  44. 183
      Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java
  45. 81
      Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java
  46. 48
      Clover/app/src/main/java/org/floens/chan/core/site/Sites.java
  47. 2
      Clover/app/src/main/java/org/floens/chan/core/site/http/DeleteRequest.java
  48. 2
      Clover/app/src/main/java/org/floens/chan/core/site/http/Reply.java
  49. 37
      Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java
  50. 2
      Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4BoardsRequest.java
  51. 4
      Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4ReaderRequest.java
  52. 2
      Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/PostParseCallable.java
  53. 6
      Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java
  54. 2
      Clover/app/src/main/java/org/floens/chan/ui/adapter/DrawerAdapter.java
  55. 2
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java
  56. 2
      Clover/app/src/main/java/org/floens/chan/ui/cell/PostCellInterface.java
  57. 2
      Clover/app/src/main/java/org/floens/chan/ui/cell/ThreadStatusCell.java
  58. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumDownloadController.java
  59. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/AlbumViewController.java
  60. 3
      Clover/app/src/main/java/org/floens/chan/ui/controller/BoardEditController.java
  61. 6
      Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java
  62. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/DeveloperSettingsController.java
  63. 3
      Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java
  64. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/FiltersController.java
  65. 4
      Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java
  66. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerNavigationController.java
  67. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java
  68. 35
      Clover/app/src/main/java/org/floens/chan/ui/controller/SiteSetupController.java
  69. 4
      Clover/app/src/main/java/org/floens/chan/ui/controller/ThemeSettingsController.java
  70. 6
      Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java
  71. 4
      Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java
  72. 2
      Clover/app/src/main/java/org/floens/chan/ui/helper/BoardHelper.java
  73. 2
      Clover/app/src/main/java/org/floens/chan/ui/helper/PostHelper.java
  74. 2
      Clover/app/src/main/java/org/floens/chan/ui/layout/FilterLayout.java
  75. 2
      Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java
  76. 4
      Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java
  77. 2
      Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java
  78. 2
      Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java
  79. 2
      Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java

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

@ -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{<init>(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.**

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

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

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

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

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

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

@ -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<Pin, Integer> pinDao;
public Dao<Loadable, Integer> 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() {

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

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

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

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

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

@ -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<List<SiteModel>> getAll() {
return new Callable<List<SiteModel>>() {
@Override
public List<SiteModel> call() throws Exception {
return helper.siteDao.queryForAll();
}
};
}
public Callable<SiteModel> add(final SiteModel site) {
return new Callable<SiteModel>() {
@Override
public SiteModel call() throws Exception {
helper.siteDao.create(site);
return site;
}
};
}
public Callable<SiteModel> update(final SiteModel site) {
return new Callable<SiteModel>() {
@Override
public SiteModel call() throws Exception {
helper.siteDao.update(site);
return site;
}
};
}
public Callable<SiteModel> updateId(final SiteModel site, final int newId) {
return new Callable<SiteModel>() {
@Override
public SiteModel call() throws Exception {
helper.siteDao.updateId(site, newId);
return site;
}
};
}
}

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

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

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

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

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

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

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

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

@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}

@ -15,15 +15,8 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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 {
}

@ -15,16 +15,17 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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() {
}

@ -15,14 +15,14 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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;

@ -15,12 +15,12 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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;

@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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;
* <p>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;

@ -15,12 +15,12 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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;

@ -15,12 +15,12 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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() {
}

@ -15,23 +15,22 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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() {
}
}

@ -15,12 +15,12 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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;

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

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

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

@ -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<AddedSite> sites = new ArrayList<>();
private List<Site> 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<AddedSite> sites);
void setAddedSites(List<Site> 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;
}
}

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

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

@ -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<? extends Site> getSiteClass();
}

@ -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.<br>
* 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.
*/

@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

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

@ -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 <http://www.gnu.org/licenses/>.
*/
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<Site> newAllSites = new ArrayList<>(Sites.ALL_SITES);
newAllSites.add(site);
Sites.initialize(newAllSites);
callback.onSiteAdded(site);
}
public void initialize() {
List<Site> 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<Site> loadSitesFromDatabase() {
List<Site> sites = new ArrayList<>();
List<SiteModel> siteModels = databaseManager.runTaskSync(databaseManager.getDatabaseSiteManager().getAll());
for (SiteModel siteModel : siteModels) {
Pair<SiteConfig, SiteUserSettings> 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<SiteConfig, SiteUserSettings> 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<? extends Site> clazz = Sites.SITE_CLASSES.get(siteClassId);
if (clazz == null) {
throw new IllegalArgumentException();
}
return instantiateSiteClass(clazz);
}
private Site instantiateSiteClass(Class<? extends Site> 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);
}
}

@ -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 <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.core.site;
import java.util.List;
import okhttp3.HttpUrl;
class SiteResolver {
SiteResolverResult resolve(String url) {
List<Resolvable> 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<? extends Site> builtinResult;
HttpUrl externalResult;
public SiteResolverResult(Match match, Class<? extends Site> builtinResult, HttpUrl externalResult) {
this.match = match;
this.builtinResult = builtinResult;
this.externalResult = externalResult;
}
}
}

@ -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<Class<? extends Site>> SITE_CLASSES = new SparseArray<>();
public static final List<? extends Site> 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<Resolvable> RESOLVABLES = new ArrayList<>();
static {
int highestId = 0;
for (Site site : ALL_SITES) {
if (site.id() > highestId) {
highestId = site.id();
RESOLVABLES.add(Chan4.RESOLVABLE);
}
}
BY_ID = new Site[highestId + 1];
public static final List<Site> ALL_SITES = new ArrayList<>();
@Deprecated
private static Site defaultSite;
public static Site forId(int id) {
// TODO: better datastructure
for (Site site : ALL_SITES) {
BY_ID[site.id()] = site;
if (site.id() == id) {
return 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<Site> sites) {
Sites.defaultSite = sites.isEmpty() ? null : sites.get(0);
Sites.ALL_SITES.clear();
Sites.ALL_SITES.addAll(sites);
}
}

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

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

@ -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<? extends Site> 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", "");
}
/**
* <b>Note: very special case, only this site may have 0 as the return value.<br>
* This is for backwards compatibility when we didn't support multi-site yet.</b>
*
* @return {@inheritDoc}
*/
@Override
public int id() {
return 0;
}
@Override
public String name() {
return "4chan";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -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<SetupPresenter.AddedSite> sites = new ArrayList<>();
private List<Site> 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<SetupPresenter.AddedSite> sites) {
public void setAddedSites(List<Site> 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<SiteCell> {
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());
}
}
}

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

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

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save