Implement new invite screen.

This commit is contained in:
Alex Hart 2019-11-22 13:47:25 -04:00 committed by Greyson Parrelli
parent 49ecd9ef5d
commit fb494c1151
20 changed files with 284 additions and 104 deletions

View File

@ -120,7 +120,7 @@
android:launchMode="singleTask"/> android:launchMode="singleTask"/>
<activity android:name=".InviteActivity" <activity android:name=".InviteActivity"
android:theme="@style/TextSecure.HighlightTheme" android:theme="@style/Signal.Light.NoActionBar.Invite"
android:windowSoftInputMode="stateHidden" android:windowSoftInputMode="stateHidden"
android:parentActivityName=".MainActivity" android:parentActivityName=".MainActivity"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"> android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/signal_primary_dark">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<corners android:radius="4dp" />
<solid android:color="@color/signal_primary_dark" />
</shape>
</item>
<item android:id="@android:id/background">
<shape android:shape="rectangle">
<corners android:radius="4dp" />
<solid android:color="@color/signal_primary" />
</shape>
</item>
</ripple>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:radius="4dp" />
<solid android:color="@color/signal_primary_dark" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<corners android:radius="4dp" />
<solid android:color="@color/signal_primary" />
</shape>
</item>
</selector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/signal_primary"
android:pathData="M17,15a2.98,2.98 0,0 0,-2.184 0.955L8.9,12.728a2.726,2.726 0,0 0,0 -1.456l5.915,-3.227A3.1,3.1 0,1 0,14.1 6.728L8.184,9.955a3,3 0,1 0,0 4.09L14.1,17.272A2.995,2.995 0,1 0,17 15ZM17,4.5A1.5,1.5 0,1 1,15.5 6,1.5 1.5,0 0,1 17,4.5ZM6,13.5A1.5,1.5 0,1 1,7.5 12,1.5 1.5,0 0,1 6,13.5ZM17,19.5A1.5,1.5 0,1 1,18.5 18,1.5 1.5,0 0,1 17,19.5Z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/signal_primary"
android:pathData="M17,15a2.98,2.98 0,0 0,-2.184 0.955L8.9,12.728a2.726,2.726 0,0 0,0 -1.456l5.915,-3.227A3.1,3.1 0,1 0,14.1 6.728L8.184,9.955a3,3 0,1 0,0 4.09L14.1,17.272A2.995,2.995 0,1 0,17 15Z"/>
</vector>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:color="@color/core_grey_75" android:width="1dp" />
<corners android:radius="12dp" />
</shape>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:color="@color/core_grey_25" android:width="1dp" />
<corners android:radius="12dp" />
</shape>

View File

@ -7,13 +7,13 @@
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.appcompat.widget.Toolbar <androidx.appcompat.widget.Toolbar
style="@style/TextSecure.HighlightActionBar" style="?actionBarStyle"
android:theme="@style/TextSecure.HighlightActionBar" android:theme="?actionBarStyle"
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:titleTextAppearance="@style/TextSecure.TitleTextStyle.Conversation" app:titleTextAppearance="@style/TextSecure.TitleTextStyle"
app:subtitleTextAppearance="@style/TextSecure.SubtitleTextStyle.Conversation" app:subtitleTextAppearance="@style/TextSecure.SubtitleTextStyle"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
@ -29,25 +29,18 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:padding="10dp" android:paddingTop="14dp"
android:background="?attr/invite_background"> android:paddingStart="28dp"
android:paddingEnd="28dp">
<ImageView android:id="@+id/heart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:contentDescription="@string/InviteActivity_heart_content_description"
android:src="@drawable/love_heart" />
<TextView android:layout_width="match_parent" <TextView android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/white" android:textAppearance="@style/TextAppearance.Signal.Title2"
android:textSize="20sp"
android:text="@string/InviteActivity_friends_dont_let_friends_text_unencrypted" android:text="@string/InviteActivity_friends_dont_let_friends_text_unencrypted"
android:textColor="?title_text_color_primary"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:layout_marginBottom="30dp" android:layout_marginBottom="30dp"
android:layout_marginTop="18dp" android:layout_marginTop="18dp"
android:fontFamily="sans-serif-light"
android:paddingStart="10dp"/> android:paddingStart="10dp"/>
<EditText android:id="@+id/invite_text" <EditText android:id="@+id/invite_text"
@ -55,45 +48,44 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minLines="2" android:minLines="2"
tools:text="Let's switch to Signal: https://sgnl.link/asdfdfsa" tools:text="Let's switch to Signal: https://sgnl.link/asdfdfsa"
android:background="@drawable/message_bubble_background" android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:background="?attr/invite_edit_text_background"
android:paddingTop="10dp" android:paddingTop="10dp"
android:paddingBottom="10dp" android:paddingBottom="10dp"
android:textColor="?title_text_color_primary"
android:paddingStart="10dp" android:paddingStart="10dp"
android:paddingEnd="20dp" android:paddingEnd="20dp"
android:minHeight="@dimen/invite_edit_text_min_height"
android:gravity="top" android:gravity="top"
android:inputType="textShortMessage|textMultiLine" android:inputType="textShortMessage|textMultiLine"/>
android:textColor="#ff333333"/>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:orientation="horizontal">
<Button android:id="@+id/share_button"
android:drawablePadding="10dp"
android:drawableStart="@drawable/ic_share_black_18dp"
android:text="@string/InviteActivity_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="ButtonStyle" />
<Button android:id="@+id/sms_button" <Button android:id="@+id/sms_button"
android:drawableStart="@drawable/ic_message_solid_24" android:layout_gravity="center_horizontal"
android:drawablePadding="10dp" android:text="@string/InviteActivity_share_with_contacts"
android:text="@string/InviteActivity_choose_contacts" android:layout_marginTop="16dp"
android:layout_width="wrap_content" android:textColor="?conversation_title_color"
android:layout_height="wrap_content" android:background="@drawable/cta_button_background"
tools:ignore="ButtonStyle" /> android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/share_button"
style="@style/Button.Borderless"
app:drawableStartCompat="?invite_share_icon"
android:drawablePadding="4dp"
android:layout_marginTop="16dp"
android:text="@string/InviteActivity_choose_how_to_share"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
<LinearLayout android:id="@+id/sms_send_frame" <LinearLayout android:id="@+id/sms_send_frame"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:background="@color/white" android:background="?android:windowBackground"
android:orientation="vertical" android:orientation="vertical"
android:visibility="gone" android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@ -104,10 +96,9 @@
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:layout_width="match_parent" android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize" android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary" android:background="@color/signal_primary"
android:elevation="4dp" android:elevation="4dp"
app:searchTextStyle="@style/TextSecure.TitleTextStyle.Light" app:searchTextStyle="@style/TextSecure.TitleTextStyle.Light" />
android:theme="@style/TextSecure.HighlightActionBar" />
<fragment android:id="@+id/contact_selection_list_fragment" <fragment android:id="@+id/contact_selection_list_fragment"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -1,10 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="TextSecure.HighlightTheme" parent="TextSecure.BaseHighlightTheme">
<item name="android:statusBarColor">@color/signal_primary</item>
</style>
<style name="TextSecure.LightTheme" parent="TextSecure.BaseLightTheme"> <style name="TextSecure.LightTheme" parent="TextSecure.BaseLightTheme">
<item name="android:statusBarColor">@color/core_grey_60</item> <item name="android:statusBarColor">@color/core_grey_60</item>
</style> </style>

View File

@ -1,11 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="TextSecure.HighlightTheme" parent="TextSecure.BaseHighlightTheme">
<item name="android:statusBarColor">@color/signal_primary</item>
<item name="android:navigationBarColor">@color/signal_primary</item>
</style>
<style name="TextSecure.LightTheme" parent="TextSecure.BaseLightTheme"> <style name="TextSecure.LightTheme" parent="TextSecure.BaseLightTheme">
<item name="android:windowLightStatusBar">true</item> <item name="android:windowLightStatusBar">true</item>
<item name="android:statusBarColor">@color/white</item> <item name="android:statusBarColor">@color/white</item>

View File

@ -142,7 +142,8 @@
<attr name="import_export_item_background_shadow_color" format="reference|color" /> <attr name="import_export_item_background_shadow_color" format="reference|color" />
<attr name="import_export_item_card_background" format="reference" /> <attr name="import_export_item_card_background" format="reference" />
<attr name="invite_background" format="color"/> <attr name="invite_edit_text_background" format="reference" />
<attr name="invite_share_icon" format="reference" />
<attr name="linkpreview_background_color" format="color" /> <attr name="linkpreview_background_color" format="color" />
<attr name="linkpreview_primary_text_color" format="color" /> <attr name="linkpreview_primary_text_color" format="color" />

View File

@ -102,6 +102,8 @@
<dimen name="insights_modal_percent_text_size">28sp</dimen> <dimen name="insights_modal_percent_text_size">28sp</dimen>
<dimen name="insights_modal_percent_sign_text_size">20sp</dimen> <dimen name="insights_modal_percent_sign_text_size">20sp</dimen>
<dimen name="invite_edit_text_min_height">84dp</dimen>
<!-- RedPhone --> <!-- RedPhone -->
<!-- Height of the main row of in-call buttons. --> <!-- Height of the main row of in-call buttons. -->

View File

@ -434,6 +434,9 @@
<!-- InviteActivity --> <!-- InviteActivity -->
<string name="InviteActivity_share">Share</string> <string name="InviteActivity_share">Share</string>
<string name="InviteActivity_choose_contacts">Choose contacts</string> <string name="InviteActivity_choose_contacts">Choose contacts</string>
<string name="InviteActivity_share_with_contacts">Share with contacts</string>
<string name="InviteActivity_choose_how_to_share">Choose how to share</string>
<string name="InviteActivity_cancel">Cancel</string> <string name="InviteActivity_cancel">Cancel</string>
<string name="InviteActivity_sending">Sending…</string> <string name="InviteActivity_sending">Sending…</string>
<string name="InviteActivity_heart_content_description">Heart</string> <string name="InviteActivity_heart_content_description">Heart</string>

View File

@ -69,7 +69,6 @@
<style name="TextSecure.HighlightActionBar" parent="@style/TextSecure.DarkActionBar.Conversation"> <style name="TextSecure.HighlightActionBar" parent="@style/TextSecure.DarkActionBar.Conversation">
<item name="background">@color/signal_primary</item> <item name="background">@color/signal_primary</item>
<item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
<item name="elevation">0dp</item> <item name="elevation">0dp</item>
</style> </style>

View File

@ -45,6 +45,10 @@
<item name="android:textColor">@color/core_white</item> <item name="android:textColor">@color/core_white</item>
</style> </style>
<style name="TextAppearance.Signal.Title2" parent="@style/TextAppearance.AppCompat.Title">
<item name="android:textStyle">bold</item>
</style>
<style name="TextAppearance.Signal.Headline.Insights" parent=""> <style name="TextAppearance.Signal.Headline.Insights" parent="">
<item name="android:textStyle">bold</item> <item name="android:textStyle">bold</item>
<item name="android:textSize">28sp</item> <item name="android:textSize">28sp</item>

View File

@ -65,19 +65,19 @@
<item name="media_overview_document_secondary">@color/core_grey_25</item> <item name="media_overview_document_secondary">@color/core_grey_25</item>
</style> </style>
<style name="TextSecure.HighlightTheme" parent="TextSecure.BaseHighlightTheme"> <style name="Signal.Light.NoActionBar.Invite" parent="Base.Signal.Light.NoActionBar.Invite">
<!-- Empty for override --> <!-- Empty for override -->
</style> </style>
<style name="TextSecure.BaseHighlightTheme" parent="@style/TextSecure.LightNoActionBar.DarkToolbar"> <style name="Base.Signal.Light.NoActionBar.Invite" parent="@style/TextSecure.LightNoActionBar">
<item name="actionBarStyle">@style/TextSecure.HighlightActionBar</item> <item name="contact_filter_toolbar_icon_tint">?conversation_subtitle_color</item>
<item name="android:actionBarStyle">@style/TextSecure.HighlightActionBar</item> </style>
<item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
<item name="android:windowBackground">@color/signal_primary</item> <style name="Signal.NoActionBar.Invite" parent="Base.Signal.NoActionBar.Invite">
<item name="android:windowContentOverlay">@null</item> <!-- Empty for override -->
<item name="homeAsUpIndicator">@drawable/ic_arrow_left_conversation_24</item> </style>
<item name="android:homeAsUpIndicator">@drawable/ic_arrow_left_conversation_24</item>
<item name="colorButtonNormal">@color/white</item> <style name="Base.Signal.NoActionBar.Invite" parent="@style/TextSecure.DarkNoActionBar">
<item name="contact_filter_toolbar_icon_tint">?conversation_subtitle_color</item> <item name="contact_filter_toolbar_icon_tint">?conversation_subtitle_color</item>
</style> </style>
@ -359,7 +359,8 @@
<item name="search_toolbar_background">@color/white</item> <item name="search_toolbar_background">@color/white</item>
<item name="search_background">@color/white</item> <item name="search_background">@color/white</item>
<item name="invite_background">@color/signal_primary</item> <item name="invite_edit_text_background">@drawable/invite_edit_text_background_light</item>
<item name="invite_share_icon">@drawable/ic_share_outline_24</item>
<item name="shared_contact_details_header_background">@color/grey_100</item> <item name="shared_contact_details_header_background">@color/grey_100</item>
<item name="shared_contact_details_titlebar">@color/grey_400</item> <item name="shared_contact_details_titlebar">@color/grey_400</item>
@ -385,6 +386,9 @@
<item name="search_view_style">@style/Signal.SearchView</item> <item name="search_view_style">@style/Signal.SearchView</item>
<item name="search_view_style_dark">@style/Signal.SearchView.Dark</item> <item name="search_view_style_dark">@style/Signal.SearchView.Dark</item>
<item name="invite_edit_text_background">@drawable/invite_edit_text_background_dark</item>
<item name="invite_share_icon">@drawable/ic_share_solid_24</item>
<item name="title_text_color_primary">@color/core_grey_05</item> <item name="title_text_color_primary">@color/core_grey_05</item>
<item name="title_text_color_secondary">@color/core_grey_25</item> <item name="title_text_color_secondary">@color/core_grey_25</item>
@ -584,7 +588,6 @@
<item name="preferenceTheme">@style/PreferenceThemeOverlay.Fix</item> <item name="preferenceTheme">@style/PreferenceThemeOverlay.Fix</item>
<item name="search_toolbar_background">@color/core_grey_95</item> <item name="search_toolbar_background">@color/core_grey_95</item>
<item name="search_background">@color/black</item> <item name="search_background">@color/black</item>
<item name="invite_background">@color/black</item>
<item name="shared_contact_details_header_background">@color/grey_800</item> <item name="shared_contact_details_header_background">@color/grey_800</item>
<item name="shared_contact_details_titlebar">@color/grey_900</item> <item name="shared_contact_details_titlebar">@color/grey_900</item>

View File

@ -1,30 +1,27 @@
package org.thoughtcrime.securesms; package org.thoughtcrime.securesms;
import android.animation.Animator;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.PorterDuff;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build.VERSION; import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.AnimRes;
import androidx.appcompat.widget.Toolbar;
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
import androidx.appcompat.app.AlertDialog;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewAnimationUtils;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.view.animation.Animation; import android.view.animation.Animation;
import android.view.animation.AnimationUtils; import android.view.animation.AnimationUtils;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.AnimRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
import org.thoughtcrime.securesms.components.ContactFilterToolbar; import org.thoughtcrime.securesms.components.ContactFilterToolbar;
import org.thoughtcrime.securesms.components.ContactFilterToolbar.OnFilterChangedListener; import org.thoughtcrime.securesms.components.ContactFilterToolbar.OnFilterChangedListener;
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader.DisplayMode; import org.thoughtcrime.securesms.contacts.ContactsCursorLoader.DisplayMode;
@ -33,7 +30,11 @@ import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.sms.MessageSender;
import org.thoughtcrime.securesms.sms.OutgoingTextMessage; import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
import org.thoughtcrime.securesms.util.DynamicNoActionBarInviteTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.ThemeUtil;
import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.WindowUtil;
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture.Listener; import org.thoughtcrime.securesms.util.concurrent.ListenableFuture.Listener;
import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask; import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask;
import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.libsignal.util.guava.Optional;
@ -48,7 +49,14 @@ public class InviteActivity extends PassphraseRequiredActionBarActivity implemen
private Button smsSendButton; private Button smsSendButton;
private Animation slideInAnimation; private Animation slideInAnimation;
private Animation slideOutAnimation; private Animation slideOutAnimation;
private ImageView heart; private DynamicTheme dynamicTheme = new DynamicNoActionBarInviteTheme();
private Toolbar primaryToolbar;
@Override
protected void onPreCreate() {
super.onPreCreate();
dynamicTheme.onCreate(this);
}
@Override @Override
protected void onCreate(Bundle savedInstanceState, boolean ready) { protected void onCreate(Bundle savedInstanceState, boolean ready) {
@ -62,9 +70,15 @@ public class InviteActivity extends PassphraseRequiredActionBarActivity implemen
initializeResources(); initializeResources();
} }
@Override
protected void onResume() {
super.onResume();
dynamicTheme.onResume(this);
}
private void initializeAppBar() { private void initializeAppBar() {
Toolbar toolbar = findViewById(R.id.toolbar); primaryToolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(primaryToolbar);
assert getSupportActionBar() != null; assert getSupportActionBar() != null;
@ -84,22 +98,18 @@ public class InviteActivity extends PassphraseRequiredActionBarActivity implemen
inviteText = ViewUtil.findById(this, R.id.invite_text); inviteText = ViewUtil.findById(this, R.id.invite_text);
smsSendFrame = ViewUtil.findById(this, R.id.sms_send_frame); smsSendFrame = ViewUtil.findById(this, R.id.sms_send_frame);
smsSendButton = ViewUtil.findById(this, R.id.send_sms_button); smsSendButton = ViewUtil.findById(this, R.id.send_sms_button);
heart = ViewUtil.findById(this, R.id.heart);
contactsFragment = (ContactSelectionListFragment)getSupportFragmentManager().findFragmentById(R.id.contact_selection_list_fragment); contactsFragment = (ContactSelectionListFragment)getSupportFragmentManager().findFragmentById(R.id.contact_selection_list_fragment);
inviteText.setText(getString(R.string.InviteActivity_lets_switch_to_signal, getString(R.string.install_url))); inviteText.setText(getString(R.string.InviteActivity_lets_switch_to_signal, getString(R.string.install_url)));
updateSmsButtonText(); updateSmsButtonText();
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
heart.getViewTreeObserver().addOnPreDrawListener(new HeartPreDrawListener());
}
contactsFragment.setOnContactSelectedListener(this); contactsFragment.setOnContactSelectedListener(this);
shareButton.setOnClickListener(new ShareClickListener()); shareButton.setOnClickListener(new ShareClickListener());
smsButton.setOnClickListener(new SmsClickListener()); smsButton.setOnClickListener(new SmsClickListener());
smsCancelButton.setOnClickListener(new SmsCancelClickListener()); smsCancelButton.setOnClickListener(new SmsCancelClickListener());
smsSendButton.setOnClickListener(new SmsSendClickListener()); smsSendButton.setOnClickListener(new SmsSendClickListener());
contactFilter.setOnFilterChangedListener(new ContactFilterChangedListener()); contactFilter.setOnFilterChangedListener(new ContactFilterChangedListener());
contactFilter.setNavigationIcon(R.drawable.ic_search_24); contactFilter.setNavigationIcon(R.drawable.ic_search_conversation_24);
} }
private Animation loadAnimation(@AnimRes int animResId) { private Animation loadAnimation(@AnimRes int animResId) {
@ -141,11 +151,42 @@ public class InviteActivity extends PassphraseRequiredActionBarActivity implemen
} }
private void cancelSmsSelection() { private void cancelSmsSelection() {
setPrimaryColorsToolbarNormal();
contactsFragment.reset(); contactsFragment.reset();
updateSmsButtonText(); updateSmsButtonText();
ViewUtil.animateOut(smsSendFrame, slideOutAnimation, View.GONE); ViewUtil.animateOut(smsSendFrame, slideOutAnimation, View.GONE);
} }
private void setPrimaryColorsToolbarNormal() {
primaryToolbar.setBackgroundColor(0);
primaryToolbar.getNavigationIcon().setColorFilter(null);
primaryToolbar.setTitleTextColor(ThemeUtil.getThemedColor(this, R.attr.title_text_color_primary));
if (Build.VERSION.SDK_INT >= 23) {
getWindow().setStatusBarColor(ThemeUtil.getThemedColor(this, android.R.attr.statusBarColor));
getWindow().setNavigationBarColor(ThemeUtil.getThemedColor(this, android.R.attr.navigationBarColor));
WindowUtil.setLightStatusBarFromTheme(this);
}
WindowUtil.setLightNavigationBarFromTheme(this);
}
private void setPrimaryColorsToolbarForSms() {
primaryToolbar.setBackgroundColor(ContextCompat.getColor(this, R.color.signal_primary));
primaryToolbar.getNavigationIcon().setColorFilter(ThemeUtil.getThemedColor(this, R.attr.conversation_subtitle_color), PorterDuff.Mode.SRC_IN);
primaryToolbar.setTitleTextColor(ThemeUtil.getThemedColor(this, R.attr.conversation_title_color));
if (Build.VERSION.SDK_INT >= 23) {
getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.signal_primary));
WindowUtil.clearLightStatusBar(getWindow());
}
if (Build.VERSION.SDK_INT >= 27) {
getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.signal_primary));
WindowUtil.clearLightNavigationBar(getWindow());
}
}
private class ShareClickListener implements OnClickListener { private class ShareClickListener implements OnClickListener {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -164,6 +205,7 @@ public class InviteActivity extends PassphraseRequiredActionBarActivity implemen
private class SmsClickListener implements OnClickListener { private class SmsClickListener implements OnClickListener {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
setPrimaryColorsToolbarForSms();
ViewUtil.animateIn(smsSendFrame, slideInAnimation); ViewUtil.animateIn(smsSendFrame, slideInAnimation);
} }
} }
@ -196,23 +238,6 @@ public class InviteActivity extends PassphraseRequiredActionBarActivity implemen
} }
} }
private class HeartPreDrawListener implements OnPreDrawListener {
@Override
@TargetApi(VERSION_CODES.LOLLIPOP)
public boolean onPreDraw() {
heart.getViewTreeObserver().removeOnPreDrawListener(this);
final int w = heart.getWidth();
final int h = heart.getHeight();
Animator reveal = ViewAnimationUtils.createCircularReveal(heart,
w / 2, h,
0, (float)Math.sqrt(h*h + (w*w/4)));
reveal.setInterpolator(new FastOutSlowInInterpolator());
reveal.setDuration(800);
reveal.start();
return false;
}
}
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")
private class SendSmsInvitesAsyncTask extends ProgressDialogAsyncTask<String,Void,Void> { private class SendSmsInvitesAsyncTask extends ProgressDialogAsyncTask<String,Void,Void> {
private final String message; private final String message;

View File

@ -0,0 +1,16 @@
package org.thoughtcrime.securesms.util;
import android.app.Activity;
import org.thoughtcrime.securesms.R;
public class DynamicNoActionBarInviteTheme extends DynamicTheme {
@Override
protected int getSelectedTheme(Activity activity) {
String theme = TextSecurePreferences.getTheme(activity);
if (theme.equals("dark")) return R.style.Signal_NoActionBar_Invite;
return R.style.Signal_Light_NoActionBar_Invite;
}
}

View File

@ -22,6 +22,17 @@ public class ThemeUtil {
return getAttribute(context, R.attr.theme_type, "light").equals("dark"); return getAttribute(context, R.attr.theme_type, "light").equals("dark");
} }
public static boolean getThemedBoolean(@NonNull Context context, @AttrRes int attr) {
TypedValue typedValue = new TypedValue();
Resources.Theme theme = context.getTheme();
if (theme.resolveAttribute(attr, typedValue, true)) {
return typedValue.data != 0;
}
return false;
}
public static int getThemedColor(@NonNull Context context, @AttrRes int attr) { public static int getThemedColor(@NonNull Context context, @AttrRes int attr) {
TypedValue typedValue = new TypedValue(); TypedValue typedValue = new TypedValue();
Resources.Theme theme = context.getTheme(); Resources.Theme theme = context.getTheme();

View File

@ -0,0 +1,72 @@
package org.thoughtcrime.securesms.util;
import android.app.Activity;
import android.os.Build;
import android.view.View;
import android.view.Window;
import androidx.annotation.NonNull;
public final class WindowUtil {
private WindowUtil() {
}
public static void setLightNavigationBarFromTheme(@NonNull Activity activity) {
if (Build.VERSION.SDK_INT < 27) return;
final boolean isLightNavigationBar = ThemeUtil.getThemedBoolean(activity, android.R.attr.windowLightNavigationBar);
if (isLightNavigationBar) setLightNavigationBar(activity.getWindow());
else clearLightNavigationBar(activity.getWindow());
}
public static void clearLightNavigationBar(@NonNull Window window) {
if (Build.VERSION.SDK_INT < 27) return;
clearSystemUiFlags(window, View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
}
public static void setLightNavigationBar(@NonNull Window window) {
if (Build.VERSION.SDK_INT < 27) return;
setSystemUiFlags(window, View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
}
public static void setLightStatusBarFromTheme(@NonNull Activity activity) {
if (Build.VERSION.SDK_INT < 23) return;
final boolean isLightStatusBar = ThemeUtil.getThemedBoolean(activity, android.R.attr.windowLightStatusBar);
if (isLightStatusBar) setLightStatusBar(activity.getWindow());
else clearLightStatusBar(activity.getWindow());
}
public static void clearLightStatusBar(@NonNull Window window) {
if (Build.VERSION.SDK_INT < 23) return;
clearSystemUiFlags(window, View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
public static void setLightStatusBar(@NonNull Window window) {
if (Build.VERSION.SDK_INT < 23) return;
setSystemUiFlags(window, View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
private static void clearSystemUiFlags(@NonNull Window window, int flags) {
View view = window.getDecorView();
int uiFlags = view.getSystemUiVisibility();
uiFlags &= ~flags;
view.setSystemUiVisibility(uiFlags);
}
private static void setSystemUiFlags(@NonNull Window window, int flags) {
View view = window.getDecorView();
int uiFlags = view.getSystemUiVisibility();
uiFlags |= flags;
view.setSystemUiVisibility(uiFlags);
}
}