Search for library (not working)
@ -0,0 +1,18 @@
|
|||||||
|
package eu.kanade.mangafeed.presenter;
|
||||||
|
|
||||||
|
import de.greenrobot.event.EventBus;
|
||||||
|
|
||||||
|
public class BasePresenter {
|
||||||
|
|
||||||
|
public void registerForStickyEvents() {
|
||||||
|
EventBus.getDefault().registerSticky(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerForEvents() {
|
||||||
|
EventBus.getDefault().register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unregisterForEvents() {
|
||||||
|
EventBus.getDefault().unregister(this);
|
||||||
|
}
|
||||||
|
}
|
@ -10,11 +10,17 @@ import eu.kanade.mangafeed.data.helpers.PreferencesHelper;
|
|||||||
import eu.kanade.mangafeed.data.models.Manga;
|
import eu.kanade.mangafeed.data.models.Manga;
|
||||||
import eu.kanade.mangafeed.ui.activity.MangaDetailActivity;
|
import eu.kanade.mangafeed.ui.activity.MangaDetailActivity;
|
||||||
import eu.kanade.mangafeed.view.LibraryView;
|
import eu.kanade.mangafeed.view.LibraryView;
|
||||||
|
import rx.Observable;
|
||||||
|
import rx.Subscription;
|
||||||
|
import rx.android.schedulers.AndroidSchedulers;
|
||||||
|
import rx.schedulers.Schedulers;
|
||||||
|
import rx.subjects.PublishSubject;
|
||||||
|
import timber.log.Timber;
|
||||||
import uk.co.ribot.easyadapter.EasyAdapter;
|
import uk.co.ribot.easyadapter.EasyAdapter;
|
||||||
|
|
||||||
import static rx.android.schedulers.AndroidSchedulers.mainThread;
|
import static rx.android.schedulers.AndroidSchedulers.mainThread;
|
||||||
|
|
||||||
public class LibraryPresenter {
|
public class LibraryPresenter extends BasePresenter {
|
||||||
|
|
||||||
private LibraryView view;
|
private LibraryView view;
|
||||||
|
|
||||||
@ -24,6 +30,9 @@ public class LibraryPresenter {
|
|||||||
@Inject
|
@Inject
|
||||||
PreferencesHelper prefs;
|
PreferencesHelper prefs;
|
||||||
|
|
||||||
|
private Subscription searchViewSubscription;
|
||||||
|
private PublishSubject<Observable<String>> searchViewPublishSubject;
|
||||||
|
|
||||||
public LibraryPresenter(LibraryView view) {
|
public LibraryPresenter(LibraryView view) {
|
||||||
this.view = view;
|
this.view = view;
|
||||||
App.getComponent(view.getActivity()).inject(this);
|
App.getComponent(view.getActivity()).inject(this);
|
||||||
@ -45,10 +54,24 @@ public class LibraryPresenter {
|
|||||||
view.getActivity().startActivity(intent);
|
view.getActivity().startActivity(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void initializeSearch() {
|
||||||
|
searchViewPublishSubject = PublishSubject.create();
|
||||||
|
searchViewSubscription = Observable.switchOnNext(searchViewPublishSubject)
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(Timber::w);
|
||||||
|
}
|
||||||
|
|
||||||
public void initializeMangas() {
|
public void initializeMangas() {
|
||||||
db.manga.get()
|
db.manga.get()
|
||||||
.observeOn(mainThread())
|
.observeOn(mainThread())
|
||||||
.subscribe(view::setMangas);
|
.subscribe(view::setMangas);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onQueryTextChange(String query) {
|
||||||
|
if (searchViewPublishSubject != null) {
|
||||||
|
searchViewPublishSubject.onNext(Observable.just(query));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ import eu.kanade.mangafeed.data.helpers.DatabaseHelper;
|
|||||||
import eu.kanade.mangafeed.data.models.Manga;
|
import eu.kanade.mangafeed.data.models.Manga;
|
||||||
import eu.kanade.mangafeed.view.MangaDetailView;
|
import eu.kanade.mangafeed.view.MangaDetailView;
|
||||||
|
|
||||||
public class MangaDetailPresenter {
|
public class MangaDetailPresenter extends BasePresenter {
|
||||||
|
|
||||||
private MangaDetailView view;
|
private MangaDetailView view;
|
||||||
|
|
||||||
@ -20,14 +20,6 @@ public class MangaDetailPresenter {
|
|||||||
App.getComponent(view.getActivity()).inject(this);
|
App.getComponent(view.getActivity()).inject(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onStart() {
|
|
||||||
EventBus.getDefault().registerSticky(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onStop() {
|
|
||||||
EventBus.getDefault().unregister(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onEventMainThread(Manga manga) {
|
public void onEventMainThread(Manga manga) {
|
||||||
view.loadManga(manga);
|
view.loadManga(manga);
|
||||||
initializeChapters(manga);
|
initializeChapters(manga);
|
||||||
|
@ -89,22 +89,6 @@ public class MainActivity extends BaseActivity {
|
|||||||
mSubscriptions.unsubscribe();
|
mSubscriptions.unsubscribe();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
|
||||||
getMenuInflater().inflate(R.menu.main, menu);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.action_github:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setFragment(Fragment fragment) {
|
private void setFragment(Fragment fragment) {
|
||||||
try {
|
try {
|
||||||
if (fragment != null && getSupportFragmentManager() != null) {
|
if (fragment != null && getSupportFragmentManager() != null) {
|
||||||
|
@ -32,6 +32,12 @@ public class MangaDetailActivity extends BaseActivity implements MangaDetailView
|
|||||||
@Bind(R.id.manga_chapters_list)
|
@Bind(R.id.manga_chapters_list)
|
||||||
ListView list_chapters;
|
ListView list_chapters;
|
||||||
|
|
||||||
|
public static Intent newIntent(Context context, Manga manga) {
|
||||||
|
Intent intent = new Intent(context, MangaDetailActivity.class);
|
||||||
|
MangaDetailPresenter.newIntent(manga);
|
||||||
|
return intent;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@ -42,44 +48,16 @@ public class MangaDetailActivity extends BaseActivity implements MangaDetailView
|
|||||||
setupToolbar(toolbar);
|
setupToolbar(toolbar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
|
||||||
// Inflate the menu; this adds items to the action bar if it is present.
|
|
||||||
getMenuInflater().inflate(R.menu.menu_manga_detail, menu);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
// Handle action bar item clicks here. The action bar will
|
|
||||||
// automatically handle clicks on the Home/Up button, so long
|
|
||||||
// as you specify a parent activity in AndroidManifest.xml.
|
|
||||||
int id = item.getItemId();
|
|
||||||
|
|
||||||
//noinspection SimplifiableIfStatement
|
|
||||||
if (id == R.id.action_settings) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Intent newIntent(Context context, Manga manga) {
|
|
||||||
Intent intent = new Intent(context, MangaDetailActivity.class);
|
|
||||||
MangaDetailPresenter.newIntent(manga);
|
|
||||||
return intent;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart() {
|
public void onStart() {
|
||||||
super.onStart();
|
super.onStart();
|
||||||
presenter.onStart();
|
presenter.registerForStickyEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStop() {
|
public void onStop() {
|
||||||
|
presenter.unregisterForEvents();
|
||||||
super.onStop();
|
super.onStop();
|
||||||
presenter.onStop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadManga(Manga manga) {
|
public void loadManga(Manga manga) {
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
package eu.kanade.mangafeed.ui.fragment;
|
||||||
|
|
||||||
|
import android.app.Fragment;
|
||||||
|
|
||||||
|
public class BaseFragment extends Fragment {
|
||||||
|
}
|
@ -1,8 +1,10 @@
|
|||||||
package eu.kanade.mangafeed.ui.fragment;
|
package eu.kanade.mangafeed.ui.fragment;
|
||||||
|
|
||||||
import android.app.Fragment;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.support.v7.widget.SearchView;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.GridView;
|
import android.widget.GridView;
|
||||||
@ -17,14 +19,16 @@ import eu.kanade.mangafeed.presenter.LibraryPresenter;
|
|||||||
import eu.kanade.mangafeed.ui.activity.MainActivity;
|
import eu.kanade.mangafeed.ui.activity.MainActivity;
|
||||||
import eu.kanade.mangafeed.ui.adapter.MangaLibraryHolder;
|
import eu.kanade.mangafeed.ui.adapter.MangaLibraryHolder;
|
||||||
import eu.kanade.mangafeed.view.LibraryView;
|
import eu.kanade.mangafeed.view.LibraryView;
|
||||||
|
import timber.log.Timber;
|
||||||
import uk.co.ribot.easyadapter.EasyAdapter;
|
import uk.co.ribot.easyadapter.EasyAdapter;
|
||||||
|
|
||||||
|
|
||||||
public class LibraryFragment extends Fragment implements LibraryView {
|
public class LibraryFragment extends BaseFragment implements LibraryView {
|
||||||
|
|
||||||
@Bind(R.id.gridView) GridView grid;
|
@Bind(R.id.gridView) GridView grid;
|
||||||
LibraryPresenter presenter;
|
LibraryPresenter presenter;
|
||||||
EasyAdapter<Manga> adapter;
|
EasyAdapter<Manga> adapter;
|
||||||
|
MainActivity activity;
|
||||||
|
|
||||||
public static LibraryFragment newInstance() {
|
public static LibraryFragment newInstance() {
|
||||||
LibraryFragment fragment = new LibraryFragment();
|
LibraryFragment fragment = new LibraryFragment();
|
||||||
@ -36,8 +40,10 @@ public class LibraryFragment extends Fragment implements LibraryView {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
|
||||||
presenter = new LibraryPresenter(this);
|
presenter = new LibraryPresenter(this);
|
||||||
|
activity = (MainActivity)getActivity();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -45,18 +51,49 @@ public class LibraryFragment extends Fragment implements LibraryView {
|
|||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
// Inflate the layout for this fragment
|
// Inflate the layout for this fragment
|
||||||
View view = inflater.inflate(R.layout.fragment_library, container, false);
|
View view = inflater.inflate(R.layout.fragment_library, container, false);
|
||||||
((MainActivity)getActivity()).setToolbarTitle(getString(R.string.library_title));
|
activity.setToolbarTitle(getString(R.string.library_title));
|
||||||
ButterKnife.bind(this, view);
|
ButterKnife.bind(this, view);
|
||||||
|
|
||||||
presenter.initializeMangas();
|
|
||||||
setMangaClickListener();
|
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityCreated(Bundle savedInstanceState) {
|
||||||
|
super.onActivityCreated(savedInstanceState);
|
||||||
|
|
||||||
|
setupToolbar();
|
||||||
|
setMangaClickListener();
|
||||||
|
presenter.initializeMangas();
|
||||||
|
presenter.initializeSearch();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
|
inflater.inflate(R.menu.library, menu);
|
||||||
|
initializeSearch(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initializeSearch(Menu menu) {
|
||||||
|
final SearchView sv = (SearchView) menu.findItem(R.id.action_search).getActionView();
|
||||||
|
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextSubmit(String query) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextChange(String newText) {
|
||||||
|
presenter.onQueryTextChange(newText);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// LibraryView
|
||||||
|
|
||||||
public void setMangas(List<Manga> mangas) {
|
public void setMangas(List<Manga> mangas) {
|
||||||
if (adapter == null) {
|
if (adapter == null) {
|
||||||
adapter = new EasyAdapter<Manga>(
|
adapter = new EasyAdapter<>(
|
||||||
getActivity(),
|
getActivity(),
|
||||||
MangaLibraryHolder.class,
|
MangaLibraryHolder.class,
|
||||||
mangas
|
mangas
|
||||||
@ -71,8 +108,12 @@ public class LibraryFragment extends Fragment implements LibraryView {
|
|||||||
private void setMangaClickListener() {
|
private void setMangaClickListener() {
|
||||||
grid.setOnItemClickListener(
|
grid.setOnItemClickListener(
|
||||||
(parent, view, position, id) ->
|
(parent, view, position, id) ->
|
||||||
presenter.onMangaClick(adapter, position)
|
presenter.onMangaClick(adapter, position)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupToolbar() {
|
||||||
|
//activity.getSupportActionBar().
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
BIN
app/src/main/res/drawable-hdpi/ic_action_refresh.png
Normal file
After Width: | Height: | Size: 422 B |
BIN
app/src/main/res/drawable-hdpi/ic_action_search.png
Normal file
After Width: | Height: | Size: 448 B |
BIN
app/src/main/res/drawable-mdpi/ic_action_refresh.png
Normal file
After Width: | Height: | Size: 276 B |
BIN
app/src/main/res/drawable-mdpi/ic_action_search.png
Normal file
After Width: | Height: | Size: 265 B |
BIN
app/src/main/res/drawable-xhdpi/ic_action_refresh.png
Normal file
After Width: | Height: | Size: 557 B |
BIN
app/src/main/res/drawable-xhdpi/ic_action_search.png
Normal file
After Width: | Height: | Size: 492 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_action_refresh.png
Normal file
After Width: | Height: | Size: 787 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_action_search.png
Normal file
After Width: | Height: | Size: 744 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_action_refresh.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
app/src/main/res/drawable-xxxhdpi/ic_action_search.png
Normal file
After Width: | Height: | Size: 967 B |
17
app/src/main/res/menu/library.xml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_search"
|
||||||
|
android:title="@string/action_search"
|
||||||
|
android:icon="@drawable/ic_action_search"
|
||||||
|
android:orderInCategory="100"
|
||||||
|
app:showAsAction="collapseActionView|ifRoom"
|
||||||
|
app:actionViewClass="android.support.v7.widget.SearchView"/>
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_refresh"
|
||||||
|
android:title="@string/action_refresh"
|
||||||
|
android:icon="@drawable/ic_action_refresh"
|
||||||
|
android:orderInCategory="1"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
</menu>
|
@ -1,6 +0,0 @@
|
|||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
|
|
||||||
<item android:id="@+id/action_github" android:title="@string/action_github"
|
|
||||||
android:orderInCategory="100" app:showAsAction="never" />
|
|
||||||
</menu>
|
|
@ -30,5 +30,8 @@
|
|||||||
|
|
||||||
<string name="hello_world">Hello world!</string>
|
<string name="hello_world">Hello world!</string>
|
||||||
<string name="action_settings">Settings</string>
|
<string name="action_settings">Settings</string>
|
||||||
|
<string name="action_search">Search</string>
|
||||||
|
<string name="action_refresh">Refresh</string>
|
||||||
|
<string name="library_search_hint">Title or author...</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|