mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2024-11-19 02:49:18 +01:00
Catalogue now has a dropdown menu to select or change the source
This commit is contained in:
parent
8dca7fe79a
commit
4630a5ed1a
@ -88,17 +88,17 @@ public class PreferencesHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getSourceUsername(Source source) {
|
public String getSourceUsername(Source source) {
|
||||||
return prefs.getString(SOURCE_ACCOUNT_USERNAME + source.getSourceId(), "");
|
return prefs.getString(SOURCE_ACCOUNT_USERNAME + source.getId(), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSourcePassword(Source source) {
|
public String getSourcePassword(Source source) {
|
||||||
return prefs.getString(SOURCE_ACCOUNT_PASSWORD + source.getSourceId(), "");
|
return prefs.getString(SOURCE_ACCOUNT_PASSWORD + source.getId(), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSourceCredentials(Source source, String username, String password) {
|
public void setSourceCredentials(Source source, String username, String password) {
|
||||||
prefs.edit()
|
prefs.edit()
|
||||||
.putString(SOURCE_ACCOUNT_USERNAME + source.getSourceId(), username)
|
.putString(SOURCE_ACCOUNT_USERNAME + source.getId(), username)
|
||||||
.putString(SOURCE_ACCOUNT_PASSWORD + source.getSourceId(), password)
|
.putString(SOURCE_ACCOUNT_PASSWORD + source.getId(), password)
|
||||||
.apply();
|
.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,21 +19,21 @@ public class SourceManager {
|
|||||||
public static final int MANGAFOX = 3;
|
public static final int MANGAFOX = 3;
|
||||||
public static final int KISSMANGA = 4;
|
public static final int KISSMANGA = 4;
|
||||||
|
|
||||||
private HashMap<Integer, Source> mSourcesMap;
|
private HashMap<Integer, Source> sourcesMap;
|
||||||
private Context context;
|
private Context context;
|
||||||
|
|
||||||
public SourceManager(Context context) {
|
public SourceManager(Context context) {
|
||||||
mSourcesMap = new HashMap<>();
|
sourcesMap = new HashMap<>();
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
|
||||||
initializeSources();
|
initializeSources();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Source get(int sourceKey) {
|
public Source get(int sourceKey) {
|
||||||
if (!mSourcesMap.containsKey(sourceKey)) {
|
if (!sourcesMap.containsKey(sourceKey)) {
|
||||||
mSourcesMap.put(sourceKey, createSource(sourceKey));
|
sourcesMap.put(sourceKey, createSource(sourceKey));
|
||||||
}
|
}
|
||||||
return mSourcesMap.get(sourceKey);
|
return sourcesMap.get(sourceKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Source createSource(int sourceKey) {
|
private Source createSource(int sourceKey) {
|
||||||
@ -52,14 +52,14 @@ public class SourceManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initializeSources() {
|
private void initializeSources() {
|
||||||
mSourcesMap.put(BATOTO, createSource(BATOTO));
|
sourcesMap.put(BATOTO, createSource(BATOTO));
|
||||||
mSourcesMap.put(MANGAHERE, createSource(MANGAHERE));
|
sourcesMap.put(MANGAHERE, createSource(MANGAHERE));
|
||||||
mSourcesMap.put(MANGAFOX, createSource(MANGAFOX));
|
sourcesMap.put(MANGAFOX, createSource(MANGAFOX));
|
||||||
mSourcesMap.put(KISSMANGA, createSource(KISSMANGA));
|
sourcesMap.put(KISSMANGA, createSource(KISSMANGA));
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Source> getSources() {
|
public List<Source> getSources() {
|
||||||
return new ArrayList<>(mSourcesMap.values());
|
return new ArrayList<>(sourcesMap.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ public abstract class BaseSource {
|
|||||||
public abstract String getName();
|
public abstract String getName();
|
||||||
|
|
||||||
// Id of the source (must be declared and obtained from SourceManager to avoid conflicts)
|
// Id of the source (must be declared and obtained from SourceManager to avoid conflicts)
|
||||||
public abstract int getSourceId();
|
public abstract int getId();
|
||||||
|
|
||||||
// Base url of the source, like: http://example.com
|
// Base url of the source, like: http://example.com
|
||||||
public abstract String getBaseUrl();
|
public abstract String getBaseUrl();
|
||||||
@ -95,4 +95,8 @@ public abstract class BaseSource {
|
|||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return getName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,8 @@ public abstract class Source extends BaseSource {
|
|||||||
protected Headers requestHeaders;
|
protected Headers requestHeaders;
|
||||||
protected LazyHeaders glideHeaders;
|
protected LazyHeaders glideHeaders;
|
||||||
|
|
||||||
|
public Source() {}
|
||||||
|
|
||||||
public Source(Context context) {
|
public Source(Context context) {
|
||||||
App.get(context).getComponent().inject(this);
|
App.get(context).getComponent().inject(this);
|
||||||
requestHeaders = headersBuilder().build();
|
requestHeaders = headersBuilder().build();
|
||||||
@ -188,7 +190,7 @@ public abstract class Source extends BaseSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected String getChapterCacheKey(String chapterUrl) {
|
protected String getChapterCacheKey(String chapterUrl) {
|
||||||
return getSourceId() + chapterUrl;
|
return getId() + chapterUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected LazyHeaders.Builder glideHeadersBuilder() {
|
protected LazyHeaders.Builder glideHeadersBuilder() {
|
||||||
|
@ -70,7 +70,7 @@ public class Batoto extends Source {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSourceId() {
|
public int getId() {
|
||||||
return SourceManager.BATOTO;
|
return SourceManager.BATOTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,7 +218,7 @@ public class Batoto extends Source {
|
|||||||
Element urlElement = htmlBlock.select("a[href^=http://bato.to]").first();
|
Element urlElement = htmlBlock.select("a[href^=http://bato.to]").first();
|
||||||
Element updateElement = htmlBlock.select("td").get(5);
|
Element updateElement = htmlBlock.select("td").get(5);
|
||||||
|
|
||||||
mangaFromHtmlBlock.source = getSourceId();
|
mangaFromHtmlBlock.source = getId();
|
||||||
|
|
||||||
if (urlElement != null) {
|
if (urlElement != null) {
|
||||||
mangaFromHtmlBlock.setUrl(urlElement.attr("href"));
|
mangaFromHtmlBlock.setUrl(urlElement.attr("href"));
|
||||||
|
@ -55,7 +55,7 @@ public class Kissmanga extends Source {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSourceId() {
|
public int getId() {
|
||||||
return SourceManager.KISSMANGA;
|
return SourceManager.KISSMANGA;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,7 +94,7 @@ public class Kissmanga extends Source {
|
|||||||
|
|
||||||
private Manga constructPopularMangaFromHtmlBlock(Element htmlBlock) {
|
private Manga constructPopularMangaFromHtmlBlock(Element htmlBlock) {
|
||||||
Manga mangaFromHtmlBlock = new Manga();
|
Manga mangaFromHtmlBlock = new Manga();
|
||||||
mangaFromHtmlBlock.source = getSourceId();
|
mangaFromHtmlBlock.source = getId();
|
||||||
|
|
||||||
Element urlElement = htmlBlock.select("td a:eq(0)").first();
|
Element urlElement = htmlBlock.select("td a:eq(0)").first();
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ public class Mangafox extends Source {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSourceId() {
|
public int getId() {
|
||||||
return SourceManager.MANGAFOX;
|
return SourceManager.MANGAFOX;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ public class Mangafox extends Source {
|
|||||||
|
|
||||||
private Manga constructPopularMangaFromHtmlBlock(Element htmlBlock) {
|
private Manga constructPopularMangaFromHtmlBlock(Element htmlBlock) {
|
||||||
Manga mangaFromHtmlBlock = new Manga();
|
Manga mangaFromHtmlBlock = new Manga();
|
||||||
mangaFromHtmlBlock.source = getSourceId();
|
mangaFromHtmlBlock.source = getId();
|
||||||
|
|
||||||
Element urlElement = htmlBlock.select("a.title").first();
|
Element urlElement = htmlBlock.select("a.title").first();
|
||||||
|
|
||||||
@ -115,7 +115,7 @@ public class Mangafox extends Source {
|
|||||||
|
|
||||||
private Manga constructSearchMangaFromHtmlBlock(Element htmlBlock) {
|
private Manga constructSearchMangaFromHtmlBlock(Element htmlBlock) {
|
||||||
Manga mangaFromHtmlBlock = new Manga();
|
Manga mangaFromHtmlBlock = new Manga();
|
||||||
mangaFromHtmlBlock.source = getSourceId();
|
mangaFromHtmlBlock.source = getId();
|
||||||
|
|
||||||
Element urlElement = htmlBlock.select("a.series_preview").first();
|
Element urlElement = htmlBlock.select("a.series_preview").first();
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ public class Mangahere extends Source {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSourceId() {
|
public int getId() {
|
||||||
return SourceManager.MANGAHERE;
|
return SourceManager.MANGAHERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ public class Mangahere extends Source {
|
|||||||
|
|
||||||
private Manga constructPopularMangaFromHtmlBlock(Element htmlBlock) {
|
private Manga constructPopularMangaFromHtmlBlock(Element htmlBlock) {
|
||||||
Manga mangaFromHtmlBlock = new Manga();
|
Manga mangaFromHtmlBlock = new Manga();
|
||||||
mangaFromHtmlBlock.source = getSourceId();
|
mangaFromHtmlBlock.source = getId();
|
||||||
|
|
||||||
Element urlElement = htmlBlock.select("div.title > a").first();
|
Element urlElement = htmlBlock.select("div.title > a").first();
|
||||||
|
|
||||||
@ -153,7 +153,7 @@ public class Mangahere extends Source {
|
|||||||
|
|
||||||
private Manga constructSearchMangaFromHtmlBlock(Element htmlBlock) {
|
private Manga constructSearchMangaFromHtmlBlock(Element htmlBlock) {
|
||||||
Manga mangaFromHtmlBlock = new Manga();
|
Manga mangaFromHtmlBlock = new Manga();
|
||||||
mangaFromHtmlBlock.source = getSourceId();
|
mangaFromHtmlBlock.source = getId();
|
||||||
|
|
||||||
Element urlElement = htmlBlock.select("a.manga_info").first();
|
Element urlElement = htmlBlock.select("a.manga_info").first();
|
||||||
|
|
||||||
|
@ -5,15 +5,14 @@ import android.app.Application;
|
|||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import dagger.Component;
|
import dagger.Component;
|
||||||
import eu.kanade.mangafeed.data.mangasync.services.MyAnimeList;
|
|
||||||
import eu.kanade.mangafeed.data.sync.UpdateMangaSyncService;
|
|
||||||
import eu.kanade.mangafeed.data.download.DownloadService;
|
import eu.kanade.mangafeed.data.download.DownloadService;
|
||||||
|
import eu.kanade.mangafeed.data.mangasync.services.MyAnimeList;
|
||||||
import eu.kanade.mangafeed.data.source.base.Source;
|
import eu.kanade.mangafeed.data.source.base.Source;
|
||||||
import eu.kanade.mangafeed.data.sync.LibraryUpdateService;
|
import eu.kanade.mangafeed.data.sync.LibraryUpdateService;
|
||||||
|
import eu.kanade.mangafeed.data.sync.UpdateMangaSyncService;
|
||||||
import eu.kanade.mangafeed.injection.module.AppModule;
|
import eu.kanade.mangafeed.injection.module.AppModule;
|
||||||
import eu.kanade.mangafeed.injection.module.DataModule;
|
import eu.kanade.mangafeed.injection.module.DataModule;
|
||||||
import eu.kanade.mangafeed.ui.catalogue.CataloguePresenter;
|
import eu.kanade.mangafeed.ui.catalogue.CataloguePresenter;
|
||||||
import eu.kanade.mangafeed.ui.catalogue.SourcePresenter;
|
|
||||||
import eu.kanade.mangafeed.ui.download.DownloadPresenter;
|
import eu.kanade.mangafeed.ui.download.DownloadPresenter;
|
||||||
import eu.kanade.mangafeed.ui.library.LibraryPresenter;
|
import eu.kanade.mangafeed.ui.library.LibraryPresenter;
|
||||||
import eu.kanade.mangafeed.ui.manga.MangaActivity;
|
import eu.kanade.mangafeed.ui.manga.MangaActivity;
|
||||||
@ -37,7 +36,6 @@ public interface AppComponent {
|
|||||||
|
|
||||||
void inject(LibraryPresenter libraryPresenter);
|
void inject(LibraryPresenter libraryPresenter);
|
||||||
void inject(MangaPresenter mangaPresenter);
|
void inject(MangaPresenter mangaPresenter);
|
||||||
void inject(SourcePresenter sourcePresenter);
|
|
||||||
void inject(CataloguePresenter cataloguePresenter);
|
void inject(CataloguePresenter cataloguePresenter);
|
||||||
void inject(MangaInfoPresenter mangaInfoPresenter);
|
void inject(MangaInfoPresenter mangaInfoPresenter);
|
||||||
void inject(ChaptersPresenter chaptersPresenter);
|
void inject(ChaptersPresenter chaptersPresenter);
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package eu.kanade.mangafeed.ui.catalogue;
|
package eu.kanade.mangafeed.ui.catalogue;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.widget.SearchView;
|
import android.support.v7.widget.SearchView;
|
||||||
|
import android.support.v7.widget.Toolbar;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
@ -10,9 +12,11 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.AdapterView;
|
||||||
import android.widget.GridView;
|
import android.widget.GridView;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
|
import android.widget.Spinner;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -22,9 +26,12 @@ import butterknife.ButterKnife;
|
|||||||
import butterknife.OnItemClick;
|
import butterknife.OnItemClick;
|
||||||
import eu.kanade.mangafeed.R;
|
import eu.kanade.mangafeed.R;
|
||||||
import eu.kanade.mangafeed.data.database.models.Manga;
|
import eu.kanade.mangafeed.data.database.models.Manga;
|
||||||
|
import eu.kanade.mangafeed.data.source.base.Source;
|
||||||
import eu.kanade.mangafeed.ui.base.fragment.BaseRxFragment;
|
import eu.kanade.mangafeed.ui.base.fragment.BaseRxFragment;
|
||||||
|
import eu.kanade.mangafeed.ui.main.MainActivity;
|
||||||
import eu.kanade.mangafeed.ui.manga.MangaActivity;
|
import eu.kanade.mangafeed.ui.manga.MangaActivity;
|
||||||
import eu.kanade.mangafeed.util.PageBundle;
|
import eu.kanade.mangafeed.util.PageBundle;
|
||||||
|
import eu.kanade.mangafeed.util.ToastUtil;
|
||||||
import eu.kanade.mangafeed.widget.EndlessScrollListener;
|
import eu.kanade.mangafeed.widget.EndlessScrollListener;
|
||||||
import icepick.Icepick;
|
import icepick.Icepick;
|
||||||
import icepick.State;
|
import icepick.State;
|
||||||
@ -40,23 +47,20 @@ public class CatalogueFragment extends BaseRxFragment<CataloguePresenter> {
|
|||||||
@Bind(R.id.progress) ProgressBar progress;
|
@Bind(R.id.progress) ProgressBar progress;
|
||||||
@Bind(R.id.progress_grid) ProgressBar progressGrid;
|
@Bind(R.id.progress_grid) ProgressBar progressGrid;
|
||||||
|
|
||||||
|
private Toolbar toolbar;
|
||||||
|
private Spinner spinner;
|
||||||
private CatalogueAdapter adapter;
|
private CatalogueAdapter adapter;
|
||||||
private EndlessScrollListener scrollListener;
|
private EndlessScrollListener scrollListener;
|
||||||
|
|
||||||
@State String query = "";
|
@State String query = "";
|
||||||
|
@State int selectedIndex = -1;
|
||||||
private final int SEARCH_TIMEOUT = 1000;
|
private final int SEARCH_TIMEOUT = 1000;
|
||||||
|
|
||||||
private PublishSubject<String> queryDebouncerSubject;
|
private PublishSubject<String> queryDebouncerSubject;
|
||||||
private Subscription queryDebouncerSubscription;
|
private Subscription queryDebouncerSubscription;
|
||||||
|
|
||||||
public final static String SOURCE_ID = "source_id";
|
public static CatalogueFragment newInstance() {
|
||||||
|
return new CatalogueFragment();
|
||||||
public static CatalogueFragment newInstance(int sourceId) {
|
|
||||||
CatalogueFragment fragment = new CatalogueFragment();
|
|
||||||
Bundle args = new Bundle();
|
|
||||||
args.putInt(SOURCE_ID, sourceId);
|
|
||||||
fragment.setArguments(args);
|
|
||||||
return fragment;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -78,13 +82,43 @@ public class CatalogueFragment extends BaseRxFragment<CataloguePresenter> {
|
|||||||
gridView.setAdapter(adapter);
|
gridView.setAdapter(adapter);
|
||||||
gridView.setOnScrollListener(scrollListener);
|
gridView.setOnScrollListener(scrollListener);
|
||||||
|
|
||||||
int sourceId = getArguments().getInt(SOURCE_ID, -1);
|
// Create toolbar spinner
|
||||||
|
Context themedContext = getBaseActivity().getSupportActionBar() != null ?
|
||||||
|
getBaseActivity().getSupportActionBar().getThemedContext() : getActivity();
|
||||||
|
spinner = new Spinner(themedContext);
|
||||||
|
CatalogueSpinnerAdapter spinnerAdapter = new CatalogueSpinnerAdapter(themedContext,
|
||||||
|
android.R.layout.simple_spinner_item, getPresenter().getEnabledSources());
|
||||||
|
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||||
|
spinner.setAdapter(spinnerAdapter);
|
||||||
|
spinner.setSelection(savedState == null ? spinnerAdapter.getEmptyIndex() : selectedIndex);
|
||||||
|
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||||
|
@Override
|
||||||
|
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||||
|
Source source = spinnerAdapter.getItem(position);
|
||||||
|
// We add an empty source with id -1 that acts as a placeholder to show a hint
|
||||||
|
// that asks to select a source
|
||||||
|
if (source.getId() != -1 && selectedIndex != position) {
|
||||||
|
// Set previous selection if it's not a valid source and notify the user
|
||||||
|
if (!getPresenter().isValidSource(source)) {
|
||||||
|
spinner.setSelection(selectedIndex != -1 ? selectedIndex :
|
||||||
|
spinnerAdapter.getEmptyIndex());
|
||||||
|
ToastUtil.showShort(getActivity(), R.string.source_requires_login);
|
||||||
|
} else {
|
||||||
|
selectedIndex = position;
|
||||||
|
showProgressBar();
|
||||||
|
getPresenter().startRequesting(source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
showProgressBar();
|
@Override
|
||||||
if (savedState == null)
|
public void onNothingSelected(AdapterView<?> parent) {}
|
||||||
getPresenter().startRequesting(sourceId);
|
});
|
||||||
|
|
||||||
|
setToolbarTitle("");
|
||||||
|
toolbar = ((MainActivity)getActivity()).getToolbar();
|
||||||
|
toolbar.addView(spinner);
|
||||||
|
|
||||||
setToolbarTitle(getPresenter().getSource().getName());
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,6 +162,12 @@ public class CatalogueFragment extends BaseRxFragment<CataloguePresenter> {
|
|||||||
super.onStop();
|
super.onStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroyView() {
|
||||||
|
toolbar.removeView(spinner);
|
||||||
|
super.onDestroyView();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSaveInstanceState(Bundle outState) {
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
Icepick.saveInstanceState(this, outState);
|
Icepick.saveInstanceState(this, outState);
|
||||||
|
@ -13,6 +13,7 @@ import javax.inject.Inject;
|
|||||||
import eu.kanade.mangafeed.data.cache.CoverCache;
|
import eu.kanade.mangafeed.data.cache.CoverCache;
|
||||||
import eu.kanade.mangafeed.data.database.DatabaseHelper;
|
import eu.kanade.mangafeed.data.database.DatabaseHelper;
|
||||||
import eu.kanade.mangafeed.data.database.models.Manga;
|
import eu.kanade.mangafeed.data.database.models.Manga;
|
||||||
|
import eu.kanade.mangafeed.data.preference.PreferencesHelper;
|
||||||
import eu.kanade.mangafeed.data.source.SourceManager;
|
import eu.kanade.mangafeed.data.source.SourceManager;
|
||||||
import eu.kanade.mangafeed.data.source.base.Source;
|
import eu.kanade.mangafeed.data.source.base.Source;
|
||||||
import eu.kanade.mangafeed.data.source.model.MangasPage;
|
import eu.kanade.mangafeed.data.source.model.MangasPage;
|
||||||
@ -30,6 +31,7 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
@Inject SourceManager sourceManager;
|
@Inject SourceManager sourceManager;
|
||||||
@Inject DatabaseHelper db;
|
@Inject DatabaseHelper db;
|
||||||
@Inject CoverCache coverCache;
|
@Inject CoverCache coverCache;
|
||||||
|
@Inject PreferencesHelper prefs;
|
||||||
|
|
||||||
private Source source;
|
private Source source;
|
||||||
|
|
||||||
@ -85,8 +87,8 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startRequesting(int sourceId) {
|
public void startRequesting(Source source) {
|
||||||
source = sourceManager.get(sourceId);
|
this.source = source;
|
||||||
restartRequest(null);
|
restartRequest(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,7 +125,7 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Manga networkToLocalManga(Manga networkManga) {
|
private Manga networkToLocalManga(Manga networkManga) {
|
||||||
List<Manga> dbResult = db.getManga(networkManga.url, source.getSourceId()).executeAsBlocking();
|
List<Manga> dbResult = db.getManga(networkManga.url, source.getId()).executeAsBlocking();
|
||||||
Manga localManga = !dbResult.isEmpty() ? dbResult.get(0) : null;
|
Manga localManga = !dbResult.isEmpty() ? dbResult.get(0) : null;
|
||||||
if (localManga == null) {
|
if (localManga == null) {
|
||||||
PutResult result = db.insertManga(networkManga).executeAsBlocking();
|
PutResult result = db.insertManga(networkManga).executeAsBlocking();
|
||||||
@ -152,4 +154,17 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
return lastMangasPage != null && lastMangasPage.nextPageUrl != null;
|
return lastMangasPage != null && lastMangasPage.nextPageUrl != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isValidSource(Source source) {
|
||||||
|
if (!source.isLoginRequired() || source.isLogged())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return !(prefs.getSourceUsername(source).equals("")
|
||||||
|
|| prefs.getSourcePassword(source).equals(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Source> getEnabledSources() {
|
||||||
|
// TODO filter by enabled source
|
||||||
|
return sourceManager.getSources();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,120 @@
|
|||||||
|
package eu.kanade.mangafeed.ui.catalogue;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import eu.kanade.mangafeed.R;
|
||||||
|
import eu.kanade.mangafeed.data.database.models.Chapter;
|
||||||
|
import eu.kanade.mangafeed.data.database.models.Manga;
|
||||||
|
import eu.kanade.mangafeed.data.source.base.Source;
|
||||||
|
import eu.kanade.mangafeed.data.source.model.MangasPage;
|
||||||
|
|
||||||
|
public class CatalogueSpinnerAdapter extends ArrayAdapter<Source> {
|
||||||
|
|
||||||
|
public CatalogueSpinnerAdapter(Context context, int resource, List<Source> sources) {
|
||||||
|
super(context, resource, sources);
|
||||||
|
sources.add(new SimpleSource());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getView(int position, View convertView, ViewGroup parent) {
|
||||||
|
|
||||||
|
View v = super.getView(position, convertView, parent);
|
||||||
|
if (position == getCount()) {
|
||||||
|
((TextView)v.findViewById(android.R.id.text1)).setText("");
|
||||||
|
((TextView)v.findViewById(android.R.id.text1)).setHint(getItem(getCount()).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return super.getCount()-1; // you dont display last item. It is used as hint.
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getEmptyIndex() {
|
||||||
|
return getCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SimpleSource extends Source {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return getContext().getString(R.string.select_source);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getId() {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getBaseUrl() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isLoginRequired() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getInitialPopularMangasUrl() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getInitialSearchUrl(String query) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<Manga> parsePopularMangasFromHtml(Document parsedHtml) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String parseNextPopularMangasUrl(Document parsedHtml, MangasPage page) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<Manga> parseSearchFromHtml(Document parsedHtml) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String parseNextSearchUrl(Document parsedHtml, MangasPage page, String query) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Manga parseHtmlToManga(String mangaUrl, String unparsedHtml) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<Chapter> parseHtmlToChapters(String unparsedHtml) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<String> parseHtmlToPageUrls(String unparsedHtml) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String parseHtmlToImageUrl(String unparsedHtml) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,69 +0,0 @@
|
|||||||
package eu.kanade.mangafeed.ui.catalogue;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.ListView;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import butterknife.Bind;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import butterknife.OnItemClick;
|
|
||||||
import eu.kanade.mangafeed.R;
|
|
||||||
import eu.kanade.mangafeed.data.source.base.Source;
|
|
||||||
import eu.kanade.mangafeed.ui.main.MainActivity;
|
|
||||||
import eu.kanade.mangafeed.ui.base.fragment.BaseRxFragment;
|
|
||||||
import nucleus.factory.RequiresPresenter;
|
|
||||||
import uk.co.ribot.easyadapter.EasyAdapter;
|
|
||||||
|
|
||||||
@RequiresPresenter(SourcePresenter.class)
|
|
||||||
public class SourceFragment extends BaseRxFragment<SourcePresenter> {
|
|
||||||
|
|
||||||
@Bind(R.id.catalogue_list) ListView source_list;
|
|
||||||
|
|
||||||
private EasyAdapter<Source> adapter;
|
|
||||||
|
|
||||||
public static SourceFragment newInstance() {
|
|
||||||
return new SourceFragment();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
||||||
Bundle savedInstanceState) {
|
|
||||||
// Inflate the layout for this fragment
|
|
||||||
View view = inflater.inflate(R.layout.fragment_source, container, false);
|
|
||||||
ButterKnife.bind(this, view);
|
|
||||||
|
|
||||||
setToolbarTitle(R.string.label_catalogues);
|
|
||||||
|
|
||||||
createAdapter();
|
|
||||||
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnItemClick(R.id.catalogue_list)
|
|
||||||
public void onSourceClick(int position) {
|
|
||||||
Source source = adapter.getItem(position);
|
|
||||||
MainActivity activity = (MainActivity) getActivity();
|
|
||||||
|
|
||||||
if (getPresenter().isValidSource(source)) {
|
|
||||||
CatalogueFragment fragment = CatalogueFragment.newInstance(source.getSourceId());
|
|
||||||
activity.setFragment(fragment);
|
|
||||||
} else {
|
|
||||||
Toast.makeText(getActivity(), R.string.source_requires_login, Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void createAdapter() {
|
|
||||||
adapter = new EasyAdapter<>(getActivity(), SourceHolder.class);
|
|
||||||
source_list.setAdapter(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItems(List<Source> items) {
|
|
||||||
adapter.setItems(items);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
package eu.kanade.mangafeed.ui.catalogue;
|
|
||||||
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import eu.kanade.mangafeed.R;
|
|
||||||
import eu.kanade.mangafeed.data.source.base.Source;
|
|
||||||
import uk.co.ribot.easyadapter.ItemViewHolder;
|
|
||||||
import uk.co.ribot.easyadapter.PositionInfo;
|
|
||||||
import uk.co.ribot.easyadapter.annotations.LayoutId;
|
|
||||||
import uk.co.ribot.easyadapter.annotations.ViewId;
|
|
||||||
|
|
||||||
|
|
||||||
@LayoutId(R.layout.item_source)
|
|
||||||
public class SourceHolder extends ItemViewHolder<Source> {
|
|
||||||
|
|
||||||
@ViewId(R.id.source_name)
|
|
||||||
TextView source_name;
|
|
||||||
|
|
||||||
public SourceHolder(View view) {
|
|
||||||
super(view);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSetValues(Source item, PositionInfo positionInfo) {
|
|
||||||
source_name.setText(item.getName());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
package eu.kanade.mangafeed.ui.catalogue;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import eu.kanade.mangafeed.data.preference.PreferencesHelper;
|
|
||||||
import eu.kanade.mangafeed.data.source.SourceManager;
|
|
||||||
import eu.kanade.mangafeed.data.source.base.Source;
|
|
||||||
import eu.kanade.mangafeed.ui.base.presenter.BasePresenter;
|
|
||||||
|
|
||||||
|
|
||||||
public class SourcePresenter extends BasePresenter<SourceFragment> {
|
|
||||||
|
|
||||||
@Inject SourceManager sourceManager;
|
|
||||||
@Inject PreferencesHelper prefs;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onTakeView(SourceFragment view) {
|
|
||||||
super.onTakeView(view);
|
|
||||||
|
|
||||||
view.setItems(sourceManager.getSources());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isValidSource(Source source) {
|
|
||||||
if (!source.isLoginRequired() || source.isLogged())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return !(prefs.getSourceUsername(source).equals("")
|
|
||||||
|| prefs.getSourcePassword(source).equals(""));
|
|
||||||
}
|
|
||||||
}
|
|
@ -14,7 +14,7 @@ import butterknife.Bind;
|
|||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.kanade.mangafeed.R;
|
import eu.kanade.mangafeed.R;
|
||||||
import eu.kanade.mangafeed.ui.base.activity.BaseActivity;
|
import eu.kanade.mangafeed.ui.base.activity.BaseActivity;
|
||||||
import eu.kanade.mangafeed.ui.catalogue.SourceFragment;
|
import eu.kanade.mangafeed.ui.catalogue.CatalogueFragment;
|
||||||
import eu.kanade.mangafeed.ui.download.DownloadFragment;
|
import eu.kanade.mangafeed.ui.download.DownloadFragment;
|
||||||
import eu.kanade.mangafeed.ui.library.LibraryFragment;
|
import eu.kanade.mangafeed.ui.library.LibraryFragment;
|
||||||
import eu.kanade.mangafeed.ui.setting.SettingsActivity;
|
import eu.kanade.mangafeed.ui.setting.SettingsActivity;
|
||||||
@ -80,7 +80,7 @@ public class MainActivity extends BaseActivity {
|
|||||||
case R.id.nav_drawer_recent_updates:
|
case R.id.nav_drawer_recent_updates:
|
||||||
break;
|
break;
|
||||||
case R.id.nav_drawer_catalogues:
|
case R.id.nav_drawer_catalogues:
|
||||||
setFragment(SourceFragment.newInstance());
|
setFragment(CatalogueFragment.newInstance());
|
||||||
break;
|
break;
|
||||||
case R.id.nav_drawer_downloads:
|
case R.id.nav_drawer_downloads:
|
||||||
setFragment(DownloadFragment.newInstance());
|
setFragment(DownloadFragment.newInstance());
|
||||||
@ -111,4 +111,8 @@ public class MainActivity extends BaseActivity {
|
|||||||
fragmentStack.replace(fragment);
|
fragmentStack.replace(fragment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Toolbar getToolbar() {
|
||||||
|
return toolbar;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
|
|||||||
EventBus.getDefault().removeStickyEvent(event);
|
EventBus.getDefault().removeStickyEvent(event);
|
||||||
manga = event.getManga();
|
manga = event.getManga();
|
||||||
source = event.getSource();
|
source = event.getSource();
|
||||||
sourceId = source.getSourceId();
|
sourceId = source.getId();
|
||||||
loadChapter(event.getChapter());
|
loadChapter(event.getChapter());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
tools:context="eu.kanade.mangafeed.ui.catalogue.SourceFragment">
|
|
||||||
|
|
||||||
|
|
||||||
<ListView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/catalogue_list" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
@ -1,16 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="50dp"
|
|
||||||
tools:text="New Text"
|
|
||||||
android:id="@+id/source_name"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:paddingLeft="15dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
@ -90,6 +90,7 @@
|
|||||||
|
|
||||||
<!-- Catalogue fragment -->
|
<!-- Catalogue fragment -->
|
||||||
<string name="source_requires_login">This source requires login</string>
|
<string name="source_requires_login">This source requires login</string>
|
||||||
|
<string name="select_source">Select a source</string>
|
||||||
|
|
||||||
<!-- Manga info fragment -->
|
<!-- Manga info fragment -->
|
||||||
<string name="manga_detail_tab">Info</string>
|
<string name="manga_detail_tab">Info</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user