Skip to content

Commit

Permalink
implements dismiss when clicked and show again
Browse files Browse the repository at this point in the history
  • Loading branch information
skydoves committed Aug 27, 2019
1 parent ad86b3b commit 4fd5ad0
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 47 deletions.
4 changes: 2 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".MainActivity" />
<activity android:name=".CustomActivity" />
<activity
android:name=".CustomActivity"
android:name=".MainActivity"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
35 changes: 14 additions & 21 deletions app/src/main/java/com/skydoves/balloondemo/CustomActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.skydoves.balloondemo

import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
Expand All @@ -26,6 +27,7 @@ import com.skydoves.balloon.balloon
import com.skydoves.balloondemo.factory.CustomListBalloonFactory
import com.skydoves.balloondemo.factory.ProfileBalloonFactory
import com.skydoves.balloondemo.factory.TagBalloonFactory
import com.skydoves.balloondemo.factory.ViewHolderBalloonFactory
import com.skydoves.balloondemo.recycler.CustomAdapter
import com.skydoves.balloondemo.recycler.CustomItem
import com.skydoves.balloondemo.recycler.CustomViewHolder
Expand All @@ -40,10 +42,11 @@ class CustomActivity : AppCompatActivity(),
SampleViewHolder.Delegate,
CustomViewHolder.Delegate {

private val adapter by lazy { SampleAdapter(this, this) }
private val adapter by lazy { SampleAdapter(this) }
private val customAdapter by lazy { CustomAdapter(this) }
private val customListBalloon by balloon(CustomListBalloonFactory::class)
private val customProfileBalloon by balloon(ProfileBalloonFactory::class)
private val viewHolderBalloon by balloon(ViewHolderBalloonFactory::class)
private val customTagBalloon by balloon(TagBalloonFactory::class)

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -55,49 +58,39 @@ class CustomActivity : AppCompatActivity(),

recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)
adapter.addItems(ItemUtils.getSamples(this))
this.adapter.addItems(ItemUtils.getSamples(this))

val listRecycler: RecyclerView = customListBalloon.getContentView().findViewById(R.id.list_recyclerView)
listRecycler.adapter = customAdapter
listRecycler.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)
customAdapter.addCustomItem(ItemUtils.getCustomSamples(this))
this.customAdapter.addCustomItem(ItemUtils.getCustomSamples(this))

toolbar_list.setOnClickListener {
if (customListBalloon.isShowing) {
customListBalloon.dismiss()
} else {
customListBalloon.showAlignBottom(it)
}
this.customListBalloon.showAlignBottom(it)
}

circleImageView.setOnClickListener {
if (customProfileBalloon.isShowing) {
customProfileBalloon.dismiss()
} else {
customProfileBalloon.showAlignBottom(it)
}
this.customProfileBalloon.showAlignBottom(it)
}

val buttonEdit: Button = customProfileBalloon.getContentView().findViewById(R.id.button_edit)
buttonEdit.setOnClickListener {
customProfileBalloon.dismiss()
this.customProfileBalloon.dismiss()
Toast.makeText(baseContext, "Edit", Toast.LENGTH_SHORT).show()
}

bottomNavigationView.setOnNavigationItemSelectedListener {
if (customTagBalloon.isShowing) {
customTagBalloon.dismiss()
} else {
customTagBalloon.showAlignTop(bottomNavigationView, 130, 0)
}
this.customTagBalloon.showAlignTop(bottomNavigationView, 130, 0)
true
}
}

override fun onCustomItemClick(customItem: CustomItem) {
customListBalloon.dismiss()
this.customListBalloon.dismiss()
Toast.makeText(baseContext, customItem.title, Toast.LENGTH_SHORT).show()
}

override fun onItemClick(sampleItem: SampleItem) = Unit
override fun onItemClick(sampleItem: SampleItem, view: View) {
this.viewHolderBalloon.showAlignBottom(view)
}
}
10 changes: 8 additions & 2 deletions app/src/main/java/com/skydoves/balloondemo/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@
package com.skydoves.balloondemo

import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.skydoves.balloon.OnBalloonClickListener
import com.skydoves.balloon.balloon
import com.skydoves.balloon.showAlignTop
import com.skydoves.balloondemo.factory.ViewHolderBalloonFactory
import com.skydoves.balloondemo.recycler.ItemUtils
import com.skydoves.balloondemo.recycler.SampleAdapter
import com.skydoves.balloondemo.recycler.SampleItem
Expand All @@ -31,9 +34,10 @@ import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), SampleViewHolder.Delegate, OnBalloonClickListener {

private val adapter by lazy { SampleAdapter(this, this) }
private val adapter by lazy { SampleAdapter(this) }
private val profileBalloon by lazy { BalloonUtils.getProfileBalloon(this, this) }
private val navigationBalloon by lazy { BalloonUtils.getNavigationBalloon(this, this, this) }
private val viewHolderBalloon by balloon(ViewHolderBalloonFactory::class)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down Expand Up @@ -70,5 +74,7 @@ class MainActivity : AppCompatActivity(), SampleViewHolder.Delegate, OnBalloonCl
Toast.makeText(baseContext, "dismissed", Toast.LENGTH_SHORT).show()
}

override fun onItemClick(sampleItem: SampleItem) = Unit
override fun onItemClick(sampleItem: SampleItem, view: View) {
this.viewHolderBalloon.showAlignBottom(view)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class CustomListBalloonFactory : Balloon.Factory() {
.setCornerRadius(4f)
.setBackgroundColor(ContextCompat.getColor(context, R.color.background800))
.setBalloonAnimation(BalloonAnimation.FADE)
.setDismissWhenShowAgain(true)
.setLifecycleOwner(lifecycle)
.build()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class ProfileBalloonFactory : Balloon.Factory() {
setCornerRadius(4f)
setBackgroundColor(ContextCompat.getColor(context, R.color.background900))
setBalloonAnimation(BalloonAnimation.CIRCULAR)
setDismissWhenShowAgain(true)
setLifecycleOwner(lifecycle)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class TagBalloonFactory : Balloon.Factory() {
setCornerRadius(4f)
setBackgroundColor(ContextCompat.getColor(context, R.color.white))
setBalloonAnimation(BalloonAnimation.ELASTIC)
setDismissWhenShowAgain(true)
setLifecycleOwner(lifecycle)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Copyright (C) 2019 skydoves
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.skydoves.balloondemo.factory

import android.content.Context
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import com.skydoves.balloon.ArrowOrientation
import com.skydoves.balloon.Balloon
import com.skydoves.balloon.BalloonAnimation
import com.skydoves.balloon.createBalloon
import com.skydoves.balloondemo.R

class ViewHolderBalloonFactory : Balloon.Factory() {

override fun create(context: Context, lifecycle: LifecycleOwner): Balloon {
return createBalloon(context) {
setText("This is your new content.")
setArrowSize(10)
setWidthRatio(0.75f)
setHeight(63)
setTextSize(15f)
setCornerRadius(8f)
setArrowOrientation(ArrowOrientation.TOP)
setTextColor(ContextCompat.getColor(context, R.color.white_87))
setIconDrawable(ContextCompat.getDrawable(context, R.drawable.ic_edit))
setBackgroundColor(ContextCompat.getColor(context, R.color.yellow))
setOnBalloonDismissListener { Toast.makeText(context, "dismissed", Toast.LENGTH_SHORT).show() }
setDismissWhenClicked(true)
setDismissWhenShowAgain(true)
setBalloonAnimation(BalloonAnimation.ELASTIC)
setLifecycleOwner(lifecycle)
build()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,13 @@
package com.skydoves.balloondemo.recycler

import android.view.View
import androidx.lifecycle.LifecycleOwner
import com.skydoves.balloondemo.R
import com.skydoves.baserecyclerviewadapter.BaseAdapter
import com.skydoves.baserecyclerviewadapter.BaseViewHolder
import com.skydoves.baserecyclerviewadapter.SectionRow

@Suppress("PrivatePropertyName")
class SampleAdapter(
private val delegate: SampleViewHolder.Delegate,
private val lifecycleOwner: LifecycleOwner
private val delegate: SampleViewHolder.Delegate
) : BaseAdapter() {

private val section_item = 0
Expand All @@ -40,11 +37,7 @@ class SampleAdapter(
notifyDataSetChanged()
}

override fun layout(sectionRow: SectionRow): Int {
return R.layout.item_sample
}
override fun layout(sectionRow: SectionRow) = R.layout.item_sample

override fun viewHolder(layout: Int, view: View): BaseViewHolder {
return SampleViewHolder(view, delegate, lifecycleOwner)
}
override fun viewHolder(layout: Int, view: View) = SampleViewHolder(view, delegate)
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,19 @@
package com.skydoves.balloondemo.recycler

import android.view.View
import androidx.lifecycle.LifecycleOwner
import com.skydoves.balloondemo.BalloonUtils
import com.skydoves.baserecyclerviewadapter.BaseViewHolder
import kotlinx.android.synthetic.main.item_sample.view.*

@Suppress("CanBeParameter")
class SampleViewHolder(
private val view: View,
private val delegate: Delegate,
private val lifecycleOwner: LifecycleOwner
private val delegate: Delegate
) : BaseViewHolder(view) {

interface Delegate {
fun onItemClick(sampleItem: SampleItem)
fun onItemClick(sampleItem: SampleItem, view: View)
}

private val balloon by lazy { BalloonUtils.getProfileBalloonForViewHolder(context(), lifecycleOwner) }
private lateinit var sampleItem: SampleItem

override fun bindData(data: Any) {
Expand All @@ -51,10 +47,8 @@ class SampleViewHolder(
}
}

override fun onClick(v: View?) {
delegate.onItemClick(this.sampleItem)
balloon.showAlignBottom(v!!)
}
override fun onClick(v: View?) =
this.delegate.onItemClick(this.sampleItem, itemView)

override fun onLongClick(v: View?) = false
}
15 changes: 13 additions & 2 deletions balloon/src/main/java/com/skydoves/balloon/Balloon.kt
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,10 @@ class Balloon(
this.onBalloonClickListener = builder.onBalloonClickListener
this.onBalloonDismissListener = builder.onBalloonDismissListener
this.onBalloonOutsideTouchListener = builder.onBalloonOutsideTouchListener
this.bodyView.setOnClickListener { this.onBalloonClickListener?.onBalloonClick() }
this.bodyView.setOnClickListener {
this.onBalloonClickListener?.onBalloonClick()
if (builder.dismissWhenClicked) dismiss()
}
this.bodyWindow.setOnDismissListener { this.onBalloonDismissListener?.onBalloonDismiss() }
this.bodyWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
this.bodyWindow.isOutsideTouchable = true
Expand Down Expand Up @@ -219,7 +222,7 @@ class Balloon(
@MainThread
private inline fun show(anchor: View, crossinline block: () -> Unit) {
if (!isShowing) {
isShowing = true
this.isShowing = true
builder.preferenceName?.let {
if (balloonPreferenceManager.shouldShowUP(it, builder.showTimes)) {
balloonPreferenceManager.putIncrementedTimes(it)
Expand All @@ -230,6 +233,8 @@ class Balloon(
applyBalloonAnimation()
block()
}
} else if (builder.dismissWhenShowAgain) {
dismiss()
}
}

Expand Down Expand Up @@ -412,6 +417,10 @@ class Balloon(
@JvmField
var dismissWhenTouchOutside: Boolean = false
@JvmField
var dismissWhenShowAgain: Boolean = false
@JvmField
var dismissWhenClicked: Boolean = false
@JvmField
var lifecycleOwner: LifecycleOwner? = null
@JvmField
var balloonAnimation: BalloonAnimation = BalloonAnimation.FADE
Expand Down Expand Up @@ -473,6 +482,8 @@ class Balloon(
}

fun setDismissWhenTouchOutside(value: Boolean): Builder = apply { this.dismissWhenTouchOutside = value }
fun setDismissWhenShowAgain(value: Boolean): Builder = apply { this.dismissWhenShowAgain = value }
fun setDismissWhenClicked(value: Boolean): Builder = apply { this.dismissWhenClicked = value }
fun setPreferenceName(value: String): Builder = apply { this.preferenceName = value }
fun setShowTime(value: Int): Builder = apply { this.showTimes = value }

Expand Down

0 comments on commit 4fd5ad0

Please sign in to comment.