diff options
Diffstat (limited to 'src/main/java/de/pixart/messenger/ui')
14 files changed, 238 insertions, 55 deletions
diff --git a/src/main/java/de/pixart/messenger/ui/ChannelDiscoveryActivity.java b/src/main/java/de/pixart/messenger/ui/ChannelDiscoveryActivity.java index 6c2a5c562..ba572e837 100644 --- a/src/main/java/de/pixart/messenger/ui/ChannelDiscoveryActivity.java +++ b/src/main/java/de/pixart/messenger/ui/ChannelDiscoveryActivity.java @@ -36,6 +36,7 @@ import de.pixart.messenger.ui.adapter.ChannelSearchResultAdapter; import de.pixart.messenger.ui.util.PendingItem; import de.pixart.messenger.ui.util.SoftKeyboardUtils; import de.pixart.messenger.utils.AccountUtils; +import me.drakeet.support.toast.ToastCompat; import rocks.xmpp.addr.Jid; public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.OnActionExpandListener, TextView.OnEditorActionListener, ChannelDiscoveryService.OnChannelSearchResultsFound, ChannelSearchResultAdapter.OnChannelSearchResultSelected { @@ -219,10 +220,12 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O @Override public void onChannelSearchResult(final Room result) { - List<String> accounts = AccountUtils.getEnabledAccounts(xmppConnectionService); + final List<String> accounts = AccountUtils.getEnabledAccounts(xmppConnectionService); if (accounts.size() == 1) { joinChannelSearchResult(accounts.get(0), result); - } else if (accounts.size() > 0) { + } else if (accounts.size() == 0) { + ToastCompat.makeText(this, R.string.please_enable_an_account, ToastCompat.LENGTH_LONG).show(); + } else { final AtomicReference<String> account = new AtomicReference<>(accounts.get(0)); final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.choose_account); diff --git a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java index 9ab0f50fc..8354d6517 100644 --- a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java +++ b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java @@ -139,6 +139,7 @@ import static de.pixart.messenger.ui.SettingsActivity.WARN_UNENCRYPTED_CHAT; import static de.pixart.messenger.ui.XmppActivity.EXTRA_ACCOUNT; import static de.pixart.messenger.ui.XmppActivity.REQUEST_INVITE_TO_CONVERSATION; import static de.pixart.messenger.ui.util.SoftKeyboardUtils.hideSoftKeyboard; +import static de.pixart.messenger.utils.Compatibility.runsTwentyOne; import static de.pixart.messenger.utils.PermissionUtils.allGranted; import static de.pixart.messenger.utils.PermissionUtils.getFirstDenied; import static de.pixart.messenger.utils.PermissionUtils.readGranted; @@ -632,6 +633,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke popup.setOnMenuItemClickListener(attachmentItem -> { switch (attachmentItem.getItemId()) { case R.id.attach_choose_picture: + case R.id.attach_choose_video: case R.id.attach_take_picture: case R.id.attach_record_video: case R.id.attach_choose_file: @@ -996,6 +998,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke case ATTACHMENT_CHOICE_CHOOSE_FILE: case ATTACHMENT_CHOICE_RECORD_VIDEO: case ATTACHMENT_CHOICE_RECORD_VOICE: + case ATTACHMENT_CHOICE_CHOOSE_VIDEO: final Attachment.Type type = requestCode == ATTACHMENT_CHOICE_RECORD_VOICE ? Attachment.Type.RECORDING : Attachment.Type.FILE; final List<Attachment> fileUris = Attachment.extractAttachments(getActivity(), data, type); mediaPreviewAdapter.addMediaPreviews(fileUris); @@ -1151,7 +1154,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke menuNeedHelp.setVisible(true); menuSearchUpdates.setVisible(false); ConversationMenuConfigurator.configureAttachmentMenu(conversation, menu, activity.xmppConnectionService.getAttachmentChoicePreference(), hasAttachments); - ConversationMenuConfigurator.configureEncryptionMenu(conversation, menu); + ConversationMenuConfigurator.configureEncryptionMenu(conversation, menu, activity); } else { menuNeedHelp.setVisible(false); menuSearchUpdates.setVisible(true); @@ -1434,6 +1437,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke handleEncryptionSelection(item); break; case R.id.attach_choose_picture: + case R.id.attach_choose_video: case R.id.attach_take_picture: case R.id.attach_record_video: case R.id.attach_choose_file: @@ -1494,6 +1498,9 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke case R.id.attach_choose_picture: attachFile(ATTACHMENT_CHOICE_CHOOSE_IMAGE); break; + case R.id.attach_choose_video: + attachFile(ATTACHMENT_CHOICE_CHOOSE_VIDEO); + break; case R.id.attach_take_picture: attachFile(ATTACHMENT_CHOICE_TAKE_PHOTO); break; @@ -1678,7 +1685,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke } private void updateChatBG() { - if (activity.unicoloredBG()) { + if (activity.unicoloredBG() || !runsTwentyOne()) { binding.conversationsFragment.setBackgroundResource(0); binding.conversationsFragment.setBackgroundColor(StyledAttributes.getColor(activity, R.attr.color_background_tertiary)); } else { @@ -2141,12 +2148,16 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke public void onStart() { super.onStart(); if (this.reInitRequiredOnStart && this.conversation != null) { + if (activity != null) { + updateChatBG(); + } final Bundle extras = pendingExtras.pop(); reInit(this.conversation, extras != null); if (extras != null) { processExtras(extras); } } else if (conversation == null && activity != null && activity.xmppConnectionService != null) { + updateChatBG(); final String uuid = pendingConversationsUuid.pop(); Log.d(Config.LOGTAG, "ConversationFragment.onStart() - activity was bound but no conversation loaded. uuid=" + uuid); if (uuid != null) { diff --git a/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java b/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java index 3afcf83bb..a6ab04be2 100644 --- a/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java +++ b/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java @@ -364,7 +364,8 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat return; } - if (xmppConnectionService.getAccounts().size() == 0 && Config.MAGIC_CREATE_DOMAIN != null) { + final List<Account> accounts = xmppConnectionService == null ? null : xmppConnectionService.getAccounts(); + if (accounts != null && accounts.size() == 0 && Config.MAGIC_CREATE_DOMAIN != null) { Intent intent = SignupUtils.getSignUpIntent(this, mForceRegister != null && mForceRegister); StartConversationActivity.addInviteUri(intent, getIntent()); startActivity(intent); diff --git a/src/main/java/de/pixart/messenger/ui/MediaBrowserActivity.java b/src/main/java/de/pixart/messenger/ui/MediaBrowserActivity.java index 2ed416c17..b75af44e9 100644 --- a/src/main/java/de/pixart/messenger/ui/MediaBrowserActivity.java +++ b/src/main/java/de/pixart/messenger/ui/MediaBrowserActivity.java @@ -3,6 +3,7 @@ package de.pixart.messenger.ui; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -13,6 +14,7 @@ import androidx.databinding.DataBindingUtil; import java.util.ArrayList; import java.util.List; +import de.pixart.messenger.Config; import de.pixart.messenger.R; import de.pixart.messenger.databinding.ActivityMediaBrowserBinding; import de.pixart.messenger.entities.Account; @@ -38,6 +40,14 @@ public class MediaBrowserActivity extends XmppActivity implements OnMediaLoaded private String account; private String jid; + @Override + protected void onStart() { + super.onStart(); + filter(OnlyImagesVideos); + invalidateOptionsMenu(); + refreshUiReal(); + } + public static void launch(Context context, Contact contact) { launch(context, contact.getAccount(), contact.getJid().asBareJid().toEscapedString()); } @@ -79,7 +89,7 @@ public class MediaBrowserActivity extends XmppActivity implements OnMediaLoaded } @Override - protected void refreshUiReal() { + public void refreshUiReal() { mMediaAdapter.notifyDataSetChanged(); } @@ -145,19 +155,18 @@ public class MediaBrowserActivity extends XmppActivity implements OnMediaLoaded @Override public void onMediaLoaded(List<Attachment> attachments) { + allAttachments.clear(); allAttachments.addAll(attachments); runOnUiThread(() -> { - if (OnlyImagesVideos) { filter(OnlyImagesVideos); - } else { - loadAttachments(allAttachments); - } }); } private void loadAttachments(List<Attachment> attachments) { if (attachments.size() > 0) { + if (mMediaAdapter.getItemCount() != attachments.size()) { mMediaAdapter.setAttachments(attachments); + } this.binding.noMedia.setVisibility(View.GONE); this.binding.progressbar.setVisibility(View.GONE); } else { @@ -172,20 +181,28 @@ public class MediaBrowserActivity extends XmppActivity implements OnMediaLoaded } } + @Override + public void onResume() { + super.onResume(); + filter(OnlyImagesVideos); + } + protected void filterAttachments(boolean needle) { if (allAttachments.size() > 0) { + if (needle) { final ArrayList<Attachment> attachments = new ArrayList<>(allAttachments); filteredAttachments.clear(); - if (needle) { for (Attachment attachment : attachments) { if (attachment.getMime() != null && (attachment.getMime().startsWith("image/") || attachment.getMime().startsWith("video/"))) { filteredAttachments.add(attachment); } } + loadAttachments(filteredAttachments); } else { - filteredAttachments.addAll(allAttachments); + loadAttachments(allAttachments); } - loadAttachments(filteredAttachments); + } else { + loadAttachments(allAttachments); } } }
\ No newline at end of file diff --git a/src/main/java/de/pixart/messenger/ui/OmemoActivity.java b/src/main/java/de/pixart/messenger/ui/OmemoActivity.java index 9f309ac5f..fb63a7a86 100644 --- a/src/main/java/de/pixart/messenger/ui/OmemoActivity.java +++ b/src/main/java/de/pixart/messenger/ui/OmemoActivity.java @@ -76,8 +76,8 @@ public abstract class OmemoActivity extends XmppActivity { } @Override - public void onActivityResult(int requestCode, int resultCode, Intent intent) { - super.onActivityResult(requestCode, requestCode, intent); + public void onActivityResult(final int requestCode, final int resultCode, final Intent intent) { + super.onActivityResult(requestCode, resultCode, intent); if (requestCode == ScanActivity.REQUEST_SCAN_QR_CODE && resultCode == RESULT_OK) { String result = intent.getStringExtra(ScanActivity.INTENT_EXTRA_RESULT); XmppUri uri = new XmppUri(result == null ? "" : result); diff --git a/src/main/java/de/pixart/messenger/ui/PublishGroupChatProfilePictureActivity.java b/src/main/java/de/pixart/messenger/ui/PublishGroupChatProfilePictureActivity.java index 9c70640c3..fc0d34beb 100644 --- a/src/main/java/de/pixart/messenger/ui/PublishGroupChatProfilePictureActivity.java +++ b/src/main/java/de/pixart/messenger/ui/PublishGroupChatProfilePictureActivity.java @@ -51,6 +51,8 @@ import de.pixart.messenger.ui.interfaces.OnAvatarPublication; import de.pixart.messenger.ui.util.PendingItem; import me.drakeet.support.toast.ToastCompat; +import static de.pixart.messenger.ui.PublishProfilePictureActivity.REQUEST_CHOOSE_PICTURE; + public class PublishGroupChatProfilePictureActivity extends XmppActivity implements OnAvatarPublication { private final PendingItem<String> pendingConversationUuid = new PendingItem<>(); @@ -96,7 +98,7 @@ public class PublishGroupChatProfilePictureActivity extends XmppActivity impleme configureActionBar(getSupportActionBar()); this.binding.cancelButton.setOnClickListener((v) -> this.finish()); this.binding.secondaryHint.setVisibility(View.GONE); - this.binding.accountImage.setOnClickListener((v) -> this.chooseAvatar()); + this.binding.accountImage.setOnClickListener((v) -> PublishProfilePictureActivity.chooseAvatar(this)); Intent intent = getIntent(); String uuid = intent == null ? null : intent.getStringExtra("uuid"); if (uuid != null) { @@ -116,7 +118,7 @@ public class PublishGroupChatProfilePictureActivity extends XmppActivity impleme @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) { - CropImage.ActivityResult result = CropImage.getActivityResult(data); + final CropImage.ActivityResult result = CropImage.getActivityResult(data); if (resultCode == RESULT_OK) { this.uri = result.getUri(); if (xmppConnectionServiceBound) { @@ -128,15 +130,11 @@ public class PublishGroupChatProfilePictureActivity extends XmppActivity impleme ToastCompat.makeText(this, error.getMessage(), Toast.LENGTH_SHORT).show(); } } + } else if (requestCode == REQUEST_CHOOSE_PICTURE) { + if (resultCode == RESULT_OK) { + PublishProfilePictureActivity.cropUri(this, data.getData()); } } - - private void chooseAvatar() { - CropImage.activity() - .setOutputCompressFormat(Bitmap.CompressFormat.PNG) - .setAspectRatio(1, 1) - .setMinCropResultSize(Config.AVATAR_SIZE, Config.AVATAR_SIZE) - .start(this); } @Override diff --git a/src/main/java/de/pixart/messenger/ui/PublishProfilePictureActivity.java b/src/main/java/de/pixart/messenger/ui/PublishProfilePictureActivity.java index f505bd3a3..0c634d8f3 100644 --- a/src/main/java/de/pixart/messenger/ui/PublishProfilePictureActivity.java +++ b/src/main/java/de/pixart/messenger/ui/PublishProfilePictureActivity.java @@ -1,8 +1,10 @@ package de.pixart.messenger.ui; +import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -28,6 +30,8 @@ import me.drakeet.support.toast.ToastCompat; public class PublishProfilePictureActivity extends XmppActivity implements XmppConnectionService.OnAccountUpdate, OnAvatarPublication { + public static final int REQUEST_CHOOSE_PICTURE = 0x1337; + private ImageView avatar; private TextView hintOrWarning; private TextView secondaryHint; @@ -108,7 +112,7 @@ public class PublishProfilePictureActivity extends XmppActivity implements XmppC } finish(); }); - this.avatar.setOnClickListener(v -> chooseAvatar()); + this.avatar.setOnClickListener(v -> chooseAvatar(this)); this.defaultUri = PhoneHelper.getProfilePictureUri(getApplicationContext()); if (savedInstanceState != null) { this.avatarUri = savedInstanceState.getParcelable("uri"); @@ -141,15 +145,28 @@ public class PublishProfilePictureActivity extends XmppActivity implements XmppC ToastCompat.makeText(this, error.getMessage(), Toast.LENGTH_SHORT).show(); } } + } else if (requestCode == REQUEST_CHOOSE_PICTURE) { + if (resultCode == RESULT_OK) { + cropUri(this, data.getData()); + } } } - private void chooseAvatar() { + public static void chooseAvatar(final Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + final Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.setType("image/*"); + activity.startActivityForResult( + Intent.createChooser(intent, activity.getString(R.string.attach_choose_picture)), + REQUEST_CHOOSE_PICTURE + ); + } else { CropImage.activity() .setOutputCompressFormat(Bitmap.CompressFormat.PNG) .setAspectRatio(1, 1) .setMinCropResultSize(Config.AVATAR_SIZE, Config.AVATAR_SIZE) - .start(this); + .start(activity); + } } @Override @@ -183,10 +200,7 @@ public class PublishProfilePictureActivity extends XmppActivity implements XmppC final Uri uri = intent != null ? intent.getData() : null; if (uri != null && handledExternalUri.compareAndSet(false, true)) { - CropImage.activity(uri).setOutputCompressFormat(Bitmap.CompressFormat.PNG) - .setAspectRatio(1, 1) - .setMinCropResultSize(Config.AVATAR_SIZE, Config.AVATAR_SIZE) - .start(this); + cropUri(this, uri); return; } @@ -196,6 +210,13 @@ public class PublishProfilePictureActivity extends XmppActivity implements XmppC configureActionBar(getSupportActionBar(), !this.mInitialAccountSetup && !handledExternalUri.get()); } + public static void cropUri(final Activity activity, final Uri uri) { + CropImage.activity(uri).setOutputCompressFormat(Bitmap.CompressFormat.PNG) + .setAspectRatio(1, 1) + .setMinCropResultSize(Config.AVATAR_SIZE, Config.AVATAR_SIZE) + .start(activity); + } + protected void loadImageIntoPreview(Uri uri) { Bitmap bm = null; diff --git a/src/main/java/de/pixart/messenger/ui/SearchActivity.java b/src/main/java/de/pixart/messenger/ui/SearchActivity.java index 8fd76df2e..dce7b370c 100644 --- a/src/main/java/de/pixart/messenger/ui/SearchActivity.java +++ b/src/main/java/de/pixart/messenger/ui/SearchActivity.java @@ -33,6 +33,7 @@ import android.os.Bundle; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; +import android.util.Log; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; @@ -47,6 +48,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import de.pixart.messenger.Config; import de.pixart.messenger.R; import de.pixart.messenger.databinding.ActivitySearchBinding; import de.pixart.messenger.entities.Contact; @@ -64,6 +66,7 @@ import de.pixart.messenger.ui.util.ShareUtil; import de.pixart.messenger.ui.util.StyledAttributes; import de.pixart.messenger.utils.FtsUtils; import de.pixart.messenger.utils.MessageUtils; +import de.pixart.messenger.utils.UIHelper; import static de.pixart.messenger.ui.util.SoftKeyboardUtils.hideSoftKeyboard; import static de.pixart.messenger.ui.util.SoftKeyboardUtils.showKeyboard; @@ -115,9 +118,7 @@ public class SearchActivity extends XmppActivity implements TextWatcher, OnSearc searchField.addTextChangedListener(this); searchField.setHint(R.string.search_messages); searchField.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); - if (term == null) { showKeyboard(searchField); - } return super.onCreateOptionsMenu(menu); } @@ -150,7 +151,8 @@ public class SearchActivity extends XmppActivity implements TextWatcher, OnSearc @Override public boolean onContextItemSelected(MenuItem item) { final Message message = selectedMessageReference.get(); - final String user = selectedMessageReference.get().getConversation().getContact().getDisplayName(); + final boolean multi = message.getConversation().getMode() == Conversational.MODE_MULTI; + final String user = multi ? UIHelper.getDisplayedMucCounterpart(message.getCounterpart()) : null; if (message != null) { switch (item.getItemId()) { case R.id.open_conversation: @@ -183,6 +185,7 @@ public class SearchActivity extends XmppActivity implements TextWatcher, OnSearc } private void quote(Message message, String user) { + Log.d(Config.LOGTAG, "Quote User: " + user); switchToConversationAndQuote(wrap(message.getConversation()), MessageUtils.prepareQuote(message), user); } diff --git a/src/main/java/de/pixart/messenger/ui/SetSettingsActivity.java b/src/main/java/de/pixart/messenger/ui/SetSettingsActivity.java index 5c4ce2622..27119f5fd 100644 --- a/src/main/java/de/pixart/messenger/ui/SetSettingsActivity.java +++ b/src/main/java/de/pixart/messenger/ui/SetSettingsActivity.java @@ -36,7 +36,7 @@ public class SetSettingsActivity extends XmppActivity implements XmppConnectionS static final int CHATSTATES = 4; static final int CONFIRMMESSAGES = 5; static final int LASTSEEN = 6; - static final int INVIDEOUS = 7; + static final int INVIDIOUS = 7; @Override protected void refreshUiReal() { @@ -66,7 +66,7 @@ public class SetSettingsActivity extends XmppActivity implements XmppConnectionS this.binding.actionInfoChatStates.setOnClickListener(string -> showInfo(CHATSTATES)); this.binding.actionInfoConfirmMessages.setOnClickListener(string -> showInfo(CONFIRMMESSAGES)); this.binding.actionInfoLastSeen.setOnClickListener(string -> showInfo(LASTSEEN)); - this.binding.actionInfoInvideous.setOnClickListener(string -> showInfo(INVIDEOUS)); + this.binding.actionInfoInvidious.setOnClickListener(string -> showInfo(INVIDIOUS)); } private void getDefaults() { @@ -76,7 +76,7 @@ public class SetSettingsActivity extends XmppActivity implements XmppConnectionS this.binding.chatStates.setChecked(getResources().getBoolean(R.bool.chat_states)); this.binding.confirmMessages.setChecked(getResources().getBoolean(R.bool.confirm_messages)); this.binding.lastSeen.setChecked(getResources().getBoolean(R.bool.last_activity)); - this.binding.invideous.setChecked(getResources().getBoolean(R.bool.use_invidious)); + this.binding.invidious.setChecked(getResources().getBoolean(R.bool.use_invidious)); } private void next(View view) { @@ -122,7 +122,7 @@ public class SetSettingsActivity extends XmppActivity implements XmppConnectionS title = getString(R.string.pref_broadcast_last_activity); message = getString(R.string.pref_broadcast_last_activity_summary); break; - case INVIDEOUS: + case INVIDIOUS: title = getString(R.string.pref_use_invidious); message = getString(R.string.pref_use_invidious_summary); break; @@ -171,7 +171,7 @@ public class SetSettingsActivity extends XmppActivity implements XmppConnectionS } else { preferences.edit().putBoolean(BROADCAST_LAST_ACTIVITY, false).apply(); } - if (this.binding.invideous.isChecked()) { + if (this.binding.invidious.isChecked()) { preferences.edit().putBoolean(USE_INVIDIOUS, true).apply(); } else { preferences.edit().putBoolean(USE_INVIDIOUS, false).apply(); diff --git a/src/main/java/de/pixart/messenger/ui/StartConversationActivity.java b/src/main/java/de/pixart/messenger/ui/StartConversationActivity.java index 8f4e468c7..b0e880cba 100644 --- a/src/main/java/de/pixart/messenger/ui/StartConversationActivity.java +++ b/src/main/java/de/pixart/messenger/ui/StartConversationActivity.java @@ -1003,10 +1003,12 @@ public class StartConversationActivity extends XmppActivity implements XmppConne } if (isBookmarkChecked) { - if (account.hasBookmarkFor(conferenceJid)) { - layout.setError(getString(R.string.bookmark_already_exists)); + Bookmark bookmark = account.getBookmark(conferenceJid); + if (bookmark != null) { + dialog.dismiss(); + openConversationsForBookmark(bookmark); } else { - final Bookmark bookmark = new Bookmark(account, conferenceJid.asBareJid()); + bookmark = new Bookmark(account, conferenceJid.asBareJid()); bookmark.setAutojoin(getBooleanPreference("autojoin", R.bool.autojoin)); final String nick = conferenceJid.getResource(); if (nick != null && !nick.isEmpty() && !nick.equals(MucOptions.defaultNick(account))) { @@ -1100,6 +1102,10 @@ public class StartConversationActivity extends XmppActivity implements XmppConne final AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo; if (mResContextMenu == R.menu.conference_context) { activity.conference_context_id = acmi.position; + final Bookmark bookmark = (Bookmark) activity.conferences.get(acmi.position); + final Conversation conversation = bookmark.getConversation(); + final MenuItem share = menu.findItem(R.id.context_share_uri); + share.setVisible(conversation == null || !conversation.isPrivateAndNonAnonymous()); } else if (mResContextMenu == R.menu.contact_context) { activity.contact_context_id = acmi.position; final Contact contact = (Contact) activity.contacts.get(acmi.position); @@ -1110,7 +1116,7 @@ public class StartConversationActivity extends XmppActivity implements XmppConne showContactDetailsItem.setVisible(false); } deleteContactMenuItem.setVisible(contact.showInRoster() && !contact.getOption(Contact.Options.SYNCED_VIA_OTHER)); - XmppConnection xmpp = contact.getAccount().getXmppConnection(); + final XmppConnection xmpp = contact.getAccount().getXmppConnection(); if (xmpp != null && xmpp.getFeatures().blocking() && !contact.isSelf()) { if (contact.isBlocked()) { blockUnblockItem.setTitle(R.string.unblock_contact); diff --git a/src/main/java/de/pixart/messenger/ui/XmppActivity.java b/src/main/java/de/pixart/messenger/ui/XmppActivity.java index 4f9cb587a..624119bb8 100644 --- a/src/main/java/de/pixart/messenger/ui/XmppActivity.java +++ b/src/main/java/de/pixart/messenger/ui/XmppActivity.java @@ -97,6 +97,7 @@ import me.drakeet.support.toast.ToastCompat; import pl.droidsonroids.gif.GifDrawable; import rocks.xmpp.addr.Jid; +import static de.pixart.messenger.ui.SettingsActivity.ENABLE_OTR_ENCRYPTION; import static de.pixart.messenger.ui.SettingsActivity.USE_BUNDLED_EMOJIS; import static de.pixart.messenger.ui.SettingsActivity.USE_INTERNAL_UPDATER; @@ -111,6 +112,7 @@ public abstract class XmppActivity extends ActionBarActivity { public static final String EXTRA_ACCOUNT = "account"; public XmppConnectionService xmppConnectionService; + public MediaBrowserActivity mediaBrowserActivity; public boolean xmppConnectionServiceBound = false; protected int mColorWarningButton; @@ -438,6 +440,10 @@ public abstract class XmppActivity extends ActionBarActivity { return getBooleanPreference("unicolored_chatbg", R.bool.use_unicolored_chatbg); } + public boolean enableOTR() { + return getBooleanPreference(ENABLE_OTR_ENCRYPTION, R.bool.enable_otr); + } + public void setBubbleColor(final View v, final int backgroundColor, final int borderColor) { GradientDrawable shape = (GradientDrawable) v.getBackground(); shape.setColor(backgroundColor); @@ -528,10 +534,10 @@ public abstract class XmppActivity extends ActionBarActivity { intent.putExtra(Intent.EXTRA_TEXT, text); if (asQuote) { intent.putExtra(ConversationsActivity.EXTRA_AS_QUOTE, true); - intent.putExtra(ConversationsActivity.EXTRA_ACCOUNT, nick); + intent.putExtra(ConversationsActivity.EXTRA_USER, nick); } } - if (nick != null) { + if (nick != null && !asQuote) { intent.putExtra(ConversationsActivity.EXTRA_NICK, nick); intent.putExtra(ConversationsActivity.EXTRA_IS_PRIVATE_MESSAGE, pm); } @@ -1092,8 +1098,8 @@ public abstract class XmppActivity extends ActionBarActivity { protected String doInBackground(XmppConnection... params) { String uri = null; if (this.connection != null) { - XmppConnection.Features features = connection.getFeatures(); - if (features.adhocinvite) { + XmppConnection.Features features = this.connection.getFeatures(); + if (features != null && features.adhocinvite) { int i = 0; uri = this.connection.getAdHocInviteUrl(Jid.ofDomain(this.account.getJid().getDomain())); try { diff --git a/src/main/java/de/pixart/messenger/ui/adapter/MediaAdapter.java b/src/main/java/de/pixart/messenger/ui/adapter/MediaAdapter.java index 778dbbb13..3dfa9b560 100644 --- a/src/main/java/de/pixart/messenger/ui/adapter/MediaAdapter.java +++ b/src/main/java/de/pixart/messenger/ui/adapter/MediaAdapter.java @@ -1,34 +1,49 @@ package de.pixart.messenger.ui.adapter; +import android.content.ActivityNotFoundException; import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.AsyncTask; +import android.util.Log; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.Toast; import androidx.annotation.AttrRes; import androidx.annotation.DimenRes; import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.PopupMenu; import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.RecyclerView; +import java.io.File; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.RejectedExecutionException; +import de.pixart.messenger.Config; import de.pixart.messenger.R; import de.pixart.messenger.databinding.MediaBinding; +import de.pixart.messenger.persistance.FileBackend; import de.pixart.messenger.services.ExportBackupService; import de.pixart.messenger.ui.XmppActivity; import de.pixart.messenger.ui.util.Attachment; import de.pixart.messenger.ui.util.StyledAttributes; import de.pixart.messenger.ui.util.ViewUtil; +import de.pixart.messenger.utils.MimeUtils; +import me.drakeet.support.toast.ToastCompat; public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHolder> { @@ -140,9 +155,105 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol loadPreview(attachment, holder.binding.media); } else { cancelPotentialWork(attachment, holder.binding.media); - renderPreview(activity, attachment, holder.binding.media); + renderPreview(this.activity, attachment, holder.binding.media); + } + holder.binding.getRoot().setOnClickListener(v -> ViewUtil.view(this.activity, attachment)); + holder.binding.getRoot().setOnLongClickListener(v -> { + setSelection(v); + final PopupMenu popupMenu = new PopupMenu(this.activity, v); + popupMenu.inflate(R.menu.media_viewer); + popupMenu.getMenu().findItem(R.id.action_delete).setVisible(isDeletableFile(new File(attachment.getUri().getPath()))); + popupMenu.setOnMenuItemClickListener(item -> { + switch (item.getItemId()) { + case R.id.action_share: + share(attachment); + return true; + case R.id.action_open: + open(attachment); + return true; + case R.id.action_delete: + deleteFile(attachment); + return true; + } + return false; + }); + popupMenu.setOnDismissListener(menu -> resetSelection(v)); + popupMenu.show(); + return true; + }); + } + + private void setSelection(final View v) { + v.setBackgroundColor(StyledAttributes.getColor(this.activity, R.attr.colorAccent)); + } + + private void resetSelection(final View v) { + v.setBackgroundColor(0); + } + + private void share(final Attachment attachment) { + final Intent share = new Intent(Intent.ACTION_SEND); + final File file = new File(attachment.getUri().getPath()); + share.setType(attachment.getMime()); + share.putExtra(Intent.EXTRA_STREAM, FileBackend.getUriForFile(this.activity, file)); + try { + this.activity.startActivity(Intent.createChooser(share, this.activity.getText(R.string.share_with))); + } catch (ActivityNotFoundException e) { + //This should happen only on faulty androids because normally chooser is always available + ToastCompat.makeText(this.activity, R.string.no_application_found_to_open_file, Toast.LENGTH_SHORT).show(); + } + } + + private void deleteFile(final Attachment attachment) { + final File file = new File(attachment.getUri().getPath()); + final int hash = attachment.hashCode(); + final AlertDialog.Builder builder = new AlertDialog.Builder(this.activity); + builder.setNegativeButton(R.string.cancel, null); + builder.setTitle(R.string.delete_file_dialog); + builder.setMessage(R.string.delete_file_dialog_msg); + builder.setPositiveButton(R.string.confirm, (dialog, which) -> { + if (activity.xmppConnectionService.getFileBackend().deleteFile(file)) { + for (int i = 0; i < attachments.size(); i++) { + if (hash == attachments.get(i).hashCode()) { + attachments.remove(i); + notifyDataSetChanged(); + this.activity.refreshUi(); + return; + } + } + } + }); + builder.create().show(); + } + + private void open(final Attachment attachment) { + final File file = new File(attachment.getUri().getPath()); + final Uri uri; + try { + uri = FileBackend.getUriForFile(this.activity, file); + } catch (SecurityException e) { + Log.d(Config.LOGTAG, "No permission to access " + file.getAbsolutePath(), e); + ToastCompat.makeText(this.activity, this.activity.getString(R.string.no_permission_to_access_x, file.getAbsolutePath()), Toast.LENGTH_SHORT).show(); + return; + } + String mime = MimeUtils.guessMimeTypeFromUri(this.activity, uri); + Intent openIntent = new Intent(Intent.ACTION_VIEW); + openIntent.setDataAndType(uri, mime); + openIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + PackageManager manager = this.activity.getPackageManager(); + List<ResolveInfo> info = manager.queryIntentActivities(openIntent, 0); + if (info.size() == 0) { + openIntent.setDataAndType(uri, "*/*"); + } + try { + this.activity.startActivity(openIntent); + } catch (ActivityNotFoundException e) { + ToastCompat.makeText(this.activity, R.string.no_application_found_to_open_file, Toast.LENGTH_SHORT).show(); + } } - holder.binding.getRoot().setOnClickListener(v -> ViewUtil.view(activity, attachment)); + + private boolean isDeletableFile(File file) { + return (file == null || !file.toString().startsWith("/") || file.toString().contains(FileBackend.getConversationsDirectory("null"))); } public void setAttachments(List<Attachment> attachments) { diff --git a/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java b/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java index 0593869ca..f85670ec0 100644 --- a/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java +++ b/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java @@ -493,7 +493,6 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie viewHolder.richlinkview.setVisibility(View.GONE); viewHolder.progressBar.setVisibility(View.GONE); viewHolder.messageBody.setVisibility(View.GONE); - } private void applyQuoteSpan(SpannableStringBuilder body, int start, int end, boolean darkBackground) { @@ -681,6 +680,12 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie private void displayOpenableMessage(ViewHolder viewHolder, final Message message, final boolean darkBackground) { toggleWhisperInfo(viewHolder, message, false, darkBackground); + viewHolder.download_button.setVisibility(View.VISIBLE); + viewHolder.audioPlayer.setVisibility(View.GONE); + viewHolder.image.setVisibility(View.GONE); + viewHolder.gifImage.setVisibility(View.GONE); + viewHolder.richlinkview.setVisibility(View.GONE); + viewHolder.progressBar.setVisibility(View.GONE); final String mimeType = message.getMimeType(); if (mimeType != null && message.getMimeType().contains("vcard")) { try { @@ -1299,9 +1304,10 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie } private void markFileExisting(Message message) { - Log.d(Config.LOGTAG, "Found and restored orphaned file"); + Log.d(Config.LOGTAG, "Found and restored orphaned file " + message.getRelativeFilePath()); message.setFileDeleted(false); activity.xmppConnectionService.updateMessage(message, false); + activity.xmppConnectionService.updateConversation((Conversation) message.getConversation()); } private boolean checkFileExistence(Message message, View view, ViewHolder viewHolder) { diff --git a/src/main/java/de/pixart/messenger/ui/util/ConversationMenuConfigurator.java b/src/main/java/de/pixart/messenger/ui/util/ConversationMenuConfigurator.java index 9797da56f..8a9434622 100644 --- a/src/main/java/de/pixart/messenger/ui/util/ConversationMenuConfigurator.java +++ b/src/main/java/de/pixart/messenger/ui/util/ConversationMenuConfigurator.java @@ -29,6 +29,7 @@ package de.pixart.messenger.ui.util; +import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager; import android.view.Menu; @@ -42,8 +43,7 @@ import de.pixart.messenger.crypto.OmemoSetting; import de.pixart.messenger.entities.Conversation; import de.pixart.messenger.entities.Conversational; import de.pixart.messenger.entities.Message; - -import static de.pixart.messenger.ui.SettingsActivity.ENABLE_OTR_ENCRYPTION; +import de.pixart.messenger.ui.XmppActivity; public class ConversationMenuConfigurator { @@ -93,7 +93,7 @@ public class ConversationMenuConfigurator { menu.findItem(R.id.attach_location).setVisible(locationAvailable); } - public static void configureEncryptionMenu(@NonNull Conversation conversation, Menu menu) { + public static void configureEncryptionMenu(@NonNull Conversation conversation, Menu menu, final XmppActivity activity) { final MenuItem menuSecure = menu.findItem(R.id.action_security); final boolean participating = conversation.getMode() == Conversational.MODE_SINGLE || conversation.getMucOptions().participating(); if (!participating) { @@ -130,7 +130,7 @@ public class ConversationMenuConfigurator { menuSecure.setIcon(R.drawable.ic_lock_white_24dp); } - otr.setVisible(Config.supportOtr() && conversation.getBooleanAttribute(ENABLE_OTR_ENCRYPTION, false)); + otr.setVisible(Config.supportOtr() && activity.enableOTR()); if (conversation.getMode() == Conversation.MODE_MULTI) { otr.setVisible(false); } |