Add Chat Colors onboarding.

fork-5.53.8
Alex Hart 2021-06-02 13:03:41 -03:00 zatwierdzone przez Cody Henthorne
rodzic 1eae360470
commit fb817e0c3b
14 zmienionych plików z 249 dodań i 15 usunięć

Wyświetl plik

@ -1,11 +1,15 @@
package org.thoughtcrime.securesms.conversation.colors.ui package org.thoughtcrime.securesms.conversation.colors.ui
import android.content.Context import android.content.Context
import android.graphics.Color
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.core.content.ContextCompat
import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.TooltipPopup
import org.thoughtcrime.securesms.conversation.colors.ChatColors import org.thoughtcrime.securesms.conversation.colors.ChatColors
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.util.MappingAdapter import org.thoughtcrime.securesms.util.MappingAdapter
import org.thoughtcrime.securesms.util.MappingViewHolder import org.thoughtcrime.securesms.util.MappingViewHolder
import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.ViewUtil
@ -83,6 +87,15 @@ class ChatColorSelectionAdapter(
val mask = model.chatColors.asCircle() val mask = model.chatColors.asCircle()
preview.setImageDrawable(mask.withFixedSize(ViewUtil.dpToPx(56))) preview.setImageDrawable(mask.withFixedSize(ViewUtil.dpToPx(56)))
if (model.isAuto && SignalStore.chatColorsValues().shouldShowAutoTooltip) {
SignalStore.chatColorsValues().shouldShowAutoTooltip = false
TooltipPopup.forTarget(itemView)
.setText(R.string.ChatColorSelectionFragment__auto_matches_the_color_to_the_wallpaper)
.setBackgroundTint(ContextCompat.getColor(context, R.color.signal_accent_primary))
.setTextColor(Color.WHITE)
.show(TooltipPopup.POSITION_BELOW)
}
} }
} }

Wyświetl plik

@ -11,8 +11,11 @@ import android.graphics.PointF
import android.graphics.RectF import android.graphics.RectF
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.PopupWindow
import android.widget.ScrollView import android.widget.ScrollView
import android.widget.SeekBar import android.widget.SeekBar
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
@ -28,6 +31,7 @@ import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.conversation.colors.ChatColors import org.thoughtcrime.securesms.conversation.colors.ChatColors
import org.thoughtcrime.securesms.conversation.colors.ui.ChatColorPreviewView import org.thoughtcrime.securesms.conversation.colors.ui.ChatColorPreviewView
import org.thoughtcrime.securesms.conversation.colors.ui.ChatColorSelectionViewModel import org.thoughtcrime.securesms.conversation.colors.ui.ChatColorSelectionViewModel
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.Util
import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.customizeOnDraw import org.thoughtcrime.securesms.util.customizeOnDraw
@ -195,6 +199,23 @@ class CustomChatColorCreatorPageFragment :
} }
} }
} }
if (page == 1 && SignalStore.chatColorsValues().shouldShowGradientTooltip) {
view.post {
SignalStore.chatColorsValues().shouldShowGradientTooltip = false
val contentView = layoutInflater.inflate(R.layout.gradient_tool_tooltip, view as ViewGroup, false)
val popupWindow = PopupWindow(contentView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
popupWindow.isOutsideTouchable = false
popupWindow.isFocusable = true
if (Build.VERSION.SDK_INT > 21) {
popupWindow.elevation = ViewUtil.dpToPx(8).toFloat()
}
popupWindow.showAsDropDown(gradientTool, 0, -gradientTool.measuredHeight + ViewUtil.dpToPx(48))
}
}
} }
private fun createRepository(): CustomChatColorCreatorRepository { private fun createRepository(): CustomChatColorCreatorRepository {

Wyświetl plik

@ -9,11 +9,26 @@ internal class ChatColorsValues internal constructor(store: KeyValueStore) : Sig
companion object { companion object {
private const val KEY_CHAT_COLORS = "chat_colors.chat_colors" private const val KEY_CHAT_COLORS = "chat_colors.chat_colors"
private const val KEY_CHAT_COLORS_ID = "chat_colors.chat_colors.id" private const val KEY_CHAT_COLORS_ID = "chat_colors.chat_colors.id"
private const val KEY_CHAT_COLORS_AUTO_TOOLTIP = "chat_colors.auto.tooltip"
private const val KEY_CHAT_COLORS_GRADIENT_TOOLTIP = "chat_colors.gradient.tooltip"
} }
override fun onFirstEverAppLaunch() = Unit override fun onFirstEverAppLaunch() = Unit
override fun getKeysToIncludeInBackup(): MutableList<String> = mutableListOf() override fun getKeysToIncludeInBackup(): MutableList<String> = mutableListOf(
KEY_CHAT_COLORS,
KEY_CHAT_COLORS_ID,
KEY_CHAT_COLORS_AUTO_TOOLTIP,
KEY_CHAT_COLORS_GRADIENT_TOOLTIP
)
var shouldShowAutoTooltip: Boolean
get() = getBoolean(KEY_CHAT_COLORS_AUTO_TOOLTIP, true)
set(value) = putBoolean(KEY_CHAT_COLORS_AUTO_TOOLTIP, value)
var shouldShowGradientTooltip: Boolean
get() = getBoolean(KEY_CHAT_COLORS_GRADIENT_TOOLTIP, true)
set(value) = putBoolean(KEY_CHAT_COLORS_GRADIENT_TOOLTIP, value)
val hasChatColors: Boolean val hasChatColors: Boolean
@JvmName("hasChatColors") @JvmName("hasChatColors")

Wyświetl plik

@ -15,6 +15,7 @@ public final class OnboardingValues extends SignalStoreValues {
private static final String SHOW_NEW_GROUP = "onboarding.new_group"; private static final String SHOW_NEW_GROUP = "onboarding.new_group";
private static final String SHOW_INVITE_FRIENDS = "onboarding.invite_friends"; private static final String SHOW_INVITE_FRIENDS = "onboarding.invite_friends";
private static final String SHOW_SMS = "onboarding.sms"; private static final String SHOW_SMS = "onboarding.sms";
private static final String SHOW_APPEARANCE = "onboarding.appearance";
OnboardingValues(@NonNull KeyValueStore store) { OnboardingValues(@NonNull KeyValueStore store) {
super(store); super(store);
@ -25,6 +26,7 @@ public final class OnboardingValues extends SignalStoreValues {
putBoolean(SHOW_NEW_GROUP, true); putBoolean(SHOW_NEW_GROUP, true);
putBoolean(SHOW_INVITE_FRIENDS, true); putBoolean(SHOW_INVITE_FRIENDS, true);
putBoolean(SHOW_SMS, true); putBoolean(SHOW_SMS, true);
putBoolean(SHOW_APPEARANCE, true);
} }
@Override @Override
@ -36,12 +38,14 @@ public final class OnboardingValues extends SignalStoreValues {
setShowNewGroup(false); setShowNewGroup(false);
setShowInviteFriends(false); setShowInviteFriends(false);
setShowSms(false); setShowSms(false);
setShowAppearance(false);
} }
public boolean hasOnboarding(@NonNull Context context) { public boolean hasOnboarding(@NonNull Context context) {
return shouldShowNewGroup() || return shouldShowNewGroup() ||
shouldShowInviteFriends() || shouldShowInviteFriends() ||
shouldShowSms(context); shouldShowSms(context) ||
shouldShowAppearance();
} }
public void setShowNewGroup(boolean value) { public void setShowNewGroup(boolean value) {
@ -67,4 +71,12 @@ public final class OnboardingValues extends SignalStoreValues {
public boolean shouldShowSms(@NonNull Context context) { public boolean shouldShowSms(@NonNull Context context) {
return getBoolean(SHOW_SMS, false) && !Util.isDefaultSmsProvider(context) && PhoneNumberFormatter.getLocalCountryCode() != 91; return getBoolean(SHOW_SMS, false) && !Util.isDefaultSmsProvider(context) && PhoneNumberFormatter.getLocalCountryCode() != 91;
} }
public void setShowAppearance(boolean value) {
putBoolean(SHOW_APPEARANCE, value);
}
public boolean shouldShowAppearance() {
return getBoolean(SHOW_APPEARANCE, false);
}
} }

Wyświetl plik

@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RawRes;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
@ -25,6 +26,7 @@ public class Megaphone {
private final int titleRes; private final int titleRes;
private final int bodyRes; private final int bodyRes;
private final int imageRes; private final int imageRes;
private final int lottieRes;
private final GlideRequest<Drawable> imageRequest; private final GlideRequest<Drawable> imageRequest;
private final int buttonTextRes; private final int buttonTextRes;
private final EventListener buttonListener; private final EventListener buttonListener;
@ -41,6 +43,7 @@ public class Megaphone {
this.titleRes = builder.titleRes; this.titleRes = builder.titleRes;
this.bodyRes = builder.bodyRes; this.bodyRes = builder.bodyRes;
this.imageRes = builder.imageRes; this.imageRes = builder.imageRes;
this.lottieRes = builder.lottieRes;
this.imageRequest = builder.imageRequest; this.imageRequest = builder.imageRequest;
this.buttonTextRes = builder.buttonTextRes; this.buttonTextRes = builder.buttonTextRes;
this.buttonListener = builder.buttonListener; this.buttonListener = builder.buttonListener;
@ -74,6 +77,10 @@ public class Megaphone {
return bodyRes; return bodyRes;
} }
public @RawRes int getLottieRes() {
return lottieRes;
}
public @DrawableRes int getImageRes() { public @DrawableRes int getImageRes() {
return imageRes; return imageRes;
} }
@ -124,6 +131,7 @@ public class Megaphone {
private int titleRes; private int titleRes;
private int bodyRes; private int bodyRes;
private int imageRes; private int imageRes;
private int lottieRes;
private GlideRequest<Drawable> imageRequest; private GlideRequest<Drawable> imageRequest;
private int buttonTextRes; private int buttonTextRes;
private EventListener buttonListener; private EventListener buttonListener;
@ -174,6 +182,11 @@ public class Megaphone {
return this; return this;
} }
public @NonNull Builder setLottie(@RawRes int lottieRes) {
this.lottieRes = lottieRes;
return this;
}
public @NonNull Builder setImageRequest(@Nullable GlideRequest<Drawable> imageRequest) { public @NonNull Builder setImageRequest(@Nullable GlideRequest<Drawable> imageRequest) {
this.imageRequest = imageRequest; this.imageRequest = imageRequest;
return this; return this;

Wyświetl plik

@ -103,6 +103,7 @@ public final class Megaphones {
put(Event.GROUP_CALLING, shouldShowGroupCallingMegaphone() ? ALWAYS : NEVER); put(Event.GROUP_CALLING, shouldShowGroupCallingMegaphone() ? ALWAYS : NEVER);
put(Event.ONBOARDING, shouldShowOnboardingMegaphone(context) ? ALWAYS : NEVER); put(Event.ONBOARDING, shouldShowOnboardingMegaphone(context) ? ALWAYS : NEVER);
put(Event.NOTIFICATIONS, shouldShowNotificationsMegaphone(context) ? RecurringSchedule.every(TimeUnit.DAYS.toMillis(30)) : NEVER); put(Event.NOTIFICATIONS, shouldShowNotificationsMegaphone(context) ? RecurringSchedule.every(TimeUnit.DAYS.toMillis(30)) : NEVER);
put(Event.CHAT_COLORS, ALWAYS);
}}; }};
} }
@ -130,6 +131,8 @@ public final class Megaphones {
return buildOnboardingMegaphone(); return buildOnboardingMegaphone();
case NOTIFICATIONS: case NOTIFICATIONS:
return buildNotificationsMegaphone(context); return buildNotificationsMegaphone(context);
case CHAT_COLORS:
return buildChatColorsMegaphone();
default: default:
throw new IllegalArgumentException("Event not handled!"); throw new IllegalArgumentException("Event not handled!");
} }
@ -301,6 +304,14 @@ public final class Megaphones {
.build(); .build();
} }
private static @NonNull Megaphone buildChatColorsMegaphone() {
return new Megaphone.Builder(Event.CHAT_COLORS, Megaphone.Style.POPUP)
.setTitle(R.string.ChatColorsMegaphone__new_chat_colors)
.setBody(R.string.ChatColorsMegaphone__we_switched_up_chat_colors)
.setLottie(R.raw.color_bubble_64)
.build();
}
private static boolean shouldShowMessageRequestsMegaphone() { private static boolean shouldShowMessageRequestsMegaphone() {
return Recipient.self().getProfileName() == ProfileName.EMPTY; return Recipient.self().getProfileName() == ProfileName.EMPTY;
} }
@ -355,7 +366,8 @@ public final class Megaphones {
DONATE("donate"), DONATE("donate"),
GROUP_CALLING("group_calling"), GROUP_CALLING("group_calling"),
ONBOARDING("onboarding"), ONBOARDING("onboarding"),
NOTIFICATIONS("notifications"); NOTIFICATIONS("notifications"),
CHAT_COLORS("chat_colors");
private final String key; private final String key;

Wyświetl plik

@ -19,10 +19,12 @@ import androidx.recyclerview.widget.RecyclerView;
import org.signal.core.util.logging.Log; import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.InviteActivity; import org.thoughtcrime.securesms.InviteActivity;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity;
import org.thoughtcrime.securesms.conversationlist.ConversationListFragment; import org.thoughtcrime.securesms.conversationlist.ConversationListFragment;
import org.thoughtcrime.securesms.groups.ui.creategroup.CreateGroupActivity; import org.thoughtcrime.securesms.groups.ui.creategroup.CreateGroupActivity;
import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.util.SmsUtil; import org.thoughtcrime.securesms.util.SmsUtil;
import org.thoughtcrime.securesms.wallpaper.ChatWallpaperActivity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -60,9 +62,10 @@ public class OnboardingMegaphoneView extends FrameLayout {
private static class CardAdapter extends RecyclerView.Adapter<CardViewHolder> implements ActionClickListener { private static class CardAdapter extends RecyclerView.Adapter<CardViewHolder> implements ActionClickListener {
private static final int TYPE_GROUP = 0; private static final int TYPE_GROUP = 0;
private static final int TYPE_INVITE = 1; private static final int TYPE_INVITE = 1;
private static final int TYPE_SMS = 2; private static final int TYPE_SMS = 2;
private static final int TYPE_APPEARANCE = 3;
private final Context context; private final Context context;
private final MegaphoneActionController controller; private final MegaphoneActionController controller;
@ -95,10 +98,11 @@ public class OnboardingMegaphoneView extends FrameLayout {
public @NonNull CardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public @NonNull CardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.onboarding_megaphone_list_item, parent, false); View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.onboarding_megaphone_list_item, parent, false);
switch (viewType) { switch (viewType) {
case TYPE_GROUP: return new GroupCardViewHolder(view); case TYPE_GROUP: return new GroupCardViewHolder(view);
case TYPE_INVITE: return new InviteCardViewHolder(view); case TYPE_INVITE: return new InviteCardViewHolder(view);
case TYPE_SMS: return new SmsCardViewHolder(view); case TYPE_SMS: return new SmsCardViewHolder(view);
default: throw new IllegalStateException("Invalid viewType! " + viewType); case TYPE_APPEARANCE: return new AppearanceCardViewHolder(view);
default: throw new IllegalStateException("Invalid viewType! " + viewType);
} }
} }
@ -138,6 +142,10 @@ public class OnboardingMegaphoneView extends FrameLayout {
data.add(TYPE_SMS); data.add(TYPE_SMS);
} }
if (SignalStore.onboarding().shouldShowAppearance()) {
data.add(TYPE_APPEARANCE);
}
return data; return data;
} }
} }
@ -259,4 +267,32 @@ public class OnboardingMegaphoneView extends FrameLayout {
SignalStore.onboarding().setShowSms(false); SignalStore.onboarding().setShowSms(false);
} }
} }
private static class AppearanceCardViewHolder extends CardViewHolder {
public AppearanceCardViewHolder(@NonNull View itemView) {
super(itemView);
}
@Override
int getButtonStringRes() {
return R.string.Megaphones_appearance;
}
@Override
int getImageRes() {
return R.drawable.ic_signal_appearance;
}
@Override
void onActionClicked(@NonNull MegaphoneActionController controller) {
controller.onMegaphoneNavigationRequested(ChatWallpaperActivity.createIntent(controller.getMegaphoneActivity()));
SignalStore.onboarding().setShowAppearance(false);
}
@Override
void onCloseClicked() {
SignalStore.onboarding().setShowAppearance(false);
}
}
} }

Wyświetl plik

@ -10,14 +10,16 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.airbnb.lottie.LottieAnimationView;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
public class PopupMegaphoneView extends FrameLayout { public class PopupMegaphoneView extends FrameLayout {
private ImageView image; private LottieAnimationView image;
private TextView titleText; private TextView titleText;
private TextView bodyText; private TextView bodyText;
private View xButton; private View xButton;
private Megaphone megaphone; private Megaphone megaphone;
private MegaphoneActionController megaphoneListener; private MegaphoneActionController megaphoneListener;
@ -57,6 +59,9 @@ public class PopupMegaphoneView extends FrameLayout {
if (megaphone.getImageRequest() != null) { if (megaphone.getImageRequest() != null) {
image.setVisibility(VISIBLE); image.setVisibility(VISIBLE);
megaphone.getImageRequest().into(image); megaphone.getImageRequest().into(image);
} else if (megaphone.getLottieRes() != 0) {
image.setVisibility(VISIBLE);
image.setAnimation(megaphone.getLottieRes());
} else { } else {
image.setVisibility(GONE); image.setVisibility(GONE);
} }

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="44dp"
android:height="44dp"
android:viewportWidth="44"
android:viewportHeight="44">
<group>
<clip-path
android:pathData="M0,0h44v44h-44z"/>
<path
android:pathData="M-0.0001,21.9853L8.4852,30.4706V25.9345C10.1857,25.7121 16.0929,25 22,25C27.8734,25 33.7468,25.704 35.4852,25.9306V30.5L43.9705,22.0147L35.4852,13.5294V18.0585C33.5652,18.2725 26.6913,19 22,19C17.2843,19 10.3633,18.2649 8.4852,18.0552V13.5L-0.0001,21.9853Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
</group>
</vector>

Wyświetl plik

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="12dp"
android:paddingBottom="12dp">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tint="@color/signal_accent_primary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/tooltip_arrow_up" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/bubble"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_max="295dp"
app:srcCompat="@drawable/chat_wallpaper_preview_bubble_8"
app:tint="@color/signal_accent_primary" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="12dp"
android:layout_marginTop="7dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="7dp"
android:scaleType="centerInside"
app:layout_constraintBottom_toBottomOf="@id/bubble"
app:layout_constraintEnd_toStartOf="@id/text"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="@id/bubble"
app:layout_constraintTop_toTopOf="@id/bubble"
app:srcCompat="@drawable/ic_union" />
<TextView
android:id="@+id/text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="7dp"
android:layout_marginEnd="12dp"
android:text="@string/CustomChatColorCreatorFragment__drag_to_change_the_direction_of_the_gradient"
android:textAppearance="@style/Signal.Text.Body"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="@id/bubble"
app:layout_constraintStart_toEndOf="@id/icon"
app:layout_constraintTop_toTopOf="@id/bubble" />
</androidx.constraintlayout.widget.ConstraintLayout>

Wyświetl plik

@ -25,7 +25,7 @@
android:clickable="true" android:clickable="true"
android:paddingBottom="16dp"> android:paddingBottom="16dp">
<ImageView <com.airbnb.lottie.LottieAnimationView
android:id="@+id/popup_megaphone_image" android:id="@+id/popup_megaphone_image"
android:layout_width="64dp" android:layout_width="64dp"
android:layout_height="64dp" android:layout_height="64dp"

Wyświetl plik

@ -0,0 +1 @@
{"v":"5.5.10","fr":60,"ip":0,"op":900,"w":64,"h":64,"nm":"Comp 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[32,32,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[64,64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0.267,0.173,0.929,0.5,0.616,0.253,0.653,1,0.965,0.333,0.376]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[0,0.027,0.451,0.263,0.5,0.496,0.392,0.32,1,0.965,0.333,0.376]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":180,"s":[0,0.027,0.451,0.263,0.5,0.106,0.514,0.357,1,0.184,0.576,0.451]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":270,"s":[0,0.925,0.075,0.867,0.5,0.555,0.325,0.659,1,0.184,0.576,0.451]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":360,"s":[0,0.925,0.075,0.867,0.5,0.516,0.143,0.822,1,0.106,0.212,0.776]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":450,"s":[0,0.173,0.4,0.627,0.5,0.139,0.306,0.702,1,0.106,0.212,0.776]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":540,"s":[0,0.173,0.4,0.627,0.5,0.229,0.48,0.729,1,0.286,0.561,0.831]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":630,"s":[0,0.471,0.471,0.569,0.5,0.378,0.516,0.7,1,0.286,0.561,0.831]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":720,"s":[0,0.471,0.471,0.569,0.5,0.322,0.322,0.398,1,0.173,0.173,0.227]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":810,"s":[0,0.267,0.173,0.929,0.5,0.22,0.173,0.578,1,0.173,0.173,0.227]},{"t":900,"s":[0,0.267,0.173,0.929,0.5,0.616,0.253,0.653,1,0.965,0.333,0.376]}],"ix":9}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-32,32],"to":[5.333,0],"ti":[-10.667,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":225,"s":[0,32],"to":[10.667,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":450,"s":[32,32],"to":[0,0],"ti":[10.667,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":675,"s":[0,32],"to":[-10.667,0],"ti":[5.333,0]},{"t":900,"s":[-32,32]}],"ix":5},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[32,-32],"to":[-5.333,0],"ti":[10.667,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":225,"s":[0,-32],"to":[-10.667,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":450,"s":[-32,-32],"to":[0,0],"ti":[-10.667,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":675,"s":[0,-32],"to":[10.667,0],"ti":[-5.333,0]},{"t":900,"s":[32,-32]}],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.218,0.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0}],"markers":[]}

Wyświetl plik

@ -977,6 +977,7 @@
<string name="Megaphones_new_group">New group</string> <string name="Megaphones_new_group">New group</string>
<string name="Megaphones_invite_friends">Invite friends</string> <string name="Megaphones_invite_friends">Invite friends</string>
<string name="Megaphones_use_sms">Use SMS</string> <string name="Megaphones_use_sms">Use SMS</string>
<string name="Megaphones_appearance">Appearance</string>
<!-- NotificationBarManager --> <!-- NotificationBarManager -->
<string name="NotificationBarManager_signal_call_in_progress">Signal call in progress</string> <string name="NotificationBarManager_signal_call_in_progress">Signal call in progress</string>
@ -3507,6 +3508,10 @@
<string name="EditReactionsFragment__tap_to_replace_an_emoji">Tap to replace an emoji</string> <string name="EditReactionsFragment__tap_to_replace_an_emoji">Tap to replace an emoji</string>
<string name="EditReactionsFragment__reset">Reset</string> <string name="EditReactionsFragment__reset">Reset</string>
<string name="EditReactionsFragment_save">Save</string> <string name="EditReactionsFragment_save">Save</string>
<string name="ChatColorSelectionFragment__auto_matches_the_color_to_the_wallpaper">Auto matches the color to the wallpaper</string>
<string name="CustomChatColorCreatorFragment__drag_to_change_the_direction_of_the_gradient">Drag to change the direction of the gradient</string>
<string name="ChatColorsMegaphone__new_chat_colors">New Chat Colors</string>
<string name="ChatColorsMegaphone__we_switched_up_chat_colors">We switched up chat colors to give you more options and make chats easier to read.</string>
<!-- EOF --> <!-- EOF -->