Commit 2f23635e authored by DrKLO's avatar DrKLO

UI update

parent b2ad802b
......@@ -9,7 +9,9 @@
package org.telegram.android;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Point;
......@@ -24,8 +26,10 @@ import android.view.inputmethod.InputMethodManager;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.R;
import org.telegram.messenger.TLRPC;
import org.telegram.messenger.UserConfig;
import org.telegram.ui.ApplicationLoader;
import org.telegram.ui.Views.NumberPicker;
import java.io.File;
import java.util.Hashtable;
......@@ -240,6 +244,10 @@ public class AndroidUtilities {
return (int)Math.ceil(density * value);
}
public static float dpf2(float value) {
return density * value;
}
public static void checkDisplaySize() {
try {
WindowManager manager = (WindowManager)ApplicationLoader.applicationContext.getSystemService(Context.WINDOW_SERVICE);
......@@ -388,4 +396,91 @@ public class AndroidUtilities {
}
return photoSize;
}
public static String formatTTLString(int ttl) {
if (ttl < 60) {
return LocaleController.formatPluralString("Seconds", ttl);
} else if (ttl < 60 * 60) {
return LocaleController.formatPluralString("Minutes", ttl / 60);
} else if (ttl < 60 * 60 * 24) {
return LocaleController.formatPluralString("Hours", ttl / 60 / 60);
} else if (ttl < 60 * 60 * 24 * 7) {
return LocaleController.formatPluralString("Days", ttl / 60 / 60 / 24);
} else {
int days = ttl / 60 / 60 / 24;
if (ttl % 7 == 0) {
return LocaleController.formatPluralString("Weeks", days / 7);
} else {
return String.format("%s %s", LocaleController.formatPluralString("Weeks", days / 7), LocaleController.formatPluralString("Days", days % 7));
}
}
}
public static AlertDialog.Builder buildTTLAlert(Context context, final TLRPC.EncryptedChat encryptedChat) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(LocaleController.getString("MessageLifetime", R.string.MessageLifetime));
final NumberPicker numberPicker = new NumberPicker(context);
numberPicker.setMinValue(0);
numberPicker.setMaxValue(20);
if (encryptedChat.ttl >= 0 && encryptedChat.ttl < 16) {
numberPicker.setValue(encryptedChat.ttl);
} else if (encryptedChat.ttl == 30) {
numberPicker.setValue(16);
} else if (encryptedChat.ttl == 60) {
numberPicker.setValue(17);
} else if (encryptedChat.ttl == 60 * 60) {
numberPicker.setValue(18);
} else if (encryptedChat.ttl == 60 * 60 * 24) {
numberPicker.setValue(19);
} else if (encryptedChat.ttl == 60 * 60 * 24 * 7) {
numberPicker.setValue(20);
}
numberPicker.setFormatter(new NumberPicker.Formatter() {
@Override
public String format(int value) {
if (value == 0) {
return LocaleController.getString("ShortMessageLifetimeForever", R.string.ShortMessageLifetimeForever);
} else if (value >= 1 && value < 16) {
return AndroidUtilities.formatTTLString(value);
} else if (value == 16) {
return AndroidUtilities.formatTTLString(30);
} else if (value == 17) {
return AndroidUtilities.formatTTLString(60);
} else if (value == 18) {
return AndroidUtilities.formatTTLString(60 * 60);
} else if (value == 19) {
return AndroidUtilities.formatTTLString(60 * 60 * 24);
} else if (value == 20) {
return AndroidUtilities.formatTTLString(60 * 60 * 24 * 7);
}
return "";
}
});
builder.setView(numberPicker);
builder.setNegativeButton(LocaleController.getString("Done", R.string.Done), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int oldValue = encryptedChat.ttl;
which = numberPicker.getValue();
if (which >= 0 && which < 16) {
encryptedChat.ttl = which;
} else if (which == 16) {
encryptedChat.ttl = 30;
} else if (which == 17) {
encryptedChat.ttl = 60;
} else if (which == 18) {
encryptedChat.ttl = 60 * 60;
} else if (which == 19) {
encryptedChat.ttl = 60 * 60 * 24;
} else if (which == 20) {
encryptedChat.ttl = 60 * 60 * 24 * 7;
}
if (oldValue != encryptedChat.ttl) {
SendMessagesHelper.getInstance().sendTTLMessage(encryptedChat);
MessagesStorage.getInstance().updateEncryptedChatTTL(encryptedChat);
}
}
});
return builder;
}
}
......@@ -178,29 +178,13 @@ public class MessageObject {
}
} else if (message.action instanceof TLRPC.TL_messageActionTTLChange) {
if (message.action.ttl != 0) {
String timeString;
if (message.action.ttl == 2) {
timeString = LocaleController.getString("MessageLifetime2s", R.string.MessageLifetime2s);
} else if (message.action.ttl == 5) {
timeString = LocaleController.getString("MessageLifetime5s", R.string.MessageLifetime5s);
} else if (message.action.ttl == 60) {
timeString = LocaleController.getString("MessageLifetime1m", R.string.MessageLifetime1m);
} else if (message.action.ttl == 60 * 60) {
timeString = LocaleController.getString("MessageLifetime1h", R.string.MessageLifetime1h);
} else if (message.action.ttl == 60 * 60 * 24) {
timeString = LocaleController.getString("MessageLifetime1d", R.string.MessageLifetime1d);
} else if (message.action.ttl == 60 * 60 * 24 * 7) {
timeString = LocaleController.getString("MessageLifetime1w", R.string.MessageLifetime1w);
} else {
timeString = String.format("%d", message.action.ttl);
}
if (isFromMe()) {
messageText = LocaleController.formatString("MessageLifetimeChangedOutgoing", R.string.MessageLifetimeChangedOutgoing, timeString);
messageText = LocaleController.formatString("MessageLifetimeChangedOutgoing", R.string.MessageLifetimeChangedOutgoing, AndroidUtilities.formatTTLString(message.action.ttl));
} else {
if (fromUser != null) {
messageText = LocaleController.formatString("MessageLifetimeChanged", R.string.MessageLifetimeChanged, fromUser.first_name, timeString);
messageText = LocaleController.formatString("MessageLifetimeChanged", R.string.MessageLifetimeChanged, fromUser.first_name, AndroidUtilities.formatTTLString(message.action.ttl));
} else {
messageText = LocaleController.formatString("MessageLifetimeChanged", R.string.MessageLifetimeChanged, "", timeString);
messageText = LocaleController.formatString("MessageLifetimeChanged", R.string.MessageLifetimeChanged, "", AndroidUtilities.formatTTLString(message.action.ttl));
}
}
} else {
......
......@@ -1700,7 +1700,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter
random_ids.add(random_id);
SendMessagesHelper.getInstance().sendMessagesReadMessage(random_ids, chat);
if (chat.ttl > 0) {
MessagesStorage.getInstance().createTaskForSecretChat(chat.id, 0, ConnectionsManager.getInstance().getCurrentTime(), 0, random_ids);
int time = ConnectionsManager.getInstance().getCurrentTime();
MessagesStorage.getInstance().createTaskForSecretChat(chat.id, time, time, 0, random_ids);
}
//TODO resend request
}
......@@ -3707,12 +3708,13 @@ public class MessagesController implements NotificationCenter.NotificationCenter
TLRPC.TL_messageService newMessage = new TLRPC.TL_messageService();
if (serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL) {
newMessage.action = new TLRPC.TL_messageActionTTLChange();
if (serviceMessage.action.ttl_seconds < 0 || serviceMessage.action.ttl_seconds > 60 * 60 * 24 * 365) {
serviceMessage.action.ttl_seconds = 60 * 60 * 24 * 365;
}
newMessage.action.ttl = chat.ttl = serviceMessage.action.ttl_seconds;
} else if (serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionScreenshotMessages) {
newMessage.action = new TLRPC.TL_messageEcryptedAction();
newMessage.action.encryptedAction = serviceMessage.action;
} else {
return null;
}
newMessage.local_id = newMessage.id = UserConfig.getNewMessageId();
UserConfig.saveConfig(false);
......@@ -3761,7 +3763,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
return null;
} else if (serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionReadMessages) {
if (!serviceMessage.action.random_ids.isEmpty()) {
MessagesStorage.getInstance().createTaskForSecretChat(chat.id, 0, message.date, 1, serviceMessage.action.random_ids);
MessagesStorage.getInstance().createTaskForSecretChat(chat.id, ConnectionsManager.getInstance().getCurrentTime(), message.date, 1, serviceMessage.action.random_ids);
}
} else if (serviceMessage.action instanceof TLRPC.TL_decryptedMessageActionNotifyLayer) {
AndroidUtilities.RunOnUIThread(new Runnable() {
......
......@@ -862,7 +862,7 @@ public class MessagesStorage {
}
while (cursor.next()) {
int mid = cursor.intValue(0);
int date = readTime + cursor.intValue(1);
int date = Math.min(readTime, time) + cursor.intValue(1);
minDate = Math.min(minDate, date);
ArrayList<Integer> arr = messages.get(date);
if (arr == null) {
......@@ -2198,8 +2198,8 @@ public class MessagesStorage {
state.bindByteBuffer(2, data2.buffer);
state.bindByteBuffer(3, data3.buffer);
state.bindInteger(4, chat.ttl);
state.bindInteger(5, chat.id);
state.bindInteger(6, chat.layer);
state.bindInteger(5, chat.layer);
state.bindInteger(6, chat.id);
state.step();
buffersStorage.reuseFreeBuffer(data);
buffersStorage.reuseFreeBuffer(data2);
......@@ -2473,8 +2473,10 @@ public class MessagesStorage {
private int getMessageMediaType(TLRPC.Message message) {
if (message instanceof TLRPC.TL_message_secret && message.media instanceof TLRPC.TL_messageMediaPhoto && message.ttl != 0 && message.ttl <= 60) {
return 1;
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto || message.media instanceof TLRPC.TL_messageMediaVideo) {
return 0;
}
return 0;
return -1;
}
private void putMessagesInternal(final ArrayList<TLRPC.Message> messages, final boolean withTransaction, final boolean isBroadcast, final int downloadMask) {
......
......@@ -1542,7 +1542,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
@Override
public void run() {
TLRPC.EncryptedChat chat = MessagesController.getInstance().getEncryptedChat(encryptedChat.id);
sendingNotifyLayer.remove(chat.id);
sendingNotifyLayer.remove((Integer)chat.id);
chat.layer = AndroidUtilities.setMyLayerVersion(chat.layer, CURRENT_SECRET_CHAT_LAYER);
MessagesStorage.getInstance().updateEncryptedChatLayer(chat);
}
......
/*
* This is the source code of Telegram for Android v. 1.7.x.
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013-2014.
*/
package org.telegram.ui.Cells;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import org.telegram.android.AndroidUtilities;
import org.telegram.android.MessageObject;
import org.telegram.android.MessagesController;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.R;
public class ChatActionCell extends BaseCell {
private static Drawable backgroundBlack;
private static Drawable backgroundBlue;
private static TextPaint textPaint;
private StaticLayout textLayout;
private int textWidth = 0;
private int textHeight = 0;
private int textX = 0;
private int textXLeft = 0;
private int textY = 0;
private boolean useBlackBackground = false;
private boolean wasLayout = false;
private MessageObject currentMessageObject;
public ChatActionCell(Context context) {
super(context);
if (backgroundBlack == null) {
backgroundBlack = getResources().getDrawable(R.drawable.system_black);
backgroundBlue = getResources().getDrawable(R.drawable.system_blue);
textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
textPaint.setColor(0xffffffff);
}
textPaint.setTextSize(AndroidUtilities.dp(MessagesController.getInstance().fontSize));
}
public void setMessageObject(MessageObject messageObject) {
if (currentMessageObject == messageObject) {
return;
}
currentMessageObject = messageObject;
int size;
if (AndroidUtilities.isTablet()) {
size = AndroidUtilities.getMinTabletSide();
} else {
size = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y);
}
textLayout = new StaticLayout(currentMessageObject.messageText, textPaint, size - AndroidUtilities.dp(30), Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false);
textHeight = 0;
textWidth = 0;
try {
int linesCount = textLayout.getLineCount();
boolean hasNonRTL = false;
for (int a = 0; a < linesCount; a++) {
float lineWidth = 0;
float lineLeft = 0;
try {
lineWidth = textLayout.getLineWidth(a);
lineLeft = textLayout.getLineLeft(a);
textHeight = (int)Math.max(textHeight, Math.ceil(textLayout.getLineBottom(a)));
} catch (Exception e) {
FileLog.e("tmessages", e);
return;
}
if (lineLeft == 0) {
hasNonRTL = true;
}
textWidth = (int)Math.max(textWidth, Math.ceil(lineWidth));
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
textY = AndroidUtilities.dp(7);
wasLayout = false;
requestLayout();
}
public void setUseBlackBackground(boolean value) {
useBlackBackground = value;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), textHeight + AndroidUtilities.dp(14));
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
if (currentMessageObject == null) {
super.onLayout(changed, left, top, right, bottom);
return;
}
if (!wasLayout || changed) {
textX = (right - left - textWidth) / 2;
textXLeft = (right - left - textLayout.getWidth()) / 2;
wasLayout = true;
}
}
@Override
protected void onDraw(Canvas canvas) {
if (currentMessageObject == null) {
return;
}
if (!wasLayout) {
requestLayout();
return;
}
Drawable backgroundDrawable = null;
if (useBlackBackground) {
backgroundDrawable = backgroundBlack;
} else {
backgroundDrawable = backgroundBlue;
}
backgroundDrawable.setBounds(textX - AndroidUtilities.dp(5), AndroidUtilities.dp(5), textX + textWidth + AndroidUtilities.dp(5), getMeasuredHeight() - AndroidUtilities.dp(5));
backgroundDrawable.draw(canvas);
canvas.save();
canvas.translate(textXLeft, textY);
textLayout.draw(canvas);
canvas.restore();
}
}
......@@ -149,18 +149,6 @@ public class ChatBaseCell extends BaseCell {
public ChatBaseCell(Context context) {
super(context);
init();
avatarImage = new ImageReceiver(this);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
avatarImage.clearImage();
currentPhoto = null;
}
private void init() {
if (backgroundDrawableIn == null) {
backgroundDrawableIn = getResources().getDrawable(R.drawable.msg_in);
backgroundDrawableInSelected = getResources().getDrawable(R.drawable.msg_in_selected);
......@@ -199,6 +187,14 @@ public class ChatBaseCell extends BaseCell {
forwardNamePaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG);
forwardNamePaint.setTextSize(AndroidUtilities.dp(14));
}
avatarImage = new ImageReceiver(this);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
avatarImage.clearImage();
currentPhoto = null;
}
@Override
......@@ -466,7 +462,6 @@ public class ChatBaseCell extends BaseCell {
}
@Override
protected void onDraw(Canvas canvas) {
if (currentMessageObject == null) {
......
......@@ -72,6 +72,7 @@ import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.Utilities;
import org.telegram.ui.Adapters.BaseFragmentAdapter;
import org.telegram.ui.Cells.ChatActionCell;
import org.telegram.ui.Cells.ChatAudioCell;
import org.telegram.ui.Cells.ChatBaseCell;
import org.telegram.ui.Cells.ChatMediaCell;
......@@ -393,6 +394,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
typingDotsDrawable = new TypingDotsDrawable();
typingDotsDrawable.setIsChat(currentChat != null);
if (currentEncryptedChat != null && AndroidUtilities.getMyLayerVersion(currentEncryptedChat.layer) != SendMessagesHelper.CURRENT_SECRET_CHAT_LAYER) {
SendMessagesHelper.getInstance().sendNotifyLayerMessage(currentEncryptedChat);
}
return true;
}
......@@ -801,6 +806,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
if (messageObject == null || !messageObject.isSecretMedia() || !cell.getPhotoImage().isInsideImage(x, y - top)) {
break;
}
File file = FileLoader.getPathToMessage(messageObject.messageOwner);
if (!file.exists()) {
break;
}
startX = x;
startY = y;
openSecretPhotoRunnable = new Runnable() {
......@@ -1113,44 +1122,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
if (getParentActivity() == null) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("MessageLifetime", R.string.MessageLifetime));
builder.setItems(new CharSequence[]{
LocaleController.getString("ShortMessageLifetimeForever", R.string.ShortMessageLifetimeForever),
LocaleController.getString("ShortMessageLifetime2s", R.string.ShortMessageLifetime2s),
LocaleController.getString("ShortMessageLifetime5s", R.string.ShortMessageLifetime5s),
LocaleController.getString("ShortMessageLifetime1m", R.string.ShortMessageLifetime1m),
LocaleController.getString("ShortMessageLifetime1h", R.string.ShortMessageLifetime1h),
LocaleController.getString("ShortMessageLifetime1d", R.string.ShortMessageLifetime1d),
LocaleController.getString("ShortMessageLifetime1w", R.string.ShortMessageLifetime1w)
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int oldValue = currentEncryptedChat.ttl;
if (which == 0) {
currentEncryptedChat.ttl = 0;
} else if (which == 1) {
currentEncryptedChat.ttl = 2;
} else if (which == 2) {
currentEncryptedChat.ttl = 5;
} else if (which == 3) {
currentEncryptedChat.ttl = 60;
} else if (which == 4) {
currentEncryptedChat.ttl = 60 * 60;
} else if (which == 5) {
currentEncryptedChat.ttl = 60 * 60 * 24;
} else if (which == 6) {
currentEncryptedChat.ttl = 60 * 60 * 24 * 7;
}
if (oldValue != currentEncryptedChat.ttl) {
SendMessagesHelper.getInstance().sendTTLMessage(currentEncryptedChat);
MessagesStorage.getInstance().updateEncryptedChat(currentEncryptedChat);
}
}
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
showAlertDialog(builder);
showAlertDialog(AndroidUtilities.buildTTLAlert(getParentActivity(), currentEncryptedChat));
}
});
timerButton.setTime(currentEncryptedChat.ttl);
......@@ -3460,41 +3432,48 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
offset = 0;
}
if (i == 0 && !endReached || !unread_end_reached && i == (messages.size() + 1 - offset)) {
View progressBar = null;
if (view == null) {
LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = li.inflate(R.layout.chat_loading_layout, viewGroup, false);
View progressBar = view.findViewById(R.id.progressLayout);
progressBar = view.findViewById(R.id.progressLayout);
if (isCustomTheme) {
progressBar.setBackgroundResource(R.drawable.system_loader2);
} else {
progressBar.setBackgroundResource(R.drawable.system_loader1);
}
progressBar.setVisibility(loadsCount > 1 ? View.VISIBLE : View.INVISIBLE);
} else {
progressBar = view.findViewById(R.id.progressLayout);
}
progressBar.setVisibility(loadsCount > 1 ? View.VISIBLE : View.INVISIBLE);
return view;
}
}
final MessageObject message = messages.get(messages.size() - i - offset);
int type = message.contentType;
if (view == null) {
LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (type == 0) {
view = new ChatMessageCell(mContext);
} if (type == 1) {
view = new ChatMediaCell(mContext);
} else if (type == 7) {
view = li.inflate(R.layout.chat_action_message_layout, viewGroup, false);
view = new ChatActionCell(mContext);
} else if (type == 8) {
LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = li.inflate(R.layout.chat_action_change_photo_layout, viewGroup, false);
} else if (type == 3) {
LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = li.inflate(R.layout.chat_outgoing_contact_layout, viewGroup, false);
} else if (type == 4) {
LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (currentChat != null) {
view = li.inflate(R.layout.chat_group_incoming_contact_layout, viewGroup, false);
} else {
view = li.inflate(R.layout.chat_incoming_contact_layout, viewGroup, false);
}
} else if (type == 6) {
LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = li.inflate(R.layout.chat_unread_layout, viewGroup, false);
} else if (type == 2) {
view = new ChatAudioCell(mContext);
......@@ -3638,6 +3617,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
if (view instanceof ChatAudioCell && MediaController.getInstance().canDownloadMedia(MediaController.AUTODOWNLOAD_MASK_AUDIO)) {
((ChatAudioCell)view).downloadAudioIfNeed();
}
} else if (view instanceof ChatActionCell) {
((ChatActionCell)view).setMessageObject(message);
((ChatActionCell)view).setUseBlackBackground(isCustomTheme);
} else {
ChatListRowHolderEx holder = (ChatListRowHolderEx)view.getTag();
if (holder == null) {
......
......@@ -60,6 +60,7 @@ public class LoginActivity extends BaseFragment implements SlideView.SlideViewDe
} catch (Exception e) {
FileLog.e("tmessages", e);
}
progressDialog = null;
}
}
......@@ -260,6 +261,7 @@ public class LoginActivity extends BaseFragment implements SlideView.SlideViewDe
} catch (Exception e) {
FileLog.e("tmessages", e);
}
progressDialog = null;
}
public void setPage(int page, boolean animated, Bundle params, boolean back) {
......
......@@ -611,12 +611,14 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
return;
}
try {
int size[] = new int[1];
TLRPC.FileLocation fileLocation = getFileLocation(currentIndex, size);
if (fileLocation == null) {
return;
File f = null;
if (currentMessageObject != null) {
f = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
} else if (currentFileLocation != null) {
f = FileLoader.getPathToAttach(currentFileLocation, avatarsUserId != 0);
}
File f = FileLoader.getPathToAttach(fileLocation, avatarsUserId != 0);
if (f.exists()) {
Intent intent = new Intent(Intent.ACTION_SEND);
if (f.toString().endsWith("mp4")) {
......
......@@ -59,6 +59,7 @@ import org.telegram.ui.Views.ActionBar.ActionBarLayer;
import org.telegram.ui.Views.AvatarUpdater;
import org.telegram.ui.Views.BackupImageView;
import org.telegram.ui.Views.ActionBar.BaseFragment;
import org.telegram.ui.Views.NumberPicker;
import java.io.File;
import java.util.ArrayList;
......@@ -245,39 +246,24 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
}
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("TextSize", R.string.TextSize));
builder.setItems(new CharSequence[] {
String.format("%d", 12),
String.format("%d", 13),
String.format("%d", 14),
String.format("%d", 15),
String.format("%d", 16),
String.format("%d", 17),
String.format("%d", 18),
String.format("%d", 19),
String.format("%d", 20),
String.format("%d", 21),
String.format("%d", 22),
String.format("%d", 23),
String.format("%d", 24),
String.format("%d", 25),
String.format("%d", 26),
String.format("%d", 27),
String.format("%d", 28),
String.format("%d", 29),
String.format("%d", 30)}, new DialogInterface.OnClickListener() {
final NumberPicker numberPicker = new NumberPicker(getParentActivity());
numberPicker.setMinValue(12);
numberPicker.setMaxValue(30);
numberPicker.setValue(MessagesController.getInstance().fontSize);
builder.setView(numberPicker);
builder.setNegativeButton(LocaleController.getString("Done", R.string.Done), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("fons_size", 12 + which);
MessagesController.getInstance().fontSize = 12 + which;
editor.putInt("fons_size", numberPicker.getValue());
MessagesController.getInstance().fontSize = numberPicker.getValue();
editor.commit();
if (listView != null) {
listView.invalidateViews();
}
}
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
showAlertDialog(builder);
} else if (i == enableAnimationsRow) {
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
......
......@@ -31,7 +31,6 @@ import org.telegram.messenger.TLRPC;
import org.telegram.android.ContactsController;
import org.telegram.messenger.FileLog;
import org.telegram.android.MessagesController;
import org.telegram.android.MessagesStorage;
import org.telegram.android.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.android.MessageObject;
......@@ -256,47 +255,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
if (getParentActivity() == null) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("MessageLifetime", R.string.MessageLifetime));
builder.setItems(new CharSequence[]{
LocaleController.getString("ShortMessageLifetimeForever", R.string.ShortMessageLifetimeForever),
LocaleController.getString("ShortMessageLifetime2s", R.string.ShortMessageLifetime2s),
LocaleController.getString("ShortMessageLifetime5s", R.string.ShortMessageLifetime5s),
LocaleController.getString("ShortMessageLifetime1m", R.string.ShortMessageLifetime1m),
LocaleController.getString("ShortMessageLifetime1h", R.string.ShortMessageLifetime1h),
LocaleController.getString("ShortMessageLifetime1d", R.string.ShortMessageLifetime1d),
LocaleController.getString("ShortMessageLifetime1w", R.string.ShortMessageLifetime1w)
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int oldValue = currentEncryptedChat.ttl;
if (which == 0) {
currentEncryptedChat.ttl = 0;
} else if (which == 1) {
currentEncryptedChat.ttl = 2;
} else if (which == 2) {
currentEncryptedChat.ttl = 5;
} else if (which == 3) {
currentEncryptedChat.ttl = 60;
} else if (which == 4) {
currentEncryptedChat.ttl = 60 * 60;
} else if (which == 5) {
currentEncryptedChat.ttl = 60 * 60 * 24;
} else if (which == 6) {
currentEncryptedChat.ttl = 60 * 60 * 24 * 7;
}
if (oldValue != currentEncryptedChat.ttl) {
if (listView != null) {
listView.invalidateViews();
}
SendMessagesHelper.getInstance().sendTTLMessage(currentEncryptedChat);
MessagesStorage.getInstance().updateEncryptedChat(currentEncryptedChat);
}
}
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
showAlertDialog(builder);
showAlertDialog(AndroidUtilities.buildTTLAlert(getParentActivity(), currentEncryptedChat));
} else if (i == settingsNotificationsRow) {
Bundle args = new Bundle();
args.putLong("dialog_id", dialog_id == 0 ? user_id : dialog_id);
......@@ -454,6 +413,13 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
}
}
@Override
protected void onDialogDismiss() {
if (listView != null) {
listView.invalidateViews();
}
}
@Override
public void didSelectDialog(MessagesActivity messageFragment, long dialog_id, boolean param) {
if (dialog_id != 0) {
......@@ -670,20 +636,8 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
divider.setVisibility(View.VISIBLE);
if (encryptedChat.ttl == 0) {
detailTextView.setText(LocaleController.getString("ShortMessageLifetimeForever", R.string.ShortMessageLifetimeForever));
} else if (encryptedChat.ttl == 2) {
detailTextView.setText(LocaleController.getString("ShortMessageLifetime2s", R.string.ShortMessageLifetime2s));
} else if (encryptedChat.ttl == 5) {
detailTextView.setText(LocaleController.getString("ShortMessageLifetime5s", R.string.ShortMessageLifetime5s));
} else if (encryptedChat.ttl == 60) {
detailTextView.setText(LocaleController.getString("ShortMessageLifetime1m", R.string.ShortMessageLifetime1m));
} else if (encryptedChat.ttl == 60 * 60) {
detailTextView.setText(LocaleController.getString("ShortMessageLifetime1h", R.string.ShortMessageLifetime1h));
} else if (encryptedChat.ttl == 60 * 60 * 24) {
detailTextView.setText(LocaleController.getString("ShortMessageLifetime1d", R.string.ShortMessageLifetime1d));
} else if (encryptedChat.ttl == 60 * 60 * 24 * 7) {
detailTextView.setText(LocaleController.getString("ShortMessageLifetime1w", R.string.ShortMessageLifetime1w));
} else {
detailTextView.setText(String.format("%d", encryptedChat.ttl));
detailTextView.setText(AndroidUtilities.formatTTLString(encryptedChat.ttl));
}
}
} else if (type == 4) {
......
......@@ -23,8 +23,6 @@ import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.Scroller;
import org.telegram.messenger.R;
public class HorizontalListView extends AdapterView<ListAdapter> {
public boolean mAlwaysOverrideTouch = true;
......@@ -209,7 +207,7 @@ public class HorizontalListView extends AdapterView<ListAdapter> {
v = list.poll();
}
View child = mAdapter.getView(mRightViewIndex, v, this);
child.setTag(R.string.CacheTag, type);
child.setTag(1, type);
addAndMeasureChild(child, -1);
rightEdge += child.getMeasuredWidth();
......@@ -236,7 +234,7 @@ public class HorizontalListView extends AdapterView<ListAdapter> {
v = list.poll();
}
View child = mAdapter.getView(mLeftViewIndex, v, this);
child.setTag(R.string.CacheTag, type);
child.setTag(1, type);
addAndMeasureChild(child, 0);
leftEdge -= child.getMeasuredWidth();
......@@ -250,7 +248,7 @@ public class HorizontalListView extends AdapterView<ListAdapter> {
while (child != null && child.getRight() + dx <= 0) {
mDisplayOffset += child.getMeasuredWidth();
int type = (Integer) child.getTag(R.string.CacheTag);
int type = (Integer) child.getTag(1);
LinkedList<View> list = mRemovedViewQueue.get(type);
if (list == null) {
list = new LinkedList<View>();
......@@ -265,7 +263,7 @@ public class HorizontalListView extends AdapterView<ListAdapter> {
child = getChildAt(getChildCount() - 1);
while (child != null && child.getLeft() + dx >= getWidth()) {
int type = (Integer) child.getTag(R.string.CacheTag);
int type = (Integer) child.getTag(1);
LinkedList<View> list = mRemovedViewQueue.get(type);
if (list == null) {
list = new LinkedList<View>();
......
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.telegram.ui.Views;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.LinearLayout;
import android.widget.Scroller;
import android.widget.TextView;
import org.telegram.messenger.R;
import java.util.Locale;
public class NumberPicker extends LinearLayout {
private static final int SELECTOR_WHEEL_ITEM_COUNT = 3;
private static final long DEFAULT_LONG_PRESS_UPDATE_INTERVAL = 300;
private static final int SELECTOR_MIDDLE_ITEM_INDEX = SELECTOR_WHEEL_ITEM_COUNT / 2;
private static final int SELECTOR_MAX_FLING_VELOCITY_ADJUSTMENT = 8;
private static final int SELECTOR_ADJUSTMENT_DURATION_MILLIS = 800;
private static final int SNAP_SCROLL_DURATION = 300;
private static final float TOP_AND_BOTTOM_FADING_EDGE_STRENGTH = 0.9f;
private static final int UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT = 2;
private static final int UNSCALED_DEFAULT_SELECTION_DIVIDERS_DISTANCE = 48;
private static final int DEFAULT_LAYOUT_RESOURCE_ID = 0;
private static final int SIZE_UNSPECIFIED = -1;
private final TextView mInputText;
private final int mSelectionDividersDistance;
private final int mMinHeight;
private final int mMaxHeight;
private final int mMinWidth;
private int mMaxWidth;
private final boolean mComputeMaxWidth;
private final int mTextSize;
private int mSelectorTextGapHeight;
private String[] mDisplayedValues;
private int mMinValue;
private int mMaxValue;
private int mValue;
private OnValueChangeListener mOnValueChangeListener;
private OnScrollListener mOnScrollListener;
private Formatter mFormatter;
private long mLongPressUpdateInterval = DEFAULT_LONG_PRESS_UPDATE_INTERVAL;
private final SparseArray<String> mSelectorIndexToStringCache = new SparseArray<String>();
private final int[] mSelectorIndices = new int[SELECTOR_WHEEL_ITEM_COUNT];
private final Paint mSelectorWheelPaint;
private final Drawable mVirtualButtonPressedDrawable;
private int mSelectorElementHeight;
private int mInitialScrollOffset = Integer.MIN_VALUE;
private int mCurrentScrollOffset;
private final Scroller mFlingScroller;
private final Scroller mAdjustScroller;
private int mPreviousScrollerY;
private ChangeCurrentByOneFromLongPressCommand mChangeCurrentByOneFromLongPressCommand;
private float mLastDownEventY;
private long mLastDownEventTime;
private float mLastDownOrMoveEventY;
private VelocityTracker mVelocityTracker;
private int mTouchSlop;
private int mMinimumFlingVelocity;
private int mMaximumFlingVelocity;
private boolean mWrapSelectorWheel;
private final int mSolidColor;
private final Drawable mSelectionDivider;
private final int mSelectionDividerHeight;
private int mScrollState = OnScrollListener.SCROLL_STATE_IDLE;
private boolean mIngonreMoveEvents;
private int mTopSelectionDividerTop;
private int mBottomSelectionDividerBottom;
private int mLastHoveredChildVirtualViewId;
private boolean mIncrementVirtualButtonPressed;
private boolean mDecrementVirtualButtonPressed;
private final PressedStateHelper mPressedStateHelper;
private int mLastHandledDownDpadKeyCode = -1;
public interface OnValueChangeListener {
void onValueChange(NumberPicker picker, int oldVal, int newVal);
}
public interface OnScrollListener {
public static int SCROLL_STATE_IDLE = 0;
public static int SCROLL_STATE_TOUCH_SCROLL = 1;
public static int SCROLL_STATE_FLING = 2;
public void onScrollStateChange(NumberPicker view, int scrollState);
}
public interface Formatter {
public String format(int value);
}
public NumberPicker(Context context) {
this(context, null);
}
public NumberPicker(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public NumberPicker(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mSolidColor = 0;
mSelectionDivider = getResources().getDrawable(R.drawable.numberpicker_selection_divider);
mSelectionDividerHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT, getResources().getDisplayMetrics());
mSelectionDividersDistance = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, UNSCALED_DEFAULT_SELECTION_DIVIDERS_DISTANCE, getResources().getDisplayMetrics());
mMinHeight = SIZE_UNSPECIFIED;
mMaxHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 180, getResources().getDisplayMetrics());
if (mMinHeight != SIZE_UNSPECIFIED && mMaxHeight != SIZE_UNSPECIFIED && mMinHeight > mMaxHeight) {
throw new IllegalArgumentException("minHeight > maxHeight");
}
mMinWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 64, getResources().getDisplayMetrics());
mMaxWidth = SIZE_UNSPECIFIED;
if (mMinWidth != SIZE_UNSPECIFIED && mMaxWidth != SIZE_UNSPECIFIED && mMinWidth > mMaxWidth) {
throw new IllegalArgumentException("minWidth > maxWidth");
}
mComputeMaxWidth = (mMaxWidth == SIZE_UNSPECIFIED);
mVirtualButtonPressedDrawable = getResources().getDrawable(R.drawable.item_background_holo_light);
mPressedStateHelper = new PressedStateHelper();
setWillNotDraw(false);
mInputText = new TextView(getContext());
addView(mInputText);
mInputText.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mInputText.setGravity(Gravity.CENTER);
mInputText.setSingleLine(true);
mInputText.setBackground(null);
mInputText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
ViewConfiguration configuration = ViewConfiguration.get(context);
mTouchSlop = configuration.getScaledTouchSlop();
mMinimumFlingVelocity = configuration.getScaledMinimumFlingVelocity();
mMaximumFlingVelocity = configuration.getScaledMaximumFlingVelocity() / SELECTOR_MAX_FLING_VELOCITY_ADJUSTMENT;
mTextSize = (int) mInputText.getTextSize();
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setTextAlign(Align.CENTER);
paint.setTextSize(mTextSize);
paint.setTypeface(mInputText.getTypeface());
ColorStateList colors = mInputText.getTextColors();
int color = colors.getColorForState(ENABLED_STATE_SET, Color.WHITE);
paint.setColor(color);
mSelectorWheelPaint = paint;
mFlingScroller = new Scroller(getContext(), null, true);
mAdjustScroller = new Scroller(getContext(), new DecelerateInterpolator(2.5f));
updateInputTextView();
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
final int msrdWdth = getMeasuredWidth();
final int msrdHght = getMeasuredHeight();
final int inptTxtMsrdWdth = mInputText.getMeasuredWidth();
final int inptTxtMsrdHght = mInputText.getMeasuredHeight();
final int inptTxtLeft = (msrdWdth - inptTxtMsrdWdth) / 2;
final int inptTxtTop = (msrdHght - inptTxtMsrdHght) / 2;
final int inptTxtRight = inptTxtLeft + inptTxtMsrdWdth;
final int inptTxtBottom = inptTxtTop + inptTxtMsrdHght;
mInputText.layout(inptTxtLeft, inptTxtTop, inptTxtRight, inptTxtBottom);
if (changed) {
initializeSelectorWheel();
initializeFadingEdges();
mTopSelectionDividerTop = (getHeight() - mSelectionDividersDistance) / 2 - mSelectionDividerHeight;
mBottomSelectionDividerBottom = mTopSelectionDividerTop + 2 * mSelectionDividerHeight + mSelectionDividersDistance;
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int newWidthMeasureSpec = makeMeasureSpec(widthMeasureSpec, mMaxWidth);
final int newHeightMeasureSpec = makeMeasureSpec(heightMeasureSpec, mMaxHeight);
super.onMeasure(newWidthMeasureSpec, newHeightMeasureSpec);
final int widthSize = resolveSizeAndStateRespectingMinSize(mMinWidth, getMeasuredWidth(), widthMeasureSpec);
final int heightSize = resolveSizeAndStateRespectingMinSize(mMinHeight, getMeasuredHeight(), heightMeasureSpec);
setMeasuredDimension(widthSize, heightSize);
}
private boolean moveToFinalScrollerPosition(Scroller scroller) {
scroller.forceFinished(true);
int amountToScroll = scroller.getFinalY() - scroller.getCurrY();
int futureScrollOffset = (mCurrentScrollOffset + amountToScroll) % mSelectorElementHeight;
int overshootAdjustment = mInitialScrollOffset - futureScrollOffset;
if (overshootAdjustment != 0) {
if (Math.abs(overshootAdjustment) > mSelectorElementHeight / 2) {
if (overshootAdjustment > 0) {
overshootAdjustment -= mSelectorElementHeight;
} else {
overshootAdjustment += mSelectorElementHeight;
}
}
amountToScroll += overshootAdjustment;
scrollBy(0, amountToScroll);
return true;
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
final int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN: {
removeAllCallbacks();
mInputText.setVisibility(View.INVISIBLE);
mLastDownOrMoveEventY = mLastDownEventY = event.getY();
mLastDownEventTime = event.getEventTime();
mIngonreMoveEvents = false;
if (mLastDownEventY < mTopSelectionDividerTop) {
if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
mPressedStateHelper.buttonPressDelayed(PressedStateHelper.BUTTON_DECREMENT);
}
} else if (mLastDownEventY > mBottomSelectionDividerBottom) {
if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
mPressedStateHelper.buttonPressDelayed(PressedStateHelper.BUTTON_INCREMENT);
}
}
getParent().requestDisallowInterceptTouchEvent(true);
if (!mFlingScroller.isFinished()) {
mFlingScroller.forceFinished(true);
mAdjustScroller.forceFinished(true);
onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
} else if (!mAdjustScroller.isFinished()) {
mFlingScroller.forceFinished(true);
mAdjustScroller.forceFinished(true);
} else if (mLastDownEventY < mTopSelectionDividerTop) {
postChangeCurrentByOneFromLongPress(false, ViewConfiguration.getLongPressTimeout());
} else if (mLastDownEventY > mBottomSelectionDividerBottom) {
postChangeCurrentByOneFromLongPress(true, ViewConfiguration.getLongPressTimeout());
}
return true;
}
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_MOVE: {
if (mIngonreMoveEvents) {
break;
}
float currentMoveY = event.getY();
if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY);
if (deltaDownY > mTouchSlop) {
removeAllCallbacks();
onScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);
}
} else {
int deltaMoveY = (int) ((currentMoveY - mLastDownOrMoveEventY));
scrollBy(0, deltaMoveY);
invalidate();
}
mLastDownOrMoveEventY = currentMoveY;
}
break;
case MotionEvent.ACTION_UP: {
removeChangeCurrentByOneFromLongPress();
mPressedStateHelper.cancel();
VelocityTracker velocityTracker = mVelocityTracker;
velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
int initialVelocity = (int) velocityTracker.getYVelocity();
if (Math.abs(initialVelocity) > mMinimumFlingVelocity) {
fling(initialVelocity);
onScrollStateChange(OnScrollListener.SCROLL_STATE_FLING);
} else {
int eventY = (int) event.getY();
int deltaMoveY = (int) Math.abs(eventY - mLastDownEventY);
long deltaTime = event.getEventTime() - mLastDownEventTime;
if (deltaMoveY <= mTouchSlop && deltaTime < ViewConfiguration.getTapTimeout()) {
int selectorIndexOffset = (eventY / mSelectorElementHeight) - SELECTOR_MIDDLE_ITEM_INDEX;
if (selectorIndexOffset > 0) {
changeValueByOne(true);
mPressedStateHelper.buttonTapped(
PressedStateHelper.BUTTON_INCREMENT);
} else if (selectorIndexOffset < 0) {
changeValueByOne(false);
mPressedStateHelper.buttonTapped(
PressedStateHelper.BUTTON_DECREMENT);
}
} else {
ensureScrollWheelAdjusted();
}
onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
}
mVelocityTracker.recycle();
mVelocityTracker = null;
}
break;
}
return true;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
final int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
removeAllCallbacks();
break;
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
final int keyCode = event.getKeyCode();
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
removeAllCallbacks();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_DPAD_UP:
switch (event.getAction()) {
case KeyEvent.ACTION_DOWN:
if (mWrapSelectorWheel || (keyCode == KeyEvent.KEYCODE_DPAD_DOWN)
? getValue() < getMaxValue() : getValue() > getMinValue()) {
requestFocus();
mLastHandledDownDpadKeyCode = keyCode;
removeAllCallbacks();
if (mFlingScroller.isFinished()) {
changeValueByOne(keyCode == KeyEvent.KEYCODE_DPAD_DOWN);
}
return true;
}
break;
case KeyEvent.ACTION_UP:
if (mLastHandledDownDpadKeyCode == keyCode) {
mLastHandledDownDpadKeyCode = -1;
return true;
}
break;
}
}
return super.dispatchKeyEvent(event);
}
@Override
public boolean dispatchTrackballEvent(MotionEvent event) {
final int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
removeAllCallbacks();
break;
}
return super.dispatchTrackballEvent(event);
}
@Override
public void computeScroll() {
Scroller scroller = mFlingScroller;
if (scroller.isFinished()) {
scroller = mAdjustScroller;
if (scroller.isFinished()) {
return;
}
}
scroller.computeScrollOffset();
int currentScrollerY = scroller.getCurrY();
if (mPreviousScrollerY == 0) {
mPreviousScrollerY = scroller.getStartY();
}
scrollBy(0, currentScrollerY - mPreviousScrollerY);
mPreviousScrollerY = currentScrollerY;
if (scroller.isFinished()) {
onScrollerFinished(scroller);
} else {
invalidate();
}
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
mInputText.setEnabled(enabled);
}
@Override
public void scrollBy(int x, int y) {
int[] selectorIndices = mSelectorIndices;
if (!mWrapSelectorWheel && y > 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) {
mCurrentScrollOffset = mInitialScrollOffset;
return;
}
if (!mWrapSelectorWheel && y < 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mMaxValue) {
mCurrentScrollOffset = mInitialScrollOffset;
return;
}
mCurrentScrollOffset += y;
while (mCurrentScrollOffset - mInitialScrollOffset > mSelectorTextGapHeight) {
mCurrentScrollOffset -= mSelectorElementHeight;
decrementSelectorIndices(selectorIndices);
setValueInternal(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX], true);
if (!mWrapSelectorWheel && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) {
mCurrentScrollOffset = mInitialScrollOffset;
}
}
while (mCurrentScrollOffset - mInitialScrollOffset < -mSelectorTextGapHeight) {
mCurrentScrollOffset += mSelectorElementHeight;
incrementSelectorIndices(selectorIndices);
setValueInternal(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX], true);
if (!mWrapSelectorWheel && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mMaxValue) {
mCurrentScrollOffset = mInitialScrollOffset;
}
}
}
@Override
protected int computeVerticalScrollOffset() {
return mCurrentScrollOffset;
}
@Override
protected int computeVerticalScrollRange() {
return (mMaxValue - mMinValue + 1) * mSelectorElementHeight;
}
@Override
protected int computeVerticalScrollExtent() {
return getHeight();
}
@Override
public int getSolidColor() {
return mSolidColor;
}
public void setOnValueChangedListener(OnValueChangeListener onValueChangedListener) {
mOnValueChangeListener = onValueChangedListener;
}
public void setOnScrollListener(OnScrollListener onScrollListener) {
mOnScrollListener = onScrollListener;
}
public void setFormatter(Formatter formatter) {
if (formatter == mFormatter) {
return;
}
mFormatter = formatter;
initializeSelectorWheelIndices();
updateInputTextView();
}
public void setValue(int value) {
setValueInternal(value, false);
}
private void tryComputeMaxWidth() {
if (!mComputeMaxWidth) {
return;
}
int maxTextWidth = 0;
if (mDisplayedValues == null) {
float maxDigitWidth = 0;
for (int i = 0; i <= 9; i++) {
final float digitWidth = mSelectorWheelPaint.measureText(formatNumberWithLocale(i));
if (digitWidth > maxDigitWidth) {
maxDigitWidth = digitWidth;
}
}
int numberOfDigits = 0;
int current = mMaxValue;
while (current > 0) {
numberOfDigits++;
current = current / 10;
}
maxTextWidth = (int) (numberOfDigits * maxDigitWidth);
} else {
final int valueCount = mDisplayedValues.length;
for (String mDisplayedValue : mDisplayedValues) {
final float textWidth = mSelectorWheelPaint.measureText(mDisplayedValue);
if (textWidth > maxTextWidth) {
maxTextWidth = (int) textWidth;
}
}
}
maxTextWidth += mInputText.getPaddingLeft() + mInputText.getPaddingRight();
if (mMaxWidth != maxTextWidth) {
if (maxTextWidth > mMinWidth) {
mMaxWidth = maxTextWidth;
} else {
mMaxWidth = mMinWidth;
}
invalidate();
}
}
public boolean getWrapSelectorWheel() {
return mWrapSelectorWheel;
}
public void setWrapSelectorWheel(boolean wrapSelectorWheel) {
final boolean wrappingAllowed = (mMaxValue - mMinValue) >= mSelectorIndices.length;
if ((!wrapSelectorWheel || wrappingAllowed) && wrapSelectorWheel != mWrapSelectorWheel) {
mWrapSelectorWheel = wrapSelectorWheel;
}
}
public void setOnLongPressUpdateInterval(long intervalMillis) {
mLongPressUpdateInterval = intervalMillis;
}
public int getValue() {
return mValue;
}
public int getMinValue() {
return mMinValue;
}
public void setMinValue(int minValue) {
if (mMinValue == minValue) {
return;
}
if (minValue < 0) {
throw new IllegalArgumentException("minValue must be >= 0");
}
mMinValue = minValue;
if (mMinValue > mValue) {
mValue = mMinValue;
}
boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length;
setWrapSelectorWheel(wrapSelectorWheel);
initializeSelectorWheelIndices();
updateInputTextView();
tryComputeMaxWidth();
invalidate();
}
public int getMaxValue() {
return mMaxValue;
}
public void setMaxValue(int maxValue) {
if (mMaxValue == maxValue) {
return;
}
if (maxValue < 0) {
throw new IllegalArgumentException("maxValue must be >= 0");
}
mMaxValue = maxValue;
if (mMaxValue < mValue) {
mValue = mMaxValue;
}
boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length;
setWrapSelectorWheel(wrapSelectorWheel);
initializeSelectorWheelIndices();
updateInputTextView();
tryComputeMaxWidth();
invalidate();
}
public String[] getDisplayedValues() {
return mDisplayedValues;
}
public void setDisplayedValues(String[] displayedValues) {
if (mDisplayedValues == displayedValues) {
return;
}
mDisplayedValues = displayedValues;
updateInputTextView();
initializeSelectorWheelIndices();
tryComputeMaxWidth();
}
@Override
protected float getTopFadingEdgeStrength() {
return TOP_AND_BOTTOM_FADING_EDGE_STRENGTH;
}
@Override
protected float getBottomFadingEdgeStrength() {
return TOP_AND_BOTTOM_FADING_EDGE_STRENGTH;
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
removeAllCallbacks();
}
@Override
protected void onDraw(Canvas canvas) {
float x = (getRight() - getLeft()) / 2;
float y = mCurrentScrollOffset;
if (mVirtualButtonPressedDrawable != null && mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
if (mDecrementVirtualButtonPressed) {
mVirtualButtonPressedDrawable.setState(PRESSED_STATE_SET);
mVirtualButtonPressedDrawable.setBounds(0, 0, getRight(), mTopSelectionDividerTop);
mVirtualButtonPressedDrawable.draw(canvas);
}
if (mIncrementVirtualButtonPressed) {
mVirtualButtonPressedDrawable.setState(PRESSED_STATE_SET);
mVirtualButtonPressedDrawable.setBounds(0, mBottomSelectionDividerBottom, getRight(), getBottom());
mVirtualButtonPressedDrawable.draw(canvas);
}
}
// draw the selector wheel
int[] selectorIndices = mSelectorIndices;
for (int i = 0; i < selectorIndices.length; i++) {
int selectorIndex = selectorIndices[i];
String scrollSelectorValue = mSelectorIndexToStringCache.get(selectorIndex);
// Do not draw the middle item if input is visible since the input
// is shown only if the wheel is static and it covers the middle
// item. Otherwise, if the user starts editing the text via the
// IME he may see a dimmed version of the old value intermixed
// with the new one.
if (i != SELECTOR_MIDDLE_ITEM_INDEX || mInputText.getVisibility() != VISIBLE) {
canvas.drawText(scrollSelectorValue, x, y, mSelectorWheelPaint);
}
y += mSelectorElementHeight;
}
// draw the selection dividers
if (mSelectionDivider != null) {
// draw the top divider
int topOfTopDivider = mTopSelectionDividerTop;
int bottomOfTopDivider = topOfTopDivider + mSelectionDividerHeight;
mSelectionDivider.setBounds(0, topOfTopDivider, getRight(), bottomOfTopDivider);
mSelectionDivider.draw(canvas);
// draw the bottom divider
int bottomOfBottomDivider = mBottomSelectionDividerBottom;
int topOfBottomDivider = bottomOfBottomDivider - mSelectionDividerHeight;
mSelectionDivider.setBounds(0, topOfBottomDivider, getRight(), bottomOfBottomDivider);
mSelectionDivider.draw(canvas);
}
}
private int makeMeasureSpec(int measureSpec, int maxSize) {
if (maxSize == SIZE_UNSPECIFIED) {
return measureSpec;
}
final int size = MeasureSpec.getSize(measureSpec);
final int mode = MeasureSpec.getMode(measureSpec);
switch (mode) {
case MeasureSpec.EXACTLY:
return measureSpec;
case MeasureSpec.AT_MOST:
return MeasureSpec.makeMeasureSpec(Math.min(size, maxSize), MeasureSpec.EXACTLY);
case MeasureSpec.UNSPECIFIED:
return MeasureSpec.makeMeasureSpec(maxSize, MeasureSpec.EXACTLY);
default:
throw new IllegalArgumentException("Unknown measure mode: " + mode);
}
}
private int resolveSizeAndStateRespectingMinSize(
int minSize, int measuredSize, int measureSpec) {
if (minSize != SIZE_UNSPECIFIED) {
final int desiredWidth = Math.max(minSize, measuredSize);
return resolveSizeAndState(desiredWidth, measureSpec, 0);
} else {
return measuredSize;
}
}
private void initializeSelectorWheelIndices() {
mSelectorIndexToStringCache.clear();
int[] selectorIndices = mSelectorIndices;
int current = getValue();
for (int i = 0; i < mSelectorIndices.length; i++) {
int selectorIndex = current + (i - SELECTOR_MIDDLE_ITEM_INDEX);
if (mWrapSelectorWheel) {
selectorIndex = getWrappedSelectorIndex(selectorIndex);
}
selectorIndices[i] = selectorIndex;
ensureCachedScrollSelectorValue(selectorIndices[i]);
}
}
private void setValueInternal(int current, boolean notifyChange) {
if (mValue == current) {
return;
}
if (mWrapSelectorWheel) {
current = getWrappedSelectorIndex(current);
} else {
current = Math.max(current, mMinValue);
current = Math.min(current, mMaxValue);
}
int previous = mValue;
mValue = current;
updateInputTextView();
if (notifyChange) {
notifyChange(previous, current);
}
initializeSelectorWheelIndices();
invalidate();
}
private void changeValueByOne(boolean increment) {
mInputText.setVisibility(View.INVISIBLE);
if (!moveToFinalScrollerPosition(mFlingScroller)) {
moveToFinalScrollerPosition(mAdjustScroller);
}
mPreviousScrollerY = 0;
if (increment) {
mFlingScroller.startScroll(0, 0, 0, -mSelectorElementHeight, SNAP_SCROLL_DURATION);
} else {
mFlingScroller.startScroll(0, 0, 0, mSelectorElementHeight, SNAP_SCROLL_DURATION);
}
invalidate();
}
private void initializeSelectorWheel() {
initializeSelectorWheelIndices();
int[] selectorIndices = mSelectorIndices;
int totalTextHeight = selectorIndices.length * mTextSize;
float totalTextGapHeight = (getBottom() - getTop()) - totalTextHeight;
float textGapCount = selectorIndices.length;
mSelectorTextGapHeight = (int) (totalTextGapHeight / textGapCount + 0.5f);
mSelectorElementHeight = mTextSize + mSelectorTextGapHeight;
int editTextTextPosition = mInputText.getBaseline() + mInputText.getTop();
mInitialScrollOffset = editTextTextPosition - (mSelectorElementHeight * SELECTOR_MIDDLE_ITEM_INDEX);
mCurrentScrollOffset = mInitialScrollOffset;
updateInputTextView();
}
private void initializeFadingEdges() {
setVerticalFadingEdgeEnabled(true);
setFadingEdgeLength((getBottom() - getTop() - mTextSize) / 2);
}
private void onScrollerFinished(Scroller scroller) {
if (scroller == mFlingScroller) {
if (!ensureScrollWheelAdjusted()) {
updateInputTextView();
}
onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
} else {
if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
updateInputTextView();
}
}
}
private void onScrollStateChange(int scrollState) {
if (mScrollState == scrollState) {
return;
}
mScrollState = scrollState;
if (mOnScrollListener != null) {
mOnScrollListener.onScrollStateChange(this, scrollState);
}
}
private void fling(int velocityY) {
mPreviousScrollerY = 0;
if (velocityY > 0) {
mFlingScroller.fling(0, 0, 0, velocityY, 0, 0, 0, Integer.MAX_VALUE);
} else {
mFlingScroller.fling(0, Integer.MAX_VALUE, 0, velocityY, 0, 0, 0, Integer.MAX_VALUE);
}
invalidate();
}
private int getWrappedSelectorIndex(int selectorIndex) {
if (selectorIndex > mMaxValue) {
return mMinValue + (selectorIndex - mMaxValue) % (mMaxValue - mMinValue) - 1;
} else if (selectorIndex < mMinValue) {
return mMaxValue - (mMinValue - selectorIndex) % (mMaxValue - mMinValue) + 1;
}
return selectorIndex;
}
private void incrementSelectorIndices(int[] selectorIndices) {
System.arraycopy(selectorIndices, 1, selectorIndices, 0, selectorIndices.length - 1);
int nextScrollSelectorIndex = selectorIndices[selectorIndices.length - 2] + 1;
if (mWrapSelectorWheel && nextScrollSelectorIndex > mMaxValue) {
nextScrollSelectorIndex = mMinValue;
}
selectorIndices[selectorIndices.length - 1] = nextScrollSelectorIndex;
ensureCachedScrollSelectorValue(nextScrollSelectorIndex);
}
private void decrementSelectorIndices(int[] selectorIndices) {
System.arraycopy(selectorIndices, 0, selectorIndices, 1, selectorIndices.length - 1);
int nextScrollSelectorIndex = selectorIndices[1] - 1;
if (mWrapSelectorWheel && nextScrollSelectorIndex < mMinValue) {
nextScrollSelectorIndex = mMaxValue;
}
selectorIndices[0] = nextScrollSelectorIndex;
ensureCachedScrollSelectorValue(nextScrollSelectorIndex);
}
private void ensureCachedScrollSelectorValue(int selectorIndex) {
SparseArray<String> cache = mSelectorIndexToStringCache;
String scrollSelectorValue = cache.get(selectorIndex);
if (scrollSelectorValue != null) {
return;
}
if (selectorIndex < mMinValue || selectorIndex > mMaxValue) {
scrollSelectorValue = "";
} else {
if (mDisplayedValues != null) {
int displayedValueIndex = selectorIndex - mMinValue;
scrollSelectorValue = mDisplayedValues[displayedValueIndex];
} else {
scrollSelectorValue = formatNumber(selectorIndex);
}
}
cache.put(selectorIndex, scrollSelectorValue);
}
private String formatNumber(int value) {
return (mFormatter != null) ? mFormatter.format(value) : formatNumberWithLocale(value);
}
private boolean updateInputTextView() {
String text = (mDisplayedValues == null) ? formatNumber(mValue) : mDisplayedValues[mValue - mMinValue];
if (!TextUtils.isEmpty(text) && !text.equals(mInputText.getText().toString())) {
mInputText.setText(text);
return true;
}
return false;
}
private void notifyChange(int previous, int current) {
if (mOnValueChangeListener != null) {
mOnValueChangeListener.onValueChange(this, previous, mValue);
}
}
private void postChangeCurrentByOneFromLongPress(boolean increment, long delayMillis) {
if (mChangeCurrentByOneFromLongPressCommand == null) {
mChangeCurrentByOneFromLongPressCommand = new ChangeCurrentByOneFromLongPressCommand();
} else {
removeCallbacks(mChangeCurrentByOneFromLongPressCommand);
}
mChangeCurrentByOneFromLongPressCommand.setStep(increment);
postDelayed(mChangeCurrentByOneFromLongPressCommand, delayMillis);
}
private void removeChangeCurrentByOneFromLongPress() {
if (mChangeCurrentByOneFromLongPressCommand != null) {
removeCallbacks(mChangeCurrentByOneFromLongPressCommand);
}
}
private void removeAllCallbacks() {
if (mChangeCurrentByOneFromLongPressCommand != null) {
removeCallbacks(mChangeCurrentByOneFromLongPressCommand);
}
mPressedStateHelper.cancel();
}
private int getSelectedPos(String value) {
if (mDisplayedValues == null) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
// Ignore as if it's not a number we don't care
}
} else {
for (int i = 0; i < mDisplayedValues.length; i++) {
// Don't force the user to type in jan when ja will do
value = value.toLowerCase();
if (mDisplayedValues[i].toLowerCase().startsWith(value)) {
return mMinValue + i;
}
}
/*
* The user might have typed in a number into the month field i.e.
* 10 instead of OCT so support that too.
*/
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
// Ignore as if it's not a number we don't care
}
}
return mMinValue;
}
private boolean ensureScrollWheelAdjusted() {
// adjust to the closest value
int deltaY = mInitialScrollOffset - mCurrentScrollOffset;
if (deltaY != 0) {
mPreviousScrollerY = 0;
if (Math.abs(deltaY) > mSelectorElementHeight / 2) {
deltaY += (deltaY > 0) ? -mSelectorElementHeight : mSelectorElementHeight;
}
mAdjustScroller.startScroll(0, 0, 0, deltaY, SELECTOR_ADJUSTMENT_DURATION_MILLIS);
invalidate();
return true;
}
return false;
}
class PressedStateHelper implements Runnable {
public static final int BUTTON_INCREMENT = 1;
public static final int BUTTON_DECREMENT = 2;
private final int MODE_PRESS = 1;
private final int MODE_TAPPED = 2;
private int mManagedButton;
private int mMode;
public void cancel() {
mMode = 0;
mManagedButton = 0;
NumberPicker.this.removeCallbacks(this);
if (mIncrementVirtualButtonPressed) {
mIncrementVirtualButtonPressed = false;
invalidate(0, mBottomSelectionDividerBottom, getRight(), getBottom());
}
mDecrementVirtualButtonPressed = false;
if (mDecrementVirtualButtonPressed) {
invalidate(0, 0, getRight(), mTopSelectionDividerTop);
}
}
public void buttonPressDelayed(int button) {
cancel();
mMode = MODE_PRESS;
mManagedButton = button;
NumberPicker.this.postDelayed(this, ViewConfiguration.getTapTimeout());
}
public void buttonTapped(int button) {
cancel();
mMode = MODE_TAPPED;
mManagedButton = button;
NumberPicker.this.post(this);
}
@Override
public void run() {
switch (mMode) {
case MODE_PRESS: {
switch (mManagedButton) {
case BUTTON_INCREMENT: {
mIncrementVirtualButtonPressed = true;
invalidate(0, mBottomSelectionDividerBottom, getRight(), getBottom());
}
break;
case BUTTON_DECREMENT: {
mDecrementVirtualButtonPressed = true;
invalidate(0, 0, getRight(), mTopSelectionDividerTop);
}
}
}
break;
case MODE_TAPPED: {
switch (mManagedButton) {
case BUTTON_INCREMENT: {
if (!mIncrementVirtualButtonPressed) {
NumberPicker.this.postDelayed(this,
ViewConfiguration.getPressedStateDuration());
}
mIncrementVirtualButtonPressed ^= true;
invalidate(0, mBottomSelectionDividerBottom, getRight(), getBottom());
}
break;
case BUTTON_DECREMENT: {
if (!mDecrementVirtualButtonPressed) {
NumberPicker.this.postDelayed(this,
ViewConfiguration.getPressedStateDuration());
}
mDecrementVirtualButtonPressed ^= true;
invalidate(0, 0, getRight(), mTopSelectionDividerTop);
}
}
}
break;
}
}
}
class ChangeCurrentByOneFromLongPressCommand implements Runnable {
private boolean mIncrement;
private void setStep(boolean increment) {
mIncrement = increment;
}
@Override
public void run() {
changeValueByOne(mIncrement);
postDelayed(this, mLongPressUpdateInterval);
}
}
static private String formatNumberWithLocale(int value) {
return String.format(Locale.getDefault(), "%d", value);
}
}
......@@ -65,20 +65,33 @@ public class TimerButton extends View {
time = value;
String timeString = null;
if (time == 2) {
timeString = "2s";
} else if (time == 5) {
timeString = "5s";
} else if (time == 60) {
timeString = "1m";
} else if (time == 60 * 60) {
timeString = "1h";
} else if (time == 60 * 60 * 24) {
timeString = "1d";
} else if (time == 60 * 60 * 24 * 7) {
timeString = "1w";
if (time >= 1 && time < 60) {
timeString = "" + value;
if (timeString.length() < 2) {
timeString += "s";
}
} else if (time >= 60 && time < 60 * 60) {
timeString = "" + value / 60;
if (timeString.length() < 2) {
timeString += "m";
}
} else if (time >= 60 * 60 && time < 60 * 60 * 24) {
timeString = "" + value / 60 / 60;
if (timeString.length() < 2) {
timeString += "h";
}
} else if (time >= 60 * 60 * 24 && time < 60 * 60 * 24 * 7) {
timeString = "" + value / 60 / 60 / 24;
if (timeString.length() < 2) {
timeString += "d";
}
} else {
timeString = "c";
timeString = "" + value / 60 / 60 / 24 / 7;
if (timeString.length() < 2) {
timeString += "w";
} else if (timeString.length() > 2) {
timeString = "c";
}
}
timeWidth = timePaint.measureText(timeString);
......@@ -110,7 +123,7 @@ public class TimerButton extends View {
drawable.draw(canvas);
if (time != 0 && timeLayout != null) {
canvas.translate((width - timeWidth) / 2, (height - timeHeight) / 2 + AndroidUtilities.dp(1));
canvas.translate((int)(width / 2 - Math.ceil(timeWidth / 2)), (height - timeHeight) / 2 + AndroidUtilities.dpf2(1.5f));
timeLayout.draw(canvas);
}
}
......
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_disabled_holo_light" />
<item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/list_selector_disabled_holo_light" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition_holo_light" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition_holo_light" />
<item android:state_focused="true" android:drawable="@drawable/list_focused_holo" />
<item android:drawable="@drawable/transparent" />
</selector>
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/list_pressed_holo_light" />
<item android:drawable="@drawable/list_longpressed_holo_light" />
</transition>
......@@ -118,12 +118,6 @@
<string name="MessageLifetimeChangedOutgoing">لقد قمت بتعيين التدمير الذاتي إلى %1$s</string>
<string name="MessageLifetimeRemoved">%1$s قام بإيقاف عداد التدمير الذاتي</string>
<string name="MessageLifetimeYouRemoved">لقد قمت بتعطيل عداد التدمير الذاتي</string>
<string name="MessageLifetime2s">ثانيتان</string>
<string name="MessageLifetime5s">٥ ثوانٍ</string>
<string name="MessageLifetime1m">دقيقة</string>
<string name="MessageLifetime1h">ساعة</string>
<string name="MessageLifetime1d">يوم</string>
<string name="MessageLifetime1w">أسبوع</string>
<string name="YouHaveNewMessage">لديك رسالة جديدة</string>
<string name="NotificationMessageText">%1$s: %2$s</string>
<string name="NotificationMessageNoText">%1$s قام بإرسال رسالة لك</string>
......@@ -202,12 +196,6 @@
<string name="EncryptionKey">مفتاح التشفير</string>
<string name="MessageLifetime">عداد التدمير الذاتي</string>
<string name="ShortMessageLifetimeForever">إيقاف</string>
<string name="ShortMessageLifetime2s">ثانيتان</string>
<string name="ShortMessageLifetime5s">٥ ثوانٍ</string>
<string name="ShortMessageLifetime1m">دقيقة</string>
<string name="ShortMessageLifetime1h">ساعة</string>
<string name="ShortMessageLifetime1d">يوم</string>
<string name="ShortMessageLifetime1w">أسبوع</string>
<string name="EncryptionKeyDescription">هذه الصورة هي تصور لمفتاح التشفير لهذه المحادثة السرية مع <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>.<![CDATA[<br><br>]]>إذا كانت مطابقة للصورة التي في جهاز <![CDATA[<b>]]>%2$s<![CDATA[</b>]]>, فمحادثتكم آمنة ٢٠٠٪.<![CDATA[<br><br>]]>للمزيد نرجو الذهاب إلى telegram.org</string>
<!--settings view-->
<string name="ResetNotificationsText">تم تعيين كافة الإشعارات افتراضيا</string>
......@@ -434,6 +422,36 @@
<string name="FromContacts_few">من %1$d جهات اتصال</string>
<string name="FromContacts_many">من %1$d جهة اتصال</string>
<string name="FromContacts_other">من %1$d جهة اتصال</string>
<string name="Seconds_zero">%1$d seconds</string>
<string name="Seconds_one">%1$d second</string>
<string name="Seconds_two">%1$d seconds</string>
<string name="Seconds_few">%1$d seconds</string>
<string name="Seconds_many">%1$d seconds</string>
<string name="Seconds_other">%1$d seconds</string>
<string name="Minutes_zero">%1$d minutes</string>
<string name="Minutes_one">%1$d minute</string>
<string name="Minutes_two">%1$d minutes</string>
<string name="Minutes_few">%1$d minutes</string>
<string name="Minutes_many">%1$d minutes</string>
<string name="Minutes_other">%1$d minutes</string>
<string name="Hours_zero">%1$d hours</string>
<string name="Hours_one">%1$d hour</string>
<string name="Hours_two">%1$d hours</string>
<string name="Hours_few">%1$d hours</string>
<string name="Hours_many">%1$d hours</string>
<string name="Hours_other">%1$d hours</string>
<string name="Days_zero">%1$d days</string>
<string name="Days_one">%1$d day</string>
<string name="Days_two">%1$d days</string>
<string name="Days_few">%1$d days</string>
<string name="Days_many">%1$d days</string>
<string name="Days_other">%1$d days</string>
<string name="Weeks_zero">%1$d weeks</string>
<string name="Weeks_one">%1$d week</string>
<string name="Weeks_two">%1$d weeks</string>
<string name="Weeks_few">%1$d weeks</string>
<string name="Weeks_many">%1$d weeks</string>
<string name="Weeks_other">%1$d weeks</string>
<!--date formatters-->
<string name="formatterMonth">dd MMM</string>
<string name="formatterYear">dd.MM.yy</string>
......@@ -444,6 +462,4 @@
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatDateAtTime">%1$s الساعة %2$s</string>
<!--Don't change this! Not for localization!-->
<string name="CacheTag">CACHE_TAG</string>
</resources>
\ No newline at end of file
......@@ -118,12 +118,6 @@
<string name="MessageLifetimeChangedOutgoing">Du hast den Selbstzerstörungs-Timer auf %1$s gesetzt</string>
<string name="MessageLifetimeRemoved">%1$s hat den Selbstzerstörungs-Timer deaktivert</string>
<string name="MessageLifetimeYouRemoved">Du hast den Selbstzerstörungs-Timer deaktivert</string>
<string name="MessageLifetime2s">2 Sekunden</string>
<string name="MessageLifetime5s">5 Sekunden</string>
<string name="MessageLifetime1m">1 Minute</string>
<string name="MessageLifetime1h">1 Stunde</string>
<string name="MessageLifetime1d">1 Tag</string>
<string name="MessageLifetime1w">1 Woche</string>
<string name="YouHaveNewMessage">Du hast eine neue Nachricht</string>
<string name="NotificationMessageText">%1$s: %2$s</string>
<string name="NotificationMessageNoText">%1$s hat dir eine Nachricht gesendet</string>
......@@ -202,12 +196,6 @@
<string name="EncryptionKey">Geheimer Schlüssel</string>
<string name="MessageLifetime">Selbstzerstörungs-Timer</string>
<string name="ShortMessageLifetimeForever">Aus</string>
<string name="ShortMessageLifetime2s">2 Sek.</string>
<string name="ShortMessageLifetime5s">5 Sek.</string>
<string name="ShortMessageLifetime1m">1 Min.</string>
<string name="ShortMessageLifetime1h">1 Std.</string>
<string name="ShortMessageLifetime1d">1 Tag</string>
<string name="ShortMessageLifetime1w">1 Woche</string>
<string name="EncryptionKeyDescription">Das ist eine Darstellung des Schlüssels für den Geheimen Chat mit <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>.<![CDATA[<br><br>]]>Wenn dieses Bild auf <![CDATA[<b>]]>%2$s\s<![CDATA[</b>]]>s Telefon genau so aussieht, ist euer Chat zu 200%% sicher.<![CDATA[<br><br>]]>Erfahre mehr auf telegram.org</string>
<!--settings view-->
<string name="ResetNotificationsText">Alle Einstellungen für Mitteilungen zurücksetzen</string>
......@@ -434,6 +422,36 @@
<string name="FromContacts_few">von %1$d Kontakten</string>
<string name="FromContacts_many">von %1$d Kontakten</string>
<string name="FromContacts_other">von %1$d Kontakten</string>
<string name="Seconds_zero">%1$d seconds</string>
<string name="Seconds_one">%1$d second</string>
<string name="Seconds_two">%1$d seconds</string>
<string name="Seconds_few">%1$d seconds</string>
<string name="Seconds_many">%1$d seconds</string>
<string name="Seconds_other">%1$d seconds</string>
<string name="Minutes_zero">%1$d minutes</string>
<string name="Minutes_one">%1$d minute</string>
<string name="Minutes_two">%1$d minutes</string>
<string name="Minutes_few">%1$d minutes</string>
<string name="Minutes_many">%1$d minutes</string>
<string name="Minutes_other">%1$d minutes</string>
<string name="Hours_zero">%1$d hours</string>
<string name="Hours_one">%1$d hour</string>
<string name="Hours_two">%1$d hours</string>
<string name="Hours_few">%1$d hours</string>
<string name="Hours_many">%1$d hours</string>
<string name="Hours_other">%1$d hours</string>
<string name="Days_zero">%1$d days</string>
<string name="Days_one">%1$d day</string>
<string name="Days_two">%1$d days</string>
<string name="Days_few">%1$d days</string>
<string name="Days_many">%1$d days</string>
<string name="Days_other">%1$d days</string>
<string name="Weeks_zero">%1$d weeks</string>
<string name="Weeks_one">%1$d week</string>
<string name="Weeks_two">%1$d weeks</string>
<string name="Weeks_few">%1$d weeks</string>
<string name="Weeks_many">%1$d weeks</string>
<string name="Weeks_other">%1$d weeks</string>
<!--date formatters-->
<string name="formatterMonth">dd MMM</string>
<string name="formatterYear">dd.MM.yy</string>
......@@ -444,6 +462,4 @@
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatDateAtTime">%1$s um %2$s</string>
<!--Don't change this! Not for localization!-->
<string name="CacheTag">CACHE_TAG</string>
</resources>
\ No newline at end of file
......@@ -118,12 +118,6 @@
<string name="MessageLifetimeChangedOutgoing">Activaste la autodestrucción en %1$s</string>
<string name="MessageLifetimeRemoved">%1$s desactivó la autodestrucción</string>
<string name="MessageLifetimeYouRemoved">Desactivaste la autodestrucción</string>
<string name="MessageLifetime2s">2 segundos</string>
<string name="MessageLifetime5s">5 segundos</string>
<string name="MessageLifetime1m">1 minuto</string>
<string name="MessageLifetime1h">1 hora</string>
<string name="MessageLifetime1d">1 día</string>
<string name="MessageLifetime1w">1 semana</string>
<string name="YouHaveNewMessage">Tienes un nuevo mensaje</string>
<string name="NotificationMessageText">%1$s: %2$s</string>
<string name="NotificationMessageNoText">%1$s te envió un mensaje</string>
......@@ -175,7 +169,7 @@
<!--group info view-->
<string name="EnterGroupNameTitle">PON EL NOMBRE DEL GRUPO</string>
<string name="SharedMedia">Fotos y vídeos</string>
<string name="GroupInfo">Información </string>
<string name="GroupInfo">Información</string>
<string name="SHAREDMEDIA">FOTOS Y VÍDEOS</string>
<string name="SETTINGS">AJUSTES</string>
<string name="AddMember">Añadir miembro</string>
......@@ -202,12 +196,6 @@
<string name="EncryptionKey">Clave de cifrado</string>
<string name="MessageLifetime">Autodestrucción</string>
<string name="ShortMessageLifetimeForever">Apagada</string>
<string name="ShortMessageLifetime2s">2s</string>
<string name="ShortMessageLifetime5s">5s</string>
<string name="ShortMessageLifetime1m">1m</string>
<string name="ShortMessageLifetime1h">1h</string>
<string name="ShortMessageLifetime1d">1d</string>
<string name="ShortMessageLifetime1w">1S</string>
<string name="EncryptionKeyDescription">Esta imagen es una visualización de la clave de cifrado para el chat secreto con <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>.<![CDATA[<br><br>]]>Si esta imagen se ve igual en el teléfono de <![CDATA[<b>]]>%2$s<![CDATA[</b>]]>, tu chat es seguro en un 200%%.<![CDATA[<br><br>]]>Aprende más en telegram.org</string>
<!--settings view-->
<string name="ResetNotificationsText">Restablecer las notificaciones</string>
......@@ -267,7 +255,7 @@
<string name="NoPopup">Desactivadas</string>
<string name="OnlyWhenScreenOn">Con pantalla encendida</string>
<string name="OnlyWhenScreenOff">Con pantalla apagada</string>
<string name="AlwaysShowPopup">Mostrar siempre </string>
<string name="AlwaysShowPopup">Mostrar siempre</string>
<string name="BadgeNumber">Globo en el ícono</string>
<string name="Short">Corto</string>
<string name="Long">Largo</string>
......@@ -434,6 +422,36 @@
<string name="FromContacts_few">de %1$d contactos</string>
<string name="FromContacts_many">de %1$d contactos</string>
<string name="FromContacts_other">de %1$d contactos</string>
<string name="Seconds_zero">%1$d seconds</string>
<string name="Seconds_one">%1$d second</string>
<string name="Seconds_two">%1$d seconds</string>
<string name="Seconds_few">%1$d seconds</string>
<string name="Seconds_many">%1$d seconds</string>
<string name="Seconds_other">%1$d seconds</string>
<string name="Minutes_zero">%1$d minutes</string>
<string name="Minutes_one">%1$d minute</string>
<string name="Minutes_two">%1$d minutes</string>
<string name="Minutes_few">%1$d minutes</string>
<string name="Minutes_many">%1$d minutes</string>
<string name="Minutes_other">%1$d minutes</string>
<string name="Hours_zero">%1$d hours</string>
<string name="Hours_one">%1$d hour</string>
<string name="Hours_two">%1$d hours</string>
<string name="Hours_few">%1$d hours</string>
<string name="Hours_many">%1$d hours</string>
<string name="Hours_other">%1$d hours</string>
<string name="Days_zero">%1$d days</string>
<string name="Days_one">%1$d day</string>
<string name="Days_two">%1$d days</string>
<string name="Days_few">%1$d days</string>
<string name="Days_many">%1$d days</string>
<string name="Days_other">%1$d days</string>
<string name="Weeks_zero">%1$d weeks</string>
<string name="Weeks_one">%1$d week</string>
<string name="Weeks_two">%1$d weeks</string>
<string name="Weeks_few">%1$d weeks</string>
<string name="Weeks_many">%1$d weeks</string>
<string name="Weeks_other">%1$d weeks</string>
<!--date formatters-->
<string name="formatterMonth">dd \'de\' MMM</string>
<string name="formatterYear">dd.MM.yy</string>
......@@ -444,6 +462,4 @@
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatDateAtTime">%1$s a las %2$s</string>
<!--Don't change this! Not for localization!-->
<string name="CacheTag">CACHE_TAG</string>
</resources>
\ No newline at end of file
......@@ -118,12 +118,6 @@
<string name="MessageLifetimeChangedOutgoing">Hai impostato il timer di autodistruzione a %1$s</string>
<string name="MessageLifetimeRemoved">%1$s ha disabilitato il timer di autodistruzione</string>
<string name="MessageLifetimeYouRemoved">Hai disabilitato il timer di autodistruzione</string>
<string name="MessageLifetime2s">2 secondi</string>
<string name="MessageLifetime5s">5 secondi</string>
<string name="MessageLifetime1m">1 minuto</string>
<string name="MessageLifetime1h">1 ora</string>
<string name="MessageLifetime1d">1 giorno</string>
<string name="MessageLifetime1w">1 settimana</string>
<string name="YouHaveNewMessage">Hai un nuovo messaggio</string>
<string name="NotificationMessageText">%1$s: %2$s</string>
<string name="NotificationMessageNoText">%1$s ti ha inviato un messaggio</string>
......@@ -202,12 +196,6 @@
<string name="EncryptionKey">Chiave di cifratura</string>
<string name="MessageLifetime">Timer di autodistruzione</string>
<string name="ShortMessageLifetimeForever">Spento</string>
<string name="ShortMessageLifetime2s">2s</string>
<string name="ShortMessageLifetime5s">5s</string>
<string name="ShortMessageLifetime1m">1m</string>
<string name="ShortMessageLifetime1h">1h</string>
<string name="ShortMessageLifetime1d">1g</string>
<string name="ShortMessageLifetime1w">1sett</string>
<string name="EncryptionKeyDescription">Questa immagine è una visualizzazione della chiave di cifratura per questa chat segreta con <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>.<![CDATA[<br><br>]]>Se questa immagine è uguale sul telefono di <![CDATA[<b>]]>%2$s<![CDATA[</b>]]>, la chat è sicura al 200%%.<![CDATA[<br><br>]]>Per saperne di più, visita Telegram.org</string>
<!--settings view-->
<string name="ResetNotificationsText">Ripristina tutte le impostazioni di notifica predefinite</string>
......@@ -434,6 +422,36 @@
<string name="FromContacts_few">da %1$d contatti</string>
<string name="FromContacts_many">da %1$d contatti</string>
<string name="FromContacts_other">da %1$d contatti</string>
<string name="Seconds_zero">%1$d seconds</string>
<string name="Seconds_one">%1$d second</string>
<string name="Seconds_two">%1$d seconds</string>
<string name="Seconds_few">%1$d seconds</string>
<string name="Seconds_many">%1$d seconds</string>
<string name="Seconds_other">%1$d seconds</string>
<string name="Minutes_zero">%1$d minutes</string>
<string name="Minutes_one">%1$d minute</string>
<string name="Minutes_two">%1$d minutes</string>
<string name="Minutes_few">%1$d minutes</string>
<string name="Minutes_many">%1$d minutes</string>
<string name="Minutes_other">%1$d minutes</string>
<string name="Hours_zero">%1$d hours</string>
<string name="Hours_one">%1$d hour</string>
<string name="Hours_two">%1$d hours</string>
<string name="Hours_few">%1$d hours</string>
<string name="Hours_many">%1$d hours</string>
<string name="Hours_other">%1$d hours</string>
<string name="Days_zero">%1$d days</string>
<string name="Days_one">%1$d day</string>
<string name="Days_two">%1$d days</string>
<string name="Days_few">%1$d days</string>
<string name="Days_many">%1$d days</string>
<string name="Days_other">%1$d days</string>
<string name="Weeks_zero">%1$d weeks</string>
<string name="Weeks_one">%1$d week</string>
<string name="Weeks_two">%1$d weeks</string>
<string name="Weeks_few">%1$d weeks</string>
<string name="Weeks_many">%1$d weeks</string>
<string name="Weeks_other">%1$d weeks</string>
<!--date formatters-->
<string name="formatterMonth">dd MMM</string>
<string name="formatterYear">dd.MM.yy</string>
......@@ -444,6 +462,4 @@
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatDateAtTime">%1$s alle %2$s</string>
<!--Don't change this! Not for localization!-->
<string name="CacheTag">CACHE_TAG</string>
</resources>
\ No newline at end of file
......@@ -118,12 +118,6 @@
<string name="MessageLifetimeChangedOutgoing">자동삭제를 %1$s 후로 설정했습니다</string>
<string name="MessageLifetimeRemoved">%1$s님이 자동삭제를 해제했습니다</string>
<string name="MessageLifetimeYouRemoved">자동삭제를 해제했습니다</string>
<string name="MessageLifetime2s">2초</string>
<string name="MessageLifetime5s">5초</string>
<string name="MessageLifetime1m">1분</string>
<string name="MessageLifetime1h">1시간</string>
<string name="MessageLifetime1d">하루</string>
<string name="MessageLifetime1w">일주일</string>
<string name="YouHaveNewMessage">새 메시지가 있습니다</string>
<string name="NotificationMessageText">%1$s: %2$s</string>
<string name="NotificationMessageNoText">%1$s님이 메시지를 보냈습니다</string>
......@@ -202,12 +196,6 @@
<string name="EncryptionKey">암호화 키</string>
<string name="MessageLifetime">자동삭제 타이머</string>
<string name="ShortMessageLifetimeForever">해제</string>
<string name="ShortMessageLifetime2s">2초</string>
<string name="ShortMessageLifetime5s">5초</string>
<string name="ShortMessageLifetime1m">1분</string>
<string name="ShortMessageLifetime1h">1시간</string>
<string name="ShortMessageLifetime1d">하루</string>
<string name="ShortMessageLifetime1w">일주일</string>
<string name="EncryptionKeyDescription">이 이미지는 <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>님과의 비밀대화에 사용 중인 암호화 키의 모습입니다.<![CDATA[<br><br>]]>이 이미지가 <![CDATA[<b>]]>%2$s<![CDATA[</b>]]>님의 암호화 키와 똑같다면 대화는 200%% 안전합니다.<![CDATA[<br><br>]]>더 자세한 사항은 telegram.org 를 참고해 주세요.</string>
<!--settings view-->
<string name="ResetNotificationsText">모든 알림 설정이 초기화되었습니다</string>
......@@ -434,6 +422,36 @@
<string name="FromContacts_few">채팅방 %1$d개에서</string>
<string name="FromContacts_many">채팅방 %1$d개에서</string>
<string name="FromContacts_other">채팅방 %1$d개에서</string>
<string name="Seconds_zero">%1$d seconds</string>
<string name="Seconds_one">%1$d second</string>
<string name="Seconds_two">%1$d seconds</string>
<string name="Seconds_few">%1$d seconds</string>
<string name="Seconds_many">%1$d seconds</string>
<string name="Seconds_other">%1$d seconds</string>
<string name="Minutes_zero">%1$d minutes</string>
<string name="Minutes_one">%1$d minute</string>
<string name="Minutes_two">%1$d minutes</string>
<string name="Minutes_few">%1$d minutes</string>
<string name="Minutes_many">%1$d minutes</string>
<string name="Minutes_other">%1$d minutes</string>
<string name="Hours_zero">%1$d hours</string>
<string name="Hours_one">%1$d hour</string>
<string name="Hours_two">%1$d hours</string>
<string name="Hours_few">%1$d hours</string>
<string name="Hours_many">%1$d hours</string>
<string name="Hours_other">%1$d hours</string>
<string name="Days_zero">%1$d days</string>
<string name="Days_one">%1$d day</string>
<string name="Days_two">%1$d days</string>
<string name="Days_few">%1$d days</string>
<string name="Days_many">%1$d days</string>
<string name="Days_other">%1$d days</string>
<string name="Weeks_zero">%1$d weeks</string>
<string name="Weeks_one">%1$d week</string>
<string name="Weeks_two">%1$d weeks</string>
<string name="Weeks_few">%1$d weeks</string>
<string name="Weeks_many">%1$d weeks</string>
<string name="Weeks_other">%1$d weeks</string>
<!--date formatters-->
<string name="formatterMonth">M\'월\' d\'일\'</string>
<string name="formatterYear">yyyy.MM.dd.</string>
......@@ -444,6 +462,4 @@
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">a h:mm</string>
<string name="formatDateAtTime">%1$s %2$s</string>
<!--Don't change this! Not for localization!-->
<string name="CacheTag">CACHE_TAG</string>
</resources>
\ No newline at end of file
......@@ -118,12 +118,6 @@
<string name="MessageLifetimeChangedOutgoing">Je hebt de zelfvernietigingstimer ingesteld op %1$s</string>
<string name="MessageLifetimeRemoved">%1$s heeft de zelfvernietigingstimer uitgeschakeld</string>
<string name="MessageLifetimeYouRemoved">Je hebt de zelfvernietigingstimer uitgeschakeld</string>
<string name="MessageLifetime2s">2 seconden</string>
<string name="MessageLifetime5s">5 seconden</string>
<string name="MessageLifetime1m">1 minuut</string>
<string name="MessageLifetime1h">1 uur</string>
<string name="MessageLifetime1d">1 dag</string>
<string name="MessageLifetime1w">1 week</string>
<string name="YouHaveNewMessage">Je hebt een nieuw bericht</string>
<string name="NotificationMessageText">%1$s: %2$s</string>
<string name="NotificationMessageNoText">%1$s heeft je een bericht gestuurd</string>
......@@ -202,12 +196,6 @@
<string name="EncryptionKey">Encryptiesleutel</string>
<string name="MessageLifetime">Zelfvernietigingstimer</string>
<string name="ShortMessageLifetimeForever">Uit</string>
<string name="ShortMessageLifetime2s">2s</string>
<string name="ShortMessageLifetime5s">5s</string>
<string name="ShortMessageLifetime1m">1m</string>
<string name="ShortMessageLifetime1h">1u</string>
<string name="ShortMessageLifetime1d">1d</string>
<string name="ShortMessageLifetime1w">1w</string>
<string name="EncryptionKeyDescription">Dit is een weergave van de encryptiesleutel voor deze geheime chat met <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>.<![CDATA[<br><br>]]>Als deze afbeelding er bij <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> hetzelfde uitziet, is jullie gesprek 200%% beveiligd.<![CDATA[<br><br>]]>Lees meer op telegram.org.</string>
<!--settings view-->
<string name="ResetNotificationsText">Alle meldingsinstellingen herstellen</string>
......@@ -434,6 +422,36 @@
<string name="FromContacts_few">van %1$d contactpersonen</string>
<string name="FromContacts_many">van %1$d contactpersonen</string>
<string name="FromContacts_other">van %1$d contactpersonen</string>
<string name="Seconds_zero">%1$d seconds</string>
<string name="Seconds_one">%1$d second</string>
<string name="Seconds_two">%1$d seconds</string>
<string name="Seconds_few">%1$d seconds</string>
<string name="Seconds_many">%1$d seconds</string>
<string name="Seconds_other">%1$d seconds</string>
<string name="Minutes_zero">%1$d minutes</string>
<string name="Minutes_one">%1$d minute</string>
<string name="Minutes_two">%1$d minutes</string>
<string name="Minutes_few">%1$d minutes</string>
<string name="Minutes_many">%1$d minutes</string>
<string name="Minutes_other">%1$d minutes</string>
<string name="Hours_zero">%1$d hours</string>
<string name="Hours_one">%1$d hour</string>
<string name="Hours_two">%1$d hours</string>
<string name="Hours_few">%1$d hours</string>
<string name="Hours_many">%1$d hours</string>
<string name="Hours_other">%1$d hours</string>
<string name="Days_zero">%1$d days</string>
<string name="Days_one">%1$d day</string>
<string name="Days_two">%1$d days</string>
<string name="Days_few">%1$d days</string>
<string name="Days_many">%1$d days</string>
<string name="Days_other">%1$d days</string>
<string name="Weeks_zero">%1$d weeks</string>
<string name="Weeks_one">%1$d week</string>
<string name="Weeks_two">%1$d weeks</string>
<string name="Weeks_few">%1$d weeks</string>
<string name="Weeks_many">%1$d weeks</string>
<string name="Weeks_other">%1$d weeks</string>
<!--date formatters-->
<string name="formatterMonth">dd MMM</string>
<string name="formatterYear">dd-MM-yy</string>
......@@ -444,6 +462,4 @@
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatDateAtTime">%1$s om %2$s</string>
<!--Don't change this! Not for localization!-->
<string name="CacheTag">CACHE_TAG</string>
</resources>
\ No newline at end of file
......@@ -114,16 +114,10 @@
<!--notification-->
<string name="EncryptedChatRequested">Conversa secreta solicitada</string>
<string name="EncryptedChatAccepted">Conversa secreta iniciada</string>
<string name="MessageLifetimeChanged">%1$s estabeleceu o tempo de autodestruição para %2$s </string>
<string name="MessageLifetimeChanged">%1$s estabeleceu o tempo de autodestruição para %2$s</string>
<string name="MessageLifetimeChangedOutgoing">Você estabeleceu o tempo de autodestruição para %1$s</string>
<string name="MessageLifetimeRemoved">%1$s desativou o temporizador de autodestruição</string>
<string name="MessageLifetimeYouRemoved">Você desativou o temporizador de autodestruição</string>
<string name="MessageLifetime2s">2 segundos</string>
<string name="MessageLifetime5s">5 segundos</string>
<string name="MessageLifetime1m">1 minuto</string>
<string name="MessageLifetime1h">1 hora</string>
<string name="MessageLifetime1d">1 dia</string>
<string name="MessageLifetime1w">1 semana</string>
<string name="YouHaveNewMessage">Você tem uma nova mensagem</string>
<string name="NotificationMessageText">%1$s: %2$s</string>
<string name="NotificationMessageNoText">%1$s te enviou uma mensagem</string>
......@@ -202,12 +196,6 @@
<string name="EncryptionKey">Chave criptográfica</string>
<string name="MessageLifetime">Tempo de autodestruição</string>
<string name="ShortMessageLifetimeForever">Desativado</string>
<string name="ShortMessageLifetime2s">2s</string>
<string name="ShortMessageLifetime5s">5s</string>
<string name="ShortMessageLifetime1m">1m</string>
<string name="ShortMessageLifetime1h">1h</string>
<string name="ShortMessageLifetime1d">1d</string>
<string name="ShortMessageLifetime1w">1 sem.</string>
<string name="EncryptionKeyDescription">Esta imagem é uma visualização da chave criptográfica para esta conversa secreta com <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>.<![CDATA[<br><br>]]>Se esta imagem aparecer da mesma forma no telefone de <![CDATA[<b>]]>%2$s\'s<![CDATA[</b>]]>, sua conversa é 200%% segura.<![CDATA[<br><br>]]>Saiba mais em telegram.org</string>
<!--settings view-->
<string name="ResetNotificationsText">Restaurar todas as configurações de notificação</string>
......@@ -434,6 +422,36 @@
<string name="FromContacts_few">de %1$d contatos</string>
<string name="FromContacts_many">de %1$d contatos</string>
<string name="FromContacts_other">de %1$d contatos</string>
<string name="Seconds_zero">%1$d seconds</string>
<string name="Seconds_one">%1$d second</string>
<string name="Seconds_two">%1$d seconds</string>
<string name="Seconds_few">%1$d seconds</string>
<string name="Seconds_many">%1$d seconds</string>
<string name="Seconds_other">%1$d seconds</string>
<string name="Minutes_zero">%1$d minutes</string>
<string name="Minutes_one">%1$d minute</string>
<string name="Minutes_two">%1$d minutes</string>
<string name="Minutes_few">%1$d minutes</string>
<string name="Minutes_many">%1$d minutes</string>
<string name="Minutes_other">%1$d minutes</string>
<string name="Hours_zero">%1$d hours</string>
<string name="Hours_one">%1$d hour</string>
<string name="Hours_two">%1$d hours</string>
<string name="Hours_few">%1$d hours</string>
<string name="Hours_many">%1$d hours</string>
<string name="Hours_other">%1$d hours</string>
<string name="Days_zero">%1$d days</string>
<string name="Days_one">%1$d day</string>
<string name="Days_two">%1$d days</string>
<string name="Days_few">%1$d days</string>
<string name="Days_many">%1$d days</string>
<string name="Days_other">%1$d days</string>
<string name="Weeks_zero">%1$d weeks</string>
<string name="Weeks_one">%1$d week</string>
<string name="Weeks_two">%1$d weeks</string>
<string name="Weeks_few">%1$d weeks</string>
<string name="Weeks_many">%1$d weeks</string>
<string name="Weeks_other">%1$d weeks</string>
<!--date formatters-->
<string name="formatterMonth">dd MMM</string>
<string name="formatterYear">dd.MM.yy</string>
......@@ -444,6 +462,4 @@
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatDateAtTime">%1$s às %2$s</string>
<!--Don't change this! Not for localization!-->
<string name="CacheTag">CACHE_TAG</string>
</resources>
\ No newline at end of file
......@@ -114,16 +114,10 @@
<!--notification-->
<string name="EncryptedChatRequested">Conversa secreta solicitada</string>
<string name="EncryptedChatAccepted">Conversa secreta iniciada</string>
<string name="MessageLifetimeChanged">%1$s estabeleceu o tempo de autodestruição para %2$s </string>
<string name="MessageLifetimeChanged">%1$s estabeleceu o tempo de autodestruição para %2$s</string>
<string name="MessageLifetimeChangedOutgoing">Você estabeleceu o tempo de autodestruição para %1$s</string>
<string name="MessageLifetimeRemoved">%1$s desativou o temporizador de autodestruição</string>
<string name="MessageLifetimeYouRemoved">Você desativou o temporizador de autodestruição</string>
<string name="MessageLifetime2s">2 segundos</string>
<string name="MessageLifetime5s">5 segundos</string>
<string name="MessageLifetime1m">1 minuto</string>
<string name="MessageLifetime1h">1 hora</string>
<string name="MessageLifetime1d">1 dia</string>
<string name="MessageLifetime1w">1 semana</string>
<string name="YouHaveNewMessage">Você tem uma nova mensagem</string>
<string name="NotificationMessageText">%1$s: %2$s</string>
<string name="NotificationMessageNoText">%1$s te enviou uma mensagem</string>
......@@ -202,12 +196,6 @@
<string name="EncryptionKey">Chave criptográfica</string>
<string name="MessageLifetime">Tempo de autodestruição</string>
<string name="ShortMessageLifetimeForever">Desativado</string>
<string name="ShortMessageLifetime2s">2s</string>
<string name="ShortMessageLifetime5s">5s</string>
<string name="ShortMessageLifetime1m">1m</string>
<string name="ShortMessageLifetime1h">1h</string>
<string name="ShortMessageLifetime1d">1d</string>
<string name="ShortMessageLifetime1w">1 sem.</string>
<string name="EncryptionKeyDescription">Esta imagem é uma visualização da chave criptográfica para esta conversa secreta com <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>.<![CDATA[<br><br>]]>Se esta imagem aparecer da mesma forma no telefone de <![CDATA[<b>]]>%2$s\'s<![CDATA[</b>]]>, sua conversa é 200%% segura.<![CDATA[<br><br>]]>Saiba mais em telegram.org</string>
<!--settings view-->
<string name="ResetNotificationsText">Restaurar todas as configurações de notificação</string>
......@@ -434,6 +422,36 @@
<string name="FromContacts_few">de %1$d contatos</string>
<string name="FromContacts_many">de %1$d contatos</string>
<string name="FromContacts_other">de %1$d contatos</string>
<string name="Seconds_zero">%1$d seconds</string>
<string name="Seconds_one">%1$d second</string>
<string name="Seconds_two">%1$d seconds</string>
<string name="Seconds_few">%1$d seconds</string>
<string name="Seconds_many">%1$d seconds</string>
<string name="Seconds_other">%1$d seconds</string>
<string name="Minutes_zero">%1$d minutes</string>
<string name="Minutes_one">%1$d minute</string>
<string name="Minutes_two">%1$d minutes</string>
<string name="Minutes_few">%1$d minutes</string>
<string name="Minutes_many">%1$d minutes</string>
<string name="Minutes_other">%1$d minutes</string>
<string name="Hours_zero">%1$d hours</string>
<string name="Hours_one">%1$d hour</string>
<string name="Hours_two">%1$d hours</string>
<string name="Hours_few">%1$d hours</string>
<string name="Hours_many">%1$d hours</string>
<string name="Hours_other">%1$d hours</string>
<string name="Days_zero">%1$d days</string>
<string name="Days_one">%1$d day</string>
<string name="Days_two">%1$d days</string>
<string name="Days_few">%1$d days</string>
<string name="Days_many">%1$d days</string>
<string name="Days_other">%1$d days</string>
<string name="Weeks_zero">%1$d weeks</string>
<string name="Weeks_one">%1$d week</string>
<string name="Weeks_two">%1$d weeks</string>
<string name="Weeks_few">%1$d weeks</string>
<string name="Weeks_many">%1$d weeks</string>
<string name="Weeks_other">%1$d weeks</string>
<!--date formatters-->
<string name="formatterMonth">dd MMM</string>
<string name="formatterYear">dd.MM.yy</string>
......@@ -444,6 +462,4 @@
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatDateAtTime">%1$s às %2$s</string>
<!--Don't change this! Not for localization!-->
<string name="CacheTag">CACHE_TAG</string>
</resources>
\ No newline at end of file
......@@ -118,12 +118,6 @@
<string name="MessageLifetimeChangedOutgoing">You set the self-destruct timer to %1$s</string>
<string name="MessageLifetimeRemoved">%1$s disabled the self-destruct timer</string>
<string name="MessageLifetimeYouRemoved">You disabled the self-destruct timer</string>
<string name="MessageLifetime2s">2 seconds</string>
<string name="MessageLifetime5s">5 seconds</string>
<string name="MessageLifetime1m">1 minute</string>
<string name="MessageLifetime1h">1 hour</string>
<string name="MessageLifetime1d">1 day</string>
<string name="MessageLifetime1w">1 week</string>
<string name="YouHaveNewMessage">You have a new message</string>
<string name="NotificationMessageText">%1$s: %2$s</string>
<string name="NotificationMessageNoText">%1$s sent you a message</string>
......@@ -202,12 +196,6 @@
<string name="EncryptionKey">Encryption Key</string>
<string name="MessageLifetime">Self-Destruct Timer</string>
<string name="ShortMessageLifetimeForever">Off</string>
<string name="ShortMessageLifetime2s">2s</string>
<string name="ShortMessageLifetime5s">5s</string>
<string name="ShortMessageLifetime1m">1m</string>
<string name="ShortMessageLifetime1h">1h</string>
<string name="ShortMessageLifetime1d">1d</string>
<string name="ShortMessageLifetime1w">1w</string>
<string name="EncryptionKeyDescription">This image is a visualization of the encryption key for this secret chat with <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>.<![CDATA[<br><br>]]>If this image looks the same on <![CDATA[<b>]]>%2$s\'s<![CDATA[</b>]]> phone, your chat is 200%% secure.<![CDATA[<br><br>]]>Learn more at telegram.org</string>
<!--settings view-->
<string name="ResetNotificationsText">Reset all notification settings to default</string>
......@@ -434,6 +422,36 @@
<string name="FromContacts_few">from %1$d contacts</string>
<string name="FromContacts_many">from %1$d contacts</string>
<string name="FromContacts_other">from %1$d contacts</string>
<string name="Seconds_zero">%1$d seconds</string>
<string name="Seconds_one">%1$d second</string>
<string name="Seconds_two">%1$d seconds</string>
<string name="Seconds_few">%1$d seconds</string>
<string name="Seconds_many">%1$d seconds</string>
<string name="Seconds_other">%1$d seconds</string>
<string name="Minutes_zero">%1$d minutes</string>
<string name="Minutes_one">%1$d minute</string>
<string name="Minutes_two">%1$d minutes</string>
<string name="Minutes_few">%1$d minutes</string>
<string name="Minutes_many">%1$d minutes</string>
<string name="Minutes_other">%1$d minutes</string>
<string name="Hours_zero">%1$d hours</string>
<string name="Hours_one">%1$d hour</string>
<string name="Hours_two">%1$d hours</string>
<string name="Hours_few">%1$d hours</string>
<string name="Hours_many">%1$d hours</string>
<string name="Hours_other">%1$d hours</string>
<string name="Days_zero">%1$d days</string>
<string name="Days_one">%1$d day</string>
<string name="Days_two">%1$d days</string>
<string name="Days_few">%1$d days</string>
<string name="Days_many">%1$d days</string>
<string name="Days_other">%1$d days</string>
<string name="Weeks_zero">%1$d weeks</string>
<string name="Weeks_one">%1$d week</string>
<string name="Weeks_two">%1$d weeks</string>
<string name="Weeks_few">%1$d weeks</string>
<string name="Weeks_many">%1$d weeks</string>
<string name="Weeks_other">%1$d weeks</string>
<!--date formatters-->
<string name="formatterMonth">MMM dd</string>
<string name="formatterYear">dd.MM.yy</string>
......@@ -444,6 +462,4 @@
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatDateAtTime">%1$s at %2$s</string>
<!--Don't change this! Not for localization!-->
<string name="CacheTag">CACHE_TAG</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment