Added ability to share contacts.

The "contact" option in the attachments tray now brings you through an
optimized contact sharing flow, allowing you to select specific fields
to share. The contact is then presented as a special message type,
allowing you to interact with the card to add the contact to your system
contacts, invite them to signal, initiate a signal message, etc.
This commit is contained in:
Greyson Parrelli
2018-04-26 17:03:54 -07:00
parent 17dbdbd0a9
commit 54dbffaf30
90 changed files with 3628 additions and 195 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 709 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 895 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 801 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z"/>
</vector>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/transparent_white_dd"/>
<stroke android:color="@color/grey_400_transparent" android:width="@dimen/quote_outline_width"/>
<corners android:radius="@dimen/quote_corner_radius" />
</shape>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/contact_share_edit_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/contact_share_edit_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:src="@drawable/ic_send_push_white_24dp"
android:layout_margin="@dimen/floating_action_button_margin"/>
</FrameLayout>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>

View File

@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/shared_contact_details_header_background">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="?attr/actionBarSize"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:id="@+id/contact_details_avatar"
android:layout_width="125dp"
android:layout_height="125dp"
android:padding="8dp"
android:transitionName="avatar"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.7"/>
<org.thoughtcrime.securesms.components.emoji.EmojiTextView
android:id="@+id/contact_details_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:transitionName="name"
android:gravity="center"
android:textSize="20sp"
tools:text="Peter Parker"/>
<TextView
android:id="@+id/contact_details_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:transitionName="number"
android:layout_marginBottom="14dp"
android:gravity="center"
tools:text="(610) 555-5555"/>
<Button
android:id="@+id/contact_details_add_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_gravity="center"
style="@style/Button.Primary"
android:text="@string/SharedContactDetailsActivity_add_to_contacts" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/contact_details_invite_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_gravity="center"
style="@style/Button.Borderless"
android:text="@string/SharedContactDetailsActivity_invite_to_signal"
android:visibility="gone"
tools:visibility="gone"/>
<LinearLayout
android:id="@+id/contact_details_engage_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal"
style="?attr/buttonBarStyle"
android:visibility="gone"
tools:visibility="visible">
<LinearLayout
android:id="@+id/contact_details_message_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center"
android:padding="10dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
android:tint="@color/signal_primary"
android:src="@drawable/message_24dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Signal Message"
android:textColor="@color/signal_primary"/>
</LinearLayout>
<LinearLayout
android:id="@+id/contact_details_call_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center"
android:padding="10dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
android:tint="@color/signal_primary"
android:src="@drawable/phone_24dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Signal Call"
android:textColor="@color/signal_primary"/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
</LinearLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="@style/TextSecure.LightActionBar.DarkText"
android:background="@color/transparent"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/contact_details_fields"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>

View File

@@ -84,6 +84,13 @@
app:message_type="incoming"
tools:visibility="visible"/>
<ViewStub
android:id="@+id/shared_contact_view_stub"
android:layout="@layout/conversation_item_shared_contact"
android:layout_width="@dimen/media_bubble_max_width"
android:layout_height="wrap_content"
android:visibility="gone"/>
<ViewStub
android:id="@+id/image_view_stub"
android:layout="@layout/conversation_item_received_thumbnail"

View File

@@ -47,6 +47,13 @@
app:message_type="outgoing"
tools:visibility="visible"/>
<ViewStub
android:id="@+id/shared_contact_view_stub"
android:layout="@layout/conversation_item_shared_contact"
android:layout_width="@dimen/media_bubble_max_width"
android:layout_height="wrap_content"
android:visibility="gone"/>
<ViewStub
android:id="@+id/image_view_stub"
android:layout_width="@dimen/media_bubble_default_dimens"

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<org.thoughtcrime.securesms.components.SharedContactView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/shared_contact_view"
android:layout_width="@dimen/media_bubble_default_dimens"
android:layout_height="wrap_content" />

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<org.thoughtcrime.securesms.components.AvatarImageView
android:id="@+id/editable_contact_avatar"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="12dp"/>
<org.thoughtcrime.securesms.components.emoji.EmojiTextView
android:id="@+id/editable_contact_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="20sp"
android:maxLines="2"
android:ellipsize="end"
tools:text="Peter Parker"/>
</LinearLayout>
<ImageView
android:layout_width="match_parent"
android:layout_height="1dp"
android:src="@color/grey_400"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/editable_contact_fields"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:gravity="center_vertical">
<ImageView
android:id="@+id/contact_field_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_margin="16dp"
android:tint="@color/grey_600"
tools:src="@drawable/ic_call_white_24dp" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<org.thoughtcrime.securesms.components.emoji.EmojiTextView
android:id="@+id/contact_field_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end"
tools:text="(610) 867-5309" />
<TextView
android:id="@+id/contact_field_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end"
tools:text="Mobile"/>
</LinearLayout>
<CheckBox
android:id="@+id/contact_field_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"/>
</LinearLayout>

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/shared_contact_view_background">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="6dp"
android:gravity="center_vertical">
<ImageView
android:id="@+id/contact_avatar"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<org.thoughtcrime.securesms.components.emoji.EmojiTextView
android:id="@+id/contact_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:maxLines="1"
android:ellipsize="end"
android:fontFamily="sans-serif-medium"
android:textColor="@color/signal_primary"
android:textSize="16sp"
tools:text="Peter Parker"/>
<TextView
android:id="@+id/contact_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end"
android:textColor="@color/grey_600"
tools:text="(610) 555-5555"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/contact_action_button_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/grey_400_transparent"/>
<TextView
android:id="@+id/contact_action_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:background="?attr/selectableItemBackground"
android:fontFamily="sans-serif-medium"
android:textColor="@color/signal_primary"
tools:text="Add to Contacts"/>
</LinearLayout>
</LinearLayout>
</merge>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="media_bubble_max_width">220dp</dimen>
<dimen name="media_bubble_max_width">250dp</dimen>
<dimen name="media_bubble_max_height">300dp</dimen>
</resources>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="media_bubble_max_width">350dp</dimen>
<dimen name="media_bubble_max_height">300dp</dimen>
</resources>

View File

@@ -131,6 +131,9 @@
<attr name="media_overview_document_background" format="color"/>
<attr name="media_overview_document_foreground" format="color"/>
<attr name="shared_contact_details_header_background" format="color"/>
<attr name="shared_contact_details_titlebar" format="color"/>
<attr name="search_toolbar_background" format="color"/>
<attr name="contact_list_divider" format="reference"/>

View File

@@ -37,6 +37,7 @@
<color name="transparent_white_60">#60ffffff</color>
<color name="transparent_white_70">#70ffffff</color>
<color name="transparent_white_aa">#aaffffff</color>
<color name="transparent_white_dd">#ddffffff</color>
<color name="conversation_compose_divider">#32000000</color>

View File

@@ -59,4 +59,7 @@
<dimen name="onboarding_subtitle_size">20sp</dimen>
<dimen name="scribble_stroke_size">3dp</dimen>
<dimen name="floating_action_button_margin">16dp</dimen>
</resources>

View File

@@ -97,6 +97,13 @@
<string name="ContactsDatabase_message_s">Message %s</string>
<string name="ContactsDatabase_signal_call_s">Signal Call %s</string>
<!-- ContactShareEditActivity -->
<string name="ContactShareEditActivity_type_home">Home</string>
<string name="ContactShareEditActivity_type_mobile">Mobile</string>
<string name="ContactShareEditActivity_type_work">Work</string>
<string name="ContactShareEditActivity_type_missing">Other</string>
<string name="ContactShareEditActivity_invalid_contact">Selected contact was invalid</string>
<!-- ConversationItem -->
<string name="ConversationItem_error_not_delivered">Not delivered</string>
<string name="ConversationItem_received_key_exchange_message_tap_to_process">Received key exchange message, tap to process.</string>
@@ -152,6 +159,8 @@
<string name="ConversationActivity_signal_needs_the_camera_permission_to_take_photos_or_video">Signal needs the Camera permission to take photos or video, but it has been permanently denied. Please continue to app settings, select \"Permissions\", and enable \"Camera\".</string>
<string name="ConversationActivity_signal_needs_camera_permissions_to_take_photos_or_video">Signal needs Camera permissions to take photos or video</string>
<string name="ConversationActivity_quoted_contact_message">%1$s %2$s</string>
<!-- ConversationAdapter -->
<plurals name="ConversationAdapter_n_unread_messages">
<item quantity="one">%d unread message</item>
@@ -568,6 +577,23 @@
<string name="RingtonePreference_add_ringtone_text">Add ringtone</string>
<string name="RingtonePreference_unable_to_add_ringtone">Unable to add custom ringtone</string>
<!-- SharedContactDetailsActivity -->
<string name="SharedContactDetailsActivity_add_to_contacts">Add to Contacts</string>
<string name="SharedContactDetailsActivity_invite_to_signal">Invite to Signal</string>
<string name="SharedContactDetailsActivity_invite_message">Let\'s switch to Signal: %1$s</string>
<string name="SharedContactDetailsActivity_new_contact_success">Contact added.</string>
<string name="SharedContactDetailsActivity_new_contact_failure">Failed to retrieve the contact</string>
<string name="SharedContactDetailsActivity_updated_contact_success">Contact updated.</string>
<string name="SharedContactDetailsActivity_updated_contact_failure">Error while editing contact</string>
<string name="SharedContactDetailsActivity_initialization_failure">Error while reading contact</string>
<string name="SharedContactDetailsActivity_add_as_new_contact">Add as a new contact</string>
<string name="SharedContactDetailsActivity_add_to_existing_contact">Add to an existing contact</string>
<!-- SharedContactView -->
<string name="SharedContactView_add_to_contacts">Add to Contacts</string>
<string name="SharedContactView_invite_to_signal">Invite to Signal</string>
<string name="SharedContactView_message">Signal Message</string>
<!-- Slide -->
<string name="Slide_image">Image</string>
<string name="Slide_audio">Audio</string>
@@ -695,6 +721,8 @@
<string name="MessageNotifier_reply">Reply</string>
<string name="MessageNotifier_pending_signal_messages">Pending Signal messages</string>
<string name="MessageNotifier_you_have_pending_signal_messages">You have pending Signal messages, tap to open and retrieve</string>
<string name="MessageNotifier_contact_message">%1$s %2$s</string>
<string name="MessageNotifier_unknown_contact_message">Contact</string>
<!-- MmsPreferencesFragment -->

View File

@@ -61,6 +61,12 @@
<item name="android:textColorSecondary">@color/white</item>
</style>
<style name="TextSecure.LightActionBar.DarkText"
parent="TextSecure.LightActionBar">
<item name="android:textColorPrimary">@color/black</item>
<item name="android:textColorSecondary">@color/black</item>
</style>
<style name="TextSecure.FlatLightActionBar"
parent="@style/TextSecure.LightActionBar">
<item name="elevation">0dp</item>
@@ -188,6 +194,15 @@
<item name="android:textSize">14sp</item>
</style>
<style name="Button.Primary" parent="Base.Widget.AppCompat.Button.Colored">
<item name="colorAccent">@color/signal_primary</item>
<item name="android:textColor">@color/white</item>
</style>
<style name="Button.Borderless" parent="Base.Widget.AppCompat.Button.Borderless">
<item name="android:textColor">@color/signal_primary</item>
</style>
<!-- RedPhone -->
<!-- Buttons in the main "button row" of the in-call onscreen touch UI. -->

View File

@@ -23,6 +23,9 @@
<item name="media_overview_header_foreground">@color/gray50</item>
<item name="media_overview_document_foreground">@color/gray70</item>
<item name="media_overview_document_background">@color/white</item>
<item name="shared_contact_details_header_background">@color/grey_100</item>
<item name="shared_contact_details_titlebar">@color/grey_400</item>
</style>
<style name="TextSecure.DarkNoActionBar" parent="@style/TextSecure.DarkTheme">
@@ -47,6 +50,9 @@
<item name="media_overview_header_foreground">@color/gray10</item>
<item name="media_overview_document_foreground">@color/white</item>
<item name="media_overview_document_background">@color/black</item>
<item name="shared_contact_details_header_background">@color/grey_800</item>
<item name="shared_contact_details_titlebar">@color/grey_900</item>
</style>
<style name="TextSecure.HighlightTheme" parent="@style/TextSecure.LightTheme">