From 40e24c3a393e1252dd1f05c6d4bc20b0d4a19bc3 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Wed, 13 May 2020 13:29:55 +0200 Subject: [PATCH] Start transitioning to the mute functions of the core --- jni/dc_wrapper.c | 13 +++++++++++-- src/com/b44t/messenger/DcChat.java | 1 + src/com/b44t/messenger/DcContext.java | 1 + .../securesms/ConversationActivity.java | 10 +++++----- .../securesms/ConversationTitleView.java | 2 +- src/org/thoughtcrime/securesms/MuteDialog.java | 14 +++++++------- .../thoughtcrime/securesms/ProfileActivity.java | 15 +++++---------- .../securesms/notifications/MessageNotifier.java | 6 +++--- src/org/thoughtcrime/securesms/util/Prefs.java | 13 +++++-------- 9 files changed, 39 insertions(+), 36 deletions(-) diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index ef74c388b..3afac1711 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -1184,6 +1184,16 @@ JNIEXPORT jintArray Java_com_b44t_messenger_DcContext_getChatContacts(JNIEnv *en return dc_array2jintArray_n_unref(env, ca); } +JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_setChatMuteDuration(JNIEnv *env, jobject obj, jint chat_id, jlong duration) +{ + return dc_set_chat_mute_duration(get_dc_context(env, obj), chat_id, duration); +} + +JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isMuted(JNIEnv *env, jobject obj) +{ + return dc_chat_is_muted(get_dc_chat(env, obj)); +} + /******************************************************************************* * DcMsg @@ -1668,5 +1678,4 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_dataToString(JNIEnv *env, jc } const char* cstring = (const char*)data; return JSTRING_NEW(cstring); -} - +} \ No newline at end of file diff --git a/src/com/b44t/messenger/DcChat.java b/src/com/b44t/messenger/DcChat.java index 111f2a4f6..172496426 100644 --- a/src/com/b44t/messenger/DcChat.java +++ b/src/com/b44t/messenger/DcChat.java @@ -35,6 +35,7 @@ public class DcChat { public native boolean canSend (); public native boolean isVerified (); public native boolean isSendingLocations(); + public native boolean isMuted (); // working with raw c-data private long chatCPtr; // CAVE: the name is referenced in the JNI diff --git a/src/com/b44t/messenger/DcContext.java b/src/com/b44t/messenger/DcContext.java index a7b77d125..38a4f8fca 100644 --- a/src/com/b44t/messenger/DcContext.java +++ b/src/com/b44t/messenger/DcContext.java @@ -161,6 +161,7 @@ public class DcContext { public native int[] getChatMedia (int chat_id, int type1, int type2, int type3); public native int getNextMedia (int msg_id, int dir, int type1, int type2, int type3); public native int[] getChatContacts (int chat_id); + public native boolean setChatMuteDuration (int chat_id, long duration); public native void deleteChat (int chat_id); public @NonNull DcMsg getMsg (int msg_id) { return new DcMsg(getMsgCPtr(msg_id)); } public native String getMsgInfo (int id); diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index 4c6a8157f..0981c14e5 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -433,7 +433,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity inflater.inflate(R.menu.conversation, menu); - if(Prefs.isChatMuted(this, chatId)) { + if(Prefs.isChatMuted(dcChat)) { menu.findItem(R.id.menu_mute_notifications).setTitle(R.string.menu_unmute); } @@ -561,14 +561,14 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } private void handleMuteNotifications() { - if(!Prefs.isChatMuted(this, chatId)) { - MuteDialog.show(this, until -> { - Prefs.setChatMutedUntil(this, chatId, until); + if(!Prefs.isChatMuted(dcChat)) { + MuteDialog.show(this, duration -> { + Prefs.setChatMuteDuration(dcContext, chatId, duration); titleView.setTitle(glideRequests, dcChat); }); } else { // unmute - Prefs.setChatMutedUntil(this, chatId, 0); + Prefs.setChatMuteDuration(dcContext, chatId, 0); titleView.setTitle(glideRequests, dcChat); } } diff --git a/src/org/thoughtcrime/securesms/ConversationTitleView.java b/src/org/thoughtcrime/securesms/ConversationTitleView.java index 3a6589aa7..c69a31b14 100644 --- a/src/org/thoughtcrime/securesms/ConversationTitleView.java +++ b/src/org/thoughtcrime/securesms/ConversationTitleView.java @@ -66,7 +66,7 @@ public class ConversationTitleView extends RelativeLayout { setComposeTitle(); } else { setRecipientTitle(dcChat, showSubtitle); - if (Prefs.isChatMuted(getContext(), dcChat.getId())) { + if (Prefs.isChatMuted(dcChat)) { imgLeft = R.drawable.ic_volume_off_white_18dp; } if (dcChat.isVerified()) { diff --git a/src/org/thoughtcrime/securesms/MuteDialog.java b/src/org/thoughtcrime/securesms/MuteDialog.java index 43b43c289..089908b46 100644 --- a/src/org/thoughtcrime/securesms/MuteDialog.java +++ b/src/org/thoughtcrime/securesms/MuteDialog.java @@ -15,20 +15,20 @@ public class MuteDialog { builder.setItems(R.array.mute_durations, (dialog, which) -> { final long muteUntil; + // See https://c.delta.chat/classdc__context__t.html#a6460395925d49d2053bc95224bf5ce37. switch (which) { - case 0: muteUntil = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1); break; - case 1: muteUntil = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(2); break; - case 2: muteUntil = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1); break; - case 3: muteUntil = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(7); break; - case 4: muteUntil = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(36500); break; - default: muteUntil = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1); break; + case 0: muteUntil = 0; break; // unmute + case 1: muteUntil = TimeUnit.HOURS.toSeconds(2); break; + case 2: muteUntil = TimeUnit.DAYS.toSeconds(1); break; + case 3: muteUntil = TimeUnit.DAYS.toSeconds(7); break; + case 4: muteUntil = -1; break; // mute forever + default: muteUntil = 0; break; } listener.onMuted(muteUntil); }); builder.show(); - } public interface MuteSelectionListener { diff --git a/src/org/thoughtcrime/securesms/ProfileActivity.java b/src/org/thoughtcrime/securesms/ProfileActivity.java index 9a661bd27..8a1f9f7fa 100644 --- a/src/org/thoughtcrime/securesms/ProfileActivity.java +++ b/src/org/thoughtcrime/securesms/ProfileActivity.java @@ -140,7 +140,7 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity item = menu.findItem(R.id.menu_mute_notifications); if(item!=null) { - item.setTitle(Prefs.isChatMuted(this, chatId)? R.string.menu_unmute : R.string.menu_mute); + item.setTitle(Prefs.isChatMuted(dcContext.getChat(chatId))? R.string.menu_unmute : R.string.menu_mute); } super.onPrepareOptionsMenu(menu); @@ -351,7 +351,7 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity } public void onNotifyOnOff() { - if (Prefs.isChatMuted(this, chatId)) { + if (Prefs.isChatMuted(dcContext.getChat(chatId))) { setMuted(0); } else { @@ -359,14 +359,9 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity } } - private void setMuted(final long until) { - if(chatId!=0) { - Prefs.setChatMutedUntil(this, chatId, until); - - // normally, sendToObservers() is only used to forward events from the core to the ui. - // we do an exception here, as "mute" is not handled by the core, - // but various elements listen to similar changes with the DC_EVENT_CHAT_MODIFIED event. - dcContext.eventCenter.sendToObservers(DcContext.DC_EVENT_CHAT_MODIFIED, new Integer(chatId), 0); + private void setMuted(final long duration) { + if (chatId != 0) { + Prefs.setChatMuteDuration(dcContext, chatId, duration); } } diff --git a/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java b/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java index 782c67223..c1f96d34f 100644 --- a/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java +++ b/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java @@ -90,7 +90,7 @@ abstract class MessageNotifier { boolean isVisible = visibleChatId == chatId; if (!Prefs.isNotificationsEnabled(appContext) || - Prefs.isChatMuted(appContext, chatId)) + Prefs.isChatMuted(dcContext.getChat(chatId))) { return; } @@ -352,7 +352,7 @@ abstract class MessageNotifier { return; } - if(Prefs.isChatMuted(appContext, chatId)) { + if(Prefs.isChatMuted(, chatId)) { Log.d(TAG, "chat muted"); return; } @@ -363,7 +363,7 @@ abstract class MessageNotifier { } void addMessageToNotificationState(ApplicationDcContext dcContext, int chatId, int msgId) { - if (Prefs.isChatMuted(appContext, chatId)) { + if (Prefs.isChatMuted(dcContext.getChat(chatId))) { return; } diff --git a/src/org/thoughtcrime/securesms/util/Prefs.java b/src/org/thoughtcrime/securesms/util/Prefs.java index 0c69a5602..30a529add 100644 --- a/src/org/thoughtcrime/securesms/util/Prefs.java +++ b/src/org/thoughtcrime/securesms/util/Prefs.java @@ -12,6 +12,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat; +import com.b44t.messenger.DcChat; import com.b44t.messenger.DcContext; import com.mapbox.mapboxsdk.geometry.LatLng; @@ -278,16 +279,12 @@ public class Prefs { // mute - public static void setChatMutedUntil(Context context, int chatId, long until) { - setLongPreference(context, CHAT_MUTED_UNTIL+chatId, until); + public static void setChatMuteDuration(DcContext context, int chatId, long duration) { + context.setChatMuteDuration(chatId, duration); } - public static long getChatMutedUntil(Context context, int chatId) { - return getLongPreference(context, CHAT_MUTED_UNTIL+chatId, 0); - } - - public static boolean isChatMuted(Context context, int chatId) { - return System.currentTimeMillis() <= getChatMutedUntil(context, chatId); + public static boolean isChatMuted(DcChat chat) { + return chat.isMuted(); } // map