Minor code improvements and bug fixes
This commit is contained in:
parent
cc18f34161
commit
415107a6c8
@ -58,12 +58,11 @@ class AddressDetailFragment : Fragment() {
|
|||||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||||
inflater.inflate(R.menu.address, menu)
|
inflater.inflate(R.menu.address, menu)
|
||||||
|
|
||||||
val activity = activity
|
val ctx = activity
|
||||||
Drawables.addIcon(activity, menu, R.id.write_message, GoogleMaterial.Icon.gmd_mail)
|
Drawables.addIcon(ctx, menu, R.id.write_message, GoogleMaterial.Icon.gmd_mail)
|
||||||
Drawables.addIcon(activity, menu, R.id.share, GoogleMaterial.Icon.gmd_share)
|
Drawables.addIcon(ctx, menu, R.id.share, GoogleMaterial.Icon.gmd_share)
|
||||||
Drawables.addIcon(activity, menu, R.id.delete, GoogleMaterial.Icon.gmd_delete)
|
Drawables.addIcon(ctx, menu, R.id.delete, GoogleMaterial.Icon.gmd_delete)
|
||||||
Drawables.addIcon(activity, menu, R.id.export,
|
Drawables.addIcon(ctx, menu, R.id.export, CommunityMaterial.Icon.cmd_export).isVisible = item?.privateKey != null
|
||||||
CommunityMaterial.Icon.cmd_export).isVisible = item != null && item!!.privateKey != null
|
|
||||||
|
|
||||||
super.onCreateOptionsMenu(menu, inflater)
|
super.onCreateOptionsMenu(menu, inflater)
|
||||||
}
|
}
|
||||||
@ -187,9 +186,8 @@ class AddressDetailFragment : Fragment() {
|
|||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
item?.let { item ->
|
item?.let { item ->
|
||||||
Singleton.getAddressRepository(context).save(item)
|
Singleton.getAddressRepository(context).save(item)
|
||||||
val mainActivity = MainActivity.getInstance()
|
if (item.privateKey != null) {
|
||||||
if (mainActivity != null && item.privateKey != null) {
|
MainActivity.getInstance()?.updateIdentityEntry(item)
|
||||||
mainActivity.updateIdentityEntry(item)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super.onPause()
|
super.onPause()
|
||||||
|
@ -56,7 +56,7 @@ class ComposeMessageFragment : Fragment() {
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
if (arguments != null) {
|
arguments?.let { arguments ->
|
||||||
var id = arguments.getSerializable(EXTRA_IDENTITY) as? BitmessageAddress
|
var id = arguments.getSerializable(EXTRA_IDENTITY) as? BitmessageAddress
|
||||||
if (context != null && (id == null || id.privateKey == null)) {
|
if (context != null && (id == null || id.privateKey == null)) {
|
||||||
id = Singleton.getIdentity(context)
|
id = Singleton.getIdentity(context)
|
||||||
@ -81,9 +81,9 @@ class ComposeMessageFragment : Fragment() {
|
|||||||
if (arguments.containsKey(EXTRA_PARENT)) {
|
if (arguments.containsKey(EXTRA_PARENT)) {
|
||||||
parent = arguments.getSerializable(EXTRA_PARENT) as Plaintext
|
parent = arguments.getSerializable(EXTRA_PARENT) as Plaintext
|
||||||
}
|
}
|
||||||
} else {
|
} ?: {
|
||||||
throw IllegalStateException("No identity set for ComposeMessageFragment")
|
throw IllegalStateException("No identity set for ComposeMessageFragment")
|
||||||
}
|
}.invoke()
|
||||||
setHasOptionsMenu(true)
|
setHasOptionsMenu(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,20 +109,18 @@ class ComposeMessageFragment : Fragment() {
|
|||||||
// leave current selection
|
// leave current selection
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (recipient != null) {
|
recipient?.let { recipient_input.setText(it.toString()) }
|
||||||
recipient_input.setText(recipient.toString())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
subject_input.setText(subject)
|
subject_input.setText(subject)
|
||||||
body_input.setText(content)
|
body_input.setText(content)
|
||||||
|
|
||||||
if (recipient == null) {
|
when {
|
||||||
recipient_input.requestFocus()
|
recipient == null -> recipient_input.requestFocus()
|
||||||
} else if (subject.isEmpty()) {
|
subject.isEmpty() -> subject_input.requestFocus()
|
||||||
subject_input.requestFocus()
|
else -> {
|
||||||
} else {
|
body_input.requestFocus()
|
||||||
body_input.requestFocus()
|
body_input.setSelection(0)
|
||||||
body_input.setSelection(0)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ class CreateAddressActivity : AppCompatActivity() {
|
|||||||
if (subscribe.isChecked) {
|
if (subscribe.isChecked) {
|
||||||
bmc.addSubscribtion(bmAddress)
|
bmc.addSubscribtion(bmAddress)
|
||||||
}
|
}
|
||||||
if (pubkeyBytes != null) {
|
pubkeyBytes?.let { pubkeyBytes ->
|
||||||
try {
|
try {
|
||||||
val pubkeyStream = ByteArrayInputStream(pubkeyBytes)
|
val pubkeyStream = ByteArrayInputStream(pubkeyBytes)
|
||||||
val stream = bmAddress.stream
|
val stream = bmAddress.stream
|
||||||
|
@ -33,7 +33,7 @@ class MessageDetailActivity : DetailActivity() {
|
|||||||
// http://developer.android.com/guide/components/fragments.html
|
// http://developer.android.com/guide/components/fragments.html
|
||||||
//
|
//
|
||||||
if (savedInstanceState == null) {
|
if (savedInstanceState == null) {
|
||||||
label = intent.getSerializableExtra(MainActivity.EXTRA_SHOW_LABEL) as Label
|
label = intent.getSerializableExtra(MainActivity.EXTRA_SHOW_LABEL) as Label?
|
||||||
// Create the detail fragment and add it to the activity
|
// Create the detail fragment and add it to the activity
|
||||||
// using a fragment transaction.
|
// using a fragment transaction.
|
||||||
val arguments = Bundle()
|
val arguments = Bundle()
|
||||||
|
@ -90,7 +90,7 @@ class MessageListFragment : Fragment(), ListHolder<Label> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun updateList(label: Label) {
|
override fun updateList(label: Label) {
|
||||||
if (currentLabel != null && currentLabel != label) {
|
if (currentLabel != null && currentLabel != label && currentLabel != backStack.peek()) {
|
||||||
backStack.push(currentLabel)
|
backStack.push(currentLabel)
|
||||||
}
|
}
|
||||||
if (!isResumed) {
|
if (!isResumed) {
|
||||||
@ -123,9 +123,7 @@ class MessageListFragment : Fragment(), ListHolder<Label> {
|
|||||||
messageRepo.findMessageIds(label)
|
messageRepo.findMessageIds(label)
|
||||||
.map { messageRepo.getMessage(it) }
|
.map { messageRepo.getMessage(it) }
|
||||||
.forEach { message ->
|
.forEach { message ->
|
||||||
uiThread {
|
uiThread { swipeableMessageAdapter?.add(message) }
|
||||||
swipeableMessageAdapter?.add(message)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -274,9 +272,7 @@ class MessageListFragment : Fragment(), ListHolder<Label> {
|
|||||||
messageRepo.remove(message)
|
messageRepo.remove(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
uiThread {
|
uiThread { updateList(currentLabel) }
|
||||||
updateList(currentLabel)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -26,32 +26,27 @@ import android.view.ViewGroup
|
|||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
import ch.dissem.apps.abit.Identicon
|
||||||
|
import ch.dissem.apps.abit.R
|
||||||
|
import ch.dissem.apps.abit.repository.AndroidMessageRepository.Companion.LABEL_ARCHIVE
|
||||||
|
import ch.dissem.apps.abit.util.Assets
|
||||||
|
import ch.dissem.apps.abit.util.Strings.prepareMessageExtract
|
||||||
|
import ch.dissem.bitmessage.entity.Plaintext
|
||||||
|
import ch.dissem.bitmessage.entity.valueobject.Label
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.swipeable.SwipeableItemAdapter
|
import com.h6ah4i.android.widget.advrecyclerview.swipeable.SwipeableItemAdapter
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.swipeable.SwipeableItemConstants
|
import com.h6ah4i.android.widget.advrecyclerview.swipeable.SwipeableItemConstants
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultAction
|
import com.h6ah4i.android.widget.advrecyclerview.swipeable.SwipeableItemConstants.*
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultActionMoveToSwipedDirection
|
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultActionMoveToSwipedDirection
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultActionRemoveItem
|
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultActionRemoveItem
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.utils.AbstractSwipeableItemViewHolder
|
import com.h6ah4i.android.widget.advrecyclerview.utils.AbstractSwipeableItemViewHolder
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.utils.RecyclerViewAdapterUtils
|
import com.h6ah4i.android.widget.advrecyclerview.utils.RecyclerViewAdapterUtils
|
||||||
|
import java.util.*
|
||||||
import java.util.LinkedList
|
|
||||||
|
|
||||||
import ch.dissem.apps.abit.Identicon
|
|
||||||
import ch.dissem.apps.abit.R
|
|
||||||
import ch.dissem.apps.abit.util.Assets
|
|
||||||
import ch.dissem.bitmessage.entity.Plaintext
|
|
||||||
import ch.dissem.bitmessage.entity.valueobject.Label
|
|
||||||
|
|
||||||
import ch.dissem.apps.abit.repository.AndroidMessageRepository.Companion.LABEL_ARCHIVE
|
|
||||||
import ch.dissem.apps.abit.util.Strings.prepareMessageExtract
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adapted from the basic swipeable example by Haruki Hasegawa. See
|
* Adapted from the basic swipeable example by Haruki Hasegawa. See
|
||||||
*
|
*
|
||||||
* @author Christian Basler
|
* @author Christian Basler
|
||||||
* @see [
|
* @see [https://github.com/h6ah4i/android-advancedrecyclerview](https://github.com/h6ah4i/android-advancedrecyclerview)
|
||||||
* https://github.com/h6ah4i/android-advancedrecyclerview](https://github.com/h6ah4i/android-advancedrecyclerview)
|
|
||||||
*/
|
*/
|
||||||
class SwipeableMessageAdapter : RecyclerView.Adapter<SwipeableMessageAdapter.ViewHolder>(), SwipeableItemAdapter<SwipeableMessageAdapter.ViewHolder>, SwipeableItemConstants {
|
class SwipeableMessageAdapter : RecyclerView.Adapter<SwipeableMessageAdapter.ViewHolder>(), SwipeableItemAdapter<SwipeableMessageAdapter.ViewHolder>, SwipeableItemConstants {
|
||||||
|
|
||||||
@ -108,16 +103,12 @@ class SwipeableMessageAdapter : RecyclerView.Adapter<SwipeableMessageAdapter.Vie
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun onItemViewClick(v: View) {
|
private fun onItemViewClick(v: View) {
|
||||||
if (eventListener != null) {
|
eventListener?.onItemViewClicked(v)
|
||||||
eventListener!!.onItemViewClicked(v)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onSwipeableViewContainerClick(v: View) {
|
private fun onSwipeableViewContainerClick(v: View) {
|
||||||
if (eventListener != null) {
|
eventListener?.onItemViewClicked(
|
||||||
eventListener!!.onItemViewClicked(
|
RecyclerViewAdapterUtils.getParentViewHolderItemView(v))
|
||||||
RecyclerViewAdapterUtils.getParentViewHolderItemView(v))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getItem(position: Int) = data[position]
|
fun getItem(position: Int) = data[position]
|
||||||
@ -133,52 +124,56 @@ class SwipeableMessageAdapter : RecyclerView.Adapter<SwipeableMessageAdapter.Vie
|
|||||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
val item = data[position]
|
val item = data[position]
|
||||||
|
|
||||||
if (activateOnItemClick) {
|
holder.apply {
|
||||||
holder.container.setBackgroundResource(
|
if (activateOnItemClick) {
|
||||||
if (position == selectedPosition)
|
container.setBackgroundResource(
|
||||||
R.drawable.bg_item_selected_state
|
if (position == selectedPosition)
|
||||||
else
|
R.drawable.bg_item_selected_state
|
||||||
R.drawable.bg_item_normal_state
|
else
|
||||||
)
|
R.drawable.bg_item_normal_state
|
||||||
}
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// set listeners
|
// set listeners
|
||||||
// (if the item is *pinned*, click event comes to the itemView)
|
// (if the item is *pinned*, click event comes to the itemView)
|
||||||
holder.itemView.setOnClickListener(itemViewOnClickListener)
|
itemView.setOnClickListener(itemViewOnClickListener)
|
||||||
// (if the item is *not pinned*, click event comes to the container)
|
// (if the item is *not pinned*, click event comes to the container)
|
||||||
holder.container.setOnClickListener(swipeableViewContainerOnClickListener)
|
container.setOnClickListener(swipeableViewContainerOnClickListener)
|
||||||
|
|
||||||
// set data
|
// set data
|
||||||
holder.avatar.setImageDrawable(Identicon(item.from))
|
avatar.setImageDrawable(Identicon(item.from))
|
||||||
holder.status.setImageResource(Assets.getStatusDrawable(item.status))
|
status.setImageResource(Assets.getStatusDrawable(item.status))
|
||||||
holder.status.contentDescription = holder.status.context.getString(Assets.getStatusString(item.status))
|
status.contentDescription = holder.status.context.getString(Assets.getStatusString(item.status))
|
||||||
holder.sender.text = item.from.toString()
|
sender.text = item.from.toString()
|
||||||
holder.subject.text = prepareMessageExtract(item.subject)
|
subject.text = prepareMessageExtract(item.subject)
|
||||||
holder.extract.text = prepareMessageExtract(item.text)
|
extract.text = prepareMessageExtract(item.text)
|
||||||
if (item.isUnread()) {
|
if (item.isUnread()) {
|
||||||
holder.sender.typeface = Typeface.DEFAULT_BOLD
|
sender.typeface = Typeface.DEFAULT_BOLD
|
||||||
holder.subject.typeface = Typeface.DEFAULT_BOLD
|
subject.typeface = Typeface.DEFAULT_BOLD
|
||||||
} else {
|
} else {
|
||||||
holder.sender.typeface = Typeface.DEFAULT
|
sender.typeface = Typeface.DEFAULT
|
||||||
holder.subject.typeface = Typeface.DEFAULT
|
subject.typeface = Typeface.DEFAULT
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount() = data.size
|
override fun getItemCount() = data.size
|
||||||
|
|
||||||
override fun onGetSwipeReactionType(holder: ViewHolder, position: Int, x: Int, y: Int): Int {
|
override fun onGetSwipeReactionType(holder: ViewHolder, position: Int, x: Int, y: Int): Int {
|
||||||
return if (label === LABEL_ARCHIVE || label!!.type == Label.Type.TRASH) {
|
return if (label === LABEL_ARCHIVE || label?.type == Label.Type.TRASH) {
|
||||||
SwipeableItemConstants.REACTION_CAN_SWIPE_LEFT or SwipeableItemConstants.REACTION_CAN_NOT_SWIPE_RIGHT_WITH_RUBBER_BAND_EFFECT
|
REACTION_CAN_SWIPE_LEFT or REACTION_CAN_NOT_SWIPE_RIGHT_WITH_RUBBER_BAND_EFFECT
|
||||||
} else SwipeableItemConstants.REACTION_CAN_SWIPE_BOTH_H
|
} else {
|
||||||
|
REACTION_CAN_SWIPE_BOTH_H
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SwitchIntDef")
|
@SuppressLint("SwitchIntDef")
|
||||||
override fun onSetSwipeBackground(holder: ViewHolder, position: Int, type: Int) {
|
override fun onSetSwipeBackground(holder: ViewHolder, position: Int, type: Int) {
|
||||||
var bgRes = 0
|
var bgRes = 0
|
||||||
when (type) {
|
when (type) {
|
||||||
SwipeableItemConstants.DRAWABLE_SWIPE_NEUTRAL_BACKGROUND -> bgRes = R.drawable.bg_swipe_item_neutral
|
DRAWABLE_SWIPE_NEUTRAL_BACKGROUND -> bgRes = R.drawable.bg_swipe_item_neutral
|
||||||
SwipeableItemConstants.DRAWABLE_SWIPE_LEFT_BACKGROUND -> bgRes = R.drawable.bg_swipe_item_left
|
DRAWABLE_SWIPE_LEFT_BACKGROUND -> bgRes = R.drawable.bg_swipe_item_left
|
||||||
SwipeableItemConstants.DRAWABLE_SWIPE_RIGHT_BACKGROUND -> if (label === LABEL_ARCHIVE || label!!.type == Label.Type.TRASH) {
|
DRAWABLE_SWIPE_RIGHT_BACKGROUND -> if (label === LABEL_ARCHIVE || label?.type == Label.Type.TRASH) {
|
||||||
bgRes = R.drawable.bg_swipe_item_neutral
|
bgRes = R.drawable.bg_swipe_item_neutral
|
||||||
} else {
|
} else {
|
||||||
bgRes = R.drawable.bg_swipe_item_right
|
bgRes = R.drawable.bg_swipe_item_right
|
||||||
@ -188,13 +183,12 @@ class SwipeableMessageAdapter : RecyclerView.Adapter<SwipeableMessageAdapter.Vie
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SwitchIntDef")
|
@SuppressLint("SwitchIntDef")
|
||||||
override fun onSwipeItem(holder: ViewHolder, position: Int, result: Int): SwipeResultAction? {
|
override fun onSwipeItem(holder: ViewHolder, position: Int, result: Int) =
|
||||||
when (result) {
|
when (result) {
|
||||||
SwipeableItemConstants.RESULT_SWIPED_RIGHT -> return SwipeRightResultAction(this, position)
|
RESULT_SWIPED_RIGHT -> SwipeRightResultAction(this, position)
|
||||||
SwipeableItemConstants.RESULT_SWIPED_LEFT -> return SwipeLeftResultAction(this, position)
|
RESULT_SWIPED_LEFT -> SwipeLeftResultAction(this, position)
|
||||||
else -> return null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fun setSelectedPosition(selectedPosition: Int) {
|
fun setSelectedPosition(selectedPosition: Int) {
|
||||||
val oldPosition = this.selectedPosition
|
val oldPosition = this.selectedPosition
|
||||||
@ -210,8 +204,10 @@ class SwipeableMessageAdapter : RecyclerView.Adapter<SwipeableMessageAdapter.Vie
|
|||||||
override fun onPerformAction() {
|
override fun onPerformAction() {
|
||||||
super.onPerformAction()
|
super.onPerformAction()
|
||||||
|
|
||||||
adapter?.data?.removeAt(position)
|
adapter?.apply {
|
||||||
adapter?.notifyItemRemoved(position)
|
data.removeAt(position)
|
||||||
|
notifyItemRemoved(position)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSlideAnimationEnd() {
|
override fun onSlideAnimationEnd() {
|
||||||
@ -233,8 +229,10 @@ class SwipeableMessageAdapter : RecyclerView.Adapter<SwipeableMessageAdapter.Vie
|
|||||||
override fun onPerformAction() {
|
override fun onPerformAction() {
|
||||||
super.onPerformAction()
|
super.onPerformAction()
|
||||||
|
|
||||||
adapter?.data?.removeAt(position)
|
adapter?.apply {
|
||||||
adapter?.notifyItemRemoved(position)
|
data.removeAt(position)
|
||||||
|
notifyItemRemoved(position)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSlideAnimationEnd() {
|
override fun onSlideAnimationEnd() {
|
||||||
|
Loading…
Reference in New Issue
Block a user