diff --git a/README.md b/README.md index 8de9589..2501aa8 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ allprojects { Add the dependency: ```Groovy dependencies { - compile 'com.github.Yalantis:ColorMatchTabsAndroid:v0.0.1' + implementation 'com.github.Yalantis:ColorMatchTabsAndroid:v0.0.2' } ``` diff --git a/app/build.gradle b/app/build.gradle index 0baa6ac..49ac079 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,16 +1,15 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" + compileSdkVersion 33 + buildToolsVersion "30.0.3" defaultConfig { applicationId "com.yalantis.colormatchtabs.colortabs" minSdkVersion 16 - targetSdkVersion 25 - versionCode 1 - versionName "1.0" + targetSdkVersion 33 + versionCode 2 + versionName "1.0.2" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -19,24 +18,29 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + + buildFeatures { + viewBinding true + } } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + implementation fileTree(dir: 'libs', include: ['*.jar']) + androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:25.3.1' - compile 'com.android.support.constraint:constraint-layout:1.0.2' - compile 'com.android.support:design:25.3.1' - testCompile 'junit:junit:4.12' - compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" + implementation "androidx.appcompat:appcompat:1.5.1" + implementation "androidx.constraintlayout:constraintlayout:2.1.4" + implementation "com.google.android.material:material:1.6.1" + + testImplementation "junit:junit:4.13.2" //UploadImages - compile 'com.facebook.fresco:fresco:1.1.0' - compile project(path: ':library') + implementation "com.facebook.fresco:fresco:2.6.0" + implementation project(path: ':library') } repositories { mavenCentral() + google() } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1e72374..1b61d63 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,7 +9,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ColorTabsAdapter.kt b/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ColorTabsAdapter.kt index d69d4c8..940d763 100644 --- a/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ColorTabsAdapter.kt +++ b/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ColorTabsAdapter.kt @@ -1,13 +1,14 @@ package com.yalantis.colormatchtabs.colortabs -import android.support.v4.app.Fragment -import android.support.v4.app.FragmentManager -import android.support.v4.app.FragmentStatePagerAdapter +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentStatePagerAdapter /** * Created by anna on 10.05.17. */ -class ColorTabsAdapter(fragmentManager: FragmentManager, amountTabs: Int) : FragmentStatePagerAdapter(fragmentManager) { +class ColorTabsAdapter(fragmentManager: FragmentManager, amountTabs: Int) : + FragmentStatePagerAdapter(fragmentManager) { private val amountTabs = amountTabs diff --git a/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ListItemAdapter.kt b/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ListItemAdapter.kt index b1f7908..b52b204 100644 --- a/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ListItemAdapter.kt +++ b/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ListItemAdapter.kt @@ -1,38 +1,39 @@ package com.yalantis.colormatchtabs.colortabs -import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.ViewGroup import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.yalantis.colormatchtabs.colortabs.databinding.ItemBinding import com.yalantis.colormatchtabs.colortabs.model.Menu -import kotlinx.android.synthetic.main.item.view.* /** * Created by anna on 29.05.17. */ -class ListItemAdapter() : RecyclerView.Adapter() { +class ListItemAdapter : RecyclerView.Adapter() { + private lateinit var binding: ItemBinding var items: List = listOf() set(value) { field = value notifyDataSetChanged() } - override fun onBindViewHolder(holder: MusicHolder?, position: Int) { + override fun onBindViewHolder(holder: MusicHolder, position: Int) { val menu = items[position] - holder?.layout?.apply { - picture.setImageURI(menu.picture) - nameOfDish.text = menu.dishName - restaurantName.text = menu.cafeName - review.text = menu.reviewAmount + holder.layout.apply { + binding.picture.setImageURI(menu.picture) + binding.nameOfDish.text = menu.dishName + binding.restaurantName.text = menu.cafeName + binding.review.text = menu.reviewAmount } } override fun getItemCount(): Int = items.count() - override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MusicHolder { - val layout = LayoutInflater.from(parent?.context).inflate(R.layout.item, parent, false) as LinearLayout - return MusicHolder(layout) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MusicHolder { + binding = ItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return MusicHolder(binding.root) } class MusicHolder(val layout: LinearLayout) : RecyclerView.ViewHolder(layout) diff --git a/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ListItemsFragment.kt b/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ListItemsFragment.kt index 62af982..3a6301c 100644 --- a/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ListItemsFragment.kt +++ b/app/src/main/java/com/yalantis/colormatchtabs/colortabs/ListItemsFragment.kt @@ -1,47 +1,48 @@ package com.yalantis.colormatchtabs.colortabs import android.os.Bundle -import android.support.v4.app.Fragment -import android.support.v7.widget.LinearLayoutManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import com.yalantis.colormatchtabs.colortabs.databinding.FragmentListItemsBinding import com.yalantis.colormatchtabs.colortabs.model.Menu -import kotlinx.android.synthetic.main.fragment_list_items.* /** * Created by anna on 09.05.17. */ class ListItemsFragment : Fragment() { - companion object { - private const val BASE_SCHEME = "res:///" - fun newInstance() = ListItemsFragment() - } + private lateinit var binding: FragmentListItemsBinding private val listOfPictures by lazy { listOf(BASE_SCHEME + R.drawable.eat, BASE_SCHEME + R.drawable.coffe) } - private val listOfDishName by lazy { listOf(context.getString(R.string.caesar), context.getString(R.string.latte)) } - private val listOfRestaurant by lazy { listOf(context.getString(R.string.cafe), context.getString(R.string.stareducks)) } + private val listOfDishName by lazy { listOf(requireContext().getString(R.string.caesar), requireContext().getString(R.string.latte)) } + private val listOfRestaurant by lazy { listOf(requireContext().getString(R.string.cafe), requireContext().getString(R.string.stareducks)) } - override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { - super.onCreateView(inflater, container, savedInstanceState) - return inflater?.inflate(R.layout.fragment_list_items, container, false) + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + binding = FragmentListItemsBinding.inflate(inflater, container, false) + return binding.root } - override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - menuList.layoutManager = LinearLayoutManager(context) - menuList.adapter = ListItemAdapter() - (menuList.adapter as ListItemAdapter).items = createListItems() + binding.menuList.layoutManager = LinearLayoutManager(context) + binding.menuList.adapter = ListItemAdapter() + (binding.menuList.adapter as ListItemAdapter).items = createListItems() } private fun createListItems(): List { val list = mutableListOf() for (i in 0..5) { val index = i.rem(2) - list.add(Menu(listOfPictures[index], listOfDishName[index], listOfRestaurant[index], context.getString(R.string.caesar_review))) + list.add(Menu(listOfPictures[index], listOfDishName[index], listOfRestaurant[index], requireContext().getString(R.string.caesar_review))) } return list } + companion object { + private const val BASE_SCHEME = "res:///" + fun newInstance() = ListItemsFragment() + } } \ No newline at end of file diff --git a/app/src/main/java/com/yalantis/colormatchtabs/colortabs/MainActivity.kt b/app/src/main/java/com/yalantis/colormatchtabs/colortabs/MainActivity.kt index 266b2b6..e424617 100644 --- a/app/src/main/java/com/yalantis/colormatchtabs/colortabs/MainActivity.kt +++ b/app/src/main/java/com/yalantis/colormatchtabs/colortabs/MainActivity.kt @@ -2,11 +2,11 @@ package com.yalantis.colormatchtabs.colortabs import android.graphics.Color import android.os.Bundle -import android.support.v4.content.ContextCompat -import android.support.v7.app.AppCompatActivity import android.util.Log import android.view.Menu import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import com.facebook.drawee.backends.pipeline.Fresco import com.yalantis.colormatchtabs.colormatchtabs.menu.MenuToggleListener import com.yalantis.colormatchtabs.colormatchtabs.adapter.ColorTabAdapter @@ -14,18 +14,20 @@ import com.yalantis.colormatchtabs.colormatchtabs.listeners.ColorTabLayoutOnPage import com.yalantis.colormatchtabs.colormatchtabs.listeners.OnArcMenuListener import com.yalantis.colormatchtabs.colormatchtabs.listeners.OnColorTabSelectedListener import com.yalantis.colormatchtabs.colormatchtabs.model.ColorTab -import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.activity_main.view.* +import com.yalantis.colormatchtabs.colortabs.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { + private val binding: ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater) } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Fresco.initialize(this) - setContentView(R.layout.activity_main) - toolbar.toolbarTitle.setTextColor(ContextCompat.getColor(this, R.color.colorGreen)) - toolbar.setNavigationIcon(R.drawable.ic_menu) - setSupportActionBar(toolbar) + setContentView(binding.root) + + binding.toolbar.setTitleTextColor(ContextCompat.getColor(this, R.color.colorGreen)) + binding.toolbar.setNavigationIcon(R.drawable.ic_menu) + setSupportActionBar(binding.toolbar) supportActionBar?.setDisplayShowTitleEnabled(false) val colorsArray = resources.getStringArray(R.array.colors) @@ -36,38 +38,62 @@ class MainActivity : AppCompatActivity() { val tabName = textsArray[index] val selectedColor = Color.parseColor(color) val icon = iconsArray.getDrawable(index) - colorMatchTabLayout.addTab(ColorTabAdapter.createColorTab(colorMatchTabLayout, tabName, selectedColor, icon)) + binding.colorMatchTabLayout.addTab( + ColorTabAdapter.createColorTab( + binding.colorMatchTabLayout, + tabName, + selectedColor, + icon!! + ) + ) + } + + with(binding.viewPager) { + adapter = ColorTabsAdapter(supportFragmentManager, binding.colorMatchTabLayout.count()) + addOnPageChangeListener(ColorTabLayoutOnPageChangeListener(binding.colorMatchTabLayout)) + setBackgroundColor(ContextCompat.getColor(this@MainActivity, R.color.colorGreen)) + background.alpha = 128 } - viewPager.adapter = ColorTabsAdapter(supportFragmentManager, colorMatchTabLayout.count()) - viewPager.addOnPageChangeListener(ColorTabLayoutOnPageChangeListener(colorMatchTabLayout)) - viewPager.setBackgroundColor(ContextCompat.getColor(this, R.color.colorGreen)) - viewPager.background.alpha = 128 - colorMatchTabLayout.addArcMenu(arcMenu) - colorMatchTabLayout.addOnColorTabSelectedListener(object : OnColorTabSelectedListener { + binding.colorMatchTabLayout.addArcMenu(binding.arcMenu) + binding.colorMatchTabLayout.addOnColorTabSelectedListener(object : OnColorTabSelectedListener { override fun onSelectedTab(tab: ColorTab?) { - viewPager.currentItem = tab?.position ?: 0 - viewPager.setBackgroundColor(tab?.selectedColor ?: ContextCompat.getColor(this@MainActivity, R.color.colorPrimary)) - viewPager.background.alpha = 128 - toolbar.toolbarTitle.setTextColor(tab?.selectedColor ?: ContextCompat.getColor(this@MainActivity, R.color.colorPrimary)) + binding.viewPager.currentItem = tab?.position ?: 0 + binding.viewPager.setBackgroundColor( + tab?.selectedColor ?: ContextCompat.getColor( + this@MainActivity, + R.color.colorPrimary + ) + ) + binding.viewPager.background.alpha = 128 + binding.toolbar.setTitleTextColor( + tab?.selectedColor ?: ContextCompat.getColor( + this@MainActivity, + R.color.colorPrimary + ) + ) } override fun onUnselectedTab(tab: ColorTab?) { Log.e("Unselected ", "tab") } }) - arcMenu.addMenuToggleListener(object : MenuToggleListener { + binding.arcMenu.addMenuToggleListener(object : MenuToggleListener { override fun onOpenMenu() { - viewUnderMenu.animateView(true) + binding.viewUnderMenu.animateView(true) } override fun onCloseMenu() { - viewUnderMenu.animateView(false) + binding.viewUnderMenu.animateView(false) } }) - arcMenu.addOnClickListener(object : OnArcMenuListener { + binding.arcMenu.addOnClickListener(object : OnArcMenuListener { override fun onClick(position: Int) { - Toast.makeText(this@MainActivity, "Tab " + position.toString() + " is clicked", Toast.LENGTH_LONG).show() + Toast.makeText( + this@MainActivity, + "Tab " + position.toString() + " is clicked", + Toast.LENGTH_LONG + ).show() } }) } diff --git a/app/src/main/java/com/yalantis/colormatchtabs/colortabs/widget/MenuView.kt b/app/src/main/java/com/yalantis/colormatchtabs/colortabs/widget/MenuView.kt index a7be056..06a7b62 100644 --- a/app/src/main/java/com/yalantis/colormatchtabs/colortabs/widget/MenuView.kt +++ b/app/src/main/java/com/yalantis/colormatchtabs/colortabs/widget/MenuView.kt @@ -6,11 +6,11 @@ import android.animation.ValueAnimator import android.content.Context import android.graphics.Canvas import android.graphics.Paint -import android.support.v4.content.ContextCompat -import android.support.v4.view.animation.PathInterpolatorCompat import android.util.AttributeSet import android.view.View import android.widget.LinearLayout +import androidx.core.content.ContextCompat +import androidx.core.view.animation.PathInterpolatorCompat import com.yalantis.colormatchtabs.colortabs.R /** @@ -30,9 +30,9 @@ class MenuView : LinearLayout { private val backgroundPaint: Paint = Paint() private var isMenuOpen = false - constructor(context: Context?) : this(context, null) - constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0) - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + constructor(context: Context) : this(context, null) + constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { setWillNotDraw(false) backgroundPaint.flags = Paint.ANTI_ALIAS_FLAG backgroundPaint.color = ContextCompat.getColor(context, R.color.colorWhite) @@ -62,7 +62,7 @@ class MenuView : LinearLayout { invalidate() } addListener(object : AnimatorListenerAdapter() { - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { super.onAnimationStart(animation) if (!isMenuOpen) { getChildAt(0).visibility = View.GONE @@ -73,7 +73,7 @@ class MenuView : LinearLayout { animatePlayButton(isMenuOpen) } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { super.onAnimationEnd(animation) if (!isMenuOpen) { visibility = View.GONE diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1ff3e9b..0498a70 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -10,7 +10,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + - - = (calculateRadius().toFloat() - (calculateRadius().toFloat() / 3)) && isMenuOpen) { animateDrawableAppears(childX, childY, it, canvas) } @@ -163,7 +161,7 @@ class ArcMenu : FrameLayout { }.start() } - private fun animateDrawableAppears(childX: Float, childY: Float, tab: ColorTab, canvas: Canvas?) { + private fun animateDrawableAppears(childX: Float, childY: Float, tab: ColorTab, canvas: Canvas) { val left = childX.toInt() - ((tab.icon?.intrinsicWidth ?: 0) / 2) val top = childY.toInt() - ((tab.icon?.intrinsicHeight ?: 0) / 2) tab.icon?.setColorFilter(getColor(R.color.mainBackgroundColor), PorterDuff.Mode.SRC_ATOP) @@ -224,11 +222,11 @@ class ArcMenu : FrameLayout { private val animationListener = object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { isMenuAnimating = false } - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { isMenuAnimating = true } } diff --git a/library/src/main/java/com/yalantis/colormatchtabs/colormatchtabs/utils/Extentions.kt b/library/src/main/java/com/yalantis/colormatchtabs/colormatchtabs/utils/Extentions.kt index 7a787b3..c749f61 100644 --- a/library/src/main/java/com/yalantis/colormatchtabs/colormatchtabs/utils/Extentions.kt +++ b/library/src/main/java/com/yalantis/colormatchtabs/colormatchtabs/utils/Extentions.kt @@ -1,9 +1,9 @@ package com.yalantis.colormatchtabs.colormatchtabs.utils -import android.support.annotation.ColorRes -import android.support.annotation.DimenRes -import android.support.v4.content.ContextCompat import android.view.View +import androidx.annotation.ColorRes +import androidx.annotation.DimenRes +import androidx.core.content.ContextCompat /** * Created by anna on 15.05.17. diff --git a/library/src/main/java/com/yalantis/colormatchtabs/colormatchtabs/utils/InvalidNumberOfTabsExeption.kt b/library/src/main/java/com/yalantis/colormatchtabs/colormatchtabs/utils/InvalidNumberOfTabsExeption.kt index e81d3df..f216205 100644 --- a/library/src/main/java/com/yalantis/colormatchtabs/colormatchtabs/utils/InvalidNumberOfTabsExeption.kt +++ b/library/src/main/java/com/yalantis/colormatchtabs/colormatchtabs/utils/InvalidNumberOfTabsExeption.kt @@ -4,5 +4,5 @@ package com.yalantis.colormatchtabs.colormatchtabs.utils * Created by anna on 24.05.17. */ class InvalidNumberOfTabsExeption : Exception() { - override val message: String? = "Your should add more than three and less then six tabs to use ArcMenu" + override val message: String = "Your should add more than three and less then six tabs to use ArcMenu" } \ No newline at end of file