From 8a6ec09b9e23a4de9f7724787788b75a1faf0f17 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 29 May 2025 15:33:22 +0200 Subject: [PATCH] slightly redesign contact details --- .../conversations/entities/MucOptions.java | 16 +-- .../ui/ConferenceDetailsActivity.java | 8 +- .../ui/ContactDetailsActivity.java | 67 +++++++--- src/main/res/drawable/ic_contacts_24dp.xml | 10 ++ .../res/layout/activity_contact_details.xml | 124 +++++++++++------- src/main/res/values/strings.xml | 4 +- 6 files changed, 156 insertions(+), 73 deletions(-) create mode 100644 src/main/res/drawable/ic_contacts_24dp.xml diff --git a/src/main/java/eu/siacs/conversations/entities/MucOptions.java b/src/main/java/eu/siacs/conversations/entities/MucOptions.java index a425de52b84c2a6639717ca46e2c7ca13e7d1488..7b3b6efa455a003a938d2ba287df088254f748e1 100644 --- a/src/main/java/eu/siacs/conversations/entities/MucOptions.java +++ b/src/main/java/eu/siacs/conversations/entities/MucOptions.java @@ -472,17 +472,17 @@ public class MucOptions { return subset; } - public static List sub(List users, int max) { - ArrayList subset = new ArrayList<>(); - HashSet jids = new HashSet<>(); - for (User user : users) { - jids.add(user.getAccount().getJid().asBareJid()); - if (user.getRealJid() == null - || (user.getRealJid().getLocal() != null && jids.add(user.getRealJid()))) { + public static List sub(final List users, final int max) { + final var subset = new ArrayList(); + final var addresses = new HashSet(); + for (final var user : users) { + addresses.add(user.getAccount().getJid().asBareJid()); + final var address = user.getRealJid(); + if (address == null || (address.getLocal() != null && addresses.add(address))) { subset.add(user); } if (subset.size() >= max) { - break; + return subset; } } return subset; diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index fe2da072e2acc8aff33559e7414ddccb3c8d45c5..72f41044c86e56dc055a2a61d991f20a2328b2da 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -641,8 +641,12 @@ public class ConferenceDetailsActivity extends XmppActivity } } }); - this.mUserPreviewAdapter.submitList( - MucOptions.sub(users, GridManager.getCurrentColumnCount(binding.users))); + this.binding.users.post( + () -> { + final var list = + MucOptions.sub(users, GridManager.getCurrentColumnCount(binding.users)); + this.mUserPreviewAdapter.submitList(list); + }); this.binding.invite.setVisibility(mucOptions.canInvite() ? View.VISIBLE : View.GONE); this.binding.showUsers.setVisibility(users.size() > 0 ? View.VISIBLE : View.GONE); this.binding.showUsers.setText( diff --git a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java index 8b0ca874dc146f25bddf9c55031334a3b50f265f..914d5afaa4f27ac87539b0262c64e696a03511d7 100644 --- a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java @@ -14,9 +14,11 @@ import android.preference.PreferenceManager; import android.provider.ContactsContract.CommonDataKinds; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Intents; +import android.provider.Settings; import android.text.Spannable; import android.text.SpannableString; import android.text.style.RelativeSizeSpan; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -145,16 +147,14 @@ public class ContactDetailsActivity extends OmemoActivity private void checkContactPermissionAndShowAddDialog() { if (hasContactsPermission()) { showAddToPhoneBookDialog(); - } else if (QuickConversationsService.isContactListIntegration(this) - && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + } else if (QuickConversationsService.isContactListIntegration(this)) { requestPermissions( new String[] {Manifest.permission.READ_CONTACTS}, REQUEST_SYNC_CONTACTS); } } private boolean hasContactsPermission() { - if (QuickConversationsService.isContactListIntegration(this) - && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (QuickConversationsService.isContactListIntegration(this)) { return checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED; } else { @@ -175,7 +175,7 @@ public class ContactDetailsActivity extends OmemoActivity value = jid.toString(); } final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this); - builder.setTitle(getString(R.string.action_add_phone_book)); + builder.setTitle(getString(R.string.save_to_contact)); builder.setMessage(getString(R.string.add_phone_book_text, value)); builder.setNegativeButton(getString(R.string.cancel), null); builder.setPositiveButton( @@ -295,14 +295,35 @@ public class ContactDetailsActivity extends OmemoActivity int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { // TODO check for Camera / Scan permission super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (grantResults.length > 0) + if (grantResults.length == 0) { + return; + } + if (requestCode == REQUEST_SYNC_CONTACTS && xmppConnectionServiceBound) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - if (requestCode == REQUEST_SYNC_CONTACTS && xmppConnectionServiceBound) { - showAddToPhoneBookDialog(); - xmppConnectionService.loadPhoneContacts(); - xmppConnectionService.startContactObserver(); - } + showAddToPhoneBookDialog(); + xmppConnectionService.loadPhoneContacts(); + xmppConnectionService.startContactObserver(); + } else { + showRedirectToAppSettings(); } + } + } + + private void showRedirectToAppSettings() { + final var dialogBuilder = new MaterialAlertDialogBuilder(this); + dialogBuilder.setTitle(R.string.save_to_contact); + dialogBuilder.setMessage( + getString(R.string.no_contacts_permission, getString(R.string.app_name))); + dialogBuilder.setPositiveButton( + R.string.continue_btn, + (d, w) -> { + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", getPackageName(), null); + intent.setData(uri); + startActivity(intent); + }); + dialogBuilder.setNegativeButton(R.string.cancel, null); + dialogBuilder.create().show(); } @Override @@ -481,29 +502,41 @@ public class ContactDetailsActivity extends OmemoActivity } if (contact.isBlocked() && !this.showDynamicTags) { - binding.detailsLastseen.setVisibility(View.VISIBLE); - binding.detailsLastseen.setText(R.string.contact_blocked); + binding.detailsLastSeen.setVisibility(View.VISIBLE); + binding.detailsLastSeen.setText(R.string.contact_blocked); } else { if (showLastSeen && contact.getLastseen() > 0 && contact.getPresences().allOrNonSupport(Namespace.IDLE)) { - binding.detailsLastseen.setVisibility(View.VISIBLE); - binding.detailsLastseen.setText( + binding.detailsLastSeen.setVisibility(View.VISIBLE); + binding.detailsLastSeen.setText( UIHelper.lastseen( getApplicationContext(), contact.isActive(), contact.getLastseen())); } else { - binding.detailsLastseen.setVisibility(View.GONE); + binding.detailsLastSeen.setVisibility(View.GONE); } } - binding.detailsContactjid.setText(IrregularUnicodeDetector.style(this, contact.getJid())); + binding.detailsContactXmppAddress.setText( + IrregularUnicodeDetector.style(this, contact.getJid())); final String account = contact.getAccount().getJid().asBareJid().toString(); binding.detailsAccount.setText(getString(R.string.using_account, account)); AvatarWorkerTask.loadAvatar( contact, binding.detailsContactBadge, R.dimen.avatar_on_details_screen_size); binding.detailsContactBadge.setOnClickListener(this::onBadgeClick); + if (QuickConversationsService.isContactListIntegration(this)) { + if (contact.getSystemAccount() == null) { + binding.addAddressBook.setText(R.string.save_to_contact); + } else { + binding.addAddressBook.setText(R.string.show_in_contacts); + } + binding.addAddressBook.setVisibility(View.VISIBLE); + binding.addAddressBook.setOnClickListener(this::onAddToAddressBookClick); + } else { + binding.addAddressBook.setVisibility(View.GONE); + } binding.detailsContactKeys.removeAllViews(); boolean hasKeys = false; diff --git a/src/main/res/drawable/ic_contacts_24dp.xml b/src/main/res/drawable/ic_contacts_24dp.xml new file mode 100644 index 0000000000000000000000000000000000000000..7af18f9437567c13ce7f5537f4c183385e9d773e --- /dev/null +++ b/src/main/res/drawable/ic_contacts_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/src/main/res/layout/activity_contact_details.xml b/src/main/res/layout/activity_contact_details.xml index b4687b8c245f6a846a520ecc60405e19b49559cb..83a325e2420634a68d02618a1a33f7f2e778b3af 100644 --- a/src/main/res/layout/activity_contact_details.xml +++ b/src/main/res/layout/activity_contact_details.xml @@ -46,76 +46,109 @@ + + + + + android:layout_below="@+id/details_contact_xmpp_address" + android:layout_centerHorizontal="true" + android:layout_marginTop="16dp" + android:orientation="horizontal"> - + android:layout_marginHorizontal="8dp" + android:text="@string/add_contact" /> - - - - + android:layout_marginHorizontal="8dp" + android:text="@string/save_to_contact" + app:icon="@drawable/ic_contacts_24dp" /> + - + + + app:flow_horizontalBias="0" + app:flow_horizontalGap="8sp" + app:flow_horizontalStyle="packed" + app:flow_verticalGap="4sp" + app:flow_wrapMode="chain" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + + + + -