aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/pixart/messenger/ui')
-rw-r--r--src/main/java/de/pixart/messenger/ui/ChannelDiscoveryActivity.java7
-rw-r--r--src/main/java/de/pixart/messenger/ui/ConversationFragment.java15
-rw-r--r--src/main/java/de/pixart/messenger/ui/EditAccountActivity.java3
-rw-r--r--src/main/java/de/pixart/messenger/ui/MediaBrowserActivity.java33
-rw-r--r--src/main/java/de/pixart/messenger/ui/OmemoActivity.java4
-rw-r--r--src/main/java/de/pixart/messenger/ui/PublishGroupChatProfilePictureActivity.java16
-rw-r--r--src/main/java/de/pixart/messenger/ui/PublishProfilePictureActivity.java35
-rw-r--r--src/main/java/de/pixart/messenger/ui/SearchActivity.java9
-rw-r--r--src/main/java/de/pixart/messenger/ui/SetSettingsActivity.java10
-rw-r--r--src/main/java/de/pixart/messenger/ui/StartConversationActivity.java14
-rw-r--r--src/main/java/de/pixart/messenger/ui/XmppActivity.java14
-rw-r--r--src/main/java/de/pixart/messenger/ui/adapter/MediaAdapter.java115
-rw-r--r--src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java10
-rw-r--r--src/main/java/de/pixart/messenger/ui/util/ConversationMenuConfigurator.java8
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);
}