kopia lustrzana https://github.com/ryukoposting/Signal-Android
Add Chat Colors onboarding.
rodzic
1eae360470
commit
fb817e0c3b
|
@ -1,11 +1,15 @@
|
|||
package org.thoughtcrime.securesms.conversation.colors.ui
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.view.View
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import org.thoughtcrime.securesms.R
|
||||
import org.thoughtcrime.securesms.components.TooltipPopup
|
||||
import org.thoughtcrime.securesms.conversation.colors.ChatColors
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||
import org.thoughtcrime.securesms.util.MappingAdapter
|
||||
import org.thoughtcrime.securesms.util.MappingViewHolder
|
||||
import org.thoughtcrime.securesms.util.ViewUtil
|
||||
|
@ -83,6 +87,15 @@ class ChatColorSelectionAdapter(
|
|||
|
||||
val mask = model.chatColors.asCircle()
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,8 +11,11 @@ import android.graphics.PointF
|
|||
import android.graphics.RectF
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.graphics.drawable.GradientDrawable
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.PopupWindow
|
||||
import android.widget.ScrollView
|
||||
import android.widget.SeekBar
|
||||
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.ui.ChatColorPreviewView
|
||||
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.ViewUtil
|
||||
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 {
|
||||
|
|
|
@ -9,11 +9,26 @@ internal class ChatColorsValues internal constructor(store: KeyValueStore) : Sig
|
|||
companion object {
|
||||
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_AUTO_TOOLTIP = "chat_colors.auto.tooltip"
|
||||
private const val KEY_CHAT_COLORS_GRADIENT_TOOLTIP = "chat_colors.gradient.tooltip"
|
||||
}
|
||||
|
||||
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
|
||||
@JvmName("hasChatColors")
|
||||
|
|
|
@ -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_INVITE_FRIENDS = "onboarding.invite_friends";
|
||||
private static final String SHOW_SMS = "onboarding.sms";
|
||||
private static final String SHOW_APPEARANCE = "onboarding.appearance";
|
||||
|
||||
OnboardingValues(@NonNull KeyValueStore store) {
|
||||
super(store);
|
||||
|
@ -25,6 +26,7 @@ public final class OnboardingValues extends SignalStoreValues {
|
|||
putBoolean(SHOW_NEW_GROUP, true);
|
||||
putBoolean(SHOW_INVITE_FRIENDS, true);
|
||||
putBoolean(SHOW_SMS, true);
|
||||
putBoolean(SHOW_APPEARANCE, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -36,12 +38,14 @@ public final class OnboardingValues extends SignalStoreValues {
|
|||
setShowNewGroup(false);
|
||||
setShowInviteFriends(false);
|
||||
setShowSms(false);
|
||||
setShowAppearance(false);
|
||||
}
|
||||
|
||||
public boolean hasOnboarding(@NonNull Context context) {
|
||||
return shouldShowNewGroup() ||
|
||||
shouldShowInviteFriends() ||
|
||||
shouldShowSms(context);
|
||||
shouldShowSms(context) ||
|
||||
shouldShowAppearance();
|
||||
}
|
||||
|
||||
public void setShowNewGroup(boolean value) {
|
||||
|
@ -67,4 +71,12 @@ public final class OnboardingValues extends SignalStoreValues {
|
|||
public boolean shouldShowSms(@NonNull Context context) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable;
|
|||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RawRes;
|
||||
import androidx.annotation.StringRes;
|
||||
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
|
@ -25,6 +26,7 @@ public class Megaphone {
|
|||
private final int titleRes;
|
||||
private final int bodyRes;
|
||||
private final int imageRes;
|
||||
private final int lottieRes;
|
||||
private final GlideRequest<Drawable> imageRequest;
|
||||
private final int buttonTextRes;
|
||||
private final EventListener buttonListener;
|
||||
|
@ -41,6 +43,7 @@ public class Megaphone {
|
|||
this.titleRes = builder.titleRes;
|
||||
this.bodyRes = builder.bodyRes;
|
||||
this.imageRes = builder.imageRes;
|
||||
this.lottieRes = builder.lottieRes;
|
||||
this.imageRequest = builder.imageRequest;
|
||||
this.buttonTextRes = builder.buttonTextRes;
|
||||
this.buttonListener = builder.buttonListener;
|
||||
|
@ -74,6 +77,10 @@ public class Megaphone {
|
|||
return bodyRes;
|
||||
}
|
||||
|
||||
public @RawRes int getLottieRes() {
|
||||
return lottieRes;
|
||||
}
|
||||
|
||||
public @DrawableRes int getImageRes() {
|
||||
return imageRes;
|
||||
}
|
||||
|
@ -124,6 +131,7 @@ public class Megaphone {
|
|||
private int titleRes;
|
||||
private int bodyRes;
|
||||
private int imageRes;
|
||||
private int lottieRes;
|
||||
private GlideRequest<Drawable> imageRequest;
|
||||
private int buttonTextRes;
|
||||
private EventListener buttonListener;
|
||||
|
@ -174,6 +182,11 @@ public class Megaphone {
|
|||
return this;
|
||||
}
|
||||
|
||||
public @NonNull Builder setLottie(@RawRes int lottieRes) {
|
||||
this.lottieRes = lottieRes;
|
||||
return this;
|
||||
}
|
||||
|
||||
public @NonNull Builder setImageRequest(@Nullable GlideRequest<Drawable> imageRequest) {
|
||||
this.imageRequest = imageRequest;
|
||||
return this;
|
||||
|
|
|
@ -103,6 +103,7 @@ public final class Megaphones {
|
|||
put(Event.GROUP_CALLING, shouldShowGroupCallingMegaphone() ? ALWAYS : NEVER);
|
||||
put(Event.ONBOARDING, shouldShowOnboardingMegaphone(context) ? ALWAYS : 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();
|
||||
case NOTIFICATIONS:
|
||||
return buildNotificationsMegaphone(context);
|
||||
case CHAT_COLORS:
|
||||
return buildChatColorsMegaphone();
|
||||
default:
|
||||
throw new IllegalArgumentException("Event not handled!");
|
||||
}
|
||||
|
@ -301,6 +304,14 @@ public final class Megaphones {
|
|||
.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() {
|
||||
return Recipient.self().getProfileName() == ProfileName.EMPTY;
|
||||
}
|
||||
|
@ -355,7 +366,8 @@ public final class Megaphones {
|
|||
DONATE("donate"),
|
||||
GROUP_CALLING("group_calling"),
|
||||
ONBOARDING("onboarding"),
|
||||
NOTIFICATIONS("notifications");
|
||||
NOTIFICATIONS("notifications"),
|
||||
CHAT_COLORS("chat_colors");
|
||||
|
||||
private final String key;
|
||||
|
||||
|
|
|
@ -19,10 +19,12 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||
import org.signal.core.util.logging.Log;
|
||||
import org.thoughtcrime.securesms.InviteActivity;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity;
|
||||
import org.thoughtcrime.securesms.conversationlist.ConversationListFragment;
|
||||
import org.thoughtcrime.securesms.groups.ui.creategroup.CreateGroupActivity;
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
||||
import org.thoughtcrime.securesms.util.SmsUtil;
|
||||
import org.thoughtcrime.securesms.wallpaper.ChatWallpaperActivity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
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 final int TYPE_GROUP = 0;
|
||||
private static final int TYPE_INVITE = 1;
|
||||
private static final int TYPE_SMS = 2;
|
||||
private static final int TYPE_GROUP = 0;
|
||||
private static final int TYPE_INVITE = 1;
|
||||
private static final int TYPE_SMS = 2;
|
||||
private static final int TYPE_APPEARANCE = 3;
|
||||
|
||||
private final Context context;
|
||||
private final MegaphoneActionController controller;
|
||||
|
@ -95,10 +98,11 @@ public class OnboardingMegaphoneView extends FrameLayout {
|
|||
public @NonNull CardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.onboarding_megaphone_list_item, parent, false);
|
||||
switch (viewType) {
|
||||
case TYPE_GROUP: return new GroupCardViewHolder(view);
|
||||
case TYPE_INVITE: return new InviteCardViewHolder(view);
|
||||
case TYPE_SMS: return new SmsCardViewHolder(view);
|
||||
default: throw new IllegalStateException("Invalid viewType! " + viewType);
|
||||
case TYPE_GROUP: return new GroupCardViewHolder(view);
|
||||
case TYPE_INVITE: return new InviteCardViewHolder(view);
|
||||
case TYPE_SMS: return new SmsCardViewHolder(view);
|
||||
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);
|
||||
}
|
||||
|
||||
if (SignalStore.onboarding().shouldShowAppearance()) {
|
||||
data.add(TYPE_APPEARANCE);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
@ -259,4 +267,32 @@ public class OnboardingMegaphoneView extends FrameLayout {
|
|||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,14 +10,16 @@ import android.widget.TextView;
|
|||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.airbnb.lottie.LottieAnimationView;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
|
||||
public class PopupMegaphoneView extends FrameLayout {
|
||||
|
||||
private ImageView image;
|
||||
private TextView titleText;
|
||||
private TextView bodyText;
|
||||
private View xButton;
|
||||
private LottieAnimationView image;
|
||||
private TextView titleText;
|
||||
private TextView bodyText;
|
||||
private View xButton;
|
||||
|
||||
private Megaphone megaphone;
|
||||
private MegaphoneActionController megaphoneListener;
|
||||
|
@ -57,6 +59,9 @@ public class PopupMegaphoneView extends FrameLayout {
|
|||
if (megaphone.getImageRequest() != null) {
|
||||
image.setVisibility(VISIBLE);
|
||||
megaphone.getImageRequest().into(image);
|
||||
} else if (megaphone.getLottieRes() != 0) {
|
||||
image.setVisibility(VISIBLE);
|
||||
image.setAnimation(megaphone.getLottieRes());
|
||||
} else {
|
||||
image.setVisibility(GONE);
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -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>
|
|
@ -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>
|
|
@ -25,7 +25,7 @@
|
|||
android:clickable="true"
|
||||
android:paddingBottom="16dp">
|
||||
|
||||
<ImageView
|
||||
<com.airbnb.lottie.LottieAnimationView
|
||||
android:id="@+id/popup_megaphone_image"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="64dp"
|
||||
|
|
|
@ -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":[]}
|
|
@ -977,6 +977,7 @@
|
|||
<string name="Megaphones_new_group">New group</string>
|
||||
<string name="Megaphones_invite_friends">Invite friends</string>
|
||||
<string name="Megaphones_use_sms">Use SMS</string>
|
||||
<string name="Megaphones_appearance">Appearance</string>
|
||||
|
||||
<!-- NotificationBarManager -->
|
||||
<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__reset">Reset</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 -->
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue