mirror of
https://github.com/mihonapp/mihon.git
synced 2025-06-25 18:47:51 +02:00
Rewrote nav drawer to Kotlin + UI updates
Added launch screen + new Header Removed MaterialDrawer library. Implemented Nav Draw from Support Library
This commit is contained in:
@ -24,6 +24,7 @@ import eu.kanade.tachiyomi.util.toast
|
||||
import eu.kanade.tachiyomi.widget.EndlessGridScrollListener
|
||||
import eu.kanade.tachiyomi.widget.EndlessListScrollListener
|
||||
import kotlinx.android.synthetic.main.fragment_catalogue.*
|
||||
import kotlinx.android.synthetic.main.toolbar.*
|
||||
import nucleus.factory.RequiresPresenter
|
||||
import rx.Subscription
|
||||
import rx.android.schedulers.AndroidSchedulers
|
||||
|
@ -28,7 +28,7 @@ class CatalogueGridHolder(private val view: View, adapter: CatalogueAdapter, lis
|
||||
view.title.text = manga.title
|
||||
|
||||
// Set visibility of in library icon.
|
||||
view.favorite_sticker.visibility = if (manga.favorite) View.VISIBLE else View.GONE
|
||||
// view.favorite_sticker.visibility = if (manga.favorite) View.VISIBLE else View.GONE
|
||||
|
||||
// Set alpha of thumbnail.
|
||||
view.thumbnail.alpha = if (manga.favorite) 0.3f else 1.0f
|
||||
|
@ -7,6 +7,9 @@ import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.download.DownloadService
|
||||
import eu.kanade.tachiyomi.data.download.model.Download
|
||||
import eu.kanade.tachiyomi.ui.base.fragment.BaseRxFragment
|
||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||
import eu.kanade.tachiyomi.util.setInformationDrawable
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
import kotlinx.android.synthetic.main.fragment_download_queue.*
|
||||
import nucleus.factory.RequiresPresenter
|
||||
import rx.Subscription
|
||||
@ -73,6 +76,9 @@ class DownloadFragment : BaseRxFragment<DownloadPresenter>() {
|
||||
override fun onViewCreated(view: View, savedState: Bundle?) {
|
||||
setToolbarTitle(R.string.label_download_queue)
|
||||
|
||||
// Check if download queue is empty and update information accordingly.
|
||||
setInformationView()
|
||||
|
||||
// Initialize adapter.
|
||||
adapter = DownloadAdapter(activity)
|
||||
recycler.adapter = adapter
|
||||
@ -138,6 +144,9 @@ class DownloadFragment : BaseRxFragment<DownloadPresenter>() {
|
||||
startButton?.isVisible = !running && !presenter.downloadQueue.isEmpty()
|
||||
pauseButton?.isVisible = running
|
||||
clearButton?.isVisible = running
|
||||
|
||||
// Check if download queue is empty and update information accordingly.
|
||||
setInformationView()
|
||||
}
|
||||
|
||||
/**
|
||||
@ -177,4 +186,14 @@ class DownloadFragment : BaseRxFragment<DownloadPresenter>() {
|
||||
return recycler.findViewHolderForItemId(download.chapter.id) as? DownloadHolder
|
||||
}
|
||||
|
||||
/**
|
||||
* Set information view when queue is empty
|
||||
*/
|
||||
private fun setInformationView() {
|
||||
if (presenter.downloadQueue.isEmpty()) {
|
||||
( activity as MainActivity).image_view.setInformationDrawable(R.drawable.ic_file_download_grey_128dp)
|
||||
( activity as MainActivity).text_label.text = getString(R.string.information_no_downloads)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,7 +20,9 @@ import eu.kanade.tachiyomi.ui.base.fragment.BaseRxFragment
|
||||
import eu.kanade.tachiyomi.ui.category.CategoryActivity
|
||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||
import eu.kanade.tachiyomi.util.inflate
|
||||
import eu.kanade.tachiyomi.util.setInformationDrawable
|
||||
import eu.kanade.tachiyomi.util.toast
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
import kotlinx.android.synthetic.main.fragment_library.*
|
||||
import nucleus.factory.RequiresPresenter
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
@ -124,7 +126,7 @@ class LibraryFragment : BaseRxFragment<LibraryPresenter>(), ActionMode.Callback
|
||||
override fun onViewCreated(view: View, savedState: Bundle?) {
|
||||
setToolbarTitle(getString(R.string.label_library))
|
||||
|
||||
appBar = (activity as MainActivity).appBar
|
||||
appBar = (activity as MainActivity).appbar
|
||||
tabs = appBar.inflate(R.layout.library_tab_layout) as TabLayout
|
||||
|
||||
// Workaround to prevent: Tab belongs to a different TabLayout.
|
||||
@ -257,6 +259,15 @@ class LibraryFragment : BaseRxFragment<LibraryPresenter>(), ActionMode.Callback
|
||||
* @param mangaMap a map containing the manga for each category.
|
||||
*/
|
||||
fun onNextLibraryUpdate(categories: List<Category>, mangaMap: Map<Int, List<Manga>>) {
|
||||
// Check if library is empty and update information accordingly.
|
||||
if (mangaMap.isEmpty()) {
|
||||
(activity as MainActivity).image_view.setInformationDrawable(R.drawable.ic_book_grey_128dp)
|
||||
(activity as MainActivity).text_label.text = getString(R.string.information_empty_library)
|
||||
} else {
|
||||
( activity as MainActivity).image_view.setInformationDrawable(null)
|
||||
( activity as MainActivity).text_label.text = ""
|
||||
}
|
||||
|
||||
// Get the current active category.
|
||||
val activeCat = if (adapter.categories != null) view_pager.currentItem else activeCategory
|
||||
|
||||
|
@ -1,220 +0,0 @@
|
||||
package eu.kanade.tachiyomi.ui.main;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.design.widget.AppBarLayout;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.support.v4.widget.DrawerLayout;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import com.mikepenz.materialdrawer.Drawer;
|
||||
import com.mikepenz.materialdrawer.DrawerBuilder;
|
||||
import com.mikepenz.materialdrawer.holder.ImageHolder;
|
||||
import com.mikepenz.materialdrawer.model.DividerDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
|
||||
|
||||
import butterknife.Bind;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.kanade.tachiyomi.R;
|
||||
import eu.kanade.tachiyomi.ui.base.activity.BaseActivity;
|
||||
import eu.kanade.tachiyomi.ui.catalogue.CatalogueFragment;
|
||||
import eu.kanade.tachiyomi.ui.download.DownloadFragment;
|
||||
import eu.kanade.tachiyomi.ui.library.LibraryFragment;
|
||||
import eu.kanade.tachiyomi.ui.recent.RecentChaptersFragment;
|
||||
import eu.kanade.tachiyomi.ui.setting.SettingsActivity;
|
||||
import icepick.State;
|
||||
import nucleus.view.ViewWithPresenter;
|
||||
|
||||
public class MainActivity extends BaseActivity {
|
||||
|
||||
@Bind(R.id.appbar) AppBarLayout appBar;
|
||||
@Bind(R.id.toolbar) Toolbar toolbar;
|
||||
@Bind(R.id.drawer_container) FrameLayout container;
|
||||
@State
|
||||
int selectedItem;
|
||||
private Drawer drawer;
|
||||
private FragmentStack fragmentStack;
|
||||
private int prevIdentifier = -1;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedState) {
|
||||
super.onCreate(savedState);
|
||||
|
||||
// Do not let the launcher create a new activity
|
||||
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
setContentView(R.layout.activity_main);
|
||||
ButterKnife.bind(this);
|
||||
|
||||
setupToolbar(toolbar);
|
||||
|
||||
fragmentStack = new FragmentStack(this, getSupportFragmentManager(), R.id.content_layout,
|
||||
fragment -> {
|
||||
if (fragment instanceof ViewWithPresenter)
|
||||
((ViewWithPresenter) fragment).getPresenter().destroy();
|
||||
});
|
||||
|
||||
drawer = new DrawerBuilder()
|
||||
.withActivity(this)
|
||||
.withRootView(container)
|
||||
.withToolbar(toolbar)
|
||||
.withActionBarDrawerToggleAnimated(true)
|
||||
.withOnDrawerNavigationListener(view -> {
|
||||
if (fragmentStack.size() > 1) {
|
||||
onBackPressed();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
})
|
||||
.addDrawerItems(
|
||||
new PrimaryDrawerItem()
|
||||
.withName(R.string.label_library)
|
||||
.withIdentifier(R.id.nav_drawer_library)
|
||||
.withIcon(ContextCompat.getDrawable(this, R.drawable.ic_book_grey_24dp)),
|
||||
new PrimaryDrawerItem()
|
||||
.withName(R.string.label_recent_updates)
|
||||
.withIdentifier(R.id.nav_drawer_recent_updates)
|
||||
.withIcon(ContextCompat.getDrawable(this, R.drawable.ic_history_grey_24dp)),
|
||||
new PrimaryDrawerItem()
|
||||
.withName(R.string.label_catalogues)
|
||||
.withIdentifier(R.id.nav_drawer_catalogues)
|
||||
.withIcon(ContextCompat.getDrawable(this, R.drawable.ic_explore_grey_24dp)),
|
||||
new PrimaryDrawerItem()
|
||||
.withName(R.string.label_download_queue)
|
||||
.withIdentifier(R.id.nav_drawer_downloads)
|
||||
.withIcon(ContextCompat.getDrawable(this, R.drawable.ic_file_download_grey_24dp)),
|
||||
new DividerDrawerItem(),
|
||||
new PrimaryDrawerItem()
|
||||
.withName(R.string.label_settings)
|
||||
.withIdentifier(R.id.nav_drawer_settings)
|
||||
.withSelectable(false)
|
||||
.withIcon(ContextCompat.getDrawable(this, R.drawable.ic_settings_grey_24dp))
|
||||
)
|
||||
.withSavedInstance(savedState)
|
||||
.withOnDrawerItemClickListener(
|
||||
(view, position, drawerItem) -> {
|
||||
if (drawerItem != null) {
|
||||
int identifier = drawerItem.getIdentifier();
|
||||
if (prevIdentifier != -1)
|
||||
setIconBackToGrey(prevIdentifier, identifier);
|
||||
prevIdentifier = identifier;
|
||||
|
||||
switch (identifier) {
|
||||
case R.id.nav_drawer_library:
|
||||
drawer.updateIcon(identifier, new ImageHolder(ContextCompat.getDrawable(this, R.drawable.ic_book_blue_24dp)));
|
||||
setFragment(LibraryFragment.newInstance());
|
||||
break;
|
||||
case R.id.nav_drawer_recent_updates:
|
||||
drawer.updateIcon(identifier, new ImageHolder(ContextCompat.getDrawable(this, R.drawable.ic_history_blue_24dp)));
|
||||
setFragment(RecentChaptersFragment.newInstance());
|
||||
break;
|
||||
case R.id.nav_drawer_catalogues:
|
||||
drawer.updateIcon(identifier, new ImageHolder(ContextCompat.getDrawable(this, R.drawable.ic_explore_blue_24dp)));
|
||||
setFragment(CatalogueFragment.newInstance());
|
||||
break;
|
||||
case R.id.nav_drawer_downloads:
|
||||
drawer.updateIcon(identifier, new ImageHolder(ContextCompat.getDrawable(this, R.drawable.ic_file_download_blue_24dp)));
|
||||
setFragment(DownloadFragment.newInstance());
|
||||
break;
|
||||
case R.id.nav_drawer_settings:
|
||||
startActivity(new Intent(this, SettingsActivity.class));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
)
|
||||
.build();
|
||||
|
||||
if (savedState != null) {
|
||||
// Recover icon state after rotation
|
||||
if (fragmentStack.size() > 1) {
|
||||
showBackArrow();
|
||||
}
|
||||
|
||||
// Set saved selection
|
||||
drawer.setSelection(selectedItem, false);
|
||||
} else {
|
||||
// Set default selection
|
||||
drawer.setSelection(R.id.nav_drawer_library);
|
||||
}
|
||||
}
|
||||
|
||||
private void setIconBackToGrey(int prevIdentifier, int identifier) {
|
||||
// Don't set to grey when settings
|
||||
if (identifier == R.id.nav_drawer_settings)
|
||||
return;
|
||||
|
||||
switch (prevIdentifier) {
|
||||
case R.id.nav_drawer_library:
|
||||
drawer.updateIcon(prevIdentifier, new ImageHolder(ContextCompat.getDrawable(this, R.drawable.ic_book_grey_24dp)));
|
||||
break;
|
||||
case R.id.nav_drawer_recent_updates:
|
||||
drawer.updateIcon(prevIdentifier, new ImageHolder(ContextCompat.getDrawable(this, R.drawable.ic_history_grey_24dp)));
|
||||
break;
|
||||
case R.id.nav_drawer_catalogues:
|
||||
drawer.updateIcon(prevIdentifier, new ImageHolder(ContextCompat.getDrawable(this, R.drawable.ic_explore_grey_24dp)));
|
||||
break;
|
||||
case R.id.nav_drawer_downloads:
|
||||
drawer.updateIcon(prevIdentifier, new ImageHolder(ContextCompat.getDrawable(this, R.drawable.ic_file_download_grey_24dp)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
selectedItem = drawer.getCurrentSelection();
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
|
||||
public void setFragment(Fragment fragment) {
|
||||
fragmentStack.replace(fragment);
|
||||
}
|
||||
|
||||
public void pushFragment(Fragment fragment) {
|
||||
fragmentStack.push(fragment);
|
||||
if (fragmentStack.size() > 1) {
|
||||
showBackArrow();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (!fragmentStack.pop()) {
|
||||
super.onBackPressed();
|
||||
} else if (fragmentStack.size() == 1) {
|
||||
showHamburgerIcon();
|
||||
drawer.getActionBarDrawerToggle().syncState();
|
||||
}
|
||||
}
|
||||
|
||||
private void showHamburgerIcon() {
|
||||
if (getSupportActionBar() != null) {
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
|
||||
drawer.getActionBarDrawerToggle().setDrawerIndicatorEnabled(true);
|
||||
drawer.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
|
||||
}
|
||||
}
|
||||
|
||||
private void showBackArrow() {
|
||||
if (getSupportActionBar() != null) {
|
||||
drawer.getActionBarDrawerToggle().setDrawerIndicatorEnabled(false);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
drawer.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
|
||||
}
|
||||
}
|
||||
|
||||
public Toolbar getToolbar() {
|
||||
return toolbar;
|
||||
}
|
||||
|
||||
public AppBarLayout getAppBar() {
|
||||
return appBar;
|
||||
}
|
||||
|
||||
}
|
101
app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
Normal file
101
app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
Normal file
@ -0,0 +1,101 @@
|
||||
package eu.kanade.tachiyomi.ui.main
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.Fragment
|
||||
import android.support.v4.view.GravityCompat
|
||||
import android.view.MenuItem
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.ui.base.activity.BaseActivity
|
||||
import eu.kanade.tachiyomi.ui.catalogue.CatalogueFragment
|
||||
import eu.kanade.tachiyomi.ui.download.DownloadFragment
|
||||
import eu.kanade.tachiyomi.ui.library.LibraryFragment
|
||||
import eu.kanade.tachiyomi.ui.recent.RecentChaptersFragment
|
||||
import eu.kanade.tachiyomi.ui.setting.SettingsActivity
|
||||
import eu.kanade.tachiyomi.util.setInformationDrawable
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
import kotlinx.android.synthetic.main.toolbar.*
|
||||
import nucleus.view.ViewWithPresenter
|
||||
|
||||
class MainActivity : BaseActivity() {
|
||||
lateinit var fragmentStack: FragmentStack
|
||||
|
||||
|
||||
override fun onCreate(savedState: Bundle?) {
|
||||
setTheme(R.style.AppTheme);
|
||||
super.onCreate(savedState)
|
||||
|
||||
// Do not let the launcher create a new activity
|
||||
if (intent.flags and Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT != 0) {
|
||||
finish()
|
||||
return
|
||||
}
|
||||
|
||||
// Inflate activity_edit_categories.xml.
|
||||
setContentView(R.layout.activity_main)
|
||||
|
||||
// Handle Toolbar
|
||||
setupToolbar(toolbar)
|
||||
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp)
|
||||
|
||||
fragmentStack = FragmentStack(this, supportFragmentManager, R.id.frame_container
|
||||
) { fragment ->
|
||||
if (fragment is ViewWithPresenter<*>)
|
||||
fragment.presenter.destroy()
|
||||
}
|
||||
|
||||
// Set behavior of Navigation drawer
|
||||
nav_view.setNavigationItemSelectedListener(
|
||||
{ menuItem ->
|
||||
// Make information view invisible
|
||||
image_view.setInformationDrawable(null)
|
||||
text_label.text = ""
|
||||
|
||||
when (menuItem.itemId) {
|
||||
R.id.nav_drawer_library -> {
|
||||
setFragment(LibraryFragment.newInstance())
|
||||
menuItem.isChecked = true
|
||||
drawer.closeDrawer(GravityCompat.START)
|
||||
}
|
||||
R.id.nav_drawer_recent_updates -> {
|
||||
setFragment(RecentChaptersFragment.newInstance())
|
||||
menuItem.isChecked = true
|
||||
drawer.closeDrawer(GravityCompat.START)
|
||||
}
|
||||
R.id.nav_drawer_catalogues -> {
|
||||
setFragment(CatalogueFragment.newInstance())
|
||||
menuItem.isChecked = true
|
||||
drawer.closeDrawer(GravityCompat.START)
|
||||
}
|
||||
R.id.nav_drawer_downloads -> {
|
||||
setFragment(DownloadFragment.newInstance())
|
||||
menuItem.isChecked = true
|
||||
drawer.closeDrawer(GravityCompat.START)
|
||||
}
|
||||
R.id.nav_drawer_settings -> {
|
||||
menuItem.isChecked = true
|
||||
startActivity(Intent(this, SettingsActivity::class.java))
|
||||
drawer.closeDrawer(GravityCompat.START)
|
||||
}
|
||||
}
|
||||
true
|
||||
})
|
||||
|
||||
setFragment(LibraryFragment.newInstance())
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
when (item.itemId) {
|
||||
android.R.id.home -> {
|
||||
drawer.openDrawer(GravityCompat.START)
|
||||
return true
|
||||
}
|
||||
}
|
||||
return super.onOptionsItemSelected(item)
|
||||
}
|
||||
|
||||
|
||||
fun setFragment(fragment: Fragment) {
|
||||
fragmentStack.replace(fragment)
|
||||
}
|
||||
}
|
@ -15,7 +15,10 @@ import eu.kanade.tachiyomi.data.download.model.Download
|
||||
import eu.kanade.tachiyomi.ui.base.adapter.FlexibleViewHolder
|
||||
import eu.kanade.tachiyomi.ui.base.decoration.DividerItemDecoration
|
||||
import eu.kanade.tachiyomi.ui.base.fragment.BaseRxFragment
|
||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||
import eu.kanade.tachiyomi.util.setInformationDrawable
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
import kotlinx.android.synthetic.main.fragment_recent_chapters.*
|
||||
import nucleus.factory.RequiresPresenter
|
||||
import rx.Observable
|
||||
@ -75,6 +78,11 @@ class RecentChaptersFragment : BaseRxFragment<RecentChaptersPresenter>(), Flexib
|
||||
|
||||
// Update toolbar text
|
||||
setToolbarTitle(R.string.label_recent_updates)
|
||||
|
||||
// Check if recent chapters is empty and update information accordingly.
|
||||
(activity as MainActivity).image_view.setInformationDrawable(R.drawable.ic_history_grey_128dp)
|
||||
(activity as MainActivity).text_label.text = getString(R.string.information_no_recent)
|
||||
(activity as MainActivity).information_layout.bringToFront()
|
||||
}
|
||||
|
||||
/**
|
||||
@ -121,6 +129,10 @@ class RecentChaptersFragment : BaseRxFragment<RecentChaptersPresenter>(), Flexib
|
||||
* @param chapters list of chapters
|
||||
*/
|
||||
fun onNextMangaChapters(chapters: List<Any>) {
|
||||
if (!chapters.isEmpty()) {
|
||||
( activity as MainActivity).image_view.setInformationDrawable(null)
|
||||
( activity as MainActivity).text_label.text = ""
|
||||
}
|
||||
adapter.setItems(chapters)
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user