mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01: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