mirror of
https://github.com/mihonapp/mihon.git
synced 2025-06-25 18:47:51 +02:00
Rewrote Theme
This commit is contained in:
@ -7,6 +7,7 @@ import org.acra.ACRA;
|
||||
import org.acra.annotation.ReportsCrashes;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper;
|
||||
import eu.kanade.tachiyomi.injection.ComponentReflectionInjector;
|
||||
import eu.kanade.tachiyomi.injection.component.AppComponent;
|
||||
import eu.kanade.tachiyomi.injection.component.DaggerAppComponent;
|
||||
@ -24,6 +25,8 @@ public class App extends Application {
|
||||
AppComponent applicationComponent;
|
||||
ComponentReflectionInjector<AppComponent> componentInjector;
|
||||
|
||||
private int theme = 0;
|
||||
|
||||
public static App get(Context context) {
|
||||
return (App) context.getApplicationContext();
|
||||
}
|
||||
@ -38,10 +41,15 @@ public class App extends Application {
|
||||
componentInjector =
|
||||
new ComponentReflectionInjector<>(AppComponent.class, applicationComponent);
|
||||
|
||||
setupTheme();
|
||||
setupEventBus();
|
||||
setupAcra();
|
||||
}
|
||||
|
||||
private void setupTheme() {
|
||||
theme = PreferencesHelper.getTheme(this);
|
||||
}
|
||||
|
||||
protected DaggerAppComponent.Builder prepareAppComponent() {
|
||||
return DaggerAppComponent.builder()
|
||||
.appModule(new AppModule(this));
|
||||
@ -65,4 +73,12 @@ public class App extends Application {
|
||||
public ComponentReflectionInjector<AppComponent> getComponentReflection() {
|
||||
return componentInjector;
|
||||
}
|
||||
|
||||
public int getAppTheme() {
|
||||
return theme;
|
||||
}
|
||||
|
||||
public void setAppTheme(int theme) {
|
||||
this.theme = theme;
|
||||
}
|
||||
}
|
||||
|
@ -49,6 +49,12 @@ class PreferencesHelper(private val context: Context) {
|
||||
return PreferenceManager.getDefaultSharedPreferences(context).getInt(
|
||||
context.getString(R.string.pref_library_update_interval_key), 0)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getTheme(context: Context): Int {
|
||||
return PreferenceManager.getDefaultSharedPreferences(context).getInt(
|
||||
context.getString(R.string.pref_theme_key), 1)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getKey(keyResource: Int): String {
|
||||
|
@ -10,7 +10,6 @@ import android.view.View
|
||||
import android.widget.TextView
|
||||
import eu.kanade.tachiyomi.App
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.injection.component.AppComponent
|
||||
import icepick.Icepick
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
|
||||
@ -31,6 +30,13 @@ open class BaseActivity : AppCompatActivity() {
|
||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||
}
|
||||
|
||||
fun setAppTheme() {
|
||||
when (app.appTheme) {
|
||||
2 -> setTheme(R.style.Theme_Tachiyomi_Dark)
|
||||
else -> setTheme(R.style.Theme_Tachiyomi)
|
||||
}
|
||||
}
|
||||
|
||||
fun setToolbarTitle(title: String) {
|
||||
supportActionBar?.title = title
|
||||
}
|
||||
@ -83,7 +89,7 @@ open class BaseActivity : AppCompatActivity() {
|
||||
snack.show()
|
||||
}
|
||||
|
||||
protected val applicationComponent: AppComponent
|
||||
get() = App.get(this).component
|
||||
protected val app: App
|
||||
get() = App.get(this)
|
||||
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package eu.kanade.tachiyomi.ui.base.fragment;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
|
||||
import eu.kanade.tachiyomi.App;
|
||||
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter;
|
||||
@ -83,6 +84,12 @@ public abstract class BaseRxFragment<P extends Presenter> extends BaseFragment i
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
presenterDelegate.onPause(getActivity().isFinishing());
|
||||
presenterDelegate.onPause(getActivity().isFinishing() || shouldDestroyPresenter(this));
|
||||
}
|
||||
|
||||
private boolean shouldDestroyPresenter(Fragment fragment) {
|
||||
if (fragment == null) return false;
|
||||
else return fragment.isRemoving() || shouldDestroyPresenter(fragment.getParentFragment());
|
||||
}
|
||||
|
||||
}
|
@ -1,7 +1,6 @@
|
||||
package eu.kanade.tachiyomi.ui.catalogue
|
||||
|
||||
import android.os.Bundle
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.support.v7.widget.GridLayoutManager
|
||||
import android.support.v7.widget.LinearLayoutManager
|
||||
import android.support.v7.widget.SearchView
|
||||
@ -20,6 +19,7 @@ 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.manga.MangaActivity
|
||||
import eu.kanade.tachiyomi.util.getResourceDrawable
|
||||
import eu.kanade.tachiyomi.util.toast
|
||||
import eu.kanade.tachiyomi.widget.EndlessGridScrollListener
|
||||
import eu.kanade.tachiyomi.widget.EndlessListScrollListener
|
||||
@ -155,8 +155,7 @@ class CatalogueFragment : BaseRxFragment<CataloguePresenter>(), FlexibleViewHold
|
||||
catalogue_list.adapter = adapter
|
||||
catalogue_list.layoutManager = llm
|
||||
catalogue_list.addOnScrollListener(listScrollListener)
|
||||
catalogue_list.addItemDecoration(DividerItemDecoration(
|
||||
ContextCompat.getDrawable(context, R.drawable.line_divider)))
|
||||
catalogue_list.addItemDecoration(DividerItemDecoration(context.theme.getResourceDrawable(R.attr.divider_drawable)))
|
||||
|
||||
if (presenter.isListMode) {
|
||||
switcher.showNext()
|
||||
|
@ -27,9 +27,6 @@ class CatalogueGridHolder(private val view: View, adapter: CatalogueAdapter, lis
|
||||
// Set manga title
|
||||
view.title.text = manga.title
|
||||
|
||||
// Set visibility of in library icon.
|
||||
// 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
|
||||
|
||||
|
@ -1,9 +1,8 @@
|
||||
package eu.kanade.tachiyomi.ui.catalogue
|
||||
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.view.View
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.util.getResourceColor
|
||||
import kotlinx.android.synthetic.main.item_catalogue_list.view.*
|
||||
|
||||
/**
|
||||
@ -18,8 +17,8 @@ import kotlinx.android.synthetic.main.item_catalogue_list.view.*
|
||||
class CatalogueListHolder(private val view: View, adapter: CatalogueAdapter, listener: OnListItemClickListener) :
|
||||
CatalogueHolder(view, adapter, listener) {
|
||||
|
||||
private val favoriteColor = ContextCompat.getColor(view.context, R.color.hint_text)
|
||||
private val unfavoriteColor = ContextCompat.getColor(view.context, R.color.primary_text)
|
||||
private val favoriteColor = view.context.theme.getResourceColor(android.R.attr.textColorHint)
|
||||
private val unfavoriteColor = view.context.theme.getResourceColor(android.R.attr.textColorPrimary)
|
||||
|
||||
/**
|
||||
* Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this
|
||||
|
@ -57,6 +57,7 @@ class CategoryActivity : BaseRxActivity<CategoryPresenter>(), ActionMode.Callbac
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
setAppTheme()
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
// Inflate activity_edit_categories.xml.
|
||||
|
@ -8,8 +8,6 @@ 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
|
||||
@ -63,8 +61,8 @@ class DownloadFragment : BaseRxFragment<DownloadPresenter>() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(bundle: Bundle?) {
|
||||
super.onCreate(bundle)
|
||||
override fun onCreate(savedState: Bundle?) {
|
||||
super.onCreate(savedState)
|
||||
setHasOptionsMenu(true)
|
||||
}
|
||||
|
||||
@ -190,10 +188,8 @@ class DownloadFragment : BaseRxFragment<DownloadPresenter>() {
|
||||
* 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)
|
||||
}
|
||||
(activity as MainActivity).updateEmptyView(presenter.downloadQueue.isEmpty(),
|
||||
R.string.information_no_downloads, R.drawable.ic_file_download_black_128dp)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,7 +20,6 @@ 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.*
|
||||
@ -51,7 +50,8 @@ class LibraryFragment : BaseRxFragment<LibraryPresenter>(), ActionMode.Callback
|
||||
/**
|
||||
* AppBarLayout from [MainActivity].
|
||||
*/
|
||||
private lateinit var appBar: AppBarLayout
|
||||
private val appbar: AppBarLayout
|
||||
get() = (activity as MainActivity).appbar
|
||||
|
||||
/**
|
||||
* Position of the active category.
|
||||
@ -112,8 +112,8 @@ class LibraryFragment : BaseRxFragment<LibraryPresenter>(), ActionMode.Callback
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
override fun onCreate(savedState: Bundle?) {
|
||||
super.onCreate(savedState)
|
||||
setHasOptionsMenu(true)
|
||||
isFilterDownloaded = presenter.preferences.filterDownloaded().get() as Boolean
|
||||
isFilterUnread = presenter.preferences.filterUnread().get() as Boolean
|
||||
@ -126,17 +126,9 @@ class LibraryFragment : BaseRxFragment<LibraryPresenter>(), ActionMode.Callback
|
||||
override fun onViewCreated(view: View, savedState: Bundle?) {
|
||||
setToolbarTitle(getString(R.string.label_library))
|
||||
|
||||
appBar = (activity as MainActivity).appbar
|
||||
tabs = appBar.inflate(R.layout.library_tab_layout) as TabLayout
|
||||
tabs = appbar.inflate(R.layout.library_tab_layout) as TabLayout
|
||||
|
||||
// Workaround to prevent: Tab belongs to a different TabLayout.
|
||||
// Internal bug in Support library v23.2.0.
|
||||
// See https://code.google.com/p/android/issues/detail?id=201827
|
||||
for (j in 0..16) {
|
||||
tabs.newTab()
|
||||
}
|
||||
|
||||
appBar.addView(tabs)
|
||||
appbar.addView(tabs)
|
||||
|
||||
adapter = LibraryAdapter(childFragmentManager)
|
||||
view_pager.adapter = adapter
|
||||
@ -150,14 +142,14 @@ class LibraryFragment : BaseRxFragment<LibraryPresenter>(), ActionMode.Callback
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
appBar.removeView(tabs)
|
||||
appbar.removeView(tabs)
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(bundle: Bundle) {
|
||||
bundle.putInt(CATEGORY_KEY, view_pager.currentItem)
|
||||
bundle.putString(QUERY_KEY, query)
|
||||
super.onSaveInstanceState(bundle)
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
outState.putInt(CATEGORY_KEY, view_pager.currentItem)
|
||||
outState.putString(QUERY_KEY, query)
|
||||
super.onSaveInstanceState(outState)
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||
@ -260,13 +252,8 @@ class LibraryFragment : BaseRxFragment<LibraryPresenter>(), ActionMode.Callback
|
||||
*/
|
||||
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 = ""
|
||||
}
|
||||
(activity as MainActivity).updateEmptyView(mangaMap.isEmpty(),
|
||||
R.string.information_empty_library, R.drawable.ic_book_black_128dp)
|
||||
|
||||
// Get the current active category.
|
||||
val activeCat = if (adapter.categories != null) view_pager.currentItem else activeCategory
|
||||
|
@ -1,179 +0,0 @@
|
||||
package eu.kanade.tachiyomi.ui.main;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import eu.kanade.tachiyomi.R;
|
||||
|
||||
/**
|
||||
* Why this class is needed.
|
||||
*
|
||||
* FragmentManager does not supply a developer with a fragment stack.
|
||||
* It gives us a fragment *transaction* stack.
|
||||
*
|
||||
* To be sane, we need *fragment* stack.
|
||||
*
|
||||
* This implementation also handles NucleusSupportFragment presenter`s lifecycle correctly.
|
||||
*/
|
||||
public class FragmentStack {
|
||||
|
||||
public interface OnBackPressedHandlingFragment {
|
||||
boolean onBackPressed();
|
||||
}
|
||||
|
||||
public interface OnFragmentRemovedListener {
|
||||
void onFragmentRemoved(Fragment fragment);
|
||||
}
|
||||
|
||||
private Activity activity;
|
||||
private FragmentManager manager;
|
||||
private int containerId;
|
||||
@Nullable private OnFragmentRemovedListener onFragmentRemovedListener;
|
||||
|
||||
public FragmentStack(Activity activity, FragmentManager manager, int containerId, @Nullable OnFragmentRemovedListener onFragmentRemovedListener) {
|
||||
this.activity = activity;
|
||||
this.manager = manager;
|
||||
this.containerId = containerId;
|
||||
this.onFragmentRemovedListener = onFragmentRemovedListener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of fragments in the stack.
|
||||
*
|
||||
* @return the number of fragments in the stack.
|
||||
*/
|
||||
public int size() {
|
||||
return getFragments().size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes a fragment to the top of the stack.
|
||||
*/
|
||||
public void push(Fragment fragment) {
|
||||
|
||||
Fragment top = peek();
|
||||
if (top != null) {
|
||||
manager.beginTransaction()
|
||||
.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right)
|
||||
.remove(top)
|
||||
.add(containerId, fragment, indexToTag(manager.getBackStackEntryCount() + 1))
|
||||
.addToBackStack(null)
|
||||
.commit();
|
||||
}
|
||||
else {
|
||||
manager.beginTransaction()
|
||||
.add(containerId, fragment, indexToTag(0))
|
||||
.commit();
|
||||
}
|
||||
|
||||
manager.executePendingTransactions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Pops the top item if the stack.
|
||||
* If the fragment implements {@link OnBackPressedHandlingFragment}, calls {@link OnBackPressedHandlingFragment#onBackPressed()} instead.
|
||||
* If {@link OnBackPressedHandlingFragment#onBackPressed()} returns false the fragment gets popped.
|
||||
*
|
||||
* @return true if a fragment has been popped or if {@link OnBackPressedHandlingFragment#onBackPressed()} returned true;
|
||||
*/
|
||||
public boolean back() {
|
||||
Fragment top = peek();
|
||||
if (top instanceof OnBackPressedHandlingFragment) {
|
||||
if (((OnBackPressedHandlingFragment)top).onBackPressed())
|
||||
return true;
|
||||
}
|
||||
return pop();
|
||||
}
|
||||
|
||||
/**
|
||||
* Pops the topmost fragment from the stack.
|
||||
* The lowest fragment can't be popped, it can only be replaced.
|
||||
*
|
||||
* @return false if the stack can't pop or true if a top fragment has been popped.
|
||||
*/
|
||||
public boolean pop() {
|
||||
if (manager.getBackStackEntryCount() == 0)
|
||||
return false;
|
||||
Fragment top = peek();
|
||||
manager.popBackStackImmediate();
|
||||
if (onFragmentRemovedListener != null)
|
||||
onFragmentRemovedListener.onFragmentRemoved(top);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces stack contents with just one fragment.
|
||||
*/
|
||||
public void replace(Fragment fragment) {
|
||||
List<Fragment> fragments = getFragments();
|
||||
|
||||
manager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
|
||||
manager.beginTransaction()
|
||||
.replace(containerId, fragment, indexToTag(0))
|
||||
.commit();
|
||||
manager.executePendingTransactions();
|
||||
|
||||
if (onFragmentRemovedListener != null) {
|
||||
for (Fragment fragment1 : fragments)
|
||||
onFragmentRemovedListener.onFragmentRemoved(fragment1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the topmost fragment in the stack.
|
||||
*/
|
||||
public Fragment peek() {
|
||||
return manager.findFragmentById(containerId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a back fragment if the fragment is of given class.
|
||||
* If such fragment does not exist and activity implements the given class then the activity will be returned.
|
||||
*
|
||||
* @param fragment a fragment to search from.
|
||||
* @param callbackType a class of type for callback to search.
|
||||
* @param <T> a type of callback.
|
||||
* @return a back fragment or activity.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T> T findCallback(Fragment fragment, Class<T> callbackType) {
|
||||
|
||||
Fragment back = getBackFragment(fragment);
|
||||
|
||||
if (back != null && callbackType.isAssignableFrom(back.getClass()))
|
||||
return (T)back;
|
||||
|
||||
if (callbackType.isAssignableFrom(activity.getClass()))
|
||||
return (T)activity;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private Fragment getBackFragment(Fragment fragment) {
|
||||
List<Fragment> fragments = getFragments();
|
||||
for (int f = fragments.size() - 1; f >= 0; f--) {
|
||||
if (fragments.get(f) == fragment && f > 0)
|
||||
return fragments.get(f - 1);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<Fragment> getFragments() {
|
||||
List<Fragment> fragments = new ArrayList<>(manager.getBackStackEntryCount() + 1);
|
||||
for (int i = 0; i < manager.getBackStackEntryCount() + 1; i++) {
|
||||
Fragment fragment = manager.findFragmentByTag(indexToTag(i));
|
||||
if (fragment != null)
|
||||
fragments.add(fragment);
|
||||
}
|
||||
return fragments;
|
||||
}
|
||||
|
||||
private String indexToTag(int index) {
|
||||
return Integer.toString(index);
|
||||
}
|
||||
}
|
@ -1,10 +1,13 @@
|
||||
package eu.kanade.tachiyomi.ui.main
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.Fragment
|
||||
import android.support.v4.view.GravityCompat
|
||||
import android.support.v4.widget.DrawerLayout
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.ui.base.activity.BaseActivity
|
||||
import eu.kanade.tachiyomi.ui.catalogue.CatalogueFragment
|
||||
@ -12,17 +15,15 @@ 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 eu.kanade.tachiyomi.util.getResourceColor
|
||||
import eu.kanade.tachiyomi.util.setDrawableCompat
|
||||
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);
|
||||
setAppTheme()
|
||||
super.onCreate(savedState)
|
||||
|
||||
// Do not let the launcher create a new activity
|
||||
@ -38,64 +39,78 @@ class MainActivity : BaseActivity() {
|
||||
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()
|
||||
}
|
||||
drawer.addDrawerListener(object : DrawerLayout.SimpleDrawerListener() {
|
||||
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {
|
||||
if (Build.VERSION.SDK_INT >= 21) {
|
||||
window.statusBarColor = theme.getResourceColor(R.attr.status_bar_trans)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDrawerClosed(drawerView: View) {
|
||||
if (Build.VERSION.SDK_INT >= 21) {
|
||||
window.statusBarColor = theme.getResourceColor(R.attr.colorPrimaryDark)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// Set behavior of Navigation drawer
|
||||
nav_view.setNavigationItemSelectedListener(
|
||||
{ menuItem ->
|
||||
// Make information view invisible
|
||||
image_view.setInformationDrawable(null)
|
||||
text_label.text = ""
|
||||
nav_view.setNavigationItemSelectedListener { item ->
|
||||
// Make information view invisible
|
||||
image_view.setDrawableCompat(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
|
||||
})
|
||||
when (item.itemId) {
|
||||
R.id.nav_drawer_library -> {
|
||||
setFragment(LibraryFragment.newInstance())
|
||||
item.isChecked = true
|
||||
}
|
||||
R.id.nav_drawer_recent_updates -> {
|
||||
setFragment(RecentChaptersFragment.newInstance())
|
||||
item.isChecked = true
|
||||
}
|
||||
R.id.nav_drawer_catalogues -> {
|
||||
setFragment(CatalogueFragment.newInstance())
|
||||
item.isChecked = true
|
||||
}
|
||||
R.id.nav_drawer_downloads -> {
|
||||
setFragment(DownloadFragment.newInstance())
|
||||
item.isChecked = true
|
||||
}
|
||||
R.id.nav_drawer_settings -> {
|
||||
item.isChecked = false
|
||||
startActivity(Intent(this, SettingsActivity::class.java))
|
||||
}
|
||||
}
|
||||
drawer.closeDrawer(GravityCompat.START)
|
||||
true
|
||||
}
|
||||
|
||||
setFragment(LibraryFragment.newInstance())
|
||||
if (savedState == null) {
|
||||
setFragment(LibraryFragment.newInstance())
|
||||
}
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
when (item.itemId) {
|
||||
android.R.id.home -> {
|
||||
drawer.openDrawer(GravityCompat.START)
|
||||
return true
|
||||
}
|
||||
android.R.id.home -> drawer.openDrawer(GravityCompat.START)
|
||||
else -> return super.onOptionsItemSelected(item)
|
||||
}
|
||||
return super.onOptionsItemSelected(item)
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
fun setFragment(fragment: Fragment) {
|
||||
fragmentStack.replace(fragment)
|
||||
supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.frame_container, fragment)
|
||||
.commit()
|
||||
}
|
||||
}
|
||||
|
||||
fun updateEmptyView(show: Boolean, textResource: Int, drawable: Int) {
|
||||
if (show) {
|
||||
image_view.setDrawableCompat(drawable)
|
||||
text_label.text = getString(textResource)
|
||||
} else {
|
||||
image_view.setDrawableCompat(null)
|
||||
text_label.text = ""
|
||||
}
|
||||
}
|
||||
}
|
@ -48,6 +48,7 @@ class MangaActivity : BaseRxActivity<MangaPresenter>() {
|
||||
private set
|
||||
|
||||
override fun onCreate(savedState: Bundle?) {
|
||||
setAppTheme()
|
||||
super.onCreate(savedState)
|
||||
setContentView(R.layout.activity_manga)
|
||||
|
||||
|
@ -17,6 +17,7 @@ import eu.kanade.tachiyomi.ui.base.decoration.DividerItemDecoration
|
||||
import eu.kanade.tachiyomi.ui.base.fragment.BaseRxFragment
|
||||
import eu.kanade.tachiyomi.ui.manga.MangaActivity
|
||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||
import eu.kanade.tachiyomi.util.getResourceDrawable
|
||||
import eu.kanade.tachiyomi.util.toast
|
||||
import kotlinx.android.synthetic.main.fragment_manga_chapters.*
|
||||
import nucleus.factory.RequiresPresenter
|
||||
@ -65,7 +66,7 @@ class ChaptersFragment : BaseRxFragment<ChaptersPresenter>(), ActionMode.Callbac
|
||||
recycler.adapter = adapter
|
||||
recycler.layoutManager = LinearLayoutManager(activity)
|
||||
recycler.addItemDecoration(DividerItemDecoration(
|
||||
ContextCompat.getDrawable(context, R.drawable.line_divider)))
|
||||
context.theme.getResourceDrawable(R.attr.divider_drawable)))
|
||||
recycler.setHasFixedSize(true)
|
||||
|
||||
swipe_refresh.setOnRefreshListener { fetchChapters() }
|
||||
|
@ -9,6 +9,7 @@ import eu.kanade.tachiyomi.data.database.models.Chapter
|
||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.data.download.model.Download
|
||||
import eu.kanade.tachiyomi.ui.base.adapter.FlexibleViewHolder
|
||||
import eu.kanade.tachiyomi.util.getResourceColor
|
||||
import kotlinx.android.synthetic.main.item_chapter.view.*
|
||||
import rx.Observable
|
||||
import java.text.DateFormat
|
||||
@ -19,8 +20,8 @@ import java.util.*
|
||||
class ChaptersHolder(private val view: View, private val adapter: ChaptersAdapter, listener: FlexibleViewHolder.OnListItemClickListener) :
|
||||
FlexibleViewHolder(view, adapter, listener) {
|
||||
|
||||
private val readColor = ContextCompat.getColor(view.context, R.color.hint_text)
|
||||
private val unreadColor = ContextCompat.getColor(view.context, R.color.primary_text)
|
||||
private val readColor = view.context.theme.getResourceColor(android.R.attr.textColorHint)
|
||||
private val unreadColor = view.context.theme.getResourceColor(android.R.attr.textColorPrimary)
|
||||
private val decimalFormat = DecimalFormat("#.###", DecimalFormatSymbols().apply { decimalSeparator = '.' })
|
||||
private val df = DateFormat.getDateInstance(DateFormat.SHORT)
|
||||
|
||||
|
@ -71,6 +71,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedState) {
|
||||
setTheme(R.style.Theme_Reader);
|
||||
super.onCreate(savedState);
|
||||
setContentView(R.layout.activity_reader);
|
||||
ButterKnife.bind(this);
|
||||
@ -85,6 +86,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
||||
|
||||
initializeSettings();
|
||||
|
||||
|
||||
maxBitmapSize = GLUtil.getMaxTextureSize();
|
||||
}
|
||||
|
||||
@ -393,12 +395,12 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
||||
View rootView = getWindow().getDecorView().getRootView();
|
||||
if (theme == BLACK_THEME) {
|
||||
rootView.setBackgroundColor(Color.BLACK);
|
||||
pageNumber.setTextColor(ContextCompat.getColor(this, R.color.light_grey));
|
||||
pageNumber.setBackgroundColor(ContextCompat.getColor(this, R.color.page_number_background_black));
|
||||
pageNumber.setTextColor(ContextCompat.getColor(this, R.color.textColorPrimaryDark));
|
||||
pageNumber.setBackgroundColor(ContextCompat.getColor(this, R.color.backgroundDark));
|
||||
} else {
|
||||
rootView.setBackgroundColor(Color.WHITE);
|
||||
pageNumber.setTextColor(ContextCompat.getColor(this, R.color.primary_text));
|
||||
pageNumber.setBackgroundColor(ContextCompat.getColor(this, R.color.page_number_background));
|
||||
pageNumber.setTextColor(ContextCompat.getColor(this, R.color.textColorPrimaryLight));
|
||||
pageNumber.setBackgroundColor(ContextCompat.getColor(this, R.color.backgroundLight));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,8 +17,8 @@ import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||
|
||||
class PageDecodeErrorLayout(context: Context) : LinearLayout(context) {
|
||||
|
||||
private val lightGreyColor = ContextCompat.getColor(context, R.color.light_grey)
|
||||
private val blackColor = ContextCompat.getColor(context, R.color.primary_text)
|
||||
private val lightGreyColor = ContextCompat.getColor(context, android.R.attr.textColorHint)
|
||||
private val blackColor = ContextCompat.getColor(context, android.R.attr.textColorPrimary)
|
||||
|
||||
init {
|
||||
orientation = LinearLayout.VERTICAL
|
||||
|
@ -74,12 +74,12 @@ class PagerReaderFragment : BaseFragment() {
|
||||
/**
|
||||
* Text color for black theme.
|
||||
*/
|
||||
private val lightGreyColor by lazy { ContextCompat.getColor(context, R.color.light_grey) }
|
||||
private val lightGreyColor by lazy { ContextCompat.getColor(context, R.color.textColorHintDark) }
|
||||
|
||||
/**
|
||||
* Text color for white theme.
|
||||
*/
|
||||
private val blackColor by lazy { ContextCompat.getColor(context, R.color.primary_text) }
|
||||
private val blackColor by lazy { ContextCompat.getColor(context, R.color.textColorHintLight) }
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedState: Bundle?): View? {
|
||||
return inflater.inflate(R.layout.item_pager_reader, container, false)
|
||||
|
@ -1,7 +1,6 @@
|
||||
package eu.kanade.tachiyomi.ui.recent
|
||||
|
||||
import android.os.Bundle
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.support.v7.widget.LinearLayoutManager
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@ -17,8 +16,7 @@ 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 eu.kanade.tachiyomi.util.getResourceDrawable
|
||||
import kotlinx.android.synthetic.main.fragment_recent_chapters.*
|
||||
import nucleus.factory.RequiresPresenter
|
||||
import rx.Observable
|
||||
@ -70,19 +68,13 @@ class RecentChaptersFragment : BaseRxFragment<RecentChaptersPresenter>(), Flexib
|
||||
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
|
||||
// Init RecyclerView and adapter
|
||||
recycler.layoutManager = LinearLayoutManager(activity)
|
||||
recycler.addItemDecoration(DividerItemDecoration(ContextCompat.getDrawable(
|
||||
context, R.drawable.line_divider)))
|
||||
recycler.addItemDecoration(DividerItemDecoration(context.theme.getResourceDrawable(R.attr.divider_drawable)))
|
||||
recycler.setHasFixedSize(true)
|
||||
adapter = RecentChaptersAdapter(this)
|
||||
recycler.adapter = adapter
|
||||
|
||||
// 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()
|
||||
}
|
||||
|
||||
/**
|
||||
@ -129,10 +121,9 @@ 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 = ""
|
||||
}
|
||||
(activity as MainActivity).updateEmptyView(chapters.isEmpty(),
|
||||
R.string.information_no_recent, R.drawable.ic_history_black_128dp)
|
||||
|
||||
adapter.setItems(chapters)
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
package eu.kanade.tachiyomi.ui.recent
|
||||
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import android.widget.PopupMenu
|
||||
import eu.kanade.tachiyomi.R
|
||||
@ -8,6 +8,7 @@ import eu.kanade.tachiyomi.data.database.models.Chapter
|
||||
import eu.kanade.tachiyomi.data.database.models.MangaChapter
|
||||
import eu.kanade.tachiyomi.data.download.model.Download
|
||||
import eu.kanade.tachiyomi.ui.base.adapter.FlexibleViewHolder
|
||||
import eu.kanade.tachiyomi.util.getResourceColor
|
||||
import kotlinx.android.synthetic.main.item_recent_chapter.view.*
|
||||
import rx.Observable
|
||||
|
||||
@ -26,12 +27,12 @@ class RecentChaptersHolder(view: View, private val adapter: RecentChaptersAdapte
|
||||
/**
|
||||
* Color of read chapter
|
||||
*/
|
||||
private val readColor = ContextCompat.getColor(view.context, R.color.hint_text)
|
||||
private var readColor = view.context.theme.getResourceColor(android.R.attr.textColorHint)
|
||||
|
||||
/**
|
||||
* Color of unread chapter
|
||||
*/
|
||||
private val unreadColor = ContextCompat.getColor(view.context, R.color.primary_text)
|
||||
private var unreadColor = view.context.theme.getResourceColor(android.R.attr.textColorPrimary)
|
||||
|
||||
/**
|
||||
* Object containing chapter information
|
||||
@ -41,6 +42,7 @@ class RecentChaptersHolder(view: View, private val adapter: RecentChaptersAdapte
|
||||
init {
|
||||
//Set OnClickListener for download menu
|
||||
itemView.chapterMenu.setOnClickListener { v -> v.post({ showPopupMenu(v) }) }
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -21,9 +21,10 @@ class SettingsActivity : BaseActivity() {
|
||||
@Inject lateinit var syncManager: MangaSyncManager
|
||||
|
||||
override fun onCreate(savedState: Bundle?) {
|
||||
setAppTheme()
|
||||
super.onCreate(savedState)
|
||||
setContentView(R.layout.activity_preferences)
|
||||
applicationComponent.inject(this)
|
||||
app.component.inject(this)
|
||||
|
||||
setupToolbar(toolbar)
|
||||
|
||||
|
@ -1,10 +1,14 @@
|
||||
package eu.kanade.tachiyomi.ui.setting
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.TaskStackBuilder
|
||||
import android.support.v7.preference.Preference
|
||||
import android.view.View
|
||||
import eu.kanade.tachiyomi.App
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateAlarm
|
||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||
import eu.kanade.tachiyomi.widget.preference.IntListPreference
|
||||
import eu.kanade.tachiyomi.widget.preference.LibraryColumnsDialog
|
||||
import eu.kanade.tachiyomi.widget.preference.SimpleDialogPreference
|
||||
@ -29,6 +33,10 @@ class SettingsGeneralFragment : SettingsNestedFragment() {
|
||||
findPreference(getString(R.string.pref_library_update_interval_key)) as IntListPreference
|
||||
}
|
||||
|
||||
val themePreference by lazy {
|
||||
findPreference(getString(R.string.pref_theme_key)) as IntListPreference
|
||||
}
|
||||
|
||||
var columnsSubscription: Subscription? = null
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
@ -36,6 +44,17 @@ class SettingsGeneralFragment : SettingsNestedFragment() {
|
||||
LibraryUpdateAlarm.startAlarm(activity, (newValue as String).toInt())
|
||||
true
|
||||
}
|
||||
|
||||
themePreference.setOnPreferenceChangeListener { preference, newValue ->
|
||||
App.get(activity).appTheme = (newValue as String).toInt()
|
||||
|
||||
// Rebuild activity's to apply themes.
|
||||
TaskStackBuilder.create(activity)
|
||||
.addNextIntent(Intent(activity, MainActivity::class.java))
|
||||
.addNextIntent(activity.intent)
|
||||
.startActivities()
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
|
@ -40,7 +40,7 @@ inline fun Context.notification(func: NotificationCompat.Builder.() -> Unit): No
|
||||
/**
|
||||
* Property to get the notification manager from the context.
|
||||
*/
|
||||
val Context.notificationManager : NotificationManager
|
||||
val Context.notificationManager: NotificationManager
|
||||
get() = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
|
||||
/**
|
||||
@ -48,4 +48,4 @@ val Context.notificationManager : NotificationManager
|
||||
* @return the alarm manager.
|
||||
*/
|
||||
val Context.alarmManager: AlarmManager
|
||||
get() = getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
||||
get() = getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
||||
|
@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.util
|
||||
|
||||
import android.support.annotation.DrawableRes
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.support.v4.graphics.drawable.DrawableCompat
|
||||
import android.widget.ImageView
|
||||
|
||||
/**
|
||||
@ -11,7 +12,9 @@ import android.widget.ImageView
|
||||
*/
|
||||
fun ImageView.setDrawableCompat(@DrawableRes drawable: Int?) {
|
||||
if (drawable != null) {
|
||||
setImageDrawable(ContextCompat.getDrawable(context, drawable))
|
||||
var drawable = ContextCompat.getDrawable(context, drawable)
|
||||
DrawableCompat.setTint(drawable,this.context.theme.getResourceColor(android.R.attr.textColorHint))
|
||||
setImageDrawable(drawable)
|
||||
} else {
|
||||
setImageResource(android.R.color.transparent)
|
||||
}
|
||||
|
@ -0,0 +1,19 @@
|
||||
package eu.kanade.tachiyomi.util
|
||||
|
||||
import android.content.res.Resources
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.support.annotation.StringRes
|
||||
|
||||
fun Resources.Theme.getResourceColor(@StringRes resource: Int) : Int {
|
||||
val typedArray = this.obtainStyledAttributes(intArrayOf(resource))
|
||||
val attrValue = typedArray.getColor(0, 0)
|
||||
typedArray.recycle()
|
||||
return attrValue
|
||||
}
|
||||
|
||||
fun Resources.Theme.getResourceDrawable(@StringRes resource: Int) : Drawable {
|
||||
val typedArray = this.obtainStyledAttributes(intArrayOf(resource))
|
||||
val attrValue = typedArray.getDrawable(0)
|
||||
typedArray.recycle()
|
||||
return attrValue
|
||||
}
|
Reference in New Issue
Block a user