From 1c2010a428fda5a03a96b27a9be817bdac3d2b17 Mon Sep 17 00:00:00 2001 From: DrKLO Date: Sun, 20 Jul 2014 03:31:49 +0400 Subject: [PATCH] Bug fixes --- TMessagesProj/build.gradle | 4 +- .../telegram/android/AndroidUtilities.java | 20 +- .../android/NotificationsController.java | 111 ++-- .../messenger/ConnectionsManager.java | 9 +- .../telegram/messenger/FileLoadOperation.java | 2 +- .../telegram/messenger/HandshakeAction.java | 14 +- .../org/telegram/ui/ApplicationLoader.java | 3 + .../org/telegram/ui/Cells/ChatOrUserCell.java | 2 +- .../java/org/telegram/ui/ChatActivity.java | 18 +- .../org/telegram/ui/LocationActivity.java | 3 + .../org/telegram/ui/MessagesActivity.java | 4 +- .../ui/PopupNotificationActivity.java | 4 + .../org/telegram/ui/SettingsActivity.java | 2 +- ...java => SettingsBlockedUsersActivity.java} | 4 +- .../ui/SettingsNotificationsActivity.java | 31 +- .../org/telegram/ui/VideoEditorActivity.java | 552 ++++++++++++++++++ .../telegram/ui/Views/ClippingImageView.java | 8 +- .../telegram/ui/Views/VideoSeekBarView.java | 133 +++++ .../telegram/ui/Views/VideoTimelineView.java | 285 +++++++++ .../src/main/res/drawable-hdpi/playback.png | Bin 0 -> 1466 bytes .../res/drawable-hdpi/playback_active.png | Bin 0 -> 1751 bytes .../src/main/res/drawable-hdpi/video_play.png | Bin 0 -> 2923 bytes .../src/main/res/drawable-ldpi/playback.png | Bin 0 -> 1156 bytes .../res/drawable-ldpi/playback_active.png | Bin 0 -> 1266 bytes .../src/main/res/drawable-ldpi/video_play.png | Bin 0 -> 1907 bytes .../src/main/res/drawable-mdpi/playback.png | Bin 0 -> 1267 bytes .../res/drawable-mdpi/playback_active.png | Bin 0 -> 1447 bytes .../src/main/res/drawable-mdpi/video_play.png | Bin 0 -> 2251 bytes .../src/main/res/drawable-xhdpi/playback.png | Bin 0 -> 1623 bytes .../res/drawable-xhdpi/playback_active.png | Bin 0 -> 2055 bytes .../main/res/drawable-xhdpi/video_play.png | Bin 0 -> 3634 bytes .../src/main/res/drawable-xxhdpi/playback.png | Bin 0 -> 2048 bytes .../res/drawable-xxhdpi/playback_active.png | Bin 0 -> 2757 bytes .../main/res/drawable-xxhdpi/video_play.png | Bin 0 -> 4971 bytes .../main/res/layout/chat_unread_layout.xml | 6 +- .../res/layout/group_create_done_layout.xml | 1 - .../main/res/layout/video_editor_layout.xml | 69 +++ .../src/main/res/values-ar/strings.xml | 6 + .../src/main/res/values-de/strings.xml | 6 + .../src/main/res/values-es/strings.xml | 6 + .../src/main/res/values-it/strings.xml | 6 + .../src/main/res/values-nl/strings.xml | 6 + .../src/main/res/values-pt-rBR/strings.xml | 6 + .../src/main/res/values-pt-rPT/strings.xml | 6 + TMessagesProj/src/main/res/values/strings.xml | 6 + 45 files changed, 1255 insertions(+), 78 deletions(-) rename TMessagesProj/src/main/java/org/telegram/ui/{SettingsBlockedUsers.java => SettingsBlockedUsersActivity.java} (98%) create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Views/VideoSeekBarView.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Views/VideoTimelineView.java create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/playback.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/playback_active.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/video_play.png create mode 100644 TMessagesProj/src/main/res/drawable-ldpi/playback.png create mode 100644 TMessagesProj/src/main/res/drawable-ldpi/playback_active.png create mode 100644 TMessagesProj/src/main/res/drawable-ldpi/video_play.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/playback.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/playback_active.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/video_play.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/playback.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/playback_active.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/video_play.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/playback.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/playback_active.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/video_play.png create mode 100644 TMessagesProj/src/main/res/layout/video_editor_layout.xml diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index c49d61bb5..601e9ba41 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -83,7 +83,7 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 19 - versionCode 281 - versionName "1.6.0" + versionCode 286 + versionName "1.6.1" } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java index 298e2ad3d..65752a19f 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java @@ -174,15 +174,23 @@ public class AndroidUtilities { public static File getCacheDir() { if (externalCacheNotAvailableState == 1 || externalCacheNotAvailableState == 0 && Environment.getExternalStorageState().startsWith(Environment.MEDIA_MOUNTED)) { externalCacheNotAvailableState = 1; - File file = ApplicationLoader.applicationContext.getExternalCacheDir(); - if (file != null) { - return file; + try { + File file = ApplicationLoader.applicationContext.getExternalCacheDir(); + if (file != null) { + return file; + } + } catch (Exception e) { + FileLog.e("tmessages", e); } } externalCacheNotAvailableState = 2; - File file = ApplicationLoader.applicationContext.getCacheDir(); - if (file != null) { - return file; + try { + File file = ApplicationLoader.applicationContext.getCacheDir(); + if (file != null) { + return file; + } + } catch (Exception e) { + FileLog.e("tmessages", e); } return new File(""); } diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java index e03e61c20..419d82f9a 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java @@ -354,30 +354,45 @@ public class NotificationsController { .setContentIntent(contentIntent); String lastMessage = null; - NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); - inboxStyle.setBigContentTitle(name); - int count = Math.min(10, pushMessages.size()); - for (int i = 0; i < count; i++) { - String message = getStringForMessage(pushMessages.get(i)); + if (pushMessages.size() == 1) { + String message = lastMessage = getStringForMessage(pushMessages.get(0)); if (message == null) { - continue; + return; } - if (i == 0) { - lastMessage = message; - } - if (pushDialogs.size() == 1) { - if (replace) { - if (chat != null) { - message = message.replace(" @ " + name, ""); - } else { - message = message.replace(name + ": ", "").replace(name + " ", ""); - } + if (replace) { + if (chat != null) { + message = message.replace(" @ " + name, ""); + } else { + message = message.replace(name + ": ", "").replace(name + " ", ""); } } - inboxStyle.addLine(message); + mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(message)); + } else { + NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); + inboxStyle.setBigContentTitle(name); + int count = Math.min(10, pushMessages.size()); + for (int i = 0; i < count; i++) { + String message = getStringForMessage(pushMessages.get(i)); + if (message == null) { + continue; + } + if (i == 0) { + lastMessage = message; + } + if (pushDialogs.size() == 1) { + if (replace) { + if (chat != null) { + message = message.replace(" @ " + name, ""); + } else { + message = message.replace(name + ": ", "").replace(name + " ", ""); + } + } + } + inboxStyle.addLine(message); + } + inboxStyle.setSummaryText(detailText); + mBuilder.setStyle(inboxStyle); } - inboxStyle.setSummaryText(detailText); - mBuilder.setStyle(inboxStyle); if (photoPath != null) { Bitmap img = FileLoader.getInstance().getImageFromMemory(photoPath, null, null, "50_50", false); @@ -547,38 +562,47 @@ public class NotificationsController { public void processDialogsUpdateRead(final HashMap dialogsToUpdate, boolean replace) { int old_unread_count = total_unread_count; + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Context.MODE_PRIVATE); for (HashMap.Entry entry : dialogsToUpdate.entrySet()) { - Long dialog_id = entry.getKey(); + long dialog_id = entry.getKey(); + + int notify_override = preferences.getInt("notify2_" + dialog_id, 0); + boolean isChat = (int)dialog_id < 0; Integer currentCount = pushDialogs.get(dialog_id); - Integer newCount = entry.getValue(); - if (replace) { - if (currentCount != null) { - total_unread_count -= currentCount; - } - if (newCount == 0) { - pushDialogs.remove(dialog_id); + if (!(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || isChat && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0)) { + Integer newCount = entry.getValue(); + if (replace) { + if (currentCount != null) { + total_unread_count -= currentCount; + } + if (newCount == 0) { + pushDialogs.remove(dialog_id); + } else { + total_unread_count += newCount; + pushDialogs.put(dialog_id, newCount); + } } else { + if (currentCount == null) { + currentCount = 0; + } + currentCount += newCount; total_unread_count += newCount; - pushDialogs.put(dialog_id, newCount); + pushDialogs.put(dialog_id, currentCount); } - } else { - if (currentCount == null) { - currentCount = 0; - } - currentCount += newCount; - total_unread_count += newCount; - pushDialogs.put(dialog_id, currentCount); } } if (old_unread_count != total_unread_count) { showOrUpdateNotification(notifyCheck); notifyCheck = false; } - setBadge(ApplicationLoader.applicationContext, total_unread_count); + if (preferences.getBoolean("badgeNumber", true)) { + setBadge(ApplicationLoader.applicationContext, total_unread_count); + } } public void processLoadedUnreadMessages(HashMap dialogs) { pushDialogs.clear(); + total_unread_count = 0; SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Context.MODE_PRIVATE); String dialogsToLoad = ""; for (HashMap.Entry entry : dialogs.entrySet()) { @@ -594,7 +618,20 @@ public class NotificationsController { dialogsToLoad += "" + dialog_id; } } - setBadge(ApplicationLoader.applicationContext, total_unread_count); + if (total_unread_count == 0) { + pushMessages.clear(); + pushMessagesDict.clear(); + popupMessages.clear(); + showOrUpdateNotification(false); + NotificationCenter.getInstance().postNotificationName(pushMessagesUpdated); + } + if (preferences.getBoolean("badgeNumber", true)) { + setBadge(ApplicationLoader.applicationContext, total_unread_count); + } + } + + public void setBadgeEnabled(boolean enabled) { + setBadge(ApplicationLoader.applicationContext, enabled ? total_unread_count : 0); } private void setBadge(Context context, int count) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java index ce85bd5a2..ca032f9ea 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java @@ -101,15 +101,18 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. public void run() { Utilities.stageQueue.handler.removeCallbacks(stageRunnable); if (datacenters != null) { + Datacenter datacenter = datacenterWithId(currentDatacenterId); if (sendingPushPing && lastPushPingTime < System.currentTimeMillis() - 30000 || Math.abs(lastPushPingTime - System.currentTimeMillis()) > 60000 * 3 + 10000) { lastPushPingTime = 0; sendingPushPing = false; + if (datacenter != null && datacenter.pushConnection != null) { + datacenter.pushConnection.suspendConnection(true); + } FileLog.e("tmessages", "push ping timeout"); } if (lastPushPingTime < System.currentTimeMillis() - 60000 * 3) { FileLog.e("tmessages", "time for push ping"); lastPushPingTime = System.currentTimeMillis(); - Datacenter datacenter = datacenterWithId(currentDatacenterId); if (datacenter != null) { generatePing(datacenter, true); } @@ -448,7 +451,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. datacenter = new Datacenter(); datacenter.datacenterId = 4; - datacenter.addAddressAndPort("31.210.235.12", 443); + datacenter.addAddressAndPort("149.154.167.90", 443); datacenters.put(datacenter.datacenterId, datacenter); datacenter = new Datacenter(); @@ -2374,7 +2377,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. FileLog.e("tmessages", "no network available"); } } catch (Exception e) { - FileLog.e("tmessages", "NETWORK STATE GET ERROR"); + FileLog.e("tmessages", "NETWORK STATE GET ERROR", e); } } final int stateCopy = connectionState; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java index aaac83a3f..cf54747f4 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java @@ -674,7 +674,7 @@ public class FileLoadOperation { } } - if (downloadedBytes % downloadChunkSize == 0 || totalBytesCount > 0 && totalBytesCount > downloadedBytes) { + if (totalBytesCount != downloadedBytes && downloadedBytes % downloadChunkSize == 0 || totalBytesCount > 0 && totalBytesCount > downloadedBytes) { startDownloadRequest(); } else { onFinishLoadingFile(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java b/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java index d2632e96e..49f6cedaf 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java @@ -174,17 +174,13 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti } ByteBufferDesc sendMessageData(TLObject message, long messageId) { - ByteBufferDesc innerOs = BuffersStorage.getInstance().getFreeBuffer(message.getObjectSize()); - message.serializeToStream(innerOs); - message.freeResources(); - - ByteBufferDesc messageOs = BuffersStorage.getInstance().getFreeBuffer(8 + 8 + 4 + innerOs.length()); + int messageLength = message.getObjectSize(); + ByteBufferDesc messageOs = BuffersStorage.getInstance().getFreeBuffer(8 + 8 + 4 + messageLength); messageOs.writeInt64(0); messageOs.writeInt64(messageId); - messageOs.writeInt32(innerOs.length()); - innerOs.position(0); - messageOs.writeRaw(innerOs); - BuffersStorage.getInstance().reuseFreeBuffer(innerOs); + messageOs.writeInt32(messageLength); + message.serializeToStream(messageOs); + message.freeResources(); datacenter.connection.sendData(messageOs, false, false); return messageOs; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ApplicationLoader.java b/TMessagesProj/src/main/java/org/telegram/ui/ApplicationLoader.java index f93145ef6..949dced5d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ApplicationLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ApplicationLoader.java @@ -30,6 +30,7 @@ import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.gcm.GoogleCloudMessaging; import org.telegram.android.AndroidUtilities; +import org.telegram.android.ContactsController; import org.telegram.android.NotificationsService; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ConnectionsManager; @@ -128,6 +129,8 @@ public class ApplicationLoader extends Application { ApplicationLoader app = (ApplicationLoader)ApplicationLoader.applicationContext; app.initPlayServices(); FileLog.e("tmessages", "app initied"); + + ContactsController.getInstance().checkAppAccount(); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatOrUserCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatOrUserCell.java index 1bf92a356..8aa33a10d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatOrUserCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatOrUserCell.java @@ -307,7 +307,7 @@ public class ChatOrUserCell extends BaseCell { nameString = nameString2.replace("\n", " "); } if (nameString.length() == 0) { - if (user.phone != null && user.phone.length() != 0) { + if (user != null && user.phone != null && user.phone.length() != 0) { nameString = PhoneFormat.getInstance().format("+" + user.phone); } else { nameString = LocaleController.getString("HiddenName", R.string.HiddenName); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 6c47363c8..07d4546da 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -89,7 +89,8 @@ import java.util.HashMap; import java.util.concurrent.Semaphore; public class ChatActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, MessagesActivity.MessagesActivityDelegate, - DocumentSelectActivity.DocumentSelectActivityDelegate, PhotoViewer.PhotoViewerProvider, PhotoPickerActivity.PhotoPickerActivityDelegate { + DocumentSelectActivity.DocumentSelectActivityDelegate, PhotoViewer.PhotoViewerProvider, PhotoPickerActivity.PhotoPickerActivityDelegate, + VideoEditorActivity.VideoEditorActivityDelegate { private ChatActivityEnterView chatActivityEnterView; private View timeItem; @@ -1318,7 +1319,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } currentPicturePath = null; } - processSendingVideo(videoPath); + /*if(android.os.Build.VERSION.SDK_INT >= 10) { + Bundle args = new Bundle(); + args.putString("videoPath", videoPath); + VideoEditorActivity fragment = new VideoEditorActivity(args); + fragment.setDelegate(this); + presentFragment(fragment); + } else {*/ + processSendingVideo(videoPath); + //} } else if (requestCode == 21) { if (data == null || data.getData() == null) { showAttachmentError(); @@ -1339,6 +1348,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } + @Override + public void didFinishedVideoConverting(String videoPath) { + processSendingVideo(videoPath); + } + private void showAttachmentError() { if (getParentActivity() == null) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java index c04854679..a31d9eff3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java @@ -133,6 +133,9 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } avatarImageView = (BackupImageView)fragmentView.findViewById(R.id.location_avatar_view); + if (avatarImageView != null) { + avatarImageView.processDetach = false; + } nameTextView = (TextView)fragmentView.findViewById(R.id.location_name_label); distanceTextView = (TextView)fragmentView.findViewById(R.id.location_distance_label); View bottomView = fragmentView.findViewById(R.id.location_bottom_view); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java index 6a98eca3b..ecdbd2c39 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java @@ -506,12 +506,12 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter builder.setMessage(LocaleController.formatStringSimple(selectAlertString, Utilities.formatName(user.first_name, user.last_name))); } CheckBox checkBox = null; - if (delegate instanceof ChatActivity) { + /*if (delegate instanceof ChatActivity) { checkBox = new CheckBox(getParentActivity()); checkBox.setText(LocaleController.getString("ForwardFromMyName", R.string.ForwardFromMyName)); checkBox.setChecked(false); builder.setView(checkBox); - } + }*/ final CheckBox checkBoxFinal = checkBox; builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() { @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java index c6f1b7dcb..c2f86eaf1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java @@ -150,6 +150,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC NotificationCenter.getInstance().addObserver(this, MessagesController.updateInterfaces); NotificationCenter.getInstance().addObserver(this, MediaController.audioProgressDidChanged); NotificationCenter.getInstance().addObserver(this, MediaController.audioDidReset); + NotificationCenter.getInstance().addObserver(this, MessagesController.contactsDidLoaded); NotificationCenter.getInstance().addObserver(this, 999); chatActivityEnterView = new ChatActivityEnterView(); @@ -940,6 +941,8 @@ public class PopupNotificationActivity extends Activity implements NotificationC view.invalidate(); } } + } else if (id == MessagesController.contactsDidLoaded) { + updateSubtitle(); } } @@ -962,6 +965,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC NotificationCenter.getInstance().removeObserver(this, MessagesController.updateInterfaces); NotificationCenter.getInstance().removeObserver(this, MediaController.audioProgressDidChanged); NotificationCenter.getInstance().removeObserver(this, MediaController.audioDidReset); + NotificationCenter.getInstance().removeObserver(this, MessagesController.contactsDidLoaded); NotificationCenter.getInstance().removeObserver(this, 999); if (chatActivityEnterView != null) { chatActivityEnterView.onDestroy(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index 3ac4d2356..1c4d1697a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -293,7 +293,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter } else if (i == notificationRow) { presentFragment(new SettingsNotificationsActivity()); } else if (i == blockedRow) { - presentFragment(new SettingsBlockedUsers()); + presentFragment(new SettingsBlockedUsersActivity()); } else if (i == backgroundRow) { presentFragment(new SettingsWallpapersActivity()); } else if (i == askQuestionRow) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsBlockedUsers.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsBlockedUsersActivity.java similarity index 98% rename from TMessagesProj/src/main/java/org/telegram/ui/SettingsBlockedUsers.java rename to TMessagesProj/src/main/java/org/telegram/ui/SettingsBlockedUsersActivity.java index 54345daf2..29afea2a8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsBlockedUsers.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsBlockedUsersActivity.java @@ -38,7 +38,7 @@ import org.telegram.ui.Views.ActionBar.BaseFragment; import java.util.ArrayList; import java.util.HashMap; -public class SettingsBlockedUsers extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, ContactsActivity.ContactsActivityDelegate { +public class SettingsBlockedUsersActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, ContactsActivity.ContactsActivityDelegate { private ListView listView; private ListAdapter listViewAdapter; private boolean loading; @@ -82,7 +82,7 @@ public class SettingsBlockedUsers extends BaseFragment implements NotificationCe args.putBoolean("usersAsSections", true); args.putBoolean("returnAsResult", true); ContactsActivity fragment = new ContactsActivity(args); - fragment.setDelegate(SettingsBlockedUsers.this); + fragment.setDelegate(SettingsBlockedUsersActivity.this); presentFragment(fragment); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java index 4e504247c..9b7298bb7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java @@ -28,6 +28,7 @@ import android.widget.TextView; import android.widget.Toast; import org.telegram.android.LocaleController; +import org.telegram.android.NotificationsController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.TLObject; import org.telegram.messenger.TLRPC; @@ -67,7 +68,8 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif private int inappPreviewRow; private int eventsSectionRow; private int contactJoinedRow; - private int pebbleSectionRow; + private int otherSectionRow; + private int badgeNumberRow; private int pebbleAlertRow; private int resetSectionRow; private int resetNotificationsRow; @@ -96,7 +98,8 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif inappPreviewRow = rowCount++; eventsSectionRow = rowCount++; contactJoinedRow = rowCount++; - pebbleSectionRow = rowCount++; + otherSectionRow = rowCount++; + badgeNumberRow = rowCount++; pebbleAlertRow = rowCount++; resetSectionRow = rowCount++; resetNotificationsRow = rowCount++; @@ -279,6 +282,14 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif editor.putBoolean("EnablePebbleNotifications", !enabled); editor.commit(); listView.invalidateViews(); + } else if (i == badgeNumberRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + boolean enabled = preferences.getBoolean("badgeNumber", true); + editor.putBoolean("badgeNumber", !enabled); + editor.commit(); + listView.invalidateViews(); + NotificationsController.getInstance().setBadgeEnabled(!enabled); } else if (i == notificationsServiceRow) { final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); boolean enabled = preferences.getBoolean("pushService", true); @@ -480,7 +491,7 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif @Override public boolean isEnabled(int i) { - return !(i == messageSectionRow || i == groupSectionRow || i == inappSectionRow || i == eventsSectionRow || i == pebbleSectionRow || i == resetSectionRow); + return !(i == messageSectionRow || i == groupSectionRow || i == inappSectionRow || i == eventsSectionRow || i == otherSectionRow || i == resetSectionRow); } @Override @@ -520,8 +531,8 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif textView.setText(LocaleController.getString("InAppNotifications", R.string.InAppNotifications)); } else if (i == eventsSectionRow) { textView.setText(LocaleController.getString("Events", R.string.Events)); - } else if (i == pebbleSectionRow) { - textView.setText(LocaleController.getString("Pebble", R.string.Pebble)); + } else if (i == otherSectionRow) { + textView.setText(LocaleController.getString("PhoneOther", R.string.PhoneOther)); } else if (i == resetSectionRow) { textView.setText(LocaleController.getString("Reset", R.string.Reset)); } @@ -581,12 +592,16 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif divider.setVisibility(View.INVISIBLE); } else if (i == pebbleAlertRow) { enabled = preferences.getBoolean("EnablePebbleNotifications", false); - textView.setText(LocaleController.getString("Alert", R.string.Alert)); + textView.setText(LocaleController.getString("Pebble", R.string.Pebble)); divider.setVisibility(View.INVISIBLE); } else if (i == notificationsServiceRow) { enabled = preferences.getBoolean("pushService", true); textView.setText(LocaleController.getString("NotificationsService", R.string.NotificationsService)); divider.setVisibility(View.INVISIBLE); + } else if (i == badgeNumberRow) { + enabled = preferences.getBoolean("badgeNumber", true); + textView.setText(LocaleController.getString("BadgeNumber", R.string.BadgeNumber)); + divider.setVisibility(View.VISIBLE); } if (enabled) { checkButton.setImageResource(R.drawable.btn_check_on); @@ -664,13 +679,13 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif @Override public int getItemViewType(int i) { - if (i == messageSectionRow || i == groupSectionRow || i == inappSectionRow || i == eventsSectionRow || i == pebbleSectionRow || i == resetSectionRow) { + if (i == messageSectionRow || i == groupSectionRow || i == inappSectionRow || i == eventsSectionRow || i == otherSectionRow || i == resetSectionRow) { return 0; } else if (i == messageAlertRow || i == messagePreviewRow || i == messageVibrateRow || i == groupAlertRow || i == groupPreviewRow || i == groupVibrateRow || i == inappSoundRow || i == inappVibrateRow || i == inappPreviewRow || i == contactJoinedRow || - i == pebbleAlertRow || i == notificationsServiceRow) { + i == pebbleAlertRow || i == notificationsServiceRow || i == badgeNumberRow) { return 1; } else if (i == messageLedRow || i == groupLedRow) { return 3; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java new file mode 100644 index 000000000..2774c356b --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java @@ -0,0 +1,552 @@ +/* + * 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; + +import android.content.res.Configuration; +import android.media.MediaPlayer; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +import com.coremedia.iso.boxes.Container; +import com.googlecode.mp4parser.authoring.Movie; +import com.googlecode.mp4parser.authoring.Track; +import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder; +import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator; +import com.googlecode.mp4parser.authoring.tracks.CroppedTrack; + +import org.telegram.android.AndroidUtilities; +import org.telegram.android.LocaleController; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; +import org.telegram.ui.Views.ActionBar.ActionBarLayer; +import org.telegram.ui.Views.ActionBar.ActionBarMenu; +import org.telegram.ui.Views.ActionBar.BaseFragment; +import org.telegram.ui.Views.VideoSeekBarView; +import org.telegram.ui.Views.VideoTimelineView; + +import java.io.File; +import java.io.FileOutputStream; +import java.nio.channels.FileChannel; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +public class VideoEditorActivity extends BaseFragment implements SurfaceHolder.Callback { + + private MediaPlayer videoPlayer = null; + private SurfaceHolder surfaceHolder = null; + private VideoTimelineView videoTimelineView = null; + private View videoContainerView = null; + private TextView originalSizeTextView = null; + private TextView editedSizeTextView = null; + private View textContainerView = null; + private ImageView playButton = null; + private VideoSeekBarView videoSeekBarView = null; + + private boolean initied = false; + private String videoPath = null; + private int videoWidth; + private int videoHeight; + private float lastProgress = 0; + private boolean needSeek = false; + private VideoEditorActivityDelegate delegate; + + public interface VideoEditorActivityDelegate { + public abstract void didFinishedVideoConverting(String videoPath); + } + + private Runnable progressRunnable = new Runnable() { + @Override + public void run() { + while (videoPlayer.isPlaying()) { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + if (videoPlayer.isPlaying()) { + float startTime = videoTimelineView.getLeftProgress() * videoPlayer.getDuration(); + float endTime = videoTimelineView.getRightProgress() * videoPlayer.getDuration(); + if (startTime == endTime) { + startTime = endTime - 0.01f; + } + float progress = (videoPlayer.getCurrentPosition() - startTime) / (endTime - startTime); + if (progress > lastProgress) { + videoSeekBarView.setProgress(progress); + lastProgress = progress; + } + if (videoPlayer.getCurrentPosition() >= endTime) { + try { + videoPlayer.pause(); + onPlayComplete(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } + } + }); + try { + Thread.sleep(50); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } + }; + + public VideoEditorActivity(Bundle args) { + super(args); + videoPath = args.getString("videoPath"); + } + + @Override + public boolean onFragmentCreate() { + if (videoPath == null) { + return false; + } + videoPlayer = new MediaPlayer(); + videoPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mp) { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + onPlayComplete(); + } + }); + } + }); + return super.onFragmentCreate(); + } + + @Override + public void onFragmentDestroy() { + if (videoTimelineView != null) { + videoTimelineView.destroy(); + } + super.onFragmentDestroy(); + } + + @Override + public View createView(LayoutInflater inflater, ViewGroup container) { + if (fragmentView == null) { + actionBarLayer.setBackgroundColor(0xff333333); + actionBarLayer.setItemsBackground(R.drawable.bar_selector_white); + actionBarLayer.setDisplayHomeAsUpEnabled(true, R.drawable.photo_back); + actionBarLayer.setTitle(LocaleController.getString("EditVideo", R.string.EditVideo)); + actionBarLayer.setActionBarMenuOnItemClick(new ActionBarLayer.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == 1) { + try { + startConvert(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } + }); + + ActionBarMenu menu = actionBarLayer.createMenu(); + View doneItem = menu.addItemResource(1, R.layout.group_create_done_layout); + + TextView doneTextView = (TextView)doneItem.findViewById(R.id.done_button); + doneTextView.setText(LocaleController.getString("Done", R.string.Done).toUpperCase()); + + fragmentView = inflater.inflate(R.layout.video_editor_layout, container, false); + originalSizeTextView = (TextView)fragmentView.findViewById(R.id.original_size); + editedSizeTextView = (TextView)fragmentView.findViewById(R.id.edited_size); + videoContainerView = fragmentView.findViewById(R.id.video_container); + textContainerView = fragmentView.findViewById(R.id.info_container); + + videoTimelineView = (VideoTimelineView)fragmentView.findViewById(R.id.video_timeline_view); + videoTimelineView.setVideoPath(videoPath); + videoTimelineView.setDelegate(new VideoTimelineView.VideoTimelineViewDelegate() { + @Override + public void onLeftProgressChanged(float progress) { + try { + if (videoPlayer.isPlaying()) { + videoPlayer.pause(); + playButton.setImageResource(R.drawable.video_play); + } + videoPlayer.setOnSeekCompleteListener(null); + videoPlayer.seekTo((int)(videoPlayer.getDuration() * progress)); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + needSeek = true; + videoSeekBarView.setProgress(0); + updateVideoEditedInfo(); + } + + @Override + public void onRifhtProgressChanged(float progress) { + try { + if (videoPlayer.isPlaying()) { + videoPlayer.pause(); + playButton.setImageResource(R.drawable.video_play); + } + videoPlayer.setOnSeekCompleteListener(null); + videoPlayer.seekTo((int)(videoPlayer.getDuration() * progress)); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + needSeek = true; + videoSeekBarView.setProgress(0); + updateVideoEditedInfo(); + } + }); + + videoSeekBarView = (VideoSeekBarView)fragmentView.findViewById(R.id.video_seekbar); + videoSeekBarView.delegate = new VideoSeekBarView.SeekBarDelegate() { + @Override + public void onSeekBarDrag(float progress) { + if (videoPlayer.isPlaying()) { + try { + float prog = videoTimelineView.getLeftProgress() + (videoTimelineView.getRightProgress() - videoTimelineView.getLeft()) * progress; + videoPlayer.seekTo((int)(videoPlayer.getDuration() * prog)); + lastProgress = progress; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else { + lastProgress = progress; + needSeek = true; + } + } + }; + + playButton = (ImageView)fragmentView.findViewById(R.id.play_button); + playButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (surfaceHolder.isCreating()) { + return; + } + play(); + } + }); + + SurfaceView surfaceView = (SurfaceView) fragmentView.findViewById(R.id.video_view); + surfaceHolder = surfaceView.getHolder(); + surfaceHolder.addCallback(this); + surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + surfaceHolder.setFixedSize(270, 480); + + updateVideoOriginalInfo(); + updateVideoEditedInfo(); + } else { + ViewGroup parent = (ViewGroup)fragmentView.getParent(); + if (parent != null) { + parent.removeView(fragmentView); + } + } + return fragmentView; + } + + @Override + public void onResume() { + super.onResume(); + fixLayout(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + fixLayout(); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + videoPlayer.setDisplay(holder); + try { + videoPlayer.setDataSource(videoPath); + videoPlayer.prepare(); + videoWidth = videoPlayer.getVideoWidth(); + videoHeight = videoPlayer.getVideoHeight(); + fixVideoSize(); + videoPlayer.seekTo((int) (videoTimelineView.getLeftProgress() * videoPlayer.getDuration())); + initied = true; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + updateVideoOriginalInfo(); + updateVideoEditedInfo(); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + videoPlayer.setDisplay(null); + } + + private void onPlayComplete() { + playButton.setImageResource(R.drawable.video_play); + videoSeekBarView.setProgress(0); + try { + videoPlayer.seekTo((int) (videoTimelineView.getLeftProgress() * videoPlayer.getDuration())); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + private void updateVideoOriginalInfo() { + if (!initied || originalSizeTextView == null) { + return; + } + File file = new File(videoPath); + String videoDimension = String.format("%dx%d", videoPlayer.getVideoWidth(), videoPlayer.getVideoHeight()); + int minutes = videoPlayer.getDuration() / 1000 / 60; + int seconds = (int)Math.ceil(videoPlayer.getDuration() / 1000) - minutes * 60; + String videoTimeSize = String.format("%d:%02d, %s", minutes, seconds, Utilities.formatFileSize(file.length())); + originalSizeTextView.setText(String.format("%s: %s, %s", LocaleController.getString("OriginalVideo", R.string.OriginalVideo), videoDimension, videoTimeSize)); + } + + private void updateVideoEditedInfo() { + if (!initied || editedSizeTextView == null) { + return; + } + File file = new File(videoPath); + long size = file.length(); + float videoWidth = videoPlayer.getVideoWidth(); + float videoHeight = videoPlayer.getVideoHeight(); + if (videoWidth > 640 || videoHeight > 640) { + float scale = videoWidth > videoHeight ? 640.0f / videoWidth : 640.0f / videoHeight; + videoWidth *= scale; + videoHeight *= scale; + size *= (scale * scale); + } + String videoDimension = String.format("%dx%d", (int)videoWidth, (int)videoHeight); + int minutes = videoPlayer.getDuration() / 1000 / 60; + int seconds = (int)Math.ceil(videoPlayer.getDuration() / 1000) - minutes * 60; + String videoTimeSize = String.format("%d:%02d, ~%s", minutes, seconds, Utilities.formatFileSize(size)); + editedSizeTextView.setText(String.format("%s: %s, %s", LocaleController.getString("EditedVideo", R.string.EditedVideo), videoDimension, videoTimeSize)); + } + + private void fixVideoSize() { + if (videoWidth == 0 || videoHeight == 0 || fragmentView == null || getParentActivity() == null) { + return; + } + int viewHeight = 0; + if (!Utilities.isTablet(getParentActivity()) && getParentActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + viewHeight = AndroidUtilities.displaySize.y - AndroidUtilities.statusBarHeight - AndroidUtilities.dp(40); + } else { + viewHeight = AndroidUtilities.displaySize.y - AndroidUtilities.statusBarHeight - AndroidUtilities.dp(48); + } + + int width = 0; + int height = 0; + if (getParentActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + width = AndroidUtilities.displaySize.x - AndroidUtilities.displaySize.x / 2 - AndroidUtilities.dp(24); + height = viewHeight - AndroidUtilities.dp(32); + } else { + width = AndroidUtilities.displaySize.x; + height = viewHeight - AndroidUtilities.dp(176); + } + + float wr = (float)width / (float)videoWidth; + float hr = (float)height / (float)videoHeight; + float ar = (float)videoWidth / (float)videoHeight; + + if (wr > hr) { + width = (int) (height * ar); + } else { + height = (int) (width / ar); + } + + surfaceHolder.setFixedSize(width, height); + } + + private void fixLayout() { + if (originalSizeTextView == null) { + return; + } + originalSizeTextView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + originalSizeTextView.getViewTreeObserver().removeOnPreDrawListener(this); + if (getParentActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)videoContainerView.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(16); + layoutParams.bottomMargin = AndroidUtilities.dp(16); + layoutParams.width = AndroidUtilities.displaySize.x / 2 - AndroidUtilities.dp(24); + layoutParams.leftMargin = AndroidUtilities.dp(16); + videoContainerView.setLayoutParams(layoutParams); + + layoutParams = (FrameLayout.LayoutParams)textContainerView.getLayoutParams(); + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.width = AndroidUtilities.displaySize.x / 2 - AndroidUtilities.dp(24); + layoutParams.leftMargin = AndroidUtilities.displaySize.x / 2 + AndroidUtilities.dp(8); + layoutParams.rightMargin = AndroidUtilities.dp(16); + layoutParams.topMargin = AndroidUtilities.dp(16); + textContainerView.setLayoutParams(layoutParams); + } else { + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)videoContainerView.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(16); + layoutParams.bottomMargin = AndroidUtilities.dp(160); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.leftMargin = 0; + videoContainerView.setLayoutParams(layoutParams); + + layoutParams = (FrameLayout.LayoutParams)textContainerView.getLayoutParams(); + layoutParams.height = AndroidUtilities.dp(143); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.leftMargin = 0; + layoutParams.rightMargin = 0; + layoutParams.topMargin = 0; + textContainerView.setLayoutParams(layoutParams); + } + fixVideoSize(); + videoTimelineView.clearFrames(); + return false; + } + }); + } + + private void play() { + if (videoPlayer.isPlaying()) { + videoPlayer.pause(); + playButton.setImageResource(R.drawable.video_play); + } else { + try { + playButton.setImageDrawable(null); + lastProgress = 0; + if (needSeek) { + float prog = videoTimelineView.getLeftProgress() + (videoTimelineView.getRightProgress() - videoTimelineView.getLeft()) * videoSeekBarView.getProgress(); + videoPlayer.seekTo((int)(videoPlayer.getDuration() * prog)); + needSeek = false; + } + videoPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() { + @Override + public void onSeekComplete(MediaPlayer mp) { + float startTime = videoTimelineView.getLeftProgress() * videoPlayer.getDuration(); + float endTime = videoTimelineView.getRightProgress() * videoPlayer.getDuration(); + if (startTime == endTime) { + startTime = endTime - 0.01f; + } + lastProgress = (videoPlayer.getCurrentPosition() - startTime) / (endTime - startTime); + videoSeekBarView.setProgress(lastProgress); + } + }); + videoPlayer.start(); + new Thread(progressRunnable).start(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } + + public void setDelegate(VideoEditorActivityDelegate delegate) { + this.delegate = delegate; + } + + private void startConvert() throws Exception { + Movie movie = MovieCreator.build(videoPath); + + List tracks = movie.getTracks(); + movie.setTracks(new LinkedList()); + + double startTime = videoTimelineView.getLeftProgress() * videoPlayer.getDuration() / 1000.0; + double endTime = videoTimelineView.getRightProgress() * videoPlayer.getDuration() / 1000.0; + + boolean timeCorrected = false; + for (Track track : tracks) { + if (track.getSyncSamples() != null && track.getSyncSamples().length > 0) { + if (timeCorrected) { + throw new RuntimeException("The startTime has already been corrected by another track with SyncSample. Not Supported."); + } + startTime = correctTimeToSyncSample(track, startTime, false); + endTime = correctTimeToSyncSample(track, endTime, true); + timeCorrected = true; + } + } + + for (Track track : tracks) { + long currentSample = 0; + double currentTime = 0; + double lastTime = 0; + long startSample = -1; + long endSample = -1; + + for (int i = 0; i < track.getSampleDurations().length; i++) { + long delta = track.getSampleDurations()[i]; + if (currentTime > lastTime && currentTime <= startTime) { + startSample = currentSample; + } + if (currentTime > lastTime && currentTime <= endTime) { + endSample = currentSample; + } + lastTime = currentTime; + currentTime += (double) delta / (double) track.getTrackMetaData().getTimescale(); + currentSample++; + } + movie.addTrack(new CroppedTrack(track, startSample, endSample)); + } + long start1 = System.currentTimeMillis(); + Container out = new DefaultMp4Builder().build(movie); + long start2 = System.currentTimeMillis(); + + String fileName = Integer.MIN_VALUE + "_" + UserConfig.lastLocalId + ".mp4"; + UserConfig.lastLocalId--; + File cacheFile = new File(AndroidUtilities.getCacheDir(), fileName); + UserConfig.saveConfig(false); + + FileOutputStream fos = new FileOutputStream(cacheFile); + FileChannel fc = fos.getChannel(); + out.writeContainer(fc); + + fc.close(); + fos.close(); + if (delegate != null) { + delegate.didFinishedVideoConverting(cacheFile.getAbsolutePath()); + finishFragment(); + } + } + + private static double correctTimeToSyncSample(Track track, double cutHere, boolean next) { + double[] timeOfSyncSamples = new double[track.getSyncSamples().length]; + long currentSample = 0; + double currentTime = 0; + for (int i = 0; i < track.getSampleDurations().length; i++) { + long delta = track.getSampleDurations()[i]; + if (Arrays.binarySearch(track.getSyncSamples(), currentSample + 1) >= 0) { + timeOfSyncSamples[Arrays.binarySearch(track.getSyncSamples(), currentSample + 1)] = currentTime; + } + currentTime += (double) delta / (double) track.getTrackMetaData().getTimescale(); + currentSample++; + } + double previous = 0; + for (double timeOfSyncSample : timeOfSyncSamples) { + if (timeOfSyncSample > cutHere) { + if (next) { + return timeOfSyncSample; + } else { + return previous; + } + } + previous = timeOfSyncSample; + } + return timeOfSyncSamples[timeOfSyncSamples.length - 1]; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/ClippingImageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/ClippingImageView.java index 69b04d21d..543272ba2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/ClippingImageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/ClippingImageView.java @@ -15,6 +15,8 @@ import android.graphics.Paint; import android.graphics.Rect; import android.view.View; +import org.telegram.messenger.FileLog; + public class ClippingImageView extends View { private int clipBottom; private int clipLeft; @@ -64,7 +66,11 @@ public class ClippingImageView extends View { canvas.save(); canvas.clipRect(clipLeft / getScaleY(), clipTop / getScaleY(), getWidth() - clipRight / getScaleY(), getHeight() - clipBottom / getScaleY()); drawRect.set(0, 0, getWidth(), getHeight()); - canvas.drawBitmap(this.bmp, null, drawRect, this.paint); + try { + canvas.drawBitmap(this.bmp, null, drawRect, this.paint); + } catch (Exception e) { + FileLog.e("tmessages", e); + } canvas.restore(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/VideoSeekBarView.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/VideoSeekBarView.java new file mode 100644 index 000000000..4bdab183d --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/VideoSeekBarView.java @@ -0,0 +1,133 @@ +/* + * 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.Views; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import org.telegram.android.AndroidUtilities; +import org.telegram.messenger.R; + +public class VideoSeekBarView extends View { + + private static Drawable thumbDrawable1; + private static Drawable thumbDrawablePressed1; + private static Paint innerPaint1 = new Paint(); + private static int thumbWidth; + private static int thumbHeight; + private int thumbDX = 0; + private float progress = 0; + private boolean pressed = false; + public SeekBarDelegate delegate; + + public abstract interface SeekBarDelegate { + public void onSeekBarDrag(float progress); + } + + private void init(Context context) { + if (thumbDrawable1 == null) { + thumbDrawable1 = context.getResources().getDrawable(R.drawable.playback); + thumbDrawablePressed1 = context.getResources().getDrawable(R.drawable.playback_active); + innerPaint1.setColor(0x99999999); + thumbWidth = thumbDrawable1.getIntrinsicWidth(); + thumbHeight = thumbDrawable1.getIntrinsicHeight(); + } + } + + public VideoSeekBarView(Context context) { + super(context); + init(context); + } + + public VideoSeekBarView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public VideoSeekBarView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event == null) { + return false; + } + float x = event.getX(); + float y = event.getY(); + float thumbX = (int)((getMeasuredWidth() - thumbWidth) * progress); + if (event.getAction() == MotionEvent.ACTION_DOWN) { + int additionWidth = (getMeasuredHeight() - thumbWidth) / 2; + if (thumbX - additionWidth <= x && x <= thumbX + thumbWidth + additionWidth && y >= 0 && y <= getMeasuredHeight()) { + pressed = true; + thumbDX = (int)(x - thumbX); + getParent().requestDisallowInterceptTouchEvent(true); + invalidate(); + return true; + } + } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { + if (pressed) { + if (event.getAction() == MotionEvent.ACTION_UP && delegate != null) { + delegate.onSeekBarDrag(thumbX / (float)(getMeasuredWidth() - thumbWidth)); + } + pressed = false; + invalidate(); + return true; + } + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + if (pressed) { + thumbX = (int)(x - thumbDX); + if (thumbX < 0) { + thumbX = 0; + } else if (thumbX > getMeasuredWidth() - thumbWidth) { + thumbX = getMeasuredWidth() - thumbWidth; + } + progress = thumbX / (getMeasuredWidth() - thumbWidth); + invalidate(); + return true; + } + } + return false; + } + + public void setProgress(float progress) { + if (progress < 0) { + progress = 0; + } else if (progress > 1) { + progress = 1; + } + this.progress = progress; + invalidate(); + } + + public float getProgress() { + return progress; + } + + @Override + protected void onDraw(Canvas canvas) { + Drawable thumb = null; + if (!pressed) { + thumb = thumbDrawable1; + } else { + thumb = thumbDrawablePressed1; + } + int y = (getMeasuredHeight() - thumbHeight) / 2; + int thumbX = (int)((getMeasuredWidth() - thumbWidth) * progress); + canvas.drawRect(thumbWidth / 2, getMeasuredHeight() / 2 - AndroidUtilities.dp(1), getMeasuredWidth() - thumbWidth / 2, getMeasuredHeight() / 2 + AndroidUtilities.dp(1), innerPaint1); + thumb.setBounds(thumbX, y, thumbX + thumbWidth, y + thumbHeight); + thumb.draw(canvas); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/VideoTimelineView.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/VideoTimelineView.java new file mode 100644 index 000000000..f8fe8e21f --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/VideoTimelineView.java @@ -0,0 +1,285 @@ +/* + * 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.Views; + +import android.annotation.TargetApi; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.media.MediaMetadataRetriever; +import android.os.AsyncTask; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import org.telegram.android.AndroidUtilities; +import org.telegram.messenger.FileLog; + +import java.util.ArrayList; + +@TargetApi(10) +public class VideoTimelineView extends View { + private long videoLength = 0; + private float progressLeft = 0; + private float progressRight = 1; + private Paint paint; + private Paint paint2; + private boolean pressedLeft = false; + private boolean pressedRight = false; + private float pressDx = 0; + private MediaMetadataRetriever mediaMetadataRetriever = null; + private VideoTimelineViewDelegate delegate = null; + private ArrayList frames = new ArrayList(); + private AsyncTask currentTask = null; + private static final Integer sync = 1; + private long frameTimeOffset = 0; + private int frameWidth = 0; + private int frameHeight = 0; + private int framesToLoad = 0; + + public abstract interface VideoTimelineViewDelegate { + public void onLeftProgressChanged(float progress); + public void onRifhtProgressChanged(float progress); + } + + private void init() { + paint = new Paint(); + paint.setColor(0xff66d1ee); + paint2 = new Paint(); + paint2.setColor(0x2266d1ee); + } + + public VideoTimelineView(Context context) { + super(context); + init(); + } + + public VideoTimelineView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public VideoTimelineView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + public float getLeftProgress() { + return progressLeft; + } + + public float getRightProgress() { + return progressRight; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event == null) { + return false; + } + float x = event.getX(); + float y = event.getY(); + + int width = getMeasuredWidth() - AndroidUtilities.dp(12); + int startX = (int)(width * progressLeft) + AndroidUtilities.dp(3); + int endX = (int)(width * progressRight) + AndroidUtilities.dp(9); + + if (event.getAction() == MotionEvent.ACTION_DOWN) { + int additionWidth = AndroidUtilities.dp(12); + if (startX - additionWidth <= x && x <= startX + additionWidth && y >= 0 && y <= getMeasuredHeight()) { + pressedLeft = true; + pressDx = (int)(x - startX); + getParent().requestDisallowInterceptTouchEvent(true); + invalidate(); + return true; + } else if (endX - additionWidth <= x && x <= endX + additionWidth && y >= 0 && y <= getMeasuredHeight()) { + pressedRight = true; + pressDx = (int)(x - endX); + getParent().requestDisallowInterceptTouchEvent(true); + invalidate(); + return true; + } + } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { + if (pressedLeft) { + pressedLeft = false; + return true; + } else if (pressedRight) { + pressedRight = false; + return true; + } + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + if (pressedLeft) { + startX = (int)(x - pressDx); + if (startX < AndroidUtilities.dp(3)) { + startX = AndroidUtilities.dp(3); + } else if (startX > endX - AndroidUtilities.dp(6)) { + startX = endX - AndroidUtilities.dp(6); + } + progressLeft = (float)(startX - AndroidUtilities.dp(3)) / (float)width; + if (delegate != null) { + delegate.onLeftProgressChanged(progressLeft); + } + invalidate(); + return true; + } else if (pressedRight) { + endX = (int)(x - pressDx); + if (endX < startX + AndroidUtilities.dp(6)) { + endX = startX + AndroidUtilities.dp(6); + } else if (endX > width + AndroidUtilities.dp(9)) { + endX = width + AndroidUtilities.dp(9); + } + progressRight = (float)(endX - AndroidUtilities.dp(9)) / (float)width; + if (delegate != null) { + delegate.onRifhtProgressChanged(progressRight); + } + invalidate(); + return true; + } + } + return false; + } + + public void setVideoPath(String path) { + mediaMetadataRetriever = new MediaMetadataRetriever(); + mediaMetadataRetriever.setDataSource(path); + String duration = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); + videoLength = Long.parseLong(duration); + } + + public void setDelegate(VideoTimelineViewDelegate delegate) { + this.delegate = delegate; + } + + private void reloadFrames(int frameNum) { + if (mediaMetadataRetriever == null) { + return; + } + if (frameNum == 0) { + frameHeight = getMeasuredHeight() - AndroidUtilities.dp(4); + framesToLoad = getMeasuredWidth() / frameHeight; + frameWidth = (int)Math.ceil((float)getMeasuredWidth() / (float)framesToLoad); + frameTimeOffset = videoLength / framesToLoad; + } + currentTask = new AsyncTask() { + private int frameNum = 0; + + @Override + protected Bitmap doInBackground(Integer... objects) { + frameNum = objects[0]; + Bitmap bitmap = null; + if (isCancelled()) { + return null; + } + try { + bitmap = mediaMetadataRetriever.getFrameAtTime(frameTimeOffset * frameNum * 1000); + if (isCancelled()) { + return null; + } + if (bitmap != null) { + Bitmap result = Bitmap.createBitmap(frameWidth, frameHeight, bitmap.getConfig()); + Canvas canvas = new Canvas(result); + float scaleX = (float) frameWidth / (float) bitmap.getWidth(); + float scaleY = (float) frameHeight / (float) bitmap.getHeight(); + float scale = scaleX > scaleY ? scaleX : scaleY; + int w = (int) (bitmap.getWidth() * scale); + int h = (int) (bitmap.getHeight() * scale); + Rect srcRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); + Rect destRect = new Rect((frameWidth - w) / 2, (frameHeight - h) / 2, w, h); + Paint paint = new Paint(); + canvas.drawBitmap(bitmap, srcRect, destRect, null); + bitmap.recycle(); + bitmap = result; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + return bitmap; + } + + @Override + protected void onPostExecute(Bitmap bitmap) { + if (!isCancelled()) { + frames.add(bitmap); + invalidate(); + if (frameNum < framesToLoad) { + reloadFrames(frameNum + 1); + } + } + } + }; + + if (android.os.Build.VERSION.SDK_INT >= 11) { + currentTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, frameNum, null, null); + } else { + currentTask.execute(frameNum, null, null); + } + } + + public void destroy() { + synchronized (sync) { + try { + if (mediaMetadataRetriever != null) { + mediaMetadataRetriever.release(); + mediaMetadataRetriever = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + for (Bitmap bitmap : frames) { + if (bitmap != null) { + bitmap.recycle(); + } + } + frames.clear(); + if (currentTask != null) { + currentTask.cancel(true); + currentTask = null; + } + } + + public void clearFrames() { + for (Bitmap bitmap : frames) { + if (bitmap != null) { + bitmap.recycle(); + } + } + frames.clear(); + if (currentTask != null) { + currentTask.cancel(true); + currentTask = null; + } + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + if (frames.isEmpty() && currentTask == null) { + reloadFrames(0); + } else { + int offset = 0; + for (Bitmap bitmap : frames) { + if (bitmap != null) { + canvas.drawBitmap(bitmap, offset * frameWidth, AndroidUtilities.dp(2), null); + } + offset++; + } + } + int width = getMeasuredWidth() - AndroidUtilities.dp(12); + int startX = (int)(width * progressLeft); + int endX = (int)(width * progressRight); + canvas.drawRect(startX, 0, startX + AndroidUtilities.dp(6), getMeasuredHeight(), paint); + canvas.drawRect(endX + AndroidUtilities.dp(6), 0, endX + AndroidUtilities.dp(12), getMeasuredHeight(), paint); + canvas.drawRect(startX + AndroidUtilities.dp(6), AndroidUtilities.dp(4), endX + AndroidUtilities.dp(6), getMeasuredHeight() - AndroidUtilities.dp(4), paint2); + canvas.drawRect(startX + AndroidUtilities.dp(6), AndroidUtilities.dp(2), endX + AndroidUtilities.dp(6), AndroidUtilities.dp(4), paint); + canvas.drawRect(startX + AndroidUtilities.dp(6), getMeasuredHeight() - AndroidUtilities.dp(4), endX + AndroidUtilities.dp(6), getMeasuredHeight() - AndroidUtilities.dp(2), paint); + } +} diff --git a/TMessagesProj/src/main/res/drawable-hdpi/playback.png b/TMessagesProj/src/main/res/drawable-hdpi/playback.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca26fcac3d1cf777c163f232027ce9f243fd7f6 GIT binary patch literal 1466 zcmeAS@N?(olHy`uVBq!ia0vp^svyk41|*NpQ(y*Ck|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=glcS}fqpOR7v8#chp{t3btGT(OrIUeylc}?r zk)sPtuSMv>2~2MaLa!@My`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-`BgX&zK> z3U0SJ@>d9P5p$7nooTz~ zMQ&=Q-+yLziCmfI=N^k)Y?S9xF0Y$s{ryhy@wFOVueZ1U*7vM*kaoV$Y$CSc;HC${ zcZ|C(2bFv_$Y3vJtBYsY{y=2U4c)5@N((MO>AB#mcaZbP2IsC#MmYw?Tbo+G9at>7 z(oW#%^P}rDnwTdTDqlVCroi@ayHp*0UzfbH^p@)ks@!nS)Hhh`(9ys$nWoKIL6>7RQrWMr&DCA$HqYu}2J7Yp;&Yl! zKO`)Abi7jQ^b)HB6CNalyqq4fMnq-HiK)>lLQCxzPviP*oNAI0sMDO+n>}SC>jyo9 zxJloSZwh@T`X}8vv?a!7>Y~W+D}OHv>d4!{*nPcpwrT16$3i~kj?4SKX5A>;=lPU{ zeJ9&St?NlOu_{GTstZ|tW}NsYGvj&dBqr^It4A!PA8ZZk+GM6&*&S$J|1nFnmZhc6 z;Z>8gz3)na?vs7GAJ$yo<u+zG~(8dTv^c&a)$*zaDX7HGaO&>Rv>%8CPn>Pw};Kx7mLfBre?`_CwO^ z_Rprn=l_OHf6%$}#8Jc0S2}YmM4voYk`CF+bxCL^v-zKy;yW8<_0QfB-FtcSQ^x=C f`cggmjBE_7+NTv~PLEgzDos6I{an^LB{Ts5LNOm3 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/playback_active.png b/TMessagesProj/src/main/res/drawable-hdpi/playback_active.png new file mode 100644 index 0000000000000000000000000000000000000000..11760303e6bf712e3b6759c460c6c4e3d3235430 GIT binary patch literal 1751 zcmaJ?c~BEq9L^Zzupotk4H4@a6e(?z-H;Fx2sV&l5(q*PH99Kf*n|kl#?1mD;!&V@ z1D4XNLn(@*qNt-*MG-}%B8Y-VMUX=+9(W>71qZ6#P{96Cx-+}){oZ`v_dDP0hPc?d zZj;E92n2$gSR|0)>n!{0?1+DVD*=f3;)4m5m>khz=_(W^@U@5<2E;~{9+tr>ZN`dv zIE+9bQVa?urj*8THHeX>vSVmgqZwxt2w`)qW|bxx#sD>}H<);oS5@aIfI-WnEM!SR zsW}o(GKg#_EVsofG`3_7M@yL#4un~`xPTGHRDji(VzO|pJj$>x7vI~D=@eiXf+h1P z{{*F!#sQHC3Ii+}NY#MBAP@}Epdcoj&Hfr-fDlLr8FYw2h1lF61{VZ@k%xkNL$x}t zOb|8V3%7WbBn&fi>GbsUbXs~44MFvEh{NI7H5d#kj-XmHOqj|_HCg;d6$G$FgBr}3 z0Wkq~MU@&!#ds7v(tlDgn#W{KmXR{y1*2P4W;#Rz?J11{rPBY08jWLU3nqg<#`~Yb z7Da{`rpsUpl8S2Z#_9a*uFTv>6josfsz8vG(JICzAsAvwLd-y*%sx<>pP~OVN?Up89fBRICe_^hZbV6$Bl+DEXiLL`KC2Q%W z)7u|Zm(&KhE&gVnY+gs{qQ{}%y7GQ^CD#Oo&#oc%5zi3L@u6*VUr}cZhosZjXH7nt zf69mTc`;!|_?5b*tU;iJulHYD^t{>k{R_sOiQzU#at6)gt*Kk~mfShBbFur0Y_yk@ zb3SNV*>ci8$7&RaY^p3THd0k9zY2ktY>~O0Cd5L^&{?1T%9yFu(T=TbG~J2;3A*f9 za`#VdHQe5UoqfEb_=S8PsXKq@2kY|?rNcF_^L@~A;uFV&^9y=gdlS5wBG(Gt(EF=1 zc1>9p`bJyugeuQT`lUneiSZhzdHC06mU|WJV+*yR+Km1D4dt0+tyy8}4X>D-;C7h3 z<-)%Fmc_{fS(V|B2cp85%1ieTCr-WbEZ*Jc!=!cS#`phc>C`k%kR-Pn8)8HG{a;g7xP`sB{ng5&ng*v~Y#HbxZ^77UaR=0eUa*$L( zPGv$@`VGVsMfoa>*{E(3yPR!tbBbTG*>-WAVaJwCkzAP8Tb)-CXN8a6^Ss)BuZKiZ z-6(A6V?B95-hW`xZD&ylxk;#GyxTKDiyauKa_G$NVPtkydIzdzDV+~KI-ampS8;r{ z0w@davq=wn)~?FmmXHQkJ&Kn3_`=lr2W`u1k9xKh&du%~tjbu^QQqepjZg`7Vb_4A z!Vm^gvg9v$h9qjvZfo++CP(W0r+sNBskaTywJ}{!<(cBt6*&hki(%)RrYJgN#--Lx z=Y7duYQ6NO(}|vxyBf)MUk$N!=7QG}zdMb3j^mx4hif(Tkc!6U0LzYRd9B@&>z5mD zltS@`_tJJ9XC8`$UVc$|rL0u2(K}(mI@XyV18<(~XzP0Tpt-`OJuSp*aAK}^@vToT zoC;?iTUh*O!)x`CiytmKoVvL4rL3WBvsbV6ks*J3;KPi7yN(~6K|*Ex-4=&}{xbWo NMl6gK9EwQH`WsN#ry2kN literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/video_play.png b/TMessagesProj/src/main/res/drawable-hdpi/video_play.png new file mode 100644 index 0000000000000000000000000000000000000000..ce78ffabe80e03231dc4133d9ab2a8d1cabd6076 GIT binary patch literal 2923 zcmaJ?c{tQ-8=lBc)<~AdI7MML%P^K~Loy?~aYV+Alh*5J=AD zh@+=)4&44E#f5(k^JJHBQU@@2z>6LV#1L3ykR6F0LI%4~31MVUGJzDw>?T`*K%x+e zHy*&_uxKKk3MFh~ps`ejkPQM^9gbxXh!JD}96}DG(5xW~Eq5Vc3dtJcXNrU47!Krc z%8_^$*(=`7n;0KKv>-ta+kmZN(Lw<#86bdTsgX1`I@TKUSr;u_Zy&=T;Li{s!W!~d zQh1y@*n!R>gH54uBO=@k4mLwT5ymDc6v_~cgd^ZEI1+|H8X-_I?J0*kNjFi_i#EuXNS`nU(HbIDfKn(VG{)G>&cxgV12?uuAP^W6I}8eCXJHSA z+nYL=A?+N$avkZ!C@Pr-eC3k<<~n_syKMz3Lm1hS%%Vh-Nlq*}75w?iXv+6+nz9%FgAJbSwrgw8|#Hu zc3;~<&~A^(U$F;ryT+ErCx<_FOv?miBwzpcXo{TFr^G#T`*_FBVE7)vior7a!wT>d z675?Bor%(`vXv5%N#)Ak2(EZq%g>!TfI@BCUeQ^xS&@hx#%I-o?xoC2sEVpetR_ox zwq)kCha75|*BvUYeE_o(W zJdiJuK17g#e?AgU-gtIkOjC_TdL2|e2TBKu#Z5~*)0 zwjSZ|Jr)@#d{{|>MI6_*7JFI5IX(6CLL_=l7O>*Fh4`PmSO(ueTJ3qgbwn-@mz<%5 zxfWh43tE_RrlL9SYIxj`hAH7x$e=4)y6sD67c zesEN))24^llu~SK9oRqjqxh)y>>=PWCs!qJ7sWVfElMo@hLZ1<8S?{{GFr~leg|cX zJVjy?YK^(MyQ86GV-3ypoceUKv}OJs@m6cDB0sa3M)2_Pu*YET=PN2IF8?5+<@KiT zO?u8PzV5N#xr2j)mPSTKrSnAt^;+IS}zxLj%AtLul6Q`bO1|4j(#uM5mM=1A{^>~|5b}@UVnZ)fdX0;avdYC1WP#N=|8uXhCnhFBLMdIm z68WQ2?-KeQqkQ2r2z0I?j`Bi$6$KyE*1cLNJGwM@g5zXfjy#onx z8JizBmI?gf<4^kf=)_8ja`0(h$=$2@pqM^2yGm`?!Glc&xw-6~VE7*O$PjrFG?!OW z)*P1_hq3av8_f11}()GFZvutBH!kfNv`Lx z@rCiH@=f`2a&l{Rb#*uCW9_{GO`YMecRG95%kI$-dB@LdSysTH(D@0ItTy>l@?&lO zwTKXVwbIF%JU0ZstsWJcl5-Qfme6dNw14o?qelVgqWK#cuGRDI8nGL{)T1JCs4l&^ zhJ+jG=8&=ee#9aB?&pE;#Yzq{RnRle$d$%s2#2_letGl?)y!5b8~5{^+I%|+kIilSq5-HblxSTEZ&1i-+?;=? zrdb5Z?s98HaXF4o?3YwYiRG-09?poAR=Q|g5$R;6(mr)j&WGWe)nW5MIhg8Q_=Sag z16xVTdZ?=`Q?Yx`%b6Diw(2{aGc3czp}gWf>+eKp{R$A#KVk!`>`{8MPrMS*)_cQpkWeC~1=E%&7=hXQTL`v7GJaj9naORpxH(;Kz3 zEPEad<=)%Gyb9O9th^*0sE;*fGSl>t^%ZypCe2@E?l+>;`-5^C=BkS?wdC?dfQYAD z190$<`ki;Y@t*hLOQ@Cb^VWO7K74GCI)6(V4$7-ea8n%@2%mZo$OYr(SZyDi@*n#1 B_jv#S literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-ldpi/playback.png b/TMessagesProj/src/main/res/drawable-ldpi/playback.png new file mode 100644 index 0000000000000000000000000000000000000000..d82736e019642a15a67c850d8159ff4988dbe8b2 GIT binary patch literal 1156 zcmaJ>U1-x<91l8mn@*jg`1KGXdS7gFlG)Y9Md_N>)-APkWmd$?vgB+FTRu$AY_}J6 ze&N<>{Y1pe#1EVzlZoiP?!h6li(Kz;>_HI32d5w+Dv0>;peJ*kK3D_EIse1&_xpdI z9E?RbloT&1CJ3S=5*Ffko#(uT)A6@<_|Rs&EJnd3sxcZ+O0po~SB!c{Ml`7r#-XIN zZNCpI2x2OwCXy&AR&%nUxg`hVPHQG+6GX-Ov?=A)z z24IsKZnt1fdo&@pH_JYSTEC90NOM>~gGeINT8nOTX`UL_c}_uqwrr^;QVpGS6s3Bj74Z~~ z^m_`LIVr2#6J^2$qtlW}Gj8Cdlmm+5@1dGDiMCN3{)qRN!giv~gmfI*Myn;`#x*Q= zT$xHj;E1Mg*S13T{-GC80jTr@%2~gV;|hk{szDv)xXKT1FfZ2`1ZPL3@$CI=ttc-k#I)&<=li?77T zh~Q78A74HGUvWol?*7rfuHvGBc&zJOu&U?MUzID|HjurX65z= z7k1A%^ttD2=2@om)$M~jh0cF^rnSbVEGDA^Q)gb?{rc(I0wpo+Nj9+e{<4<4na^hz zzSC;!UT*6h^S_!gzf^qqcIid`+EDk}KZ`2Pv*95yuPD)bWT>zN99fhJoe%j!N=L`N zS?Y;fBgaa&JUBhHr+lotw0kht_iyIK#xLO+drplq3;w@+^ajmT57$*SkL}ub=5p`5 z{sTKcM2EBUN0jLwq`=k!KHFG5n>{vq>*b~W+^6d|&wP}#$xn|Czg{s&tPK1AxEB2T Px$|F$1fxPl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsViy$<4*o&CtZa*ww($(AC7z)!f|C(#gQU$<*1* z$k7F+*Cju>G&eP`1g19ysMo;7(9pub)DfuH5UXBLQpha;+U$~Alv$RV;#QQOs{r=0 zRVHq?7~yscL~jZfw?O@2j8m^Z&@uX;h((HMm=G}afSB-P3*^8Perg^twHE=C_52rW zCNeNErg^$JhE&{|bH!hSHBjXE$I9mLOWHSoOlOU}v1H^{7>#rs_2dVu!!g8!v-o)$4=ANVo zzO9wlrUmv_*0^REbq42t%We|1ZHUax@MaD>t9J16`*er=MkSetM=idtt+?d&dRw;2 pjI=GUZJ)eI-PZhg!y|b{HU`{R)tVR+1}B)}WJ*(}GFSzMhXEl*E+L?UaRp%1W$6uEV<`AmmrI=O*EA4#3&Ar( z!M}r&izNUL!C-(zg#wfi8v@vLDxDd~;c)x`21JKw5Q9c%1kgELCW8w>z}Nx_Ztg#mqyFU$)V;jsR))qqX!2E+cg-B00I$U$kpQtV}RbUXk3908SS7>|9q=|~u4dv`0w>fP8~A%52S z^0wBwH(1I8ut-2zmQ({5`h7dyGZ6j=0&B*HqiF5hI1kd$tI;a9ev8mKjUo^a2z zq#u8{xa*BMwkh6H&!4q`T3{4$Z5`@hAw6B2&bgMBma9KM#V9{L8uIB0s-Cg=M{r+Ub?@tS zsg9101M}Qcd7dQ!r*;!-U~o{YAajyaQfe(3(NSm1xW|pk99{R--ri4c^!MY-Q&UsJ zIz(=3s2btt$;8&5^rIbLkh{CPJxB6JYwGLk3$ixM z@L-hq&DzvGGBTobE8^|$tcx+8l{8gZ)t9xW>#u81e~7JP`5$m$pKtCQcw;h|{PTPK zSB(~azT@W6m+75fNz~4LdpsYu{or3D7vxy^vOmlqJFZcYeEYydLa5LEoc&rN_Cp<)SS9i_|me-THbs;XP*1Q+qLIL zj?~m_=ka*g8l!3GdCyB}?W0q-Ian9_^vz+tS3LZs#bR;%pu*LuAn4wa4|)qLu&b2b z&%6&;KEZ0wd+)gT2+145Rv^ephin7b6!YY_KeXxsEPXnz;M1RzGi~Zc^lM4jE+{-RVLr5I=vCwv0Ch7k*w|MTBqnF4mMA2p zrf25aD!t#mUr8Y|#a1cY)Yrhbz&SM|)1#^=HMq(zB)KX(*)m1R-cG@$!U||WZfZ%Q zLPc&)Ua?h$trFN=Dp}Cc@k(Ggg0u(3#Z7WJivkG!?gW3h;*(zm}loVL$>z9|8 z>y;bp(sS1ij466e~9;Hy2Yk17`zcR|7*sR})89b8|;aCj$c~Q)e?H zM;Dl0m;B_?+|;}hnBEkGUKgBtK}jLE0BEyIYEfocYKmJ?ey#%8%T}4V-QtMTJgD9j z+-`BgsaGH97=2L0B1JSz2$*_6On9;da^ML+H4m8Di-5^`f3UO$0|R5ar;B4q#jPz< zPkS8>5NPuaNZQ(UYgNaJ2dsBQw&&HTir?LJRs6%$m|X&QcLatk(TWqi)s~d~i@)co zfy#5ANskX~_n0xq{!hA|<0O^j|FVxy?cp>y|5NZqqumcC`&8E#4|omIPbw~~{xEl{ zK*|l*`hDD4mNAv=*Ao^9&Sa@x5Om-l-;N|}cfn;hu4`yG7@ob~ZZ=WYPe(X(!(3G( z=4rN}Z@Ff82}gdvA;lOmS!v;>Nv~o`OH=a_zImEHtxJ(e=1- z7*AzORSMeguG5)RwsTVI_48Wwc_lv%Oq6Nn{`hXv{o9N3?|Ft7PCWiVU`>;lMQDxi z>5ZGtD<2KN&|x{f{Ntm_UYq5n$=;i#r(8TOq}UkkuVkKPc=D3!>3LpUHcjT&?G^@Z z$UHYs<|D(qEwd*k3Fc^O>!o$ueOeQL`JAd;8TX-k@gGiJ+tZ}-zHfWyrJ(HFe7f2} c8f{EG4F9@9n9_L|(m=(Kr>mdKI;Vst00A()(*OVf literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/playback_active.png b/TMessagesProj/src/main/res/drawable-mdpi/playback_active.png new file mode 100644 index 0000000000000000000000000000000000000000..65c7c475019d0ce58fabac85a9008157065120d1 GIT binary patch literal 1447 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAnN?apKg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+AuIMD`kd6ltlRYSS9D@>Lr5I=vCwv0Ch7k*w|MTBqnF4mMA2p zrf25aD!t#mUr8Y|#a1cY)Yrhbz&SM|)1#^=HMq(zB)KX(*)m1R-cG@$!U||WZfZ%Q zLPc&)Ua?h$trFN=Dp}Cc@k(Ggg0u(3#Z7WJivkG!?gW3h;*(zm}loVL$>z9|8 z>y;bp(sS1ij466e~9;Hy2YkLjwb2R|7*sR})89b8|;aCj$c~Q)e?H zM;Dl0m;B_?+|;}hnBEkGUPGLEK}jLE0BEyIYEfocYKmJ?ey#%8%T}2<-D2R1(>$o& z6r64`aKourALtl;P{bldG)xGXdO%EgvITPB2|qOtnA(eg$+{ya`UC?5leDLcV@SoV zHP`$-L=q*Af4mu*CV0_l$)o~)rIJ^Z>it|rI074wFLJUf@m%WsVr6%`j?xQ(g#s*! zuIvY+c5ys&e05>r30M6#5!OR_ElO+KX64;yuj78a;oO;BzYnmNP5WLuzcT&a^IG+3 z=bz8zxY(d4;~-?eu}f2@y|k}YWoOH5i$?zlXR-Fc?y{OA8gbKSJ!xXwelSi!wm^B> z3ifU=nz#g2p@=<4UAI)G8}(J5v6$NZdDVL9 zX-nGVwP!tY^EmGIQ`a%D-Mk>TRQC9H4o<&^eeFIsdD$#qL_!#tBEReN_Cz^&%nqR{*E?4p;NZntOIUw|E|6w#IK>W%oyp zeUDa6i`$vF)nwW7$=YXB7N_5dUKsghbzjj@zO{m)QLB1brf+<_H}QXElKSm6S?M+M zoa+*W`J4URZvXGU$+LCREG51?@2~rWc(P}AeNjwwe{Z|zvfS63+xJIqEq`QkZpGil ziO~kUkWNZ NJzf1=);T3K0RZO{9i{*P literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/video_play.png b/TMessagesProj/src/main/res/drawable-mdpi/video_play.png new file mode 100644 index 0000000000000000000000000000000000000000..9e930642fda766741645cf3ccb9b05f1d2049bbd GIT binary patch literal 2251 zcmaJ@dstF=8b(b_^O{9!*%FqOHx3}6C|+^A6k2MDTTuu{VT}U;8d_ssD=Vk6((R(< zSgS@vP2*vlp{z1(b0TX8W<0< zI9Yp?U?2ivhT$bLBnXmiV#XU=FlZi! zib*2U0lF|8ta^bSmZ#Qw;hhbhtnSqKQ6$Hya=UXcEo`NAM++$zEtYfCI1q9*e_!ImQ;^}lsG$fX=AT}6HqheqMA0CfGi6D?def@}dfDnem;UauPBgo`X z|1bauBZiakp|p7}O~B6JgOFsN%lVT__#)TX3Vb0PnFfk@nIPvYk${i>m@;Ih^WbP&XrlDF z`uxs~+qSIe7=PXW!;+ym66NwgORAtgP=`|D)9O?6I3Fx2#9F%zPMvLK2Mb%5TQ(V5 z&6?~NFJ5V3XA8KKNhH$>LeUztF4KFx_5JsDg9mn1K}*eNX4~rSs<+3?srRYwPOs6P zCcUi885_UwHlRhEQ$8$#($mwUXSJC&Ip>`@CNJ&5QdP;NrQIG`a|>@pG3OA}O>ZOL zcx-pfv(2^5vkJkk&Z+<&+MPpYDe3W@`lhx@YHTjuO53^cuE|PX+$GEJmUGNqpKuvk z#NBFgE>i095J^Gexq&ru`|(DTnZI}|CJQ`5M^CSvFz>c+wRnmopMdz_x^Jr{BM~3c zZny6FSCCnDNzaK7i$((On8;%C_0kXdg=@=RyN`$h^*`Fz)U-S?@r}&ZJ68_d)a5Ua zn#@U#lrakDfGvherm8S>*ivm_<9^ zg0W+VhS#E<%b?S{R>tT?29kza?dmilCX)#X1mlBBrBWr|nr>@8RS++9J3HW8Us_sf z=2QMC$k&%cIN#-NqnM0VcrRcQ2reZrJUu<*9zTA}d^Iw%uD^Cr;xwF!^Sk}Z)6LDT zxxW5QbqHE`{p!`2qs($FQgy|ZyU5Dwx9RC=Rmt(=2du+ag}47Bvsgh$PEI{jR<;s3 zwMgg~o0^s;+tYjM{%Sv$2m2f)`(CKk>Y}nT)RpS4wgP!sx-C(NSJxT%2lKjMtAnWfP`$ z`XE0)KdEQY2A#>!+_2uEzj1nIX6F98cbREPN#)q~4cKKGfPjSKA)a z|J82=bF;2A?tzX`WLTWu&1SQo$z-wvg=4dcibp}H0&SY*!0=o1bLY-oxPSltWa6Fu zQPw%-=DPOw_Ku2*ir`zfZ+F!Wbh_gFDzP_utptyD0SPjZHtgWrpJ%%9du@9?|9ak~u zpKHG6@z$%KJtOyacLP@@4x4s8%wtoPD;jbbwRhyXmif9mxqNp06007@`p1VCAus=a zJ<>+#)Y4LLXb03V?a+SdCx@1k`C3e0GiFEXom(^Y#=TNGRk;28iZq7e=wI8x*LZxR>5a8kXdi5AspJ-!R@PP`mlBXAk2WVYoq43p zjkJ-i4bqK_cc#?3Aa#Yyw%0wmtn0I6+&pl)`Yrc+V)vP@pKqPhZGNGYFPr|`1YnCA zI$j!qay-8C<*AZmvmWv`fTZt>T;8wo$~}6h)d6a5;|h-4G}*ZR?u4eQW$3#Hi>D5D zo-Payyw+;=`}W1omzN%2g@=01+bLxiUkr_gQFCRGGJkGuE5hyBH5-@rGkwP2i|B}0 K+V!wq`Tqe8BEBR5 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/playback.png b/TMessagesProj/src/main/res/drawable-xhdpi/playback.png new file mode 100644 index 0000000000000000000000000000000000000000..8393b7406196fac810092499ce296f59d5415fa9 GIT binary patch literal 1623 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVix+}y~_*wx6u*ww($(AC7z)!f|C(#gQU$<*1* z$k7F+*Cju>G&eP`1g19yq1PCvUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZnqfVG!Lpb z1-Dxaaq86vIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@iu4rmp!N9!)&-j@S3`$}RikV z-&;1N9oTRA=|qma;w|IEAn_w=6Y5^KW))6sba~0NEJR^_%6Dz%$}1D6`U*T-Jtbb? zj3_^^&dN)9b6>N4YB|L(oPBsp_yiW#oh!Ypdb^%Z+UtA2s;8Q9W9v_;@VD*-sU3#r zp1Xd?uG-IgZ-JFpczK4vtUQGnQC&T;(_d~~6PhX|f1sM@a`uwVE4Iim#fHzQ58JJ9 z>(HWN);~Q9=g!b^voP~~FLGH}yKOtq+asw8yQ(W>E}F~PZD-iG`sTHQ2@2becS+eB zFT8ne0?(3#l^=uU=j&!~yUHQ-q~+Ufty=cz5o^v6?%wU^;8RU30l6=ef)GKm1j1(`?NuEuV7v;o(Jz(pu_?Zuf&kd)*J! zOx+W*|7SMCq|Z!6ha|KeSG?G=Ygg*So`nJu7wrGMxmg&}$IEiE>^Z+E$E${_10soP z_ESXj^Q@F5f?L>cZH;pX*v}K$_rHOARZ-N^^>(YH@=!SIgb82fa)Da-%v zH46J{^I~JhdRtkcBMWtQlseoxH1}>y!`FzZOt-J|y!g6O&&ftCoc(T0`Vn5PSM&Gg zd?=Z}`EjR5mz(A)Lnh0n72m6r1&_&J?P-#4c;CJHu(9{0&#AMlj=tla#HrxtRl;Dp oBX5_y!oru&(*2gb3~FFx2>!fWJi&RED5$9SboFyt=akR{0GvKz`~Uy| literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/playback_active.png b/TMessagesProj/src/main/res/drawable-xhdpi/playback_active.png new file mode 100644 index 0000000000000000000000000000000000000000..48c99fb9d22eb4214360f59bc9946cbab4bc2012 GIT binary patch literal 2055 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVi$$G&eP`1g19yq1OzjUQklVEdbi=l3J8mmYU*Ll%J~r_Oewb7Ppw0n;V%K zyPDuM52`l>w_9-Q)dxC89~7}j5e*XprXCOzo@{{}c*0N31E%&OV6uL=SXPOFfu-8h z#WAGf)|IGe50O9#J3a4BOGJ`_THLxLG?GF*q7uYK4hwCQ6Va^RAh3Inh)~#J8D_3re2 zme2oepJ}lEy0%CnlY#IKh8Y|^On%G#UBoxE+eJ5?Z|HBZ58;tZ3p|mMz-YifBkPm> zsz&}sah*;lMYS1hYrd~Ku9>iDW;R!eTfxd4hP;bE^8{{qykV$gE@R$*`TNB!XFeG7 zS+HANPnh%ez~ck|5_Hy1J)o7K^7=RP8fH61#zwtfkElsEtrp#CJbK``R;$dVnXEC_ z#b2&l-5?#o;xql%#`k-;6u&omNA4DmV9XIb=xB9!i^jF>{5#HeO;~=Q^^%SZ>pzi$ ztnU`zJuq_(e|mkdq@sC)cEoR!53@LA4>c}5pt|NgLqWEJQ-Rd?4Q5djqLWG*r0wdL z*e+IQ(LKR@ZQY_wS>Gv)o0rsHF_<)=?2~v$)uxw=dDTC#+&1>zw6n~^UL!%Ns_}QL zZNs@Tabu$wKE*vPJ5DHN?l`k&lk5dwwvPOoSVh$Xo@c`E2!1;pT2^d$=-Ugv~W3E}K;aBbbU)XQijn?L+8-+t$x8xbg%hu^_Z zS5;#25Hu450i)$bj&*%>fJWv%-2SK6y|!wme?t>-;l zV8plma+twAce!(h(iRsVMcBOR2+~!FQm?zrJWn{eP$y2lqrhV-*Yup`_I>VDSC6XvY^bIjtz&VtLCqP-$#cqP`n<|^t5 z6Fl7)J$FiOrboaNfsMZ|`S=BV4!*H(^@$_aD)v{`EZtRmrmAv9ZhFG0=#z)0s0?Oo|_eGI2{vOKXPTipR(yh05fY&%G;uov45H` zCbx2EiS3B&X|epVTA=&HBGso$%9<~78Qwax!~av{iY95^?6s$zG!{+h>7Oj>=GEgT z_wu6jtOvJ)%-R_r3JUIFD(5-No3k)>UHz3q~VtZA)&oDTxVBJ zonmrV#JT@it4coTgAM;MKCuo11EdP8vL$UKm zy{>tS4`o%XYdv&S-0)9XK<`a%&fp*W!j?(Y#dC9?eq1x-o0{RDePL_64u*1FbT$&c g;$N+<@k9FnL;TdN7xiopD?nAVr>mdKI;Vst058ipR{#J2 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/video_play.png b/TMessagesProj/src/main/res/drawable-xhdpi/video_play.png new file mode 100644 index 0000000000000000000000000000000000000000..1837fef414b826b4ae0f0a3de903a1297e14f6ec GIT binary patch literal 3634 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 Oi?g?Lwym}fIQt*FXJn`V literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/playback.png b/TMessagesProj/src/main/res/drawable-xxhdpi/playback.png new file mode 100644 index 0000000000000000000000000000000000000000..517920f7828f029b476bd67fd84b1820b5f5efa0 GIT binary patch literal 2048 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 bmjDO6^d2Zm=h?OW-(Pmtj#gFh%L)GjGD#6% literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/layout/chat_unread_layout.xml b/TMessagesProj/src/main/res/layout/chat_unread_layout.xml index 31c3cf3f1..13832bbf5 100644 --- a/TMessagesProj/src/main/res/layout/chat_unread_layout.xml +++ b/TMessagesProj/src/main/res/layout/chat_unread_layout.xml @@ -1,13 +1,15 @@ + android:layout_height="40dp" + android:layout_gravity="top"> + android:layout_marginTop="7dp" + android:layout_gravity="top"> diff --git a/TMessagesProj/src/main/res/layout/video_editor_layout.xml b/TMessagesProj/src/main/res/layout/video_editor_layout.xml new file mode 100644 index 000000000..9e314d526 --- /dev/null +++ b/TMessagesProj/src/main/res/layout/video_editor_layout.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TMessagesProj/src/main/res/values-ar/strings.xml b/TMessagesProj/src/main/res/values-ar/strings.xml index eac750ab2..f3a3522e7 100644 --- a/TMessagesProj/src/main/res/values-ar/strings.xml +++ b/TMessagesProj/src/main/res/values-ar/strings.xml @@ -275,6 +275,7 @@ فقط عندما تكون الشاشة تعمل فقط عندما تكون الشاشة مطفأة دائمًا أظهر الإشعارات المنبثقة + Badge Number لا توجد وسائط بعد @@ -298,6 +299,11 @@ جميع الصور لا توجد صور حتى الآن + + Edit Video + Original Video + Edited Video + التالي رجوع diff --git a/TMessagesProj/src/main/res/values-de/strings.xml b/TMessagesProj/src/main/res/values-de/strings.xml index 84cd6eb9c..596ca1e15 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -275,6 +275,7 @@ Nur wenn Bildschirm „an“ Nur wenn Bildschirm „aus“ Popups immer anzeigen + Badge Number Noch keine geteilten Medien vorhanden @@ -298,6 +299,11 @@ Alle Fotos Noch keine Fotos + + Edit Video + Original Video + Edited Video + Weiter Zurück diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index 7844177da..035676ae5 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -275,6 +275,7 @@ Sólo con pantalla encendida Sólo con pantalla apagada Siempre mostrar notificación emergente + Globo de notificación No hay fotos ni vídeos compartidos aún @@ -298,6 +299,11 @@ Todas No hay fotos aún + + Edit Video + Original Video + Edited Video + Siguiente Atrás diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index b19229744..e4595b3a4 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -275,6 +275,7 @@ Solo con schermo acceso Solo con schermo spento Mostra sempre i popup + Badge Number Nessun media condiviso @@ -298,6 +299,11 @@ Tutte le foto Ancora nessuna foto + + Edit Video + Original Video + Edited Video + Avanti Indietro diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index 438f1cb48..e92fc5a4e 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -275,6 +275,7 @@ Alleen wanneer scherm \"aan\" staat Alleen wanneer scherm \"uit\" staat Altijd popup tonen + Badge Number Nog geen media gedeeld @@ -298,6 +299,11 @@ Alle foto\'s Nog geen foto\'s + + Edit Video + Original Video + Edited Video + Volgende Vorige diff --git a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml index 29b169a33..dbcc8b02d 100644 --- a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml @@ -275,6 +275,7 @@ Somente com a tela ligada Somente com a tela desligada Sempre mostrar popup + Badge Number Ainda não há mídia compartilhada @@ -298,6 +299,11 @@ Todas as Fotos Ainda não há fotos + + Edit Video + Original Video + Edited Video + Próximo Voltar diff --git a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml index 8a2936a52..13f7a41dc 100644 --- a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml @@ -275,6 +275,7 @@ Only when screen "on" Only when screen "off" Always show popup + Badge Number Ainda não há multimédia partilhado @@ -298,6 +299,11 @@ Todas as fotos Ainda não há fotos + + Edit Video + Original Video + Edited Video + Seguinte Anterior diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 3ee815832..b5a9c5975 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -275,6 +275,7 @@ Only when screen "on" Only when screen "off" Always show popup + Badge Number No shared media yet @@ -298,6 +299,11 @@ All Photos No photos yet + + Edit Video + Original Video + Edited Video + Next Back