From 6f1974ea604c1af25bbb133152cc1d2acc0f4f81 Mon Sep 17 00:00:00 2001 From: Chumva Date: Tue, 4 Sep 2018 15:15:38 +0300 Subject: [PATCH] Remove colorStateList and refactor SortByBottomSheet --- .../osmand/telegram/ui/LiveNowTabFragment.kt | 25 ++-- .../osmand/telegram/ui/SortByBottomSheet.kt | 121 +++++++----------- .../net/osmand/telegram/utils/AndroidUtils.kt | 49 ------- 3 files changed, 56 insertions(+), 139 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt index 813ac1f99a..60948b2292 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt @@ -29,6 +29,7 @@ import net.osmand.telegram.helpers.TelegramUiHelper.ChatItem import net.osmand.telegram.helpers.TelegramUiHelper.ListItem import net.osmand.telegram.helpers.TelegramUiHelper.LocationItem import net.osmand.telegram.ui.LiveNowTabFragment.LiveNowListAdapter.BaseViewHolder +import net.osmand.telegram.ui.SortByBottomSheet.SortType.* import net.osmand.telegram.utils.AndroidUtils import net.osmand.telegram.utils.OsmandFormatter import net.osmand.telegram.utils.UiUtils.UpdateLocationViewCache @@ -38,8 +39,6 @@ import org.drinkless.td.libcore.telegram.TdApi private const val CHAT_VIEW_TYPE = 0 private const val LOCATION_ITEM_VIEW_TYPE = 1 -private const val SORT_TYPE = "sort_type" - class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessagesListener, FullInfoUpdatesListener, TelegramLocationListener, TelegramCompassListener { @@ -60,7 +59,7 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage private var heading: Float? = null private var locationUiUpdateAllowed: Boolean = true - private var sortBy: Int = SORT_BY_GROUP + private var sortBy= SORT_BY_GROUP private var sortByGroup = sortBy == SORT_BY_GROUP override fun onCreateView( @@ -68,8 +67,8 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage container: ViewGroup?, savedInstanceState: Bundle? ): View? { - savedInstanceState?.getInt(SORT_TYPE)?.also { - sortBy = it + savedInstanceState?.getString(CURRENT_SORT_TYPE_KEY)?.also { + sortBy = valueOf(it) sortByGroup = sortBy == SORT_BY_GROUP } val mainView = inflater.inflate(R.layout.fragment_live_now_tab, container, false) @@ -99,7 +98,7 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage mainView.findViewById(R.id.sort_by_container).apply { setOnClickListener { fragmentManager?.also { fm -> - SortByBottomSheet.showInstance(fm, this@LiveNowTabFragment) + SortByBottomSheet.showInstance(fm, this@LiveNowTabFragment, sortBy) } } } @@ -142,9 +141,9 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage ChooseOsmAndBottomSheet.OSMAND_CHOSEN_REQUEST_CODE -> updateOpenOsmAndIcon() SortByBottomSheet.SORT_BY_REQUEST_CODE -> { if (data != null && data.extras != null) { - val newSortBy = data.extras.getInt(SORT_BY_KEY, -1) - if (newSortBy != -1) { - sortBy = newSortBy + val newSortBy = data.extras.getString(SORT_BY_KEY, "") + if (!newSortBy.isNullOrEmpty()) { + sortBy = valueOf(newSortBy) sortByGroup = sortBy == SORT_BY_GROUP updateSortBtn() updateList() @@ -156,7 +155,7 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putInt(SORT_TYPE, sortBy) + outState.putString(CURRENT_SORT_TYPE_KEY, sortBy.toString()) } override fun onTelegramStatusChanged( @@ -398,15 +397,15 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage var text = "" var icon: Drawable? = null when (sortBy) { - SORT_BY_NAME -> { + SortByBottomSheet.SortType.SORT_BY_NAME -> { text = getString(R.string.by_name) icon = app.uiUtils.getIcon(R.drawable.ic_action_sort_by_name, R.color.ctrl_active_light) } - SORT_BY_DISTANCE -> { + SortByBottomSheet.SortType.SORT_BY_DISTANCE -> { text = getString(R.string.by_distance) icon = app.uiUtils.getIcon(R.drawable.ic_action_sort_by_distance, R.color.ctrl_active_light) } - SORT_BY_GROUP -> { + SortByBottomSheet.SortType.SORT_BY_GROUP -> { text = getString(R.string.by_group) icon = app.uiUtils.getIcon(R.drawable.ic_action_sort_by_group, R.color.ctrl_active_light) } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SortByBottomSheet.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SortByBottomSheet.kt index 61848d89b9..3c72945d70 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SortByBottomSheet.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SortByBottomSheet.kt @@ -1,16 +1,14 @@ package net.osmand.telegram.ui -import android.content.Context import android.content.Intent -import android.content.res.ColorStateList -import android.graphics.drawable.Drawable -import android.os.Build import android.os.Bundle import android.support.annotation.DrawableRes +import android.support.annotation.StringRes import android.support.design.widget.BottomSheetBehavior import android.support.v4.app.DialogFragment import android.support.v4.app.Fragment import android.support.v4.app.FragmentManager +import android.support.v4.content.ContextCompat import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -19,15 +17,12 @@ import android.widget.TextView import net.osmand.telegram.R import net.osmand.telegram.TelegramApplication import net.osmand.telegram.ui.views.BottomSheetDialog -import net.osmand.telegram.utils.AndroidUtils -const val SORT_BY_GROUP = 0 -const val SORT_BY_NAME = 1 -const val SORT_BY_DISTANCE = 2 - const val SORT_BY_KEY = "sort_by_key" +const val CURRENT_SORT_TYPE_KEY = "current_sort_type_key" + class SortByBottomSheet : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?) = BottomSheetDialog(context!!) @@ -40,60 +35,38 @@ class SortByBottomSheet : DialogFragment() { val mainView = inflater.inflate(R.layout.bottom_sheet_sort_by, container, false) val intent = Intent() val app = activity?.application as TelegramApplication + val currentSortType = arguments?.getString(CURRENT_SORT_TYPE_KEY) val itemsCont = mainView.findViewById(R.id.items_container) - inflater.inflate(R.layout.item_with_rb_and_btn, itemsCont, false).apply { - findViewById(R.id.icon).setImageDrawable(getSelectedIcon(app, R.drawable.ic_action_sort_by_distance)) - findViewById(R.id.title).apply { - text = getText(R.string.shared_string_distance) - setTextColor(getTextColorStateList(context)) - } - findViewById(R.id.primary_btn_container).visibility = View.GONE - findViewById(R.id.radio_button).visibility = View.GONE - setOnClickListener { - intent.putExtra(SORT_BY_KEY, SORT_BY_DISTANCE) - targetFragment?.also { target -> - target.onActivityResult(targetRequestCode, SORT_BY_REQUEST_CODE, intent) + for (sortType in SortType.values()) { + inflater.inflate(R.layout.item_with_rb_and_btn, itemsCont, false).apply { + val isCurrentSortType = sortType.name == currentSortType + val image = if (isCurrentSortType) { + app.uiUtils.getActiveIcon(sortType.iconId) + } else { + app.uiUtils.getThemedIcon(sortType.iconId) } - dismiss() - } - itemsCont.addView(this) - } - - inflater.inflate(R.layout.item_with_rb_and_btn, itemsCont, false).apply { - findViewById(R.id.icon).setImageDrawable(getSelectedIcon(app, R.drawable.ic_action_sort_by_name)) - findViewById(R.id.title).apply { - text = getText(R.string.shared_string_name) - setTextColor(getTextColorStateList(context)) - } - findViewById(R.id.primary_btn_container).visibility = View.GONE - findViewById(R.id.radio_button).visibility = View.GONE - setOnClickListener { - intent.putExtra(SORT_BY_KEY, SORT_BY_NAME) - targetFragment?.also { target -> - target.onActivityResult(targetRequestCode, SORT_BY_REQUEST_CODE, intent) + findViewById(R.id.icon).setImageDrawable(image) + findViewById(R.id.title)?.apply { + text = getText(sortType.titleId) + setTextColor( + ContextCompat.getColor( + app, + if (isCurrentSortType) R.color.ctrl_active_light else R.color.primary_text_light + ) + ) } - dismiss() - } - itemsCont.addView(this) - } - - inflater.inflate(R.layout.item_with_rb_and_btn, itemsCont, false).apply { - findViewById(R.id.icon).setImageDrawable(getSelectedIcon(app, R.drawable.ic_action_sort_by_group)) - findViewById(R.id.title).apply { - text = getText(R.string.shared_string_group) - setTextColor(getTextColorStateList(context)) - } - findViewById(R.id.primary_btn_container).visibility = View.GONE - findViewById(R.id.radio_button).visibility = View.GONE - setOnClickListener { - intent.putExtra(SORT_BY_KEY, SORT_BY_GROUP) - targetFragment?.also { target -> - target.onActivityResult(targetRequestCode, SORT_BY_REQUEST_CODE, intent) + findViewById(R.id.primary_btn_container).visibility = View.GONE + findViewById(R.id.radio_button).visibility = View.GONE + setOnClickListener { + intent.putExtra(SORT_BY_KEY, sortType.name) + targetFragment?.also { target -> + target.onActivityResult(targetRequestCode, SORT_BY_REQUEST_CODE, intent) + } + dismiss() } - dismiss() + itemsCont.addView(this) } - itemsCont.addView(this) } BottomSheetBehavior.from(mainView.findViewById(R.id.scroll_view)) @@ -116,35 +89,23 @@ class SortByBottomSheet : DialogFragment() { return mainView } - private fun getTextColorStateList(context: Context): ColorStateList { - return AndroidUtils.createPressedColorStateList( - context, - R.color.primary_text_light, - R.color.ctrl_active_light - ) - } - - private fun getSelectedIcon(app: TelegramApplication, @DrawableRes id: Int): Drawable? { - val normal = app.uiUtils.getThemedIcon(id) - if (Build.VERSION.SDK_INT >= 21) { - val active = app.uiUtils.getActiveIcon(id) - if (normal != null && active != null) { - return AndroidUtils.createPressedStateListDrawable(normal, active) - } - } - return normal - } - companion object { const val SORT_BY_REQUEST_CODE = 3 private const val TAG = "SortByBottomSheet" - fun showInstance(fm: FragmentManager, target: Fragment): Boolean { + fun showInstance( + fm: FragmentManager, + target: Fragment, + currentSortType: SortType + ): Boolean { return try { SortByBottomSheet().apply { + val bundle = Bundle() + bundle.putString(CURRENT_SORT_TYPE_KEY, currentSortType.name) setTargetFragment(target, SORT_BY_REQUEST_CODE) + arguments = bundle show(fm, TAG) } true @@ -153,4 +114,10 @@ class SortByBottomSheet : DialogFragment() { } } } + + enum class SortType(@DrawableRes val iconId: Int, @StringRes val titleId: Int) { + SORT_BY_GROUP(R.drawable.ic_action_sort_by_group, R.string.shared_string_group), + SORT_BY_NAME(R.drawable.ic_action_sort_by_name, R.string.shared_string_name), + SORT_BY_DISTANCE(R.drawable.ic_action_sort_by_distance, R.string.shared_string_distance); + } } \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/telegram/utils/AndroidUtils.kt b/OsmAnd-telegram/src/net/osmand/telegram/utils/AndroidUtils.kt index 06726c879f..5ee0ce8578 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/utils/AndroidUtils.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/utils/AndroidUtils.kt @@ -6,19 +6,14 @@ import android.content.ContentResolver import android.content.Context import android.content.Intent import android.content.pm.PackageManager -import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.Color import android.graphics.Paint -import android.graphics.drawable.Drawable -import android.graphics.drawable.StateListDrawable import android.net.Uri import android.os.Build import android.support.annotation.AttrRes import android.support.annotation.ColorInt -import android.support.annotation.ColorRes import android.support.v4.app.ActivityCompat -import android.support.v4.content.ContextCompat import android.support.v4.content.FileProvider import android.util.TypedValue import android.util.TypedValue.COMPLEX_UNIT_DIP @@ -144,50 +139,6 @@ object AndroidUtils { "/${ctx.resources.getResourceEntryName(resID)}" ) } - - fun createPressedColorStateList(ctx: Context, @ColorRes normal: Int, @ColorRes pressed: Int): ColorStateList { - return createPressedColorStateList(ctx, false, normal, pressed, 0, 0) - } - - fun createPressedColorStateList( - ctx: Context, night: Boolean, - @ColorRes lightNormal: Int, @ColorRes lightPressed: Int, - @ColorRes darkNormal: Int, @ColorRes darkPressed: Int - ): ColorStateList { - return createColorStateList( - ctx, night, android.R.attr.state_pressed, - lightNormal, lightPressed, darkNormal, darkPressed - ) - } - - private fun createColorStateList( - ctx: Context, night: Boolean, state: Int, - @ColorRes lightNormal: Int, @ColorRes lightState: Int, - @ColorRes darkNormal: Int, @ColorRes darkState: Int - ): ColorStateList { - return ColorStateList( - arrayOf(intArrayOf(state), intArrayOf()), - intArrayOf( - ContextCompat.getColor(ctx, if (night) darkState else lightState), - ContextCompat.getColor(ctx, if (night) darkNormal else lightNormal) - ) - ) - } - - fun createPressedStateListDrawable(normal: Drawable, pressed: Drawable): StateListDrawable { - return createStateListDrawable(normal, pressed, android.R.attr.state_pressed) - } - - private fun createStateListDrawable( - normal: Drawable, - stateDrawable: Drawable, - state: Int - ): StateListDrawable { - val res = StateListDrawable() - res.addState(intArrayOf(state), stateDrawable) - res.addState(intArrayOf(), normal) - return res - } fun isAppInstalled(ctx: Context, appPackage: String): Boolean { if (appPackage.isEmpty()) {