mirror of
https://github.com/oxen-io/session-android.git
synced 2025-04-16 22:11:26 +00:00
feat: add notification types for all / mentions only or none with UI and push logic
This commit is contained in:
parent
0131bc171a
commit
b95cb2bedb
@ -2,6 +2,7 @@ package org.thoughtcrime.securesms;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
|
||||||
@ -33,11 +34,10 @@ public class MuteDialog extends AlertDialog {
|
|||||||
final long muteUntil;
|
final long muteUntil;
|
||||||
|
|
||||||
switch (which) {
|
switch (which) {
|
||||||
case 0: muteUntil = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1); break;
|
|
||||||
case 1: muteUntil = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(2); break;
|
case 1: muteUntil = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(2); break;
|
||||||
case 2: muteUntil = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1); break;
|
case 2: muteUntil = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1); break;
|
||||||
case 3: muteUntil = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(7); break;
|
case 3: muteUntil = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(7); break;
|
||||||
case 4: muteUntil = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(365); break;
|
case 4: muteUntil = Long.MAX_VALUE; break;
|
||||||
default: muteUntil = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1); break;
|
default: muteUntil = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,13 +36,14 @@ import org.session.libsession.utilities.recipients.Recipient
|
|||||||
import org.session.libsignal.utilities.guava.Optional
|
import org.session.libsignal.utilities.guava.Optional
|
||||||
import org.session.libsignal.utilities.toHexString
|
import org.session.libsignal.utilities.toHexString
|
||||||
import org.thoughtcrime.securesms.*
|
import org.thoughtcrime.securesms.*
|
||||||
|
import org.thoughtcrime.securesms.contacts.SelectContactsActivity
|
||||||
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
|
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
|
||||||
|
import org.thoughtcrime.securesms.conversation.v2.utilities.NotificationUtils
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||||
import org.thoughtcrime.securesms.groups.EditClosedGroupActivity
|
import org.thoughtcrime.securesms.groups.EditClosedGroupActivity
|
||||||
import org.thoughtcrime.securesms.groups.EditClosedGroupActivity.Companion.groupIDKey
|
import org.thoughtcrime.securesms.groups.EditClosedGroupActivity.Companion.groupIDKey
|
||||||
import org.thoughtcrime.securesms.contacts.SelectContactsActivity
|
|
||||||
import org.thoughtcrime.securesms.util.getColorWithID
|
|
||||||
import org.thoughtcrime.securesms.util.BitmapUtil
|
import org.thoughtcrime.securesms.util.BitmapUtil
|
||||||
|
import org.thoughtcrime.securesms.util.getColorWithID
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
|
||||||
object ConversationMenuHelper {
|
object ConversationMenuHelper {
|
||||||
@ -152,6 +153,7 @@ object ConversationMenuHelper {
|
|||||||
R.id.menu_invite_to_open_group -> { inviteContacts(context, thread) }
|
R.id.menu_invite_to_open_group -> { inviteContacts(context, thread) }
|
||||||
R.id.menu_unmute_notifications -> { unmute(context, thread) }
|
R.id.menu_unmute_notifications -> { unmute(context, thread) }
|
||||||
R.id.menu_mute_notifications -> { mute(context, thread) }
|
R.id.menu_mute_notifications -> { mute(context, thread) }
|
||||||
|
R.id.menu_notification_settings -> { setNotifyType(context, thread) }
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -325,4 +327,11 @@ object ConversationMenuHelper {
|
|||||||
DatabaseFactory.getRecipientDatabase(context).setMuted(thread, until)
|
DatabaseFactory.getRecipientDatabase(context).setMuted(thread, until)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setNotifyType(context: Context, thread: Recipient) {
|
||||||
|
NotificationUtils.showNotifyDialog(context, thread) { notifyType ->
|
||||||
|
DatabaseFactory.getRecipientDatabase(context).setNotifyType(thread, notifyType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package org.thoughtcrime.securesms.conversation.v2.utilities
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import network.loki.messenger.R
|
||||||
|
import org.session.libsession.utilities.recipients.Recipient
|
||||||
|
|
||||||
|
object NotificationUtils {
|
||||||
|
fun showNotifyDialog(context: Context, thread: Recipient, notifyTypeHandler: (Int)->Unit) {
|
||||||
|
val notifyTypes = context.resources.getStringArray(R.array.notify_types)
|
||||||
|
val currentSelected = thread.notifyType
|
||||||
|
|
||||||
|
AlertDialog.Builder(context)
|
||||||
|
.setSingleChoiceItems(notifyTypes,currentSelected) { d, newSelection ->
|
||||||
|
notifyTypeHandler(newSelection)
|
||||||
|
d.dismiss()
|
||||||
|
}
|
||||||
|
.setTitle(R.string.RecipientPreferenceActivity_notification_settings)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
}
|
@ -10,17 +10,18 @@ import androidx.annotation.Nullable;
|
|||||||
import com.annimon.stream.Stream;
|
import com.annimon.stream.Stream;
|
||||||
|
|
||||||
import net.sqlcipher.database.SQLiteDatabase;
|
import net.sqlcipher.database.SQLiteDatabase;
|
||||||
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
|
|
||||||
|
|
||||||
import org.session.libsession.utilities.MaterialColor;
|
|
||||||
import org.session.libsession.utilities.Address;
|
import org.session.libsession.utilities.Address;
|
||||||
import org.session.libsession.utilities.recipients.Recipient;
|
import org.session.libsession.utilities.MaterialColor;
|
||||||
import org.session.libsession.utilities.recipients.Recipient.*;
|
|
||||||
import org.session.libsignal.utilities.Base64;
|
|
||||||
import org.session.libsession.utilities.Util;
|
import org.session.libsession.utilities.Util;
|
||||||
|
import org.session.libsession.utilities.recipients.Recipient;
|
||||||
import org.session.libsignal.utilities.guava.Optional;
|
import org.session.libsession.utilities.recipients.Recipient.RecipientSettings;
|
||||||
|
import org.session.libsession.utilities.recipients.Recipient.RegisteredState;
|
||||||
|
import org.session.libsession.utilities.recipients.Recipient.UnidentifiedAccessMode;
|
||||||
|
import org.session.libsignal.utilities.Base64;
|
||||||
import org.session.libsignal.utilities.Log;
|
import org.session.libsignal.utilities.Log;
|
||||||
|
import org.session.libsignal.utilities.guava.Optional;
|
||||||
|
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
|
||||||
|
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -55,13 +56,14 @@ public class RecipientDatabase extends Database {
|
|||||||
private static final String NOTIFICATION_CHANNEL = "notification_channel";
|
private static final String NOTIFICATION_CHANNEL = "notification_channel";
|
||||||
private static final String UNIDENTIFIED_ACCESS_MODE = "unidentified_access_mode";
|
private static final String UNIDENTIFIED_ACCESS_MODE = "unidentified_access_mode";
|
||||||
private static final String FORCE_SMS_SELECTION = "force_sms_selection";
|
private static final String FORCE_SMS_SELECTION = "force_sms_selection";
|
||||||
|
private static final String NOTIFY_TYPE = "notify_type"; // all, mentions only, none
|
||||||
|
|
||||||
private static final String[] RECIPIENT_PROJECTION = new String[] {
|
private static final String[] RECIPIENT_PROJECTION = new String[] {
|
||||||
BLOCK, NOTIFICATION, CALL_RINGTONE, VIBRATE, CALL_VIBRATE, MUTE_UNTIL, COLOR, SEEN_INVITE_REMINDER, DEFAULT_SUBSCRIPTION_ID, EXPIRE_MESSAGES, REGISTERED,
|
BLOCK, NOTIFICATION, CALL_RINGTONE, VIBRATE, CALL_VIBRATE, MUTE_UNTIL, COLOR, SEEN_INVITE_REMINDER, DEFAULT_SUBSCRIPTION_ID, EXPIRE_MESSAGES, REGISTERED,
|
||||||
PROFILE_KEY, SYSTEM_DISPLAY_NAME, SYSTEM_PHOTO_URI, SYSTEM_PHONE_LABEL, SYSTEM_CONTACT_URI,
|
PROFILE_KEY, SYSTEM_DISPLAY_NAME, SYSTEM_PHOTO_URI, SYSTEM_PHONE_LABEL, SYSTEM_CONTACT_URI,
|
||||||
SIGNAL_PROFILE_NAME, SIGNAL_PROFILE_AVATAR, PROFILE_SHARING, NOTIFICATION_CHANNEL,
|
SIGNAL_PROFILE_NAME, SIGNAL_PROFILE_AVATAR, PROFILE_SHARING, NOTIFICATION_CHANNEL,
|
||||||
UNIDENTIFIED_ACCESS_MODE,
|
UNIDENTIFIED_ACCESS_MODE,
|
||||||
FORCE_SMS_SELECTION,
|
FORCE_SMS_SELECTION, NOTIFY_TYPE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static final List<String> TYPED_RECIPIENT_PROJECTION = Stream.of(RECIPIENT_PROJECTION)
|
static final List<String> TYPED_RECIPIENT_PROJECTION = Stream.of(RECIPIENT_PROJECTION)
|
||||||
@ -95,6 +97,15 @@ public class RecipientDatabase extends Database {
|
|||||||
UNIDENTIFIED_ACCESS_MODE + " INTEGER DEFAULT 0, " +
|
UNIDENTIFIED_ACCESS_MODE + " INTEGER DEFAULT 0, " +
|
||||||
FORCE_SMS_SELECTION + " INTEGER DEFAULT 0);";
|
FORCE_SMS_SELECTION + " INTEGER DEFAULT 0);";
|
||||||
|
|
||||||
|
public static String getCreateNotificationTypeCommand() {
|
||||||
|
return "ALTER TABLE "+ TABLE_NAME + " " +
|
||||||
|
"ADD COLUMN " + NOTIFY_TYPE + " INTEGER DEFAULT 0;";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final int NOTIFY_TYPE_ALL = 0;
|
||||||
|
public static final int NOTIFY_TYPE_MENTIONS = 1;
|
||||||
|
public static final int NOTIFY_TYPE_NONE = 2;
|
||||||
|
|
||||||
public RecipientDatabase(Context context, SQLCipherOpenHelper databaseHelper) {
|
public RecipientDatabase(Context context, SQLCipherOpenHelper databaseHelper) {
|
||||||
super(context, databaseHelper);
|
super(context, databaseHelper);
|
||||||
}
|
}
|
||||||
@ -131,6 +142,7 @@ public class RecipientDatabase extends Database {
|
|||||||
int messageVibrateState = cursor.getInt(cursor.getColumnIndexOrThrow(VIBRATE));
|
int messageVibrateState = cursor.getInt(cursor.getColumnIndexOrThrow(VIBRATE));
|
||||||
int callVibrateState = cursor.getInt(cursor.getColumnIndexOrThrow(CALL_VIBRATE));
|
int callVibrateState = cursor.getInt(cursor.getColumnIndexOrThrow(CALL_VIBRATE));
|
||||||
long muteUntil = cursor.getLong(cursor.getColumnIndexOrThrow(MUTE_UNTIL));
|
long muteUntil = cursor.getLong(cursor.getColumnIndexOrThrow(MUTE_UNTIL));
|
||||||
|
int notifyType = cursor.getInt(cursor.getColumnIndexOrThrow(NOTIFY_TYPE));
|
||||||
String serializedColor = cursor.getString(cursor.getColumnIndexOrThrow(COLOR));
|
String serializedColor = cursor.getString(cursor.getColumnIndexOrThrow(COLOR));
|
||||||
int defaultSubscriptionId = cursor.getInt(cursor.getColumnIndexOrThrow(DEFAULT_SUBSCRIPTION_ID));
|
int defaultSubscriptionId = cursor.getInt(cursor.getColumnIndexOrThrow(DEFAULT_SUBSCRIPTION_ID));
|
||||||
int expireMessages = cursor.getInt(cursor.getColumnIndexOrThrow(EXPIRE_MESSAGES));
|
int expireMessages = cursor.getInt(cursor.getColumnIndexOrThrow(EXPIRE_MESSAGES));
|
||||||
@ -167,6 +179,7 @@ public class RecipientDatabase extends Database {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return Optional.of(new RecipientSettings(blocked, muteUntil,
|
return Optional.of(new RecipientSettings(blocked, muteUntil,
|
||||||
|
notifyType,
|
||||||
Recipient.VibrateState.fromId(messageVibrateState),
|
Recipient.VibrateState.fromId(messageVibrateState),
|
||||||
Recipient.VibrateState.fromId(callVibrateState),
|
Recipient.VibrateState.fromId(callVibrateState),
|
||||||
Util.uri(messageRingtone), Util.uri(callRingtone),
|
Util.uri(messageRingtone), Util.uri(callRingtone),
|
||||||
@ -214,6 +227,18 @@ public class RecipientDatabase extends Database {
|
|||||||
recipient.resolve().setMuted(until);
|
recipient.resolve().setMuted(until);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param recipient to modify notifications for
|
||||||
|
* @param notifyType the new notification type {@link #NOTIFY_TYPE_ALL}, {@link #NOTIFY_TYPE_MENTIONS} or {@link #NOTIFY_TYPE_NONE}
|
||||||
|
*/
|
||||||
|
public void setNotifyType(@NonNull Recipient recipient, int notifyType) {
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
values.put(NOTIFY_TYPE, notifyType);
|
||||||
|
updateOrInsert(recipient.getAddress(), values);
|
||||||
|
recipient.resolve().setNotifyType(notifyType);
|
||||||
|
}
|
||||||
|
|
||||||
public void setExpireMessages(@NonNull Recipient recipient, int expiration) {
|
public void setExpireMessages(@NonNull Recipient recipient, int expiration) {
|
||||||
recipient.setExpireMessages(expiration);
|
recipient.setExpireMessages(expiration);
|
||||||
|
|
||||||
|
@ -10,26 +10,26 @@ import net.sqlcipher.database.SQLiteDatabase;
|
|||||||
import net.sqlcipher.database.SQLiteDatabaseHook;
|
import net.sqlcipher.database.SQLiteDatabaseHook;
|
||||||
import net.sqlcipher.database.SQLiteOpenHelper;
|
import net.sqlcipher.database.SQLiteOpenHelper;
|
||||||
|
|
||||||
|
import org.session.libsignal.utilities.Log;
|
||||||
import org.thoughtcrime.securesms.crypto.DatabaseSecret;
|
import org.thoughtcrime.securesms.crypto.DatabaseSecret;
|
||||||
import org.thoughtcrime.securesms.database.AttachmentDatabase;
|
import org.thoughtcrime.securesms.database.AttachmentDatabase;
|
||||||
import org.thoughtcrime.securesms.database.DraftDatabase;
|
import org.thoughtcrime.securesms.database.DraftDatabase;
|
||||||
import org.thoughtcrime.securesms.database.GroupDatabase;
|
import org.thoughtcrime.securesms.database.GroupDatabase;
|
||||||
import org.thoughtcrime.securesms.database.GroupReceiptDatabase;
|
import org.thoughtcrime.securesms.database.GroupReceiptDatabase;
|
||||||
import org.thoughtcrime.securesms.database.JobDatabase;
|
import org.thoughtcrime.securesms.database.JobDatabase;
|
||||||
import org.thoughtcrime.securesms.database.MmsDatabase;
|
|
||||||
import org.thoughtcrime.securesms.database.PushDatabase;
|
|
||||||
import org.thoughtcrime.securesms.database.RecipientDatabase;
|
|
||||||
import org.thoughtcrime.securesms.database.SearchDatabase;
|
|
||||||
import org.thoughtcrime.securesms.database.SmsDatabase;
|
|
||||||
import org.thoughtcrime.securesms.database.ThreadDatabase;
|
|
||||||
import org.session.libsignal.utilities.Log;
|
|
||||||
import org.thoughtcrime.securesms.database.LokiAPIDatabase;
|
import org.thoughtcrime.securesms.database.LokiAPIDatabase;
|
||||||
import org.thoughtcrime.securesms.database.LokiBackupFilesDatabase;
|
import org.thoughtcrime.securesms.database.LokiBackupFilesDatabase;
|
||||||
import org.thoughtcrime.securesms.database.LokiMessageDatabase;
|
import org.thoughtcrime.securesms.database.LokiMessageDatabase;
|
||||||
import org.thoughtcrime.securesms.database.LokiThreadDatabase;
|
import org.thoughtcrime.securesms.database.LokiThreadDatabase;
|
||||||
import org.thoughtcrime.securesms.database.LokiUserDatabase;
|
import org.thoughtcrime.securesms.database.LokiUserDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.MmsDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.PushDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.RecipientDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.SearchDatabase;
|
||||||
import org.thoughtcrime.securesms.database.SessionContactDatabase;
|
import org.thoughtcrime.securesms.database.SessionContactDatabase;
|
||||||
import org.thoughtcrime.securesms.database.SessionJobDatabase;
|
import org.thoughtcrime.securesms.database.SessionJobDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.SmsDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.ThreadDatabase;
|
||||||
|
|
||||||
public class SQLCipherOpenHelper extends SQLiteOpenHelper {
|
public class SQLCipherOpenHelper extends SQLiteOpenHelper {
|
||||||
|
|
||||||
@ -58,9 +58,10 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
|
|||||||
private static final int lokiV24 = 45;
|
private static final int lokiV24 = 45;
|
||||||
private static final int lokiV25 = 46;
|
private static final int lokiV25 = 46;
|
||||||
private static final int lokiV26 = 47;
|
private static final int lokiV26 = 47;
|
||||||
|
private static final int lokiV27 = 48;
|
||||||
|
|
||||||
// Loki - onUpgrade(...) must be updated to use Loki version numbers if Signal makes any database changes
|
// Loki - onUpgrade(...) must be updated to use Loki version numbers if Signal makes any database changes
|
||||||
private static final int DATABASE_VERSION = lokiV26;
|
private static final int DATABASE_VERSION = lokiV27;
|
||||||
private static final String DATABASE_NAME = "signal.db";
|
private static final String DATABASE_NAME = "signal.db";
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
@ -296,6 +297,10 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
|
|||||||
db.execSQL(SessionContactDatabase.getCreateSessionContactTableCommand());
|
db.execSQL(SessionContactDatabase.getCreateSessionContactTableCommand());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (oldVersion < lokiV27) {
|
||||||
|
db.execSQL(RecipientDatabase.getCreateNotificationTypeCommand());
|
||||||
|
}
|
||||||
|
|
||||||
db.setTransactionSuccessful();
|
db.setTransactionSuccessful();
|
||||||
} finally {
|
} finally {
|
||||||
db.endTransaction();
|
db.endTransaction();
|
||||||
|
@ -1,16 +1,17 @@
|
|||||||
package org.thoughtcrime.securesms.home
|
package org.thoughtcrime.securesms.home
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.view.isVisible
|
||||||
|
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||||
import kotlinx.android.synthetic.main.fragment_conversation_bottom_sheet.*
|
import kotlinx.android.synthetic.main.fragment_conversation_bottom_sheet.*
|
||||||
import network.loki.messenger.R
|
import network.loki.messenger.R
|
||||||
import org.session.libsession.utilities.recipients.Recipient
|
import org.session.libsession.utilities.recipients.Recipient
|
||||||
import org.thoughtcrime.securesms.util.UiModeUtilities
|
import org.thoughtcrime.securesms.util.UiModeUtilities
|
||||||
|
|
||||||
public class ConversationOptionsBottomSheet : BottomSheetDialogFragment() {
|
public class ConversationOptionsBottomSheet : BottomSheetDialogFragment(), View.OnClickListener {
|
||||||
|
|
||||||
//FIXME AC: Supplying a recipient directly into the field from an activity
|
//FIXME AC: Supplying a recipient directly into the field from an activity
|
||||||
// is not the best idea. It doesn't survive configuration change.
|
// is not the best idea. It doesn't survive configuration change.
|
||||||
@ -22,11 +23,25 @@ public class ConversationOptionsBottomSheet : BottomSheetDialogFragment() {
|
|||||||
var onBlockTapped: (() -> Unit)? = null
|
var onBlockTapped: (() -> Unit)? = null
|
||||||
var onUnblockTapped: (() -> Unit)? = null
|
var onUnblockTapped: (() -> Unit)? = null
|
||||||
var onDeleteTapped: (() -> Unit)? = null
|
var onDeleteTapped: (() -> Unit)? = null
|
||||||
|
var onNotificationTapped: (() -> Unit)? = null
|
||||||
|
var onSetMuteTapped: ((Boolean) -> Unit)? = null
|
||||||
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
return inflater.inflate(R.layout.fragment_conversation_bottom_sheet, container, false)
|
return inflater.inflate(R.layout.fragment_conversation_bottom_sheet, container, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onClick(v: View?) {
|
||||||
|
when (v) {
|
||||||
|
detailsTextView -> onViewDetailsTapped?.invoke()
|
||||||
|
blockTextView -> onBlockTapped?.invoke()
|
||||||
|
unblockTextView -> onUnblockTapped?.invoke()
|
||||||
|
deleteTextView -> onDeleteTapped?.invoke()
|
||||||
|
notificationsTextView -> onNotificationTapped?.invoke()
|
||||||
|
unMuteNotificationsTextView -> onSetMuteTapped?.invoke(false)
|
||||||
|
muteNotificationsTextView -> onSetMuteTapped?.invoke(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
if (!this::recipient.isInitialized) { return dismiss() }
|
if (!this::recipient.isInitialized) { return dismiss() }
|
||||||
@ -34,13 +49,19 @@ public class ConversationOptionsBottomSheet : BottomSheetDialogFragment() {
|
|||||||
detailsTextView.visibility = View.VISIBLE
|
detailsTextView.visibility = View.VISIBLE
|
||||||
unblockTextView.visibility = if (recipient.isBlocked) View.VISIBLE else View.GONE
|
unblockTextView.visibility = if (recipient.isBlocked) View.VISIBLE else View.GONE
|
||||||
blockTextView.visibility = if (recipient.isBlocked) View.GONE else View.VISIBLE
|
blockTextView.visibility = if (recipient.isBlocked) View.GONE else View.VISIBLE
|
||||||
detailsTextView.setOnClickListener { onViewDetailsTapped?.invoke() }
|
detailsTextView.setOnClickListener(this)
|
||||||
blockTextView.setOnClickListener { onBlockTapped?.invoke() }
|
blockTextView.setOnClickListener(this)
|
||||||
unblockTextView.setOnClickListener { onUnblockTapped?.invoke() }
|
unblockTextView.setOnClickListener(this)
|
||||||
} else {
|
} else {
|
||||||
detailsTextView.visibility = View.GONE
|
detailsTextView.visibility = View.GONE
|
||||||
}
|
}
|
||||||
deleteTextView.setOnClickListener { onDeleteTapped?.invoke() }
|
unMuteNotificationsTextView.isVisible = recipient.isMuted && !recipient.isLocalNumber
|
||||||
|
muteNotificationsTextView.isVisible = !recipient.isMuted && !recipient.isLocalNumber
|
||||||
|
unMuteNotificationsTextView.setOnClickListener(this)
|
||||||
|
muteNotificationsTextView.setOnClickListener(this)
|
||||||
|
notificationsTextView.isVisible = recipient.isGroupRecipient
|
||||||
|
notificationsTextView.setOnClickListener(this)
|
||||||
|
deleteTextView.setOnClickListener(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
|
@ -35,8 +35,10 @@ import org.session.libsession.utilities.Util
|
|||||||
import org.session.libsignal.utilities.ThreadUtils
|
import org.session.libsignal.utilities.ThreadUtils
|
||||||
import org.session.libsignal.utilities.toHexString
|
import org.session.libsignal.utilities.toHexString
|
||||||
import org.thoughtcrime.securesms.ApplicationContext
|
import org.thoughtcrime.securesms.ApplicationContext
|
||||||
|
import org.thoughtcrime.securesms.MuteDialog
|
||||||
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
|
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
|
||||||
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
|
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
|
||||||
|
import org.thoughtcrime.securesms.conversation.v2.utilities.NotificationUtils
|
||||||
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
|
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||||
import org.thoughtcrime.securesms.database.model.ThreadRecord
|
import org.thoughtcrime.securesms.database.model.ThreadRecord
|
||||||
@ -44,14 +46,12 @@ import org.thoughtcrime.securesms.dms.CreatePrivateChatActivity
|
|||||||
import org.thoughtcrime.securesms.groups.CreateClosedGroupActivity
|
import org.thoughtcrime.securesms.groups.CreateClosedGroupActivity
|
||||||
import org.thoughtcrime.securesms.groups.JoinPublicChatActivity
|
import org.thoughtcrime.securesms.groups.JoinPublicChatActivity
|
||||||
import org.thoughtcrime.securesms.groups.OpenGroupManager
|
import org.thoughtcrime.securesms.groups.OpenGroupManager
|
||||||
import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities
|
|
||||||
import org.thoughtcrime.securesms.util.*
|
|
||||||
import org.thoughtcrime.securesms.onboarding.SeedReminderViewDelegate
|
|
||||||
import org.thoughtcrime.securesms.mms.GlideApp
|
import org.thoughtcrime.securesms.mms.GlideApp
|
||||||
import org.thoughtcrime.securesms.mms.GlideRequests
|
import org.thoughtcrime.securesms.mms.GlideRequests
|
||||||
import org.thoughtcrime.securesms.onboarding.SeedActivity
|
import org.thoughtcrime.securesms.onboarding.SeedActivity
|
||||||
|
import org.thoughtcrime.securesms.onboarding.SeedReminderViewDelegate
|
||||||
import org.thoughtcrime.securesms.preferences.SettingsActivity
|
import org.thoughtcrime.securesms.preferences.SettingsActivity
|
||||||
import org.thoughtcrime.securesms.util.IP2Country
|
import org.thoughtcrime.securesms.util.*
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@ -257,6 +257,16 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), ConversationClickLis
|
|||||||
bottomSheet.dismiss()
|
bottomSheet.dismiss()
|
||||||
deleteConversation(thread)
|
deleteConversation(thread)
|
||||||
}
|
}
|
||||||
|
bottomSheet.onSetMuteTapped = { muted ->
|
||||||
|
bottomSheet.dismiss()
|
||||||
|
setConversationMuted(thread, muted)
|
||||||
|
}
|
||||||
|
bottomSheet.onNotificationTapped = {
|
||||||
|
bottomSheet.dismiss()
|
||||||
|
NotificationUtils.showNotifyDialog(this, thread.recipient) { notifyType ->
|
||||||
|
setNotifyType(thread, notifyType)
|
||||||
|
}
|
||||||
|
}
|
||||||
bottomSheet.show(supportFragmentManager, bottomSheet.tag)
|
bottomSheet.show(supportFragmentManager, bottomSheet.tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,6 +302,35 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), ConversationClickLis
|
|||||||
}.show()
|
}.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setConversationMuted(thread: ThreadRecord, isMuted: Boolean) {
|
||||||
|
if (!isMuted) {
|
||||||
|
ThreadUtils.queue {
|
||||||
|
DatabaseFactory.getRecipientDatabase(this).setMuted(thread.recipient, 0)
|
||||||
|
Util.runOnMain {
|
||||||
|
recyclerView.adapter!!.notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
MuteDialog.show(this) { until: Long ->
|
||||||
|
ThreadUtils.queue {
|
||||||
|
DatabaseFactory.getRecipientDatabase(this).setMuted(thread.recipient, until)
|
||||||
|
Util.runOnMain {
|
||||||
|
recyclerView.adapter!!.notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setNotifyType(thread: ThreadRecord, newNotifyType: Int) {
|
||||||
|
ThreadUtils.queue {
|
||||||
|
DatabaseFactory.getRecipientDatabase(this).setNotifyType(thread.recipient, newNotifyType)
|
||||||
|
Util.runOnMain {
|
||||||
|
recyclerView.adapter!!.notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun deleteConversation(thread: ThreadRecord) {
|
private fun deleteConversation(thread: ThreadRecord) {
|
||||||
val threadID = thread.threadId
|
val threadID = thread.threadId
|
||||||
val recipient = thread.recipient
|
val recipient = thread.recipient
|
||||||
|
@ -41,26 +41,26 @@ import androidx.core.app.NotificationManagerCompat;
|
|||||||
|
|
||||||
import org.session.libsession.messaging.sending_receiving.notifications.MessageNotifier;
|
import org.session.libsession.messaging.sending_receiving.notifications.MessageNotifier;
|
||||||
import org.session.libsession.utilities.Contact;
|
import org.session.libsession.utilities.Contact;
|
||||||
import org.session.libsession.utilities.recipients.Recipient;
|
|
||||||
import org.session.libsession.utilities.ServiceUtil;
|
import org.session.libsession.utilities.ServiceUtil;
|
||||||
import org.session.libsession.utilities.TextSecurePreferences;
|
import org.session.libsession.utilities.TextSecurePreferences;
|
||||||
import org.session.libsignal.utilities.Util;
|
import org.session.libsession.utilities.recipients.Recipient;
|
||||||
import org.session.libsignal.utilities.Log;
|
import org.session.libsignal.utilities.Log;
|
||||||
|
import org.session.libsignal.utilities.Util;
|
||||||
import org.thoughtcrime.securesms.ApplicationContext;
|
import org.thoughtcrime.securesms.ApplicationContext;
|
||||||
import org.thoughtcrime.securesms.contactshare.ContactUtil;
|
import org.thoughtcrime.securesms.contactshare.ContactUtil;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2;
|
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2;
|
||||||
|
import org.thoughtcrime.securesms.conversation.v2.utilities.MentionUtilities;
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||||
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
|
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
|
||||||
import org.thoughtcrime.securesms.database.MmsSmsDatabase;
|
import org.thoughtcrime.securesms.database.MmsSmsDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.RecipientDatabase;
|
||||||
import org.thoughtcrime.securesms.database.ThreadDatabase;
|
import org.thoughtcrime.securesms.database.ThreadDatabase;
|
||||||
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
|
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
|
||||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||||
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
|
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
|
||||||
import org.thoughtcrime.securesms.util.SessionMetaProtocol;
|
|
||||||
import org.thoughtcrime.securesms.conversation.v2.utilities.MentionUtilities;
|
|
||||||
import org.thoughtcrime.securesms.mms.SlideDeck;
|
import org.thoughtcrime.securesms.mms.SlideDeck;
|
||||||
import org.thoughtcrime.securesms.service.KeyCachingService;
|
import org.thoughtcrime.securesms.service.KeyCachingService;
|
||||||
|
import org.thoughtcrime.securesms.util.SessionMetaProtocol;
|
||||||
import org.thoughtcrime.securesms.util.SpanUtil;
|
import org.thoughtcrime.securesms.util.SpanUtil;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -493,8 +493,17 @@ public class DefaultMessageNotifier implements MessageNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (threadRecipients == null || !threadRecipients.isMuted()) {
|
if (threadRecipients == null || !threadRecipients.isMuted()) {
|
||||||
|
if (threadRecipients != null && threadRecipients.notifyType == RecipientDatabase.NOTIFY_TYPE_MENTIONS) {
|
||||||
|
// check if mentioned here
|
||||||
|
if (body.toString().contains("@"+TextSecurePreferences.getLocalNumber(context))) {
|
||||||
notificationState.addNotification(new NotificationItem(id, mms, recipient, conversationRecipient, threadRecipients, threadId, body, timestamp, slideDeck));
|
notificationState.addNotification(new NotificationItem(id, mms, recipient, conversationRecipient, threadRecipients, threadId, body, timestamp, slideDeck));
|
||||||
}
|
}
|
||||||
|
} else if (threadRecipients != null && threadRecipients.notifyType == RecipientDatabase.NOTIFY_TYPE_NONE) {
|
||||||
|
// do nothing, no notifications
|
||||||
|
} else {
|
||||||
|
notificationState.addNotification(new NotificationItem(id, mms, recipient, conversationRecipient, threadRecipients, threadId, body, timestamp, slideDeck));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reader.close();
|
reader.close();
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M10.01,21.01c0,1.1 0.89,1.99 1.99,1.99s1.99,-0.89 1.99,-1.99h-3.98zM12,6c2.76,0 5,2.24 5,5v7L7,18v-7c0,-2.76 2.24,-5 5,-5zM12,1.5c-0.83,0 -1.5,0.67 -1.5,1.5v1.17C7.36,4.85 5,7.65 5,11v6l-2,2v1h18v-1l-2,-2v-6c0,-3.35 -2.36,-6.15 -5.5,-6.83L13.5,3c0,-0.83 -0.67,-1.5 -1.5,-1.5zM11,8h2v4h-2zM11,14h2v2h-2z"/>
|
||||||
|
</vector>
|
@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.9,2 2,2zM18,16v-5c0,-3.07 -1.63,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.64,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2zM16,17L8,17v-6c0,-2.48 1.51,-4.5 4,-4.5s4,2.02 4,4.5v6zM7.58,4.08L6.15,2.65C3.75,4.48 2.17,7.3 2.03,10.5h2c0.15,-2.65 1.51,-4.97 3.55,-6.42zM19.97,10.5h2c-0.15,-3.2 -1.73,-6.02 -4.12,-7.85l-1.42,1.43c2.02,1.45 3.39,3.77 3.54,6.42z"/>
|
||||||
|
</vector>
|
@ -32,6 +32,33 @@
|
|||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/muteNotificationsTextView"
|
||||||
|
style="@style/BottomSheetActionItem"
|
||||||
|
android:drawableStart="@drawable/ic_outline_notifications_off_24"
|
||||||
|
android:text="@string/MuteDialog_mute_notifications"
|
||||||
|
tools:visibility="visible"
|
||||||
|
android:visibility="gone"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/unMuteNotificationsTextView"
|
||||||
|
style="@style/BottomSheetActionItem"
|
||||||
|
android:drawableStart="@drawable/ic_outline_notifications_active_24"
|
||||||
|
android:text="@string/conversation_muted__unmute"
|
||||||
|
tools:visibility="visible"
|
||||||
|
android:visibility="gone"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/notificationsTextView"
|
||||||
|
style="@style/BottomSheetActionItem"
|
||||||
|
android:drawableStart="@drawable/ic_outline_notification_important_24"
|
||||||
|
android:text="@string/RecipientPreferenceActivity_notification_settings"
|
||||||
|
tools:visibility="visible"
|
||||||
|
android:visibility="gone"
|
||||||
|
/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/deleteTextView"
|
android:id="@+id/deleteTextView"
|
||||||
style="@style/BottomSheetActionItem"
|
style="@style/BottomSheetActionItem"
|
||||||
|
@ -13,4 +13,8 @@
|
|||||||
android:title="@string/conversation__menu_leave_group"
|
android:title="@string/conversation__menu_leave_group"
|
||||||
app:showAsAction="collapseActionView"/>
|
app:showAsAction="collapseActionView"/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:title="@string/RecipientPreferenceActivity_notification_settings"
|
||||||
|
android:id="@+id/menu_notification_settings"/>
|
||||||
|
|
||||||
</menu>
|
</menu>
|
@ -6,4 +6,8 @@
|
|||||||
android:title="@string/ConversationActivity_invite_to_open_group"
|
android:title="@string/ConversationActivity_invite_to_open_group"
|
||||||
android:id="@+id/menu_invite_to_open_group" />
|
android:id="@+id/menu_invite_to_open_group" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:title="@string/RecipientPreferenceActivity_notification_settings"
|
||||||
|
android:id="@+id/menu_notification_settings"/>
|
||||||
|
|
||||||
</menu>
|
</menu>
|
@ -187,7 +187,7 @@
|
|||||||
<item>@string/arrays__mute_for_two_hours</item>
|
<item>@string/arrays__mute_for_two_hours</item>
|
||||||
<item>@string/arrays__mute_for_one_day</item>
|
<item>@string/arrays__mute_for_one_day</item>
|
||||||
<item>@string/arrays__mute_for_seven_days</item>
|
<item>@string/arrays__mute_for_seven_days</item>
|
||||||
<item>@string/arrays__mute_for_one_year</item>
|
<item>@string/arrays__mute_forever</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="pref_notification_privacy_entries">
|
<string-array name="pref_notification_privacy_entries">
|
||||||
@ -244,5 +244,10 @@
|
|||||||
<item>1</item>
|
<item>1</item>
|
||||||
<item>2</item>
|
<item>2</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="notify_types">
|
||||||
|
<item>@string/notify_type_all</item>
|
||||||
|
<item>@string/notify_type_mentions</item>
|
||||||
|
<item>@string/notify_type_none</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -247,6 +247,7 @@
|
|||||||
<string name="RecipientPreferenceActivity_unblock_this_contact_question">Unblock this contact?</string>
|
<string name="RecipientPreferenceActivity_unblock_this_contact_question">Unblock this contact?</string>
|
||||||
<string name="RecipientPreferenceActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact">You will once again be able to receive messages and calls from this contact.</string>
|
<string name="RecipientPreferenceActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact">You will once again be able to receive messages and calls from this contact.</string>
|
||||||
<string name="RecipientPreferenceActivity_unblock">Unblock</string>
|
<string name="RecipientPreferenceActivity_unblock">Unblock</string>
|
||||||
|
<string name="RecipientPreferenceActivity_notification_settings">Notification Settings</string>
|
||||||
|
|
||||||
<!-- Slide -->
|
<!-- Slide -->
|
||||||
<string name="Slide_image">Image</string>
|
<string name="Slide_image">Image</string>
|
||||||
@ -481,6 +482,7 @@
|
|||||||
<string name="arrays__mute_for_one_day">Mute for 1 day</string>
|
<string name="arrays__mute_for_one_day">Mute for 1 day</string>
|
||||||
<string name="arrays__mute_for_seven_days">Mute for 7 days</string>
|
<string name="arrays__mute_for_seven_days">Mute for 7 days</string>
|
||||||
<string name="arrays__mute_for_one_year">Mute for 1 year</string>
|
<string name="arrays__mute_for_one_year">Mute for 1 year</string>
|
||||||
|
<string name="arrays__mute_forever">Mute forever</string>
|
||||||
|
|
||||||
<string name="arrays__settings_default">Settings default</string>
|
<string name="arrays__settings_default">Settings default</string>
|
||||||
<string name="arrays__enabled">Enabled</string>
|
<string name="arrays__enabled">Enabled</string>
|
||||||
@ -888,4 +890,7 @@
|
|||||||
<string name="dialog_send_seed_title">Warning</string>
|
<string name="dialog_send_seed_title">Warning</string>
|
||||||
<string name="dialog_send_seed_explanation">This is your recovery phrase. If you send it to someone they\'ll have full access to your account.</string>
|
<string name="dialog_send_seed_explanation">This is your recovery phrase. If you send it to someone they\'ll have full access to your account.</string>
|
||||||
<string name="dialog_send_seed_send_button_title">Send</string>
|
<string name="dialog_send_seed_send_button_title">Send</string>
|
||||||
|
<string name="notify_type_all">All</string>
|
||||||
|
<string name="notify_type_mentions">Mentions</string>
|
||||||
|
<string name="notify_type_none">None</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -26,29 +26,28 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.annimon.stream.function.Consumer;
|
import com.annimon.stream.function.Consumer;
|
||||||
import com.esotericsoftware.kryo.util.Null;
|
|
||||||
|
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
import org.session.libsession.database.StorageProtocol;
|
|
||||||
import org.session.libsession.messaging.MessagingModuleConfiguration;
|
|
||||||
import org.session.libsession.avatars.TransparentContactPhoto;
|
|
||||||
import org.session.libsession.messaging.contacts.Contact;
|
|
||||||
import org.session.libsession.utilities.Address;
|
|
||||||
import org.session.libsession.utilities.GroupRecord;
|
|
||||||
import org.session.libsession.utilities.recipients.RecipientProvider.RecipientDetails;
|
|
||||||
import org.session.libsession.utilities.TextSecurePreferences;
|
|
||||||
import org.session.libsession.utilities.Util;
|
|
||||||
import org.session.libsession.utilities.MaterialColor;
|
|
||||||
import org.session.libsignal.utilities.Log;
|
|
||||||
import org.session.libsignal.utilities.guava.Optional;
|
|
||||||
import org.session.libsession.avatars.ContactColors;
|
import org.session.libsession.avatars.ContactColors;
|
||||||
import org.session.libsession.avatars.ContactPhoto;
|
import org.session.libsession.avatars.ContactPhoto;
|
||||||
import org.session.libsession.avatars.GroupRecordContactPhoto;
|
import org.session.libsession.avatars.GroupRecordContactPhoto;
|
||||||
import org.session.libsession.avatars.ProfileContactPhoto;
|
import org.session.libsession.avatars.ProfileContactPhoto;
|
||||||
import org.session.libsession.avatars.SystemContactPhoto;
|
import org.session.libsession.avatars.SystemContactPhoto;
|
||||||
import org.session.libsession.utilities.ProfilePictureModifiedEvent;
|
import org.session.libsession.avatars.TransparentContactPhoto;
|
||||||
|
import org.session.libsession.database.StorageProtocol;
|
||||||
|
import org.session.libsession.messaging.MessagingModuleConfiguration;
|
||||||
|
import org.session.libsession.messaging.contacts.Contact;
|
||||||
|
import org.session.libsession.utilities.Address;
|
||||||
import org.session.libsession.utilities.FutureTaskListener;
|
import org.session.libsession.utilities.FutureTaskListener;
|
||||||
|
import org.session.libsession.utilities.GroupRecord;
|
||||||
import org.session.libsession.utilities.ListenableFutureTask;
|
import org.session.libsession.utilities.ListenableFutureTask;
|
||||||
|
import org.session.libsession.utilities.MaterialColor;
|
||||||
|
import org.session.libsession.utilities.ProfilePictureModifiedEvent;
|
||||||
|
import org.session.libsession.utilities.TextSecurePreferences;
|
||||||
|
import org.session.libsession.utilities.Util;
|
||||||
|
import org.session.libsession.utilities.recipients.RecipientProvider.RecipientDetails;
|
||||||
|
import org.session.libsignal.utilities.Log;
|
||||||
|
import org.session.libsignal.utilities.guava.Optional;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -80,6 +79,7 @@ public class Recipient implements RecipientModifiedListener {
|
|||||||
private @Nullable Uri messageRingtone = null;
|
private @Nullable Uri messageRingtone = null;
|
||||||
private @Nullable Uri callRingtone = null;
|
private @Nullable Uri callRingtone = null;
|
||||||
public long mutedUntil = 0;
|
public long mutedUntil = 0;
|
||||||
|
public int notifyType = 0;
|
||||||
private boolean blocked = false;
|
private boolean blocked = false;
|
||||||
private VibrateState messageVibrate = VibrateState.DEFAULT;
|
private VibrateState messageVibrate = VibrateState.DEFAULT;
|
||||||
private VibrateState callVibrate = VibrateState.DEFAULT;
|
private VibrateState callVibrate = VibrateState.DEFAULT;
|
||||||
@ -249,6 +249,7 @@ public class Recipient implements RecipientModifiedListener {
|
|||||||
this.messageRingtone = details.messageRingtone;
|
this.messageRingtone = details.messageRingtone;
|
||||||
this.callRingtone = details.callRingtone;
|
this.callRingtone = details.callRingtone;
|
||||||
this.mutedUntil = details.mutedUntil;
|
this.mutedUntil = details.mutedUntil;
|
||||||
|
this.notifyType = details.notifyType;
|
||||||
this.blocked = details.blocked;
|
this.blocked = details.blocked;
|
||||||
this.messageVibrate = details.messageVibrateState;
|
this.messageVibrate = details.messageVibrateState;
|
||||||
this.callVibrate = details.callVibrateState;
|
this.callVibrate = details.callVibrateState;
|
||||||
@ -547,6 +548,14 @@ public class Recipient implements RecipientModifiedListener {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setNotifyType(int notifyType) {
|
||||||
|
synchronized (this) {
|
||||||
|
this.notifyType = notifyType;
|
||||||
|
}
|
||||||
|
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
public synchronized boolean isBlocked() {
|
public synchronized boolean isBlocked() {
|
||||||
return blocked;
|
return blocked;
|
||||||
}
|
}
|
||||||
@ -769,6 +778,7 @@ public class Recipient implements RecipientModifiedListener {
|
|||||||
public static class RecipientSettings {
|
public static class RecipientSettings {
|
||||||
private final boolean blocked;
|
private final boolean blocked;
|
||||||
private final long muteUntil;
|
private final long muteUntil;
|
||||||
|
private final int notifyType;
|
||||||
private final VibrateState messageVibrateState;
|
private final VibrateState messageVibrateState;
|
||||||
private final VibrateState callVibrateState;
|
private final VibrateState callVibrateState;
|
||||||
private final Uri messageRingtone;
|
private final Uri messageRingtone;
|
||||||
@ -790,6 +800,7 @@ public class Recipient implements RecipientModifiedListener {
|
|||||||
private final boolean forceSmsSelection;
|
private final boolean forceSmsSelection;
|
||||||
|
|
||||||
public RecipientSettings(boolean blocked, long muteUntil,
|
public RecipientSettings(boolean blocked, long muteUntil,
|
||||||
|
int notifyType,
|
||||||
@NonNull VibrateState messageVibrateState,
|
@NonNull VibrateState messageVibrateState,
|
||||||
@NonNull VibrateState callVibrateState,
|
@NonNull VibrateState callVibrateState,
|
||||||
@Nullable Uri messageRingtone,
|
@Nullable Uri messageRingtone,
|
||||||
@ -812,6 +823,7 @@ public class Recipient implements RecipientModifiedListener {
|
|||||||
{
|
{
|
||||||
this.blocked = blocked;
|
this.blocked = blocked;
|
||||||
this.muteUntil = muteUntil;
|
this.muteUntil = muteUntil;
|
||||||
|
this.notifyType = notifyType;
|
||||||
this.messageVibrateState = messageVibrateState;
|
this.messageVibrateState = messageVibrateState;
|
||||||
this.callVibrateState = callVibrateState;
|
this.callVibrateState = callVibrateState;
|
||||||
this.messageRingtone = messageRingtone;
|
this.messageRingtone = messageRingtone;
|
||||||
@ -845,6 +857,10 @@ public class Recipient implements RecipientModifiedListener {
|
|||||||
return muteUntil;
|
return muteUntil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getNotifyType() {
|
||||||
|
return notifyType;
|
||||||
|
}
|
||||||
|
|
||||||
public @NonNull VibrateState getMessageVibrateState() {
|
public @NonNull VibrateState getMessageVibrateState() {
|
||||||
return messageVibrateState;
|
return messageVibrateState;
|
||||||
}
|
}
|
||||||
|
@ -23,19 +23,20 @@ import android.text.TextUtils;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.session.libsession.R;
|
||||||
import org.session.libsession.messaging.MessagingModuleConfiguration;
|
import org.session.libsession.messaging.MessagingModuleConfiguration;
|
||||||
import org.session.libsignal.utilities.guava.Optional;
|
|
||||||
import org.session.libsession.utilities.MaterialColor;
|
|
||||||
import org.session.libsession.utilities.Address;
|
import org.session.libsession.utilities.Address;
|
||||||
import org.session.libsession.utilities.GroupRecord;
|
import org.session.libsession.utilities.GroupRecord;
|
||||||
|
import org.session.libsession.utilities.ListenableFutureTask;
|
||||||
|
import org.session.libsession.utilities.MaterialColor;
|
||||||
|
import org.session.libsession.utilities.SoftHashMap;
|
||||||
|
import org.session.libsession.utilities.TextSecurePreferences;
|
||||||
|
import org.session.libsession.utilities.Util;
|
||||||
import org.session.libsession.utilities.recipients.Recipient.RecipientSettings;
|
import org.session.libsession.utilities.recipients.Recipient.RecipientSettings;
|
||||||
import org.session.libsession.utilities.recipients.Recipient.RegisteredState;
|
import org.session.libsession.utilities.recipients.Recipient.RegisteredState;
|
||||||
import org.session.libsession.utilities.recipients.Recipient.UnidentifiedAccessMode;
|
import org.session.libsession.utilities.recipients.Recipient.UnidentifiedAccessMode;
|
||||||
import org.session.libsession.utilities.recipients.Recipient.VibrateState;
|
import org.session.libsession.utilities.recipients.Recipient.VibrateState;
|
||||||
import org.session.libsession.utilities.ListenableFutureTask;
|
import org.session.libsignal.utilities.guava.Optional;
|
||||||
import org.session.libsession.utilities.SoftHashMap;
|
|
||||||
import org.session.libsession.utilities.TextSecurePreferences;
|
|
||||||
import org.session.libsession.utilities.Util;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
@ -44,8 +45,6 @@ import java.util.Map;
|
|||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
import org.session.libsession.R;
|
|
||||||
|
|
||||||
class RecipientProvider {
|
class RecipientProvider {
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@ -168,6 +167,7 @@ class RecipientProvider {
|
|||||||
@Nullable final Uri messageRingtone;
|
@Nullable final Uri messageRingtone;
|
||||||
@Nullable final Uri callRingtone;
|
@Nullable final Uri callRingtone;
|
||||||
final long mutedUntil;
|
final long mutedUntil;
|
||||||
|
final int notifyType;
|
||||||
@Nullable final VibrateState messageVibrateState;
|
@Nullable final VibrateState messageVibrateState;
|
||||||
@Nullable final VibrateState callVibrateState;
|
@Nullable final VibrateState callVibrateState;
|
||||||
final boolean blocked;
|
final boolean blocked;
|
||||||
@ -197,6 +197,7 @@ class RecipientProvider {
|
|||||||
this.messageRingtone = settings != null ? settings.getMessageRingtone() : null;
|
this.messageRingtone = settings != null ? settings.getMessageRingtone() : null;
|
||||||
this.callRingtone = settings != null ? settings.getCallRingtone() : null;
|
this.callRingtone = settings != null ? settings.getCallRingtone() : null;
|
||||||
this.mutedUntil = settings != null ? settings.getMuteUntil() : 0;
|
this.mutedUntil = settings != null ? settings.getMuteUntil() : 0;
|
||||||
|
this.notifyType = settings != null ? settings.getNotifyType() : 0;
|
||||||
this.messageVibrateState = settings != null ? settings.getMessageVibrateState() : null;
|
this.messageVibrateState = settings != null ? settings.getMessageVibrateState() : null;
|
||||||
this.callVibrateState = settings != null ? settings.getCallVibrateState() : null;
|
this.callVibrateState = settings != null ? settings.getCallVibrateState() : null;
|
||||||
this.blocked = settings != null && settings.isBlocked();
|
this.blocked = settings != null && settings.isBlocked();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user