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:
NoodleMage
2016-03-08 21:22:45 +01:00
committed by NoodleMage
parent 5b75818fc5
commit 98d420d5aa
32 changed files with 1062 additions and 276 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View 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)
}
}

View File

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