diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java index 4e3eff2679..cbf1c21379 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java @@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.conversation.colors.ChatColorsPalette; import org.thoughtcrime.securesms.conversation.colors.NameColor; import org.thoughtcrime.securesms.database.DatabaseObserver; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.groups.LiveGroup; import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry; import org.thoughtcrime.securesms.mediasend.Media; @@ -32,11 +33,14 @@ import org.thoughtcrime.securesms.mediasend.MediaRepository; import org.thoughtcrime.securesms.ratelimit.RecaptchaRequiredEvent; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.util.DefaultValueLiveData; import org.thoughtcrime.securesms.util.SingleLiveEvent; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; import org.thoughtcrime.securesms.wallpaper.ChatWallpaper; import org.whispersystems.libsignal.util.Pair; +import org.whispersystems.libsignal.util.guava.Optional; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -203,9 +207,13 @@ public class ConversationViewModel extends ViewModel { } @NonNull LiveData> getNameColorsMap() { - LiveData recipient = Transformations.switchMap(recipientId, r -> Recipient.live(r).getLiveData()); - LiveData groupRecipients = LiveDataUtil.filter(recipient, Recipient::isGroup); - LiveData> groupMembers = Transformations.switchMap(groupRecipients, r -> new LiveGroup(r.getGroupId().get()).getFullMembers()); + LiveData recipient = Transformations.switchMap(recipientId, r -> Recipient.live(r).getLiveData()); + LiveData> group = Transformations.map(recipient, Recipient::getGroupId); + LiveData> groupMembers = Transformations.switchMap(group, g -> { + //noinspection CodeBlock2Expr + return g.transform(id -> new LiveGroup(id).getFullMembers()) + .or(() -> new DefaultValueLiveData<>(Collections.emptyList())); + }); return Transformations.map(groupMembers, members -> { List sorted = Stream.of(members) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionRepository.kt index 147c70f917..b2f20ab7dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionRepository.kt @@ -25,9 +25,9 @@ sealed class ChatColorSelectionRepository(context: Context) { } } - fun getUsageCount(chatColors: ChatColors, consumer: (Int) -> Unit) { + fun getUsageCount(chatColorsId: ChatColors.Id, consumer: (Int) -> Unit) { SignalExecutors.BOUNDED.execute { - consumer(DatabaseFactory.getRecipientDatabase(context).getColorUsageCount(chatColors)) + consumer(DatabaseFactory.getRecipientDatabase(context).getColorUsageCount(chatColorsId)) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionViewModel.kt index 7e58f7b6d6..a9f811d6b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionViewModel.kt @@ -42,7 +42,7 @@ class ChatColorSelectionViewModel(private val repository: ChatColorSelectionRepo } fun startDeletion(chatColors: ChatColors) { - repository.getUsageCount(chatColors) { + repository.getUsageCount(chatColors.id) { if (it > 0) { internalEvents.postValue(Event.ConfirmDeletion(it, chatColors)) } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorPageFragment.kt index 77c31660c2..73e97856fa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorPageFragment.kt @@ -13,6 +13,7 @@ import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import android.os.Bundle import android.view.View +import android.widget.ScrollView import android.widget.SeekBar import androidx.annotation.ColorInt import androidx.annotation.Dimension @@ -60,11 +61,20 @@ class CustomChatColorCreatorPageFragment : val gradientTool: CustomChatColorGradientToolView = view.findViewById(R.id.gradient_tool) val save: View = view.findViewById(R.id.save) + val scrollView: ScrollView = view.findViewById(R.id.scroll_view) if (page == SINGLE_PAGE) { gradientTool.visibility = View.GONE } else { gradientTool.setListener(object : CustomChatColorGradientToolView.Listener { + override fun onGestureStarted() { + scrollView.requestDisallowInterceptTouchEvent(true) + } + + override fun onGestureFinished() { + scrollView.requestDisallowInterceptTouchEvent(false) + } + override fun onDegreesChanged(degrees: Float) { viewModel.setDegrees(degrees) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorRepository.kt index 3720b1a682..e54b8a4aff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorRepository.kt @@ -39,11 +39,11 @@ class CustomChatColorCreatorRepository(private val context: Context) { } } - fun getUsageCount(chatColors: ChatColors, consumer: (Int) -> Unit) { + fun getUsageCount(chatColorsId: ChatColors.Id, consumer: (Int) -> Unit) { SignalExecutors.BOUNDED.execute { val recipientsDatabase = DatabaseFactory.getRecipientDatabase(context) - consumer(recipientsDatabase.getColorUsageCount(chatColors)) + consumer(recipientsDatabase.getColorUsageCount(chatColorsId)) } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorViewModel.kt index 4077e7d0a0..7ef745c6cb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorViewModel.kt @@ -105,8 +105,8 @@ class CustomChatColorCreatorViewModel( } fun startSave(chatColors: ChatColors) { - if (chatColors.id is ChatColors.Id.Custom) { - repository.getUsageCount(chatColors) { + if (chatColorsId is ChatColors.Id.Custom) { + repository.getUsageCount(chatColorsId) { if (it > 0) { internalEvents.postValue(Event.Warn(it, chatColors)) } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorGradientToolView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorGradientToolView.kt index 01afde0919..bf7a8517b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorGradientToolView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorGradientToolView.kt @@ -103,7 +103,8 @@ class CustomChatColorGradientToolView @JvmOverloads constructor( color = ContextCompat.getColor(context, R.color.signal_inverse_transparent_10) } - val gestureDetectorCompat = GestureDetectorCompat(context, GestureListener()) + private val gestureListener = GestureListener() + private val gestureDetectorCompat = GestureDetectorCompat(context, gestureListener) fun setTopColor(@ColorInt color: Int) { topColorPaint.color = color @@ -147,7 +148,14 @@ class CustomChatColorGradientToolView @JvmOverloads constructor( this.listener = listener } - override fun onTouchEvent(event: MotionEvent?): Boolean { + override fun onTouchEvent(event: MotionEvent): Boolean { + + if (event.action == MotionEvent.ACTION_CANCEL || event.action == MotionEvent.ACTION_UP) { + listener?.onGestureFinished() + } else if (event.action == MotionEvent.ACTION_DOWN) { + listener?.onGestureStarted() + } + return gestureDetectorCompat.onTouchEvent(event) } @@ -303,6 +311,8 @@ class CustomChatColorGradientToolView @JvmOverloads constructor( private fun Float.rotate(degrees: Float): Float = (this + degrees + 360f) % 360f interface Listener { + fun onGestureStarted() + fun onGestureFinished() fun onDegreesChanged(degrees: Float) fun onSelectedEdgeChanged(edge: CustomChatColorEdge) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java index 6786842636..d57b8bc1ba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java @@ -1411,11 +1411,11 @@ public class RecipientDatabase extends Database { } } - public int getColorUsageCount(@NotNull ChatColors chatColors) { + public int getColorUsageCount(@NotNull ChatColors.Id chatColorsId) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); String[] projection = SqlUtil.buildArgs("COUNT(*)"); String where = CUSTOM_CHAT_COLORS_ID + " = ?"; - String[] args = SqlUtil.buildArgs(chatColors.getId().getLongValue()); + String[] args = SqlUtil.buildArgs(chatColorsId.getLongValue()); try (Cursor cursor = db.query(TABLE_NAME, projection, where, args, null, null, null)) { if (cursor == null) { diff --git a/app/src/main/res/layout/conversation_typing_view.xml b/app/src/main/res/layout/conversation_typing_view.xml index 7336b52b0f..a7096355a3 100644 --- a/app/src/main/res/layout/conversation_typing_view.xml +++ b/app/src/main/res/layout/conversation_typing_view.xml @@ -36,6 +36,7 @@ android:layout_height="match_parent">