diff --git a/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java b/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java index 9993144fc..907a3dc86 100644 --- a/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java +++ b/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.List; import eu.siacs.conversations.entities.Conversation; +import eu.siacs.conversations.ui.ConversationsActivity; import eu.siacs.conversations.ui.ShareWithActivity; @TargetApi(Build.VERSION_CODES.M) @@ -42,7 +43,7 @@ public class ContactChooserTargetService extends ChooserTargetService implements return chooserTargets; } mXmppConnectionService.populateWithOrderedConversations(conversations, false); - final ComponentName componentName = new ComponentName(this, ShareWithActivity.class); + final ComponentName componentName = new ComponentName(this, ConversationsActivity.class); final int pixel = (int) (48 * getResources().getDisplayMetrics().density); for(Conversation conversation : conversations) { if (conversation.sentMessagesCount() == 0) { @@ -52,7 +53,7 @@ public class ContactChooserTargetService extends ChooserTargetService implements final Icon icon = Icon.createWithBitmap(mXmppConnectionService.getAvatarService().get(conversation, pixel)); final float score = 1 - (1.0f / MAX_TARGETS) * chooserTargets.size(); final Bundle extras = new Bundle(); - extras.putString("uuid", conversation.getUuid()); + extras.putString(ConversationsActivity.EXTRA_CONVERSATION, conversation.getUuid()); chooserTargets.add(new ChooserTarget(name, icon, score, componentName, extras)); if (chooserTargets.size() >= MAX_TARGETS) { break; diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index fee7c1493..ca29086ba 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1973,6 +1973,12 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke final String nick = extras.getString(ConversationsActivity.EXTRA_NICK); final boolean asQuote = extras.getBoolean(ConversationsActivity.EXTRA_AS_QUOTE); final boolean pm = extras.getBoolean(ConversationsActivity.EXTRA_IS_PRIVATE_MESSAGE, false); + final List uris = extractUris(extras); + if (uris != null && uris.size() > 0) { + mediaPreviewAdapter.addMediaPreviews(Attachment.of(getActivity(), uris)); + toggleInputMethod(); + return; + } if (nick != null) { if (pm) { Jid jid = conversation.getJid(); @@ -2001,6 +2007,19 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke } } + private List extractUris(Bundle extras) { + final List uris = extras.getParcelableArrayList(Intent.EXTRA_STREAM); + if (uris != null) { + return uris; + } + final Uri uri = extras.getParcelable(Intent.EXTRA_STREAM); + if (uri != null) { + return Collections.singletonList(uri); + } else { + return null; + } + } + private boolean showBlockSubmenu(View view) { final Jid jid = conversation.getJid(); if (jid.getLocal() == null) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java index b965ab028..ca55d0f2c 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java @@ -55,6 +55,8 @@ import android.widget.Toast; import org.openintents.openpgp.util.OpenPgpApi; +import java.util.Arrays; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import eu.siacs.conversations.Config; @@ -92,6 +94,12 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio public static final String EXTRA_NICK = "nick"; public static final String EXTRA_IS_PRIVATE_MESSAGE = "pm"; + private static List VIEW_AND_SHARE_ACTIONS = Arrays.asList( + ACTION_VIEW_CONVERSATION, + Intent.ACTION_SEND, + Intent.ACTION_SEND_MULTIPLE + ); + public static final int REQUEST_OPEN_MESSAGE = 0x9876; public static final int REQUEST_PLAY_PAUSE = 0x5432; @@ -105,8 +113,9 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio private boolean mActivityPaused = true; private AtomicBoolean mRedirectInProcess = new AtomicBoolean(false); - private static boolean isViewIntent(Intent i) { - return i != null && ACTION_VIEW_CONVERSATION.equals(i.getAction()) && i.hasExtra(EXTRA_CONVERSATION); + private static boolean isViewOrShareIntent(Intent i) { + Log.d(Config.LOGTAG,"action: "+(i == null ? null : i.getAction())); + return i != null && VIEW_AND_SHARE_ACTIONS.contains(i.getAction()) && i.hasExtra(EXTRA_CONVERSATION); } private static Intent createLauncherIntent(Context context) { @@ -383,7 +392,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio } else { intent = savedInstanceState.getParcelable("intent"); } - if (isViewIntent(intent)) { + if (isViewOrShareIntent(intent)) { pendingViewIntent.push(intent); setIntent(createLauncherIntent(this)); } @@ -530,7 +539,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio @Override protected void onNewIntent(final Intent intent) { - if (isViewIntent(intent)) { + if (isViewOrShareIntent(intent)) { if (xmppConnectionService != null) { processViewIntent(intent); } else { diff --git a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java index b4c498f2f..8595fda95 100644 --- a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java @@ -1,6 +1,5 @@ package eu.siacs.conversations.ui; -import android.app.PendingIntent; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; @@ -12,387 +11,190 @@ import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; -import java.net.URLConnection; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Conversation; -import eu.siacs.conversations.entities.Message; -import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.ui.adapter.ConversationAdapter; import eu.siacs.conversations.ui.service.EmojiService; -import eu.siacs.conversations.ui.util.PresenceSelector; -import eu.siacs.conversations.xmpp.XmppConnection; import rocks.xmpp.addr.Jid; public class ShareWithActivity extends XmppActivity implements XmppConnectionService.OnConversationUpdate { - private static final int REQUEST_STORAGE_PERMISSION = 0x733f32; - private boolean mReturnToPrevious = false; - private Conversation mPendingConversation = null; + private static final int REQUEST_STORAGE_PERMISSION = 0x733f32; + private Conversation mPendingConversation = null; - @Override - public void onConversationUpdate() { - refreshUi(); - } + @Override + public void onConversationUpdate() { + refreshUi(); + } - private class Share { - public List uris = new ArrayList<>(); - public boolean image; - public String account; - public String contact; - public String text; - public String uuid; - public boolean multiple = false; - public String type; - } + private class Share { + ArrayList uris = new ArrayList<>(); + public String account; + public String contact; + public String text; + } - private Share share; + private Share share; - private static final int REQUEST_START_NEW_CONVERSATION = 0x0501; - private RecyclerView mListView; - private ConversationAdapter mAdapter; - private List mConversations = new ArrayList<>(); - private Toast mToast; - private AtomicInteger attachmentCounter = new AtomicInteger(0); + private static final int REQUEST_START_NEW_CONVERSATION = 0x0501; + private ConversationAdapter mAdapter; + private List mConversations = new ArrayList<>(); - private UiInformableCallback attachFileCallback = new UiInformableCallback() { - @Override - public void inform(final String text) { - runOnUiThread(() -> replaceToast(text)); - } + protected void onActivityResult(int requestCode, int resultCode, final Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == REQUEST_START_NEW_CONVERSATION + && resultCode == RESULT_OK) { + share.contact = data.getStringExtra("contact"); + share.account = data.getStringExtra(EXTRA_ACCOUNT); + } + if (xmppConnectionServiceBound + && share != null + && share.contact != null + && share.account != null) { + share(); + } + } - @Override - public void userInputRequried(PendingIntent pi, Message object) { - // TODO Auto-generated method stub + @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { + if (grantResults.length > 0) + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + if (requestCode == REQUEST_STORAGE_PERMISSION) { + if (this.mPendingConversation != null) { + share(this.mPendingConversation); + } else { + Log.d(Config.LOGTAG, "unable to find stored conversation"); + } + } + } else { + Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show(); + } + } - } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + new EmojiService(this).init(); - @Override - public void success(final Message message) { - runOnUiThread(() -> { - if (attachmentCounter.decrementAndGet() <=0 ) { - int resId; - if (share.image && share.multiple) { - resId = R.string.shared_images_with_x; - } else if (share.image) { - resId = R.string.shared_image_with_x; - } else { - resId = R.string.shared_file_with_x; - } - Conversation conversation = (Conversation) message.getConversation(); - replaceToast(getString(resId, conversation.getName())); - if (mReturnToPrevious) { - finish(); - } else { - switchToConversation(conversation); - } - } - }); - } + setContentView(R.layout.activity_share_with); - @Override - public void error(final int errorCode, Message object) { - runOnUiThread(() -> { - replaceToast(getString(errorCode)); - if (attachmentCounter.decrementAndGet() <=0 ) { - finish(); - } - }); - } - }; + setSupportActionBar(findViewById(R.id.toolbar)); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(false); + getSupportActionBar().setHomeButtonEnabled(false); + } - protected void hideToast() { - if (mToast != null) { - mToast.cancel(); - } - } + setTitle(getString(R.string.title_activity_sharewith)); - protected void replaceToast(String msg) { - hideToast(); - mToast = Toast.makeText(this, msg ,Toast.LENGTH_LONG); - mToast.show(); - } + RecyclerView mListView = findViewById(R.id.choose_conversation_list); + mAdapter = new ConversationAdapter(this, this.mConversations); + mListView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); + mListView.setAdapter(mAdapter); + mAdapter.setConversationClickListener((view, conversation) -> share(conversation)); + this.share = new Share(); + } - protected void onActivityResult(int requestCode, int resultCode, final Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == REQUEST_START_NEW_CONVERSATION - && resultCode == RESULT_OK) { - share.contact = data.getStringExtra("contact"); - share.account = data.getStringExtra(EXTRA_ACCOUNT); - } - if (xmppConnectionServiceBound - && share != null - && share.contact != null - && share.account != null) { - share(); - } - } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.share_with, menu); + return true; + } - @Override - public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { - if (grantResults.length > 0) - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - if (requestCode == REQUEST_STORAGE_PERMISSION) { - if (this.mPendingConversation != null) { - share(this.mPendingConversation); - } else { - Log.d(Config.LOGTAG,"unable to find stored conversation"); - } - } - } else { - Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show(); - } - } + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + switch (item.getItemId()) { + case R.id.action_add: + final Intent intent = new Intent(getApplicationContext(), ChooseContactActivity.class); + startActivityForResult(intent, REQUEST_START_NEW_CONVERSATION); + return true; + } + return super.onOptionsItemSelected(item); + } - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - new EmojiService(this).init(); + @Override + public void onStart() { + super.onStart(); + Intent intent = getIntent(); + if (intent == null) { + return; + } + final String type = intent.getType(); + final String action = intent.getAction(); + if (Intent.ACTION_SEND.equals(action)) { + final String text = intent.getStringExtra(Intent.EXTRA_TEXT); + final Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); + if (type != null && uri != null && (text == null || !type.equals("text/plain"))) { + this.share.uris.clear(); + this.share.uris.add(uri); + } else { + this.share.text = text; + } + } else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) { + this.share.uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); + } + if (xmppConnectionServiceBound) { + xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.uris.size() == 0); + } - setContentView(R.layout.activity_share_with); + } - setSupportActionBar(findViewById(R.id.toolbar)); - if (getSupportActionBar() != null) { - getSupportActionBar().setDisplayHomeAsUpEnabled(false); - getSupportActionBar().setHomeButtonEnabled(false); - } + @Override + void onBackendConnected() { + if (xmppConnectionServiceBound && share != null && ((share.contact != null && share.account != null))) { + share(); + return; + } + refreshUiReal(); + } - setTitle(getString(R.string.title_activity_sharewith)); + private void share() { + final Conversation conversation; + Account account; + try { + account = xmppConnectionService.findAccountByJid(Jid.of(share.account)); + } catch (final IllegalArgumentException e) { + account = null; + } + if (account == null) { + return; + } - mListView = findViewById(R.id.choose_conversation_list); - mAdapter = new ConversationAdapter(this, this.mConversations); - mListView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); - mListView.setAdapter(mAdapter); - mAdapter.setConversationClickListener((view, conversation) -> share(conversation)); - this.share = new Share(); - } + try { + conversation = xmppConnectionService.findOrCreateConversation(account, Jid.of(share.contact), false, true); + } catch (final IllegalArgumentException e) { + return; + } + share(conversation); + } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.share_with, menu); - return true; - } + private void share(final Conversation conversation) { + if (share.uris.size() != 0 && !hasStoragePermission(REQUEST_STORAGE_PERMISSION)) { + mPendingConversation = conversation; + return; + } + Intent intent = new Intent(this, ConversationsActivity.class); + intent.putExtra(ConversationsActivity.EXTRA_CONVERSATION, conversation.getUuid()); + if (share.uris.size() > 0) { + intent.setAction(Intent.ACTION_SEND_MULTIPLE); + intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, share.uris); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } else if (share.text != null) { + intent.setAction(ConversationsActivity.ACTION_VIEW_CONVERSATION); + intent.putExtra(ConversationsActivity.EXTRA_TEXT, share.text); + } + startActivity(intent); + finish(); + } - @Override - public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - case R.id.action_add: - final Intent intent = new Intent(getApplicationContext(), ChooseContactActivity.class); - startActivityForResult(intent, REQUEST_START_NEW_CONVERSATION); - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onStart() { - super.onStart(); - Intent intent = getIntent(); - if (intent == null) { - return; - } - this.mReturnToPrevious = getBooleanPreference("return_to_previous", R.bool.return_to_previous); - final String type = intent.getType(); - final String action = intent.getAction(); - Log.d(Config.LOGTAG, "action: "+action+ ", type:"+type); - share.uuid = intent.getStringExtra("uuid"); - if (Intent.ACTION_SEND.equals(action)) { - final String text = intent.getStringExtra(Intent.EXTRA_TEXT); - final Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); - if (type != null && uri != null && (text == null || !type.equals("text/plain"))) { - this.share.uris.clear(); - this.share.uris.add(uri); - this.share.image = type.startsWith("image/") || isImage(uri); - this.share.type = type; - } else { - this.share.text = text; - } - } else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) { - this.share.image = type != null && type.startsWith("image/"); - if (!this.share.image) { - return; - } - this.share.uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); - } - if (xmppConnectionServiceBound) { - if (share.uuid != null) { - share(); - } else { - xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.uris.size() == 0); - } - } - - } - - protected boolean isImage(Uri uri) { - try { - String guess = URLConnection.guessContentTypeFromName(uri.toString()); - return (guess != null && guess.startsWith("image/")); - } catch (final StringIndexOutOfBoundsException ignored) { - return false; - } - } - - @Override - void onBackendConnected() { - if (xmppConnectionServiceBound && share != null - && ((share.contact != null && share.account != null) || share.uuid != null)) { - share(); - return; - } - refreshUiReal(); - } - - private void share() { - final Conversation conversation; - if (share.uuid != null) { - conversation = xmppConnectionService.findConversationByUuid(share.uuid); - if (conversation == null) { - return; - } - }else{ - Account account; - try { - account = xmppConnectionService.findAccountByJid(Jid.of(share.account)); - } catch (final IllegalArgumentException e) { - account = null; - } - if (account == null) { - return; - } - - try { - conversation = xmppConnectionService - .findOrCreateConversation(account, Jid.of(share.contact), false,true); - } catch (final IllegalArgumentException e) { - return; - } - } - share(conversation); - } - - private void share(final Conversation conversation) { - if (share.uris.size() != 0 && !hasStoragePermission(REQUEST_STORAGE_PERMISSION)) { - mPendingConversation = conversation; - return; - } - final Account account = conversation.getAccount(); - final XmppConnection connection = account.getXmppConnection(); - final long max = connection == null ? -1 : connection.getFeatures().getMaxHttpUploadSize(); - mListView.setEnabled(false); - if (conversation.getNextEncryption() == Message.ENCRYPTION_PGP && !hasPgp()) { - if (share.uuid == null) { - showInstallPgpDialog(); - } else { - Toast.makeText(this,R.string.openkeychain_not_installed,Toast.LENGTH_SHORT).show(); - finish(); - } - return; - } - if (share.uris.size() != 0) { - PresenceSelector.OnPresenceSelected callback = () -> { - attachmentCounter.set(share.uris.size()); - if (share.image) { - share.multiple = share.uris.size() > 1; - replaceToast(getString(share.multiple ? R.string.preparing_images : R.string.preparing_image)); - for (Iterator i = share.uris.iterator(); i.hasNext(); i.remove()) { - final Uri uri = i.next(); - delegateUriPermissionsToService(uri); - xmppConnectionService.attachImageToConversation(conversation, uri, attachFileCallback); - } - } else { - replaceToast(getString(R.string.preparing_file)); - final Uri uri = share.uris.get(0); - delegateUriPermissionsToService(uri); - xmppConnectionService.attachFileToConversation(conversation, uri, share.type, attachFileCallback); - } - }; - if (account.httpUploadAvailable() - && ((share.image && !neverCompressPictures()) - || conversation.getMode() == Conversation.MODE_MULTI - /*|| FileBackend.allFilesUnderSize(this, share.uris, max)*/)) { - callback.onPresenceSelected(); - } else { - selectPresence(conversation, callback); - } - } else { - if (mReturnToPrevious && this.share.text != null && !this.share.text.isEmpty() ) { - final PresenceSelector.OnPresenceSelected callback = new PresenceSelector.OnPresenceSelected() { - - private void finishAndSend(Message message) { - replaceToast(getString(R.string.shared_text_with_x, conversation.getName())); - finish(); - } - - private UiCallback messageEncryptionCallback = new UiCallback() { - @Override - public void success(final Message message) { - runOnUiThread(() -> finishAndSend(message)); - } - - @Override - public void error(final int errorCode, Message object) { - runOnUiThread(() -> { - replaceToast(getString(errorCode)); - finish(); - }); - } - - @Override - public void userInputRequried(PendingIntent pi, Message object) { - finish(); - } - }; - - @Override - public void onPresenceSelected() { - - final int encryption = conversation.getNextEncryption(); - - Message message = new Message(conversation,share.text, encryption); - - Log.d(Config.LOGTAG,"on presence selected encrpytion="+encryption); - - if (encryption == Message.ENCRYPTION_PGP) { - replaceToast(getString(R.string.encrypting_message)); - xmppConnectionService.getPgpEngine().encrypt(message,messageEncryptionCallback); - return; - } - xmppConnectionService.sendMessage(message); - finishAndSend(message); - } - }; - if (conversation.getNextEncryption() == Message.ENCRYPTION_OTR) { - selectPresence(conversation, callback); - } else { - callback.onPresenceSelected(); - } - } else { - switchToConversation(conversation, this.share.text, true); - } - } - - } - - public void refreshUiReal() { - xmppConnectionService.populateWithOrderedConversations(mConversations, this.share != null && this.share.uris.size() == 0); - mAdapter.notifyDataSetChanged(); - } - - @Override - public void onBackPressed() { - if (attachmentCounter.get() >= 1) { - replaceToast(getString(R.string.sharing_files_please_wait)); - } else { - super.onBackPressed(); - } - } + public void refreshUiReal() { + xmppConnectionService.populateWithOrderedConversations(mConversations, this.share != null && this.share.uris.size() == 0); + mAdapter.notifyDataSetChanged(); + } } diff --git a/src/main/java/eu/siacs/conversations/ui/util/Attachment.java b/src/main/java/eu/siacs/conversations/ui/util/Attachment.java index 29e3b67cb..cc311d9e1 100644 --- a/src/main/java/eu/siacs/conversations/ui/util/Attachment.java +++ b/src/main/java/eu/siacs/conversations/ui/util/Attachment.java @@ -75,6 +75,14 @@ public class Attachment { return Collections.singletonList(new Attachment(uri, type, mime)); } + public static List of(final Context context, List uris) { + List attachments = new ArrayList<>(); + for(Uri uri : uris) { + final String mime = MimeUtils.guessMimeTypeFromUri(context, uri); + attachments.add(new Attachment(uri, mime != null && mime.startsWith("image/") ? Type.IMAGE : Type.FILE,mime)); + } + return attachments; + } public static List extractAttachments(final Context context, final Intent intent, Type type) { List uris = new ArrayList<>(); diff --git a/src/main/res/values/defaults.xml b/src/main/res/values/defaults.xml index ac5f855c9..35a3f0995 100644 --- a/src/main/res/values/defaults.xml +++ b/src/main/res/values/defaults.xml @@ -35,7 +35,6 @@ false false false - false false true true diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 9c3ff8481..788456990 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -105,8 +105,6 @@ Accept files Automatically accept files smaller than… Attachments - Quick Sharing - Immediately return to previous activity instead of opening the conversation after sharing something Notification Vibrate Vibrate when a new message arrives diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml index 8bcc757a1..19035595a 100644 --- a/src/main/res/xml/preferences.xml +++ b/src/main/res/xml/preferences.xml @@ -137,11 +137,6 @@ android:key="picture_compression" android:summary="@string/pref_picture_compression_summary" android:title="@string/pref_picture_compression" /> -