added ability to disable notifications for specific conversations - fixed #322
This commit is contained in:
parent
1f378bffc8
commit
1a09a4706b
|
@ -44,6 +44,11 @@
|
||||||
android:orderInCategory="60"
|
android:orderInCategory="60"
|
||||||
android:showAsAction="never"
|
android:showAsAction="never"
|
||||||
android:title="@string/action_end_conversation"/>
|
android:title="@string/action_end_conversation"/>
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_mute"
|
||||||
|
android:orderInCategory="70"
|
||||||
|
android:showAsAction="never"
|
||||||
|
android:title="@string/disable_notifications"/>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_accounts"
|
android:id="@+id/action_accounts"
|
||||||
android:orderInCategory="90"
|
android:orderInCategory="90"
|
||||||
|
|
|
@ -19,4 +19,18 @@
|
||||||
<item>524288</item>
|
<item>524288</item>
|
||||||
<item>1048576</item>
|
<item>1048576</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="mute_options_descriptions">
|
||||||
|
<item>30 minutes</item>
|
||||||
|
<item>one hour</item>
|
||||||
|
<item>2 hours</item>
|
||||||
|
<item>8 hours</item>
|
||||||
|
<item>until further notice</item>
|
||||||
|
</string-array>
|
||||||
|
<integer-array name="mute_options_durations">
|
||||||
|
<item>1800</item>
|
||||||
|
<item>3600</item>
|
||||||
|
<item>7200</item>
|
||||||
|
<item>28800</item>
|
||||||
|
<item>-1</item>
|
||||||
|
</integer-array>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -235,5 +235,9 @@
|
||||||
<string name="server_info_session_established">Current session established</string>
|
<string name="server_info_session_established">Current session established</string>
|
||||||
<string name="additional_information">Additional Information</string>
|
<string name="additional_information">Additional Information</string>
|
||||||
<string name="skip">Skip</string>
|
<string name="skip">Skip</string>
|
||||||
|
<string name="disable_notifications">Disable notifications</string>
|
||||||
|
<string name="disable_notifications_for_this_conversation">Disable notifications for this conversation</string>
|
||||||
|
<string name="notifications_disabled">Notifications are disabled</string>
|
||||||
|
<string name="enable">Enable</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
|
@ -16,6 +16,7 @@ import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.os.SystemClock;
|
||||||
|
|
||||||
public class Conversation extends AbstractEntity {
|
public class Conversation extends AbstractEntity {
|
||||||
public static final String TABLENAME = "conversations";
|
public static final String TABLENAME = "conversations";
|
||||||
|
@ -43,6 +44,8 @@ public class Conversation extends AbstractEntity {
|
||||||
private long created;
|
private long created;
|
||||||
private int mode;
|
private int mode;
|
||||||
|
|
||||||
|
private long mutedTill = 0;
|
||||||
|
|
||||||
private String nextPresence;
|
private String nextPresence;
|
||||||
|
|
||||||
private transient CopyOnWriteArrayList<Message> messages = null;
|
private transient CopyOnWriteArrayList<Message> messages = null;
|
||||||
|
@ -418,4 +421,12 @@ public class Conversation extends AbstractEntity {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setMutedTill(long mutedTill) {
|
||||||
|
this.mutedTill = mutedTill;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isMuted() {
|
||||||
|
return SystemClock.elapsedRealtime() < this.mutedTill;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -435,6 +435,7 @@ public class MessageParser extends AbstractParser implements
|
||||||
if (packet.getType() != MessagePacket.TYPE_ERROR) {
|
if (packet.getType() != MessagePacket.TYPE_ERROR) {
|
||||||
mXmppConnectionService.databaseBackend.createMessage(message);
|
mXmppConnectionService.databaseBackend.createMessage(message);
|
||||||
}
|
}
|
||||||
|
notify = notify && !conversation.isMuted();
|
||||||
mXmppConnectionService.notifyUi(conversation, notify);
|
mXmppConnectionService.notifyUi(conversation, notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ import eu.siacs.conversations.utils.ExceptionHelper;
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
import eu.siacs.conversations.utils.UIHelper;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.SystemClock;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
import android.app.ActionBar;
|
import android.app.ActionBar;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
|
@ -214,6 +215,7 @@ public class ConversationActivity extends XmppActivity {
|
||||||
MenuItem menuAdd = (MenuItem) menu.findItem(R.id.action_add);
|
MenuItem menuAdd = (MenuItem) menu.findItem(R.id.action_add);
|
||||||
MenuItem menuInviteContact = (MenuItem) menu
|
MenuItem menuInviteContact = (MenuItem) menu
|
||||||
.findItem(R.id.action_invite);
|
.findItem(R.id.action_invite);
|
||||||
|
MenuItem menuMute = (MenuItem) menu.findItem(R.id.action_mute);
|
||||||
|
|
||||||
if ((spl.isOpen() && (spl.isSlideable()))) {
|
if ((spl.isOpen() && (spl.isSlideable()))) {
|
||||||
menuArchive.setVisible(false);
|
menuArchive.setVisible(false);
|
||||||
|
@ -223,6 +225,7 @@ public class ConversationActivity extends XmppActivity {
|
||||||
menuInviteContact.setVisible(false);
|
menuInviteContact.setVisible(false);
|
||||||
menuAttach.setVisible(false);
|
menuAttach.setVisible(false);
|
||||||
menuClearHistory.setVisible(false);
|
menuClearHistory.setVisible(false);
|
||||||
|
menuMute.setVisible(false);
|
||||||
} else {
|
} else {
|
||||||
menuAdd.setVisible(!spl.isSlideable());
|
menuAdd.setVisible(!spl.isSlideable());
|
||||||
if (this.getSelectedConversation() != null) {
|
if (this.getSelectedConversation() != null) {
|
||||||
|
@ -463,6 +466,9 @@ public class ConversationActivity extends XmppActivity {
|
||||||
case R.id.action_clear_history:
|
case R.id.action_clear_history:
|
||||||
clearHistoryDialog(getSelectedConversation());
|
clearHistoryDialog(getSelectedConversation());
|
||||||
break;
|
break;
|
||||||
|
case R.id.action_mute:
|
||||||
|
muteConversationDialog(getSelectedConversation());
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -505,6 +511,31 @@ public class ConversationActivity extends XmppActivity {
|
||||||
builder.create().show();
|
builder.create().show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void muteConversationDialog(final Conversation conversation) {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
builder.setTitle(R.string.disable_notifications_for_this_conversation);
|
||||||
|
final int[] durations = getResources().getIntArray(R.array.mute_options_durations);
|
||||||
|
builder.setItems(R.array.mute_options_descriptions, new OnClickListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
long till;
|
||||||
|
if (durations[which]==-1) {
|
||||||
|
till = Long.MAX_VALUE;
|
||||||
|
} else {
|
||||||
|
till = SystemClock.elapsedRealtime() + (durations[which] * 1000);
|
||||||
|
}
|
||||||
|
conversation.setMutedTill(till);
|
||||||
|
ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager()
|
||||||
|
.findFragmentByTag("conversation");
|
||||||
|
if (selectedFragment!=null) {
|
||||||
|
selectedFragment.updateMessages();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.create().show();
|
||||||
|
}
|
||||||
|
|
||||||
protected ConversationFragment swapConversationFragment() {
|
protected ConversationFragment swapConversationFragment() {
|
||||||
ConversationFragment selectedFragment = new ConversationFragment();
|
ConversationFragment selectedFragment = new ConversationFragment();
|
||||||
if (!isFinishing()) {
|
if (!isFinishing()) {
|
||||||
|
|
|
@ -406,6 +406,16 @@ public class ConversationFragment extends Fragment {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (this.conversation.isMuted()) {
|
||||||
|
showSnackbar(R.string.notifications_disabled, R.string.enable, new OnClickListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
conversation.setMutedTill(0);
|
||||||
|
updateMessages();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
if (this.conversation.getMessages().size() == 0) {
|
if (this.conversation.getMessages().size() == 0) {
|
||||||
this.messageList.clear();
|
this.messageList.clear();
|
||||||
messagesLoaded = false;
|
messagesLoaded = false;
|
||||||
|
|
Loading…
Reference in New Issue