Update UI elements of contact share activity.

This commit is contained in:
Alex Hart 2022-07-14 14:47:00 -03:00 committed by Cody Henthorne
parent 9c914ab715
commit caab91cdc3
6 changed files with 92 additions and 59 deletions

View file

@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.contactshare;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -85,7 +86,6 @@ class ContactFieldAdapter extends RecyclerView.Adapter<ContactFieldAdapter.Conta
private final TextView value; private final TextView value;
private final TextView label; private final TextView label;
private final ImageView icon;
private final ImageView avatar; private final ImageView avatar;
private final CheckBox checkBox; private final CheckBox checkBox;
@ -94,7 +94,6 @@ class ContactFieldAdapter extends RecyclerView.Adapter<ContactFieldAdapter.Conta
value = itemView.findViewById(R.id.contact_field_value); value = itemView.findViewById(R.id.contact_field_value);
label = itemView.findViewById(R.id.contact_field_label); label = itemView.findViewById(R.id.contact_field_label);
icon = itemView.findViewById(R.id.contact_field_icon);
avatar = itemView.findViewById(R.id.contact_field_avatar); avatar = itemView.findViewById(R.id.contact_field_avatar);
checkBox = itemView.findViewById(R.id.contact_field_checkbox); checkBox = itemView.findViewById(R.id.contact_field_checkbox);
} }
@ -103,7 +102,7 @@ class ContactFieldAdapter extends RecyclerView.Adapter<ContactFieldAdapter.Conta
value.setMaxLines(field.maxLines); value.setMaxLines(field.maxLines);
value.setText(field.value); value.setText(field.value);
label.setText(field.label); label.setText(field.label);
icon.setImageResource(field.iconResId); label.setVisibility(TextUtils.isEmpty(field.label) ? View.GONE : View.VISIBLE);
if (field.iconUri != null) { if (field.iconUri != null) {
avatar.setVisibility(View.VISIBLE); avatar.setVisibility(View.VISIBLE);
@ -118,18 +117,22 @@ class ContactFieldAdapter extends RecyclerView.Adapter<ContactFieldAdapter.Conta
if (selectable) { if (selectable) {
checkBox.setVisibility(View.VISIBLE); checkBox.setVisibility(View.VISIBLE);
checkBox.setOnCheckedChangeListener(null);
checkBox.setChecked(field.isSelected()); checkBox.setChecked(field.isSelected());
checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> field.setSelected(isChecked)); itemView.setOnClickListener(unused -> {
field.setSelected(!field.isSelected());
checkBox.setChecked(field.isSelected());
});
super.itemView.setOnClickListener(v -> checkBox.toggle()); super.itemView.setOnClickListener(v -> checkBox.toggle());
} else { } else {
checkBox.setVisibility(View.GONE); checkBox.setVisibility(View.GONE);
checkBox.setOnCheckedChangeListener(null); itemView.setOnClickListener(null);
itemView.setClickable(false);
} }
} }
void recycle() { void recycle() {
checkBox.setOnCheckedChangeListener(null); itemView.setOnClickListener(null);
itemView.setClickable(false);
} }
} }

View file

@ -14,6 +14,7 @@ import android.widget.Toast;
import androidx.annotation.ColorInt; import androidx.annotation.ColorInt;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.lifecycle.ViewModelProviders; import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
@ -23,9 +24,12 @@ import org.thoughtcrime.securesms.PassphraseRequiredActivity;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicLanguage;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Material3OnScrollHelper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import static org.thoughtcrime.securesms.contactshare.Contact.Name; import static org.thoughtcrime.securesms.contactshare.Contact.Name;
@ -39,7 +43,7 @@ public class ContactShareEditActivity extends PassphraseRequiredActivity impleme
private static final String KEY_SEND_BUTTON_COLOR = "send_button_color"; private static final String KEY_SEND_BUTTON_COLOR = "send_button_color";
private static final int CODE_NAME_EDIT = 55; private static final int CODE_NAME_EDIT = 55;
private final DynamicTheme dynamicTheme = new DynamicTheme(); private final DynamicTheme dynamicTheme = new DynamicNoActionBarTheme();
private final DynamicLanguage dynamicLanguage = new DynamicLanguage(); private final DynamicLanguage dynamicLanguage = new DynamicLanguage();
private ContactShareEditViewModel viewModel; private ContactShareEditViewModel viewModel;
@ -80,6 +84,11 @@ public class ContactShareEditActivity extends PassphraseRequiredActivity impleme
contactList.setLayoutManager(new LinearLayoutManager(this)); contactList.setLayoutManager(new LinearLayoutManager(this));
contactList.getLayoutManager().setAutoMeasureEnabled(true); contactList.getLayoutManager().setAutoMeasureEnabled(true);
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setNavigationOnClickListener(unused -> onBackPressed());
Material3OnScrollHelper onScrollHelper = new Material3OnScrollHelper(this, Collections.singletonList(toolbar), Collections.emptyList());
onScrollHelper.attach(contactList);
ContactShareEditAdapter contactAdapter = new ContactShareEditAdapter(GlideApp.with(this), dynamicLanguage.getCurrentLocale(), this); ContactShareEditAdapter contactAdapter = new ContactShareEditAdapter(GlideApp.with(this), dynamicLanguage.getCurrentLocale(), this);
contactList.setAdapter(contactAdapter); contactList.setAdapter(contactAdapter);

View file

@ -1,27 +1,40 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/signal_m3_toolbar_height"
android:minHeight="@dimen/signal_m3_toolbar_height"
app:layout_constraintTop_toTopOf="parent"
app:navigationIcon="@drawable/ic_arrow_left_24"
app:title="@string/ContactShareEditActivity__send_contact"
app:titleTextAppearance="@style/Signal.Text.TitleLarge" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/contact_share_edit_list" android:id="@+id/contact_share_edit_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="0dp"
android:clipToPadding="false" android:clipToPadding="false"
android:paddingBottom="80dp" /> android:paddingBottom="80dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar" />
<ImageView <ImageView
android:id="@+id/contact_share_edit_send" android:id="@+id/contact_share_edit_send"
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/floating_action_button_margin" android:layout_margin="@dimen/floating_action_button_margin"
android:background="@drawable/circle_tintable" android:background="@drawable/circle_tintable"
android:contentDescription="@string/conversation_activity__send" android:contentDescription="@string/conversation_activity__send"
android:scaleType="centerInside" android:scaleType="centerInside"
app:backgroundTint="@color/signal_colorPrimary" app:backgroundTint="@color/signal_colorPrimary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/ic_send_lock_24" app:srcCompat="@drawable/ic_send_lock_24"
app:tint="@color/white" /> app:tint="@color/white" />
</FrameLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -1,44 +1,41 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:gravity="center_vertical"
android:gravity="center_vertical"> android:minHeight="56dp"
android:orientation="horizontal">
<org.thoughtcrime.securesms.components.emoji.EmojiTextView <org.thoughtcrime.securesms.components.emoji.EmojiTextView
android:id="@+id/editable_contact_name" android:id="@+id/editable_contact_name"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dp" android:layout_marginStart="72dp"
android:layout_weight="1" android:layout_weight="1"
android:textSize="20sp"
android:maxLines="2"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="2"
android:textAppearance="@style/Signal.Text.BodyLarge"
tools:text="Peter Parker" /> tools:text="Peter Parker" />
<ImageButton <ImageButton
android:id="@+id/editable_contact_name_edit_button" android:id="@+id/editable_contact_name_edit_button"
android:layout_width="wrap_content" android:layout_width="48dp"
android:layout_height="wrap_content" android:layout_height="48dp"
android:padding="16dp" android:layout_marginEnd="12dp"
android:background="?attr/selectableItemBackgroundBorderless" android:background="?attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_create_white_24dp" android:contentDescription="@string/ContactShareEditActivity__edit_name"
android:tint="@color/core_ultramarine"/> android:scaleType="centerInside"
android:src="@drawable/ic_compose_24"
android:tint="@color/signal_colorOnSurface" />
</LinearLayout> </LinearLayout>
<ImageView
android:layout_width="match_parent"
android:layout_height="1dp"
android:src="@color/grey_400"/>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/editable_contact_fields" android:id="@+id/editable_contact_fields"
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -1,32 +1,40 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="5dp" android:background="@drawable/selectable_list_item_background"
android:paddingBottom="5dp" android:gravity="center_vertical"
android:gravity="center_vertical"> android:minHeight="56dp"
android:orientation="horizontal"
android:paddingHorizontal="@dimen/dsl_settings_gutter"
android:paddingTop="12dp"
android:paddingBottom="12dp">
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/contact_field_icon" android:id="@+id/contact_field_checkbox"
android:layout_width="24dp" android:layout_width="22dp"
android:layout_height="24dp" android:layout_height="22dp"
android:layout_margin="16dp" android:background="@drawable/contact_selection_checkbox"
android:tint="@color/grey_600" android:button="@null"
tools:src="@drawable/ic_phone_right_unlock_solid_24" /> android:clickable="false"
android:focusable="false"
tools:checked="true" />
<ImageView <ImageView
android:id="@+id/contact_field_avatar" android:id="@+id/contact_field_avatar"
android:layout_width="40dp" android:layout_width="56dp"
android:layout_height="40dp" android:layout_height="56dp"
android:layout_marginStart="24dp"
android:contentDescription="@string/ContactShareEditActivity__avatar"
android:visibility="gone" android:visibility="gone"
tools:src="@drawable/ic_contact_picture" /> tools:src="@drawable/ic_contact_picture"
tools:visibility="visible" />
<LinearLayout <LinearLayout
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical"> android:orientation="vertical">
@ -34,24 +42,21 @@
android:id="@+id/contact_field_value" android:id="@+id/contact_field_value"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1"
android:textAppearance="@style/Signal.Text.BodyLarge"
tools:text="(610) 867-5309" /> tools:text="(610) 867-5309" />
<TextView <TextView
android:id="@+id/contact_field_label" android:id="@+id/contact_field_label"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1"
android:textAppearance="@style/Signal.Text.BodyMedium"
android:textColor="@color/signal_colorOnSurfaceVariant"
tools:text="Mobile" /> tools:text="Mobile" />
</LinearLayout> </LinearLayout>
<CheckBox
android:id="@+id/contact_field_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"/>
</LinearLayout> </LinearLayout>

View file

@ -217,11 +217,17 @@
<string name="ContactNameEditActivity_middle_name">Middle name</string> <string name="ContactNameEditActivity_middle_name">Middle name</string>
<!-- ContactShareEditActivity --> <!-- ContactShareEditActivity -->
<!-- ContactShareEditActivity toolbar title -->
<string name="ContactShareEditActivity__send_contact">Send contact</string>
<string name="ContactShareEditActivity_type_home">Home</string> <string name="ContactShareEditActivity_type_home">Home</string>
<string name="ContactShareEditActivity_type_mobile">Mobile</string> <string name="ContactShareEditActivity_type_mobile">Mobile</string>
<string name="ContactShareEditActivity_type_work">Work</string> <string name="ContactShareEditActivity_type_work">Work</string>
<string name="ContactShareEditActivity_type_missing">Other</string> <string name="ContactShareEditActivity_type_missing">Other</string>
<string name="ContactShareEditActivity_invalid_contact">Selected contact was invalid</string> <string name="ContactShareEditActivity_invalid_contact">Selected contact was invalid</string>
<!-- Content descrption for name edit button on contact share edit activity -->
<string name="ContactShareEditActivity__edit_name">Edit name</string>
<!-- Content description for user avatar in edit activity -->
<string name="ContactShareEditActivity__avatar">Avatar</string>
<!-- ConversationItem --> <!-- ConversationItem -->
<string name="ConversationItem_error_not_sent_tap_for_details">Not sent, tap for details</string> <string name="ConversationItem_error_not_sent_tap_for_details">Not sent, tap for details</string>