Update to 1.3.26 (181)

Thanks to:
https://github.com/DrKLO/Telegram/pull/218
https://github.com/DrKLO/Telegram/pull/267
This commit is contained in:
DrKLO 2014-03-04 23:29:32 +04:00
parent 6e63dee546
commit ba726700a1
15 changed files with 484 additions and 551 deletions

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.telegram.messenger" package="org.telegram.messenger"
android:versionCode="179" android:versionCode="181"
android:versionName="1.3.26"> android:versionName="1.3.26">
<supports-screens android:anyDensity="true" <supports-screens android:anyDensity="true"
@ -50,6 +50,7 @@
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="com.google.android.gallery3d.permission.GALLERY_PROVIDER" />
<permission android:name="org.telegram.messenger.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> <permission android:name="org.telegram.messenger.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
<permission android:name="org.telegram.messenger.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <permission android:name="org.telegram.messenger.permission.C2D_MESSAGE" android:protectionLevel="signature" />
@ -63,13 +64,36 @@
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:largeHeap="true"> android:largeHeap="true">
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your-google-maps-api-key-here" /> <!--release-->
<!--<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" />-->
<!--debug-->
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCTNmNqbWovP9ETcAob98YlrfOQEAC0CJ4" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
<activity <activity
android:name="org.telegram.ui.LaunchActivity" android:name="org.telegram.ui.LoginActivity"
android:windowSoftInputMode="adjustResize" android:windowSoftInputMode="adjustResize"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait">
</activity>
<activity
android:name="org.telegram.ui.CountrySelectActivity"
android:windowSoftInputMode="adjustResize"
android:theme="@style/Theme.TMessages"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait">
</activity>
<activity
android:name="org.telegram.ui.IntroActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait">
</activity>
<activity
android:name="org.telegram.ui.ApplicationActivity"
android:windowSoftInputMode="adjustResize"
android:hardwareAccelerated="true"
android:launchMode="singleTask"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
@ -110,32 +134,6 @@
<data android:mimeType="vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile"/> <data android:mimeType="vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile"/>
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name="org.telegram.ui.LoginActivity"
android:windowSoftInputMode="adjustResize"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait">
</activity>
<activity
android:name="org.telegram.ui.CountrySelectActivity"
android:windowSoftInputMode="adjustResize"
android:theme="@style/Theme.TMessages"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait">
</activity>
<activity
android:name="org.telegram.ui.IntroActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait">
</activity>
<activity
android:name="org.telegram.ui.ApplicationActivity"
android:windowSoftInputMode="adjustResize"
android:theme="@style/Theme.TMessages"
android:hardwareAccelerated="true"
android:launchMode="singleTask"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
</activity>
<activity <activity
android:name="org.telegram.ui.GalleryImageViewer" android:name="org.telegram.ui.GalleryImageViewer"
android:theme="@style/Theme.TMessages.Gallery" android:theme="@style/Theme.TMessages.Gallery"

View file

@ -484,7 +484,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
} }
long getNewSessionId() { long getNewSessionId() {
long newSessionId = (long)(MessagesController.random.nextDouble() * Long.MAX_VALUE); long newSessionId = MessagesController.random.nextLong();
return isDebugSession ? (0xabcd000000000000L | (newSessionId & 0x0000ffffffffffffL)) : newSessionId; return isDebugSession ? (0xabcd000000000000L | (newSessionId & 0x0000ffffffffffffL)) : newSessionId;
} }
@ -612,7 +612,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
if (existing == null) { if (existing == null) {
existing = new Datacenter(); existing = new Datacenter();
existing.datacenterId = datacenterDesc.id; existing.datacenterId = datacenterDesc.id;
existing.authSessionId = (long)(MessagesController.random.nextDouble() * Long.MAX_VALUE); existing.authSessionId = MessagesController.random.nextLong();
datacentersArr.add(existing); datacentersArr.add(existing);
datacenterMap.put(existing.datacenterId, existing); datacenterMap.put(existing.datacenterId, existing);
} }

View file

@ -573,16 +573,6 @@ public class ContactsController {
} }
} }
Utilities.stageQueue.postRunnable(new Runnable() {
@Override
public void run() {
contactsBookSPhones = contactsBookShort;
contactsBook = contactsMap;
contactsSyncInProgress = false;
contactsBookLoaded = true;
}
});
FileLog.e("tmessages", "done processing contacts"); FileLog.e("tmessages", "done processing contacts");
if (request) { if (request) {
@ -593,32 +583,56 @@ public class ContactsController {
FileLog.e("tmessages", "add contact " + contact.first_name + " " + contact.last_name + " " + contact.phone); FileLog.e("tmessages", "add contact " + contact.first_name + " " + contact.last_name + " " + contact.phone);
} }
} }
TLRPC.TL_contacts_importContacts req = new TLRPC.TL_contacts_importContacts(); final int count = (int)Math.ceil(toImport.size() / 500.0f);
req.contacts = toImport; for (int a = 0; a < count; a++) {
req.replace = false; ArrayList<TLRPC.TL_inputPhoneContact> finalToImport = new ArrayList<TLRPC.TL_inputPhoneContact>();
ConnectionsManager.Instance.performRpc(req, new RPCRequest.RPCRequestDelegate() { finalToImport.addAll(toImport.subList(a * 500, Math.min((a + 1) * 500, toImport.size())));
@Override TLRPC.TL_contacts_importContacts req = new TLRPC.TL_contacts_importContacts();
public void run(TLObject response, TLRPC.TL_error error) { req.contacts = finalToImport;
if (error == null) { req.replace = false;
FileLog.e("tmessages", "contacts imported"); final boolean isLastQuery = a == count - 1;
if (!contactsMap.isEmpty()) { ConnectionsManager.Instance.performRpc(req, new RPCRequest.RPCRequestDelegate() {
MessagesStorage.Instance.putCachedPhoneBook(contactsMap); @Override
public void run(TLObject response, TLRPC.TL_error error) {
if (error == null) {
FileLog.e("tmessages", "contacts imported");
if (isLastQuery && !contactsMap.isEmpty()) {
MessagesStorage.Instance.putCachedPhoneBook(contactsMap);
Utilities.stageQueue.postRunnable(new Runnable() {
@Override
public void run() {
contactsBookSPhones = contactsBookShort;
contactsBook = contactsMap;
contactsSyncInProgress = false;
contactsBookLoaded = true;
}
});
}
TLRPC.TL_contacts_importedContacts res = (TLRPC.TL_contacts_importedContacts)response;
MessagesStorage.Instance.putUsersAndChats(res.users, null, true, true);
ArrayList<TLRPC.TL_contact> cArr = new ArrayList<TLRPC.TL_contact>();
for (TLRPC.TL_importedContact c : res.imported) {
TLRPC.TL_contact contact = new TLRPC.TL_contact();
contact.user_id = c.user_id;
cArr.add(contact);
}
processLoadedContacts(cArr, res.users, 2);
} else {
FileLog.e("tmessages", "import contacts error " + error.text);
} }
TLRPC.TL_contacts_importedContacts res = (TLRPC.TL_contacts_importedContacts)response;
MessagesStorage.Instance.putUsersAndChats(res.users, null, true, true);
ArrayList<TLRPC.TL_contact> cArr = new ArrayList<TLRPC.TL_contact>();
for (TLRPC.TL_importedContact c : res.imported) {
TLRPC.TL_contact contact = new TLRPC.TL_contact();
contact.user_id = c.user_id;
cArr.add(contact);
}
processLoadedContacts(cArr, res.users, 2);
} else {
FileLog.e("tmessages", "import contacts error " + error.text);
} }
} }, null, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassCanCompress);
}, null, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassCanCompress); }
} else { } else {
Utilities.stageQueue.postRunnable(new Runnable() {
@Override
public void run() {
contactsBookSPhones = contactsBookShort;
contactsBook = contactsMap;
contactsSyncInProgress = false;
contactsBookLoaded = true;
}
});
Utilities.RunOnUIThread(new Runnable() { Utilities.RunOnUIThread(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -628,6 +642,15 @@ public class ContactsController {
}); });
} }
} else { } else {
Utilities.stageQueue.postRunnable(new Runnable() {
@Override
public void run() {
contactsBookSPhones = contactsBookShort;
contactsBook = contactsMap;
contactsSyncInProgress = false;
contactsBookLoaded = true;
}
});
if (!contactsMap.isEmpty()) { if (!contactsMap.isEmpty()) {
MessagesStorage.Instance.putCachedPhoneBook(contactsMap); MessagesStorage.Instance.putCachedPhoneBook(contactsMap);
} }

View file

@ -14,7 +14,9 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.media.ExifInterface; import android.media.ExifInterface;
import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.ParcelFileDescriptor;
import org.telegram.objects.MessageObject; import org.telegram.objects.MessageObject;
import org.telegram.ui.ApplicationLoader; import org.telegram.ui.ApplicationLoader;
@ -23,6 +25,7 @@ import org.telegram.ui.Views.ImageReceiver;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileDescriptor;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -961,10 +964,31 @@ public class FileLoader {
}); });
} }
public static Bitmap loadBitmap(String path, float maxWidth, float maxHeight) { public static Bitmap loadBitmap(String path, Uri uri, float maxWidth, float maxHeight) {
BitmapFactory.Options bmOptions = new BitmapFactory.Options(); BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true; bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, bmOptions); FileDescriptor fileDescriptor = null;
ParcelFileDescriptor parcelFD = null;
if (path != null) {
BitmapFactory.decodeFile(path, bmOptions);
} else if (uri != null) {
boolean error = false;
try {
parcelFD = ApplicationLoader.applicationContext.getContentResolver().openFileDescriptor(uri, "r");
fileDescriptor = parcelFD.getFileDescriptor();
BitmapFactory.decodeFileDescriptor(fileDescriptor, null, bmOptions);
} catch (Exception e) {
FileLog.e("tmessages", e);
try {
if (parcelFD != null) {
parcelFD.close();
}
} catch (Exception e2) {
FileLog.e("tmessages", e2);
}
return null;
}
}
float photoW = bmOptions.outWidth; float photoW = bmOptions.outWidth;
float photoH = bmOptions.outHeight; float photoH = bmOptions.outHeight;
float scaleFactor = Math.max(photoW / maxWidth, photoH / maxHeight); float scaleFactor = Math.max(photoW / maxWidth, photoH / maxHeight);
@ -974,39 +998,70 @@ public class FileLoader {
bmOptions.inJustDecodeBounds = false; bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = (int)scaleFactor; bmOptions.inSampleSize = (int)scaleFactor;
ExifInterface exif; String exifPath = null;
Matrix matrix = null; if (path != null) {
try { exifPath = path;
exif = new ExifInterface(path); } else if (uri != null) {
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); exifPath = Utilities.getPath(uri);
matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.postRotate(90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.postRotate(180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.postRotate(270);
break;
}
} catch (Exception e) {
FileLog.e("tmessages", e);
} }
Bitmap b; Matrix matrix = null;
try {
b = BitmapFactory.decodeFile(path, bmOptions); if (exifPath != null) {
if (b != null && matrix != null) { ExifInterface exif;
b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true); try {
exif = new ExifInterface(exifPath);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.postRotate(90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.postRotate(180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.postRotate(270);
break;
}
} catch (Exception e) {
FileLog.e("tmessages", e);
} }
} catch (Exception e) { }
FileLog.e("tmessages", e);
FileLoader.Instance.memCache.evictAll(); Bitmap b = null;
b = BitmapFactory.decodeFile(path, bmOptions); if (path != null) {
if (b != null && matrix != null) { try {
b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true); b = BitmapFactory.decodeFile(path, bmOptions);
if (b != null) {
b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
FileLoader.Instance.memCache.evictAll();
if (b == null) {
b = BitmapFactory.decodeFile(path, bmOptions);
}
if (b != null) {
b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true);
}
}
} else if (uri != null) {
try {
b = BitmapFactory.decodeFileDescriptor(fileDescriptor, null, bmOptions);
if (b != null) {
b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
} finally {
try {
if (parcelFD != null) {
parcelFD.close();
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
} }
} }

View file

@ -62,7 +62,7 @@ public class FileUploadOperation {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
} }
currentFileId = (long)(MessagesController.random.nextDouble() * Long.MAX_VALUE); currentFileId = MessagesController.random.nextLong();
try { try {
mdEnc = MessageDigest.getInstance("MD5"); mdEnc = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) { } catch (NoSuchAlgorithmException e) {

View file

@ -379,9 +379,9 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
} else { } else {
audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
} }
audioRecorder.setAudioSamplingRate(24000); audioRecorder.setAudioSamplingRate(16000);
audioRecorder.setAudioChannels(1); audioRecorder.setAudioChannels(1);
audioRecorder.setAudioEncodingBitRate(16000); audioRecorder.setAudioEncodingBitRate(16000*4*1);
try { try {
audioRecorder.prepare(); audioRecorder.prepare();

View file

@ -34,8 +34,8 @@ import android.util.SparseArray;
import org.telegram.objects.MessageObject; import org.telegram.objects.MessageObject;
import org.telegram.objects.PhotoObject; import org.telegram.objects.PhotoObject;
import org.telegram.ui.ApplicationActivity;
import org.telegram.ui.ApplicationLoader; import org.telegram.ui.ApplicationLoader;
import org.telegram.ui.LaunchActivity;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -1326,9 +1326,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
}); });
} }
public TLRPC.TL_photo generatePhotoSizes(String path) { public TLRPC.TL_photo generatePhotoSizes(String path, Uri imageUri) {
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
Bitmap bitmap = FileLoader.loadBitmap(path, 800, 800); Bitmap bitmap = FileLoader.loadBitmap(path, imageUri, 800, 800);
ArrayList<TLRPC.PhotoSize> sizes = new ArrayList<TLRPC.PhotoSize>(); ArrayList<TLRPC.PhotoSize> sizes = new ArrayList<TLRPC.PhotoSize>();
TLRPC.PhotoSize size = FileLoader.scaleAndSaveImage(bitmap, 90, 90, 55, true); TLRPC.PhotoSize size = FileLoader.scaleAndSaveImage(bitmap, 90, 90, 55, true);
if (size != null) { if (size != null) {
@ -4188,7 +4188,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
String chatSoundPath = null; String chatSoundPath = null;
NotificationManager mNotificationManager = (NotificationManager)ApplicationLoader.applicationContext.getSystemService(Context.NOTIFICATION_SERVICE); NotificationManager mNotificationManager = (NotificationManager)ApplicationLoader.applicationContext.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent(ApplicationLoader.applicationContext, LaunchActivity.class); Intent intent = new Intent(ApplicationLoader.applicationContext, ApplicationActivity.class);
String msg = null; String msg = null;
if ((int)dialog_id != 0) { if ((int)dialog_id != 0) {
@ -4441,9 +4441,13 @@ public class MessagesController implements NotificationCenter.NotificationCenter
dialogMessage.put(lastMessage.messageOwner.id, lastMessage); dialogMessage.put(lastMessage.messageOwner.id, lastMessage);
} else { } else {
dialogMessage.remove(dialog.top_message); dialogMessage.remove(dialog.top_message);
dialog.top_message = lastMessage.messageOwner.id; if (dialog.top_message > 0 && lastMessage.messageOwner.id > 0 && lastMessage.messageOwner.id > dialog.top_message ||
dialog.last_message_date = lastMessage.messageOwner.date; dialog.top_message < 0 && lastMessage.messageOwner.id < 0 && lastMessage.messageOwner.id < dialog.top_message ||
dialogMessage.put(lastMessage.messageOwner.id, lastMessage); dialog.last_message_date < lastMessage.messageOwner.date) {
dialog.top_message = lastMessage.messageOwner.id;
dialog.last_message_date = lastMessage.messageOwner.date;
dialogMessage.put(lastMessage.messageOwner.id, lastMessage);
}
} }
dialogsServerOnly.clear(); dialogsServerOnly.clear();
@ -4622,6 +4626,21 @@ public class MessagesController implements NotificationCenter.NotificationCenter
newMessage.media.document.thumb.type = "s"; newMessage.media.document.thumb.type = "s";
} }
newMessage.media.document.dc_id = message.file.dc_id; newMessage.media.document.dc_id = message.file.dc_id;
} else if (decryptedMessage.media instanceof TLRPC.TL_decryptedMessageMediaAudio) {
if (decryptedMessage.media.key.length != 32 || decryptedMessage.media.iv.length != 32) {
return null;
}
newMessage.media = new TLRPC.TL_messageMediaAudio();
newMessage.media.audio = new TLRPC.TL_audioEncrypted();
newMessage.media.audio.id = message.file.id;
newMessage.media.audio.access_hash = message.file.access_hash;
newMessage.media.audio.user_id = decryptedMessage.media.user_id;
newMessage.media.audio.date = message.date;
newMessage.media.audio.size = message.file.size;
newMessage.media.audio.key = decryptedMessage.media.key;
newMessage.media.audio.iv = decryptedMessage.media.iv;
newMessage.media.audio.dc_id = message.file.dc_id;
newMessage.media.audio.duration = decryptedMessage.media.duration;
} else { } else {
return null; return null;
} }
@ -4877,7 +4896,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
TLRPC.TL_messages_requestEncryption req2 = new TLRPC.TL_messages_requestEncryption(); TLRPC.TL_messages_requestEncryption req2 = new TLRPC.TL_messages_requestEncryption();
req2.g_a = g_a; req2.g_a = g_a;
req2.user_id = getInputUser(user); req2.user_id = getInputUser(user);
req2.random_id = (int)(random.nextDouble() * Integer.MAX_VALUE); req2.random_id = random.nextInt();
ConnectionsManager.Instance.performRpc(req2, new RPCRequest.RPCRequestDelegate() { ConnectionsManager.Instance.performRpc(req2, new RPCRequest.RPCRequestDelegate() {
@Override @Override
public void run(final TLObject response, TLRPC.TL_error error) { public void run(final TLObject response, TLRPC.TL_error error) {

View file

@ -13,9 +13,12 @@ import android.app.NotificationManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar;
@ -27,12 +30,14 @@ import android.view.ViewTreeObserver;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.ConnectionsManager;
import org.telegram.messenger.FileLog; import org.telegram.messenger.FileLog;
import org.telegram.messenger.MessagesController; import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R; import org.telegram.messenger.R;
import org.telegram.messenger.TLRPC;
import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserConfig;
import org.telegram.messenger.Utilities; import org.telegram.messenger.Utilities;
import org.telegram.objects.MessageObject; import org.telegram.objects.MessageObject;
@ -44,15 +49,16 @@ import net.hockeyapp.android.UpdateManager;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList;
public class ApplicationActivity extends ActionBarActivity implements NotificationCenter.NotificationCenterDelegate, MessagesActivity.MessagesActivityDelegate { public class ApplicationActivity extends ActionBarActivity implements NotificationCenter.NotificationCenterDelegate, MessagesActivity.MessagesActivityDelegate {
private boolean finished = false; private boolean finished = false;
private NotificationView notificationView; private NotificationView notificationView;
private String photoPath = null; private Uri photoPath = null;
private String videoPath = null; private String videoPath = null;
private String sendingText = null; private String sendingText = null;
private String documentPath = null; private String documentPath = null;
private String[] imagesPathArray = null; private Uri[] imagesPathArray = null;
private String[] documentsPathArray = null; private String[] documentsPathArray = null;
private int currentConnectionState; private int currentConnectionState;
private View statusView; private View statusView;
@ -64,6 +70,21 @@ public class ApplicationActivity extends ActionBarActivity implements Notificati
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
this.setTheme(R.style.Theme_TMessages);
getWindow().setBackgroundDrawableResource(R.drawable.transparent);
getWindow().setFormat(PixelFormat.RGB_565);
if (!UserConfig.clientActivated) {
Intent intent = getIntent();
if (intent != null && intent.getAction() != null && Intent.ACTION_SEND.equals(intent.getAction()) || intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
finish();
return;
}
Intent intent2 = new Intent(this, IntroActivity.class);
startActivity(intent2);
finish();
return;
}
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) { if (resourceId > 0) {
@ -111,18 +132,180 @@ public class ApplicationActivity extends ActionBarActivity implements Notificati
ApplicationLoader.fragmentsStack.add(fragment); ApplicationLoader.fragmentsStack.add(fragment);
} }
handleIntent(getIntent(), false);
}
@SuppressWarnings("unchecked")
private void prepareForHideShowActionBar() {
try {
Class firstClass = getSupportActionBar().getClass();
Class aClass = firstClass.getSuperclass();
if (aClass == android.support.v7.app.ActionBar.class) {
Method method = firstClass.getDeclaredMethod("setShowHideAnimationEnabled", boolean.class);
method.invoke(getSupportActionBar(), false);
} else {
Field field = aClass.getDeclaredField("mActionBar");
field.setAccessible(true);
Method method = field.get(getSupportActionBar()).getClass().getDeclaredMethod("setShowHideAnimationEnabled", boolean.class);
method.invoke(field.get(getSupportActionBar()), false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void showActionBar() {
prepareForHideShowActionBar();
getSupportActionBar().show();
}
public void hideActionBar() {
prepareForHideShowActionBar();
getSupportActionBar().hide();
}
private void handleIntent(Intent intent, boolean isNew) {
boolean pushOpened = false; boolean pushOpened = false;
Integer push_user_id = (Integer)NotificationCenter.Instance.getFromMemCache("push_user_id", 0); Integer push_user_id = 0;
Integer push_chat_id = (Integer)NotificationCenter.Instance.getFromMemCache("push_chat_id", 0); Integer push_chat_id = 0;
Integer push_enc_id = (Integer)NotificationCenter.Instance.getFromMemCache("push_enc_id", 0); Integer push_enc_id = 0;
Integer open_settings = (Integer)NotificationCenter.Instance.getFromMemCache("open_settings", 0); Integer open_settings = 0;
photoPath = (String)NotificationCenter.Instance.getFromMemCache(533);
videoPath = (String)NotificationCenter.Instance.getFromMemCache(534); photoPath = null;
sendingText = (String)NotificationCenter.Instance.getFromMemCache(535); videoPath = null;
documentPath = (String)NotificationCenter.Instance.getFromMemCache(536); sendingText = null;
imagesPathArray = (String[])NotificationCenter.Instance.getFromMemCache(537); documentPath = null;
documentsPathArray = (String[])NotificationCenter.Instance.getFromMemCache(538); imagesPathArray = null;
documentsPathArray = null;
if (intent != null && intent.getAction() != null) {
if (Intent.ACTION_SEND.equals(intent.getAction())) {
boolean error = false;
String type = intent.getType();
if (type != null && type.equals("text/plain")) {
String text = intent.getStringExtra(Intent.EXTRA_TEXT);
if (text != null && text.length() != 0) {
sendingText = text;
} else {
error = true;
}
} else {
Parcelable parcelable = intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (parcelable == null) {
return;
}
String path = null;
if (!(parcelable instanceof Uri)) {
parcelable = Uri.parse(parcelable.toString());
}
if (parcelable != null && type != null && type.startsWith("image/")) {
photoPath = (Uri)parcelable;
} else {
path = Utilities.getPath((Uri)parcelable);
if (path != null) {
if (path.startsWith("file:")) {
path = path.replace("file://", "");
}
if (type != null && type.startsWith("video/")) {
videoPath = path;
} else {
documentPath = path;
}
} else {
error = true;
}
}
if (error) {
Toast.makeText(this, "Unsupported content", Toast.LENGTH_SHORT).show();
}
}
} else if (intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
boolean error = false;
try {
ArrayList<Parcelable> uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
String type = intent.getType();
if (uris != null) {
if (type != null && type.startsWith("image/")) {
Uri[] uris2 = new Uri[uris.size()];
for (int i = 0; i < uris2.length; i++) {
Parcelable parcelable = uris.get(i);
if (!(parcelable instanceof Uri)) {
parcelable = Uri.parse(parcelable.toString());
}
uris2[i] = (Uri)parcelable;
}
imagesPathArray = uris2;
} else {
String[] uris2 = new String[uris.size()];
for (int i = 0; i < uris2.length; i++) {
Parcelable parcelable = uris.get(i);
if (!(parcelable instanceof Uri)) {
parcelable = Uri.parse(parcelable.toString());
}
String path = Utilities.getPath((Uri)parcelable);
if (path != null) {
if (path.startsWith("file:")) {
path = path.replace("file://", "");
}
uris2[i] = path;
}
}
documentsPathArray = uris2;
}
} else {
error = true;
}
} catch (Exception e) {
FileLog.e("tmessages", e);
error = true;
}
if (error) {
Toast.makeText(this, "Unsupported content", Toast.LENGTH_SHORT).show();
}
} else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
try {
Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
int userId = cursor.getInt(cursor.getColumnIndex("DATA4"));
NotificationCenter.Instance.postNotificationName(MessagesController.closeChats);
push_user_id = userId;
}
cursor.close();
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
} else if (intent.getAction().equals("org.telegram.messenger.OPEN_ACCOUNT")) {
open_settings = 1;
}
}
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
int chatId = getIntent().getIntExtra("chatId", 0);
int userId = getIntent().getIntExtra("userId", 0);
int encId = getIntent().getIntExtra("encId", 0);
if (chatId != 0) {
TLRPC.Chat chat = MessagesController.Instance.chats.get(chatId);
if (chat != null) {
NotificationCenter.Instance.postNotificationName(MessagesController.closeChats);
push_chat_id = chatId;
}
} else if (userId != 0) {
TLRPC.User user = MessagesController.Instance.users.get(userId);
if (user != null) {
NotificationCenter.Instance.postNotificationName(MessagesController.closeChats);
push_user_id = userId;
}
} else if (encId != 0) {
TLRPC.EncryptedChat chat = MessagesController.Instance.encryptedChats.get(encId);
if (chat != null) {
NotificationCenter.Instance.postNotificationName(MessagesController.closeChats);
push_enc_id = encId;
}
}
}
if (push_user_id != 0) { if (push_user_id != 0) {
if (push_user_id == UserConfig.clientUserId) { if (push_user_id == UserConfig.clientUserId) {
@ -179,109 +362,18 @@ public class ApplicationActivity extends ActionBarActivity implements Notificati
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, "settings").commitAllowingStateLoss(); getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, "settings").commitAllowingStateLoss();
pushOpened = true; pushOpened = true;
} }
if (!pushOpened) { if (!pushOpened && !isNew) {
BaseFragment fragment = ApplicationLoader.fragmentsStack.get(ApplicationLoader.fragmentsStack.size() - 1); BaseFragment fragment = ApplicationLoader.fragmentsStack.get(ApplicationLoader.fragmentsStack.size() - 1);
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, fragment.getTag()).commitAllowingStateLoss(); getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, fragment.getTag()).commitAllowingStateLoss();
} }
getWindow().setBackgroundDrawableResource(R.drawable.transparent); getIntent().setAction(null);
getWindow().setFormat(PixelFormat.RGB_565);
}
@SuppressWarnings("unchecked")
private void prepareForHideShowActionBar() {
try {
Class firstClass = getSupportActionBar().getClass();
Class aClass = firstClass.getSuperclass();
if (aClass == android.support.v7.app.ActionBar.class) {
Method method = firstClass.getDeclaredMethod("setShowHideAnimationEnabled", boolean.class);
method.invoke(getSupportActionBar(), false);
} else {
Field field = aClass.getDeclaredField("mActionBar");
field.setAccessible(true);
Method method = field.get(getSupportActionBar()).getClass().getDeclaredMethod("setShowHideAnimationEnabled", boolean.class);
method.invoke(field.get(getSupportActionBar()), false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void showActionBar() {
prepareForHideShowActionBar();
getSupportActionBar().show();
}
public void hideActionBar() {
prepareForHideShowActionBar();
getSupportActionBar().hide();
} }
@Override @Override
protected void onNewIntent(Intent intent) { protected void onNewIntent(Intent intent) {
super.onNewIntent(intent); super.onNewIntent(intent);
photoPath = (String)NotificationCenter.Instance.getFromMemCache(533); handleIntent(intent, true);
videoPath = (String)NotificationCenter.Instance.getFromMemCache(534);
sendingText = (String)NotificationCenter.Instance.getFromMemCache(535);
documentPath = (String)NotificationCenter.Instance.getFromMemCache(536);
imagesPathArray = (String[])NotificationCenter.Instance.getFromMemCache(537);
documentsPathArray = (String[])NotificationCenter.Instance.getFromMemCache(538);
if (videoPath != null || photoPath != null || sendingText != null || documentPath != null || imagesPathArray != null || documentsPathArray != null) {
MessagesActivity fragment = new MessagesActivity();
fragment.selectAlertString = R.string.ForwardMessagesTo;
fragment.animationType = 1;
Bundle args = new Bundle();
args.putBoolean("onlySelect", true);
fragment.setArguments(args);
fragment.delegate = this;
ApplicationLoader.fragmentsStack.add(fragment);
fragment.onFragmentCreate();
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, fragment.getTag()).commitAllowingStateLoss();
}
Integer push_user_id = (Integer)NotificationCenter.Instance.getFromMemCache("push_user_id", 0);
Integer push_chat_id = (Integer)NotificationCenter.Instance.getFromMemCache("push_chat_id", 0);
Integer push_enc_id = (Integer)NotificationCenter.Instance.getFromMemCache("push_enc_id", 0);
Integer open_settings = (Integer)NotificationCenter.Instance.getFromMemCache("open_settings", 0);
if (push_user_id != 0) {
if (push_user_id == UserConfig.clientUserId) {
open_settings = 1;
} else {
ChatActivity fragment = new ChatActivity();
Bundle bundle = new Bundle();
bundle.putInt("user_id", push_user_id);
fragment.setArguments(bundle);
if (fragment.onFragmentCreate()) {
ApplicationLoader.fragmentsStack.add(fragment);
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, "chat" + Math.random()).commitAllowingStateLoss();
}
}
} else if (push_chat_id != 0) {
ChatActivity fragment = new ChatActivity();
Bundle bundle = new Bundle();
bundle.putInt("chat_id", push_chat_id);
fragment.setArguments(bundle);
if (fragment.onFragmentCreate()) {
ApplicationLoader.fragmentsStack.add(fragment);
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, "chat" + Math.random()).commitAllowingStateLoss();
}
} else if (push_enc_id != 0) {
ChatActivity fragment = new ChatActivity();
Bundle bundle = new Bundle();
bundle.putInt("enc_id", push_enc_id);
fragment.setArguments(bundle);
if (fragment.onFragmentCreate()) {
ApplicationLoader.fragmentsStack.add(fragment);
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, "chat" + Math.random()).commitAllowingStateLoss();
}
}
if (open_settings != 0) {
SettingsActivity fragment = new SettingsActivity();
ApplicationLoader.fragmentsStack.add(fragment);
fragment.onFragmentCreate();
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, "settings").commitAllowingStateLoss();
}
} }
@Override @Override
@ -314,7 +406,7 @@ public class ApplicationActivity extends ActionBarActivity implements Notificati
presentFragment(fragment, "chat" + Math.random(), true, false); presentFragment(fragment, "chat" + Math.random(), true, false);
} }
if (photoPath != null) { if (photoPath != null) {
fragment.processSendingPhoto(photoPath); fragment.processSendingPhoto(null, photoPath);
} else if (videoPath != null) { } else if (videoPath != null) {
fragment.processSendingVideo(videoPath); fragment.processSendingVideo(videoPath);
} else if (sendingText != null) { } else if (sendingText != null) {
@ -322,8 +414,8 @@ public class ApplicationActivity extends ActionBarActivity implements Notificati
} else if (documentPath != null) { } else if (documentPath != null) {
fragment.processSendingDocument(documentPath); fragment.processSendingDocument(documentPath);
} else if (imagesPathArray != null) { } else if (imagesPathArray != null) {
for (String path : imagesPathArray) { for (Uri path : imagesPathArray) {
fragment.processSendingPhoto(path); fragment.processSendingPhoto(null, path);
} }
} else if (documentsPathArray != null) { } else if (documentsPathArray != null) {
for (String path : documentsPathArray) { for (String path : documentsPathArray) {
@ -455,7 +547,7 @@ public class ApplicationActivity extends ActionBarActivity implements Notificati
fragment.onFragmentDestroy(); fragment.onFragmentDestroy();
} }
ApplicationLoader.fragmentsStack.clear(); ApplicationLoader.fragmentsStack.clear();
Intent intent2 = new Intent(this, LaunchActivity.class); Intent intent2 = new Intent(this, IntroActivity.class);
startActivity(intent2); startActivity(intent2);
processOnFinish(); processOnFinish();
finish(); finish();

View file

@ -22,15 +22,11 @@ public class ChatMessageCell extends ChatBaseCell {
private int textX, textY; private int textX, textY;
private int totalHeight = 0; private int totalHeight = 0;
private ClickableSpan pressedLink; private ClickableSpan pressedLink;
private int visibleY = 0;
private int visibleHeight = 0;
private int lastVisibleBlockNum = 0; private int lastVisibleBlockNum = 0;
private int firstVisibleBlockNum = 0; private int firstVisibleBlockNum = 0;
private int totalVisibleBlocksCount = 0; private int totalVisibleBlocksCount = 0;
private boolean wasLayout = false;
public ChatMessageCell(Context context, boolean isChat) { public ChatMessageCell(Context context, boolean isChat) {
super(context, isChat); super(context, isChat);
drawForwardedName = true; drawForwardedName = true;
@ -87,21 +83,18 @@ public class ChatMessageCell extends ChatBaseCell {
} }
public void setVisiblePart(int position, int height) { public void setVisiblePart(int position, int height) {
visibleY = position;
visibleHeight = height;
int newFirst = -1, newLast = -1, newCount = 0; int newFirst = -1, newLast = -1, newCount = 0;
for (int a = Math.max(0, (visibleY - textY) / currentMessageObject.blockHeight); a < currentMessageObject.textLayoutBlocks.size(); a++) { for (int a = Math.max(0, (position - textY) / currentMessageObject.blockHeight); a < currentMessageObject.textLayoutBlocks.size(); a++) {
MessageObject.TextLayoutBlock block = currentMessageObject.textLayoutBlocks.get(a); MessageObject.TextLayoutBlock block = currentMessageObject.textLayoutBlocks.get(a);
float y = textY + block.textYOffset; float y = textY + block.textYOffset;
if (intersect(y, y + currentMessageObject.blockHeight, visibleY, visibleY + visibleHeight)) { if (intersect(y, y + currentMessageObject.blockHeight, position, position + height)) {
if (newFirst == -1) { if (newFirst == -1) {
newFirst = a; newFirst = a;
} }
newLast = a; newLast = a;
newCount++; newCount++;
} else if (y > visibleY) { } else if (y > position) {
break; break;
} }
} }
@ -124,7 +117,6 @@ public class ChatMessageCell extends ChatBaseCell {
@Override @Override
public void setMessageObject(MessageObject messageObject) { public void setMessageObject(MessageObject messageObject) {
if (currentMessageObject != messageObject || isUserDataChanged()) { if (currentMessageObject != messageObject || isUserDataChanged()) {
wasLayout = false;
pressedLink = null; pressedLink = null;
int maxWidth; int maxWidth;
if (chat) { if (chat) {
@ -168,22 +160,6 @@ public class ChatMessageCell extends ChatBaseCell {
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), totalHeight); setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), totalHeight);
} }
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (changed || !wasLayout) {
if (currentMessageObject.messageOwner.out) {
textX = layoutWidth - backgroundWidth + Utilities.dp(10);
textY = Utilities.dp(10) + namesOffset;
} else {
textX = Utilities.dp(19) + (chat ? Utilities.dp(52) : 0);
textY = Utilities.dp(10) + namesOffset;
}
wasLayout = true;
}
}
@Override @Override
protected void onDraw(Canvas canvas) { protected void onDraw(Canvas canvas) {
super.onDraw(canvas); super.onDraw(canvas);
@ -191,17 +167,20 @@ public class ChatMessageCell extends ChatBaseCell {
return; return;
} }
if (currentMessageObject.messageOwner.out) {
textX = layoutWidth - backgroundWidth + Utilities.dp(10);
textY = Utilities.dp(10) + namesOffset;
} else {
textX = Utilities.dp(19) + (chat ? Utilities.dp(52) : 0);
textY = Utilities.dp(10) + namesOffset;
}
for (int a = firstVisibleBlockNum; a <= lastVisibleBlockNum; a++) { for (int a = firstVisibleBlockNum; a <= lastVisibleBlockNum; a++) {
MessageObject.TextLayoutBlock block = currentMessageObject.textLayoutBlocks.get(a); MessageObject.TextLayoutBlock block = currentMessageObject.textLayoutBlocks.get(a);
float y = textY + block.textYOffset; canvas.save();
if (intersect(y, y + currentMessageObject.blockHeight, visibleY, visibleY + visibleHeight)) { canvas.translate(textX - (int)Math.ceil(block.textXOffset), textY + block.textYOffset);
canvas.save(); block.textLayout.draw(canvas);
canvas.translate(textX - (int)Math.ceil(block.textXOffset), textY + block.textYOffset); canvas.restore();
block.textLayout.draw(canvas);
canvas.restore();
} else {
break;
}
} }
} }
} }

View file

@ -193,7 +193,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
} else { } else {
inflater.inflate(R.menu.messages_encrypted_menu, menu); inflater.inflate(R.menu.messages_encrypted_menu, menu);
} }
menu.findItem(R.id.copy).setVisible(selectedMessagesCanCopyIds.size() == 1); menu.findItem(R.id.copy).setVisible(selectedMessagesCanCopyIds.size() != 0);
return true; return true;
} }
@ -206,14 +206,25 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
switch (menuItem.getItemId()) { switch (menuItem.getItemId()) {
case R.id.copy: { case R.id.copy: {
MessageObject messageObject = (MessageObject)selectedMessagesCanCopyIds.values().toArray()[0]; String str = "";
if(android.os.Build.VERSION.SDK_INT < 11) { ArrayList<Integer> ids = new ArrayList<Integer>(selectedMessagesCanCopyIds.keySet());
android.text.ClipboardManager clipboard = (android.text.ClipboardManager)parentActivity.getSystemService(Context.CLIPBOARD_SERVICE); Collections.sort(ids);
clipboard.setText(messageObject.messageOwner.message); for (Integer id : ids) {
} else { MessageObject messageObject = selectedMessagesCanCopyIds.get(id);
android.content.ClipboardManager clipboard = (android.content.ClipboardManager)parentActivity.getSystemService(Context.CLIPBOARD_SERVICE); if (str.length() != 0) {
android.content.ClipData clip = android.content.ClipData.newPlainText("label", messageObject.messageOwner.message); str += "\n";
clipboard.setPrimaryClip(clip); }
str += messageObject.messageOwner.message;
}
if (str.length() != 0) {
if(android.os.Build.VERSION.SDK_INT < 11) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager)parentActivity.getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(str);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager)parentActivity.getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("label", str);
clipboard.setPrimaryClip(clip);
}
} }
break; break;
} }
@ -1007,25 +1018,14 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
if (messageObject.type == 0 || messageObject.type == 1 || messageObject.type == 8 || messageObject.type == 9) { if (messageObject.type == 0 || messageObject.type == 1 || messageObject.type == 8 || messageObject.type == 9) {
selectedMessagesCanCopyIds.remove(messageObject.messageOwner.id); selectedMessagesCanCopyIds.remove(messageObject.messageOwner.id);
} }
if (selectedMessagesIds.size() == 1) {
if (mActionMode != null && mActionMode.getMenu() != null) {
mActionMode.getMenu().findItem(R.id.copy).setVisible(selectedMessagesCanCopyIds.size() == 1);
}
}
} else { } else {
boolean update = false;
if (selectedMessagesIds.size() == 1) {
update = true;
}
selectedMessagesIds.put(messageObject.messageOwner.id, messageObject); selectedMessagesIds.put(messageObject.messageOwner.id, messageObject);
if (messageObject.type == 0 || messageObject.type == 1 || messageObject.type == 8 || messageObject.type == 9) { if (messageObject.type == 0 || messageObject.type == 1 || messageObject.type == 8 || messageObject.type == 9) {
selectedMessagesCanCopyIds.put(messageObject.messageOwner.id, messageObject); selectedMessagesCanCopyIds.put(messageObject.messageOwner.id, messageObject);
} }
if (update) { }
if (mActionMode != null && mActionMode.getMenu() != null) { if (mActionMode != null && mActionMode.getMenu() != null) {
mActionMode.getMenu().findItem(R.id.copy).setVisible(false); mActionMode.getMenu().findItem(R.id.copy).setVisible(selectedMessagesCanCopyIds.size() != 0);
}
}
} }
} }
@ -1220,27 +1220,13 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (requestCode == 0) { if (requestCode == 0) {
Utilities.addMediaToGallery(currentPicturePath); Utilities.addMediaToGallery(currentPicturePath);
processSendingPhoto(currentPicturePath); processSendingPhoto(currentPicturePath, null);
currentPicturePath = null; currentPicturePath = null;
} else if (requestCode == 1) { } else if (requestCode == 1) {
if (data == null) { if (data == null) {
return; return;
} }
Uri imageUri = data.getData(); processSendingPhoto(null, data.getData());
if (imageUri == null || imageUri.getScheme() == null) {
return;
}
String imageFilePath = null;
if (imageUri.getScheme().contains("file")) {
imageFilePath = imageUri.getPath();
} else {
try {
imageFilePath = Utilities.getPath(imageUri);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
processSendingPhoto(imageFilePath);
} else if (requestCode == 2) { } else if (requestCode == 2) {
String videoPath = null; String videoPath = null;
if (data != null) { if (data != null) {
@ -1293,11 +1279,11 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
return false; return false;
} }
public void processSendingPhoto(String imageFilePath) { public void processSendingPhoto(String imageFilePath, Uri imageUri) {
if (imageFilePath == null || imageFilePath.length() == 0) { if ((imageFilePath == null || imageFilePath.length() == 0) && imageUri == null) {
return; return;
} }
TLRPC.TL_photo photo = MessagesController.Instance.generatePhotoSizes(imageFilePath); TLRPC.TL_photo photo = MessagesController.Instance.generatePhotoSizes(imageFilePath, imageUri);
if (photo != null) { if (photo != null) {
MessagesController.Instance.sendMessage(photo, dialog_id); MessagesController.Instance.sendMessage(photo, dialog_id);
if (chatListView != null) { if (chatListView != null) {

View file

@ -1,183 +0,0 @@
/*
* This is the source code of Telegram for Android v. 1.3.2.
* 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.
*/
package org.telegram.ui;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.Toast;
import org.telegram.messenger.TLRPC;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.Utilities;
import org.telegram.ui.Views.PausableActivity;
import java.util.ArrayList;
public class LaunchActivity extends PausableActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
return;
}
getWindow().setBackgroundDrawableResource(R.drawable.transparent);
getSupportActionBar().hide();
if (!UserConfig.clientActivated) {
Intent intent = getIntent();
if (Intent.ACTION_SEND.equals(intent.getAction())) {
finish();
return;
}
Intent intent2 = new Intent(this, IntroActivity.class);
startActivity(intent2);
finish();
} else {
Intent intent = getIntent();
if (intent != null && intent.getAction() != null) {
if (Intent.ACTION_SEND.equals(intent.getAction())) {
boolean error = false;
String type = intent.getType();
if (type != null && type.equals("text/plain")) {
String text = intent.getStringExtra(Intent.EXTRA_TEXT);
if (text != null && text.length() != 0) {
NotificationCenter.Instance.addToMemCache(535, text);
} else {
error = true;
}
} else {
Parcelable parcelable = intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (parcelable == null) {
return;
}
String path = null;
if (!(parcelable instanceof Uri)) {
parcelable = Uri.parse(parcelable.toString());
}
path = Utilities.getPath((Uri)parcelable);
if (path != null) {
if (path.startsWith("file:")) {
path = path.replace("file://", "");
}
if (type != null && type.startsWith("image/")) {
NotificationCenter.Instance.addToMemCache(533, path);
} else if (type != null && type.startsWith("video/")) {
NotificationCenter.Instance.addToMemCache(534, path);
} else {
NotificationCenter.Instance.addToMemCache(536, path);
}
} else {
error = true;
}
if (error) {
Toast.makeText(this, "Unsupported content", Toast.LENGTH_SHORT).show();
}
}
} else if (intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
boolean error = false;
try {
ArrayList<Parcelable> uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
String type = intent.getType();
if (uris != null) {
String[] uris2 = new String[uris.size()];
for (int i = 0; i < uris2.length; i++) {
Parcelable parcelable = uris.get(i);
if (!(parcelable instanceof Uri)) {
parcelable = Uri.parse(parcelable.toString());
}
String path = Utilities.getPath((Uri)parcelable);
if (path != null) {
if (path.startsWith("file:")) {
path = path.replace("file://", "");
}
uris2[i] = path;
}
}
if (type != null && type.startsWith("image/")) {
NotificationCenter.Instance.addToMemCache(537, uris2);
} else {
NotificationCenter.Instance.addToMemCache(538, uris2);
}
} else {
error = true;
}
} catch (Exception e) {
FileLog.e("tmessages", e);
error = true;
}
if (error) {
Toast.makeText(this, "Unsupported content", Toast.LENGTH_SHORT).show();
}
} else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
try {
Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
int userId = cursor.getInt(cursor.getColumnIndex("DATA4"));
NotificationCenter.Instance.postNotificationName(MessagesController.closeChats);
NotificationCenter.Instance.addToMemCache("push_user_id", userId);
}
cursor.close();
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
} else if (intent.getAction().equals("org.telegram.messenger.OPEN_ACCOUNT")) {
NotificationCenter.Instance.addToMemCache("open_settings", 1);
}
}
openNotificationChat();
Intent intent2 = new Intent(this, ApplicationActivity.class);
startActivity(intent2);
finish();
}
getIntent().setAction(null);
try {
NotificationManager mNotificationManager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(1);
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
private void openNotificationChat() {
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
return;
}
int chatId = getIntent().getIntExtra("chatId", 0);
int userId = getIntent().getIntExtra("userId", 0);
int encId = getIntent().getIntExtra("encId", 0);
if (chatId != 0) {
TLRPC.Chat chat = MessagesController.Instance.chats.get(chatId);
if (chat != null) {
NotificationCenter.Instance.postNotificationName(MessagesController.closeChats);
NotificationCenter.Instance.addToMemCache("push_chat_id", chatId);
}
} else if (userId != 0) {
TLRPC.User user = MessagesController.Instance.users.get(userId);
if (user != null) {
NotificationCenter.Instance.postNotificationName(MessagesController.closeChats);
NotificationCenter.Instance.addToMemCache("push_user_id", userId);
}
} else if (encId != 0) {
TLRPC.EncryptedChat chat = MessagesController.Instance.encryptedChats.get(encId);
if (chat != null) {
NotificationCenter.Instance.postNotificationName(MessagesController.closeChats);
NotificationCenter.Instance.addToMemCache("push_enc_id", encId);
}
}
}
}

View file

@ -239,7 +239,7 @@ public class LoginActivity extends ActionBarActivity implements SlideView.SlideV
@Override @Override
public void needFinishActivity() { public void needFinishActivity() {
Intent intent2 = new Intent(this, LaunchActivity.class); Intent intent2 = new Intent(this, ApplicationActivity.class);
startActivity(intent2); startActivity(intent2);
finish(); finish();
} }

View file

@ -14,6 +14,7 @@ import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar;
import android.util.AttributeSet; import android.util.AttributeSet;
@ -277,12 +278,15 @@ public class PhotoCropActivity extends BaseFragment {
public boolean onFragmentCreate() { public boolean onFragmentCreate() {
super.onFragmentCreate(); super.onFragmentCreate();
String photoPath = getArguments().getString("photoPath"); String photoPath = getArguments().getString("photoPath");
if (photoPath == null) { Uri photoUri = getArguments().getParcelable("photoUri");
if (photoPath == null && photoUri == null) {
return false; return false;
} }
File f = new File(photoPath); if (photoPath != null) {
if (!f.exists()) { File f = new File(photoPath);
return false; if (!f.exists()) {
return false;
}
} }
Point displaySize = new Point(); Point displaySize = new Point();
Display display = ((WindowManager)ApplicationLoader.applicationContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); Display display = ((WindowManager)ApplicationLoader.applicationContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
@ -292,7 +296,7 @@ public class PhotoCropActivity extends BaseFragment {
display.getSize(displaySize); display.getSize(displaySize);
} }
int size = Math.max(displaySize.x, displaySize.y); int size = Math.max(displaySize.x, displaySize.y);
imageToCrop = FileLoader.loadBitmap(photoPath, size, size); imageToCrop = FileLoader.loadBitmap(photoPath, photoUri, size, size);
if (imageToCrop == null) { if (imageToCrop == null) {
return false; return false;
} }

View file

@ -193,7 +193,7 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
if (requestCode == 0) { if (requestCode == 0) {
Utilities.addMediaToGallery(currentPicturePath); Utilities.addMediaToGallery(currentPicturePath);
try { try {
Bitmap bitmap = FileLoader.loadBitmap(currentPicturePath, Utilities.dp(320), Utilities.dp(480)); Bitmap bitmap = FileLoader.loadBitmap(currentPicturePath, null, Utilities.dp(320), Utilities.dp(480));
File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg"); File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg");
FileOutputStream stream = new FileOutputStream(toFile); FileOutputStream stream = new FileOutputStream(toFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream); bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream);
@ -218,7 +218,7 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
} }
cursor.close(); cursor.close();
Bitmap bitmap = FileLoader.loadBitmap(imageFilePath, Utilities.dp(320), Utilities.dp(480)); Bitmap bitmap = FileLoader.loadBitmap(imageFilePath, null, Utilities.dp(320), Utilities.dp(480));
File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg"); File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg");
FileOutputStream stream = new FileOutputStream(toFile); FileOutputStream stream = new FileOutputStream(toFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream); bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream);

View file

@ -32,7 +32,6 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
private TLRPC.PhotoSize bigPhoto; private TLRPC.PhotoSize bigPhoto;
public String uploadingAvatar = null; public String uploadingAvatar = null;
File picturePath = null; File picturePath = null;
public Activity parentActivity = null;
public BaseFragment parentFragment = null; public BaseFragment parentFragment = null;
public AvatarUpdaterDelegate delegate; public AvatarUpdaterDelegate delegate;
private boolean clearAfterUpdate = false; private boolean clearAfterUpdate = false;
@ -47,7 +46,6 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
clearAfterUpdate = true; clearAfterUpdate = true;
} else { } else {
parentFragment = null; parentFragment = null;
parentActivity = null;
delegate = null; delegate = null;
} }
} }
@ -60,11 +58,7 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
currentPicturePath = image.getAbsolutePath(); currentPicturePath = image.getAbsolutePath();
} }
if (parentFragment != null) { parentFragment.startActivityForResult(takePictureIntent, 0);
parentFragment.startActivityForResult(takePictureIntent, 0);
} else if (parentActivity != null) {
parentActivity.startActivityForResult(takePictureIntent, 0);
}
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
@ -74,54 +68,34 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
try { try {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*"); photoPickerIntent.setType("image/*");
if (parentFragment != null) { parentFragment.startActivityForResult(photoPickerIntent, 1);
parentFragment.startActivityForResult(photoPickerIntent, 1);
} else if (parentActivity != null) {
parentActivity.startActivityForResult(photoPickerIntent, 1);
}
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
} }
private void startCrop(String path) { private void startCrop(String path, Uri uri) {
try { try {
if (parentFragment != null) { ApplicationActivity activity = (ApplicationActivity)parentFragment.parentActivity;
ApplicationActivity activity = (ApplicationActivity)parentFragment.parentActivity; if (activity == null) {
if (activity == null) { activity = (ApplicationActivity)parentFragment.getActivity();
activity = (ApplicationActivity)parentFragment.getActivity();
}
if (activity == null) {
return;
}
Bundle params = new Bundle();
params.putString("photoPath", path);
PhotoCropActivity photoCropActivity = new PhotoCropActivity();
photoCropActivity.delegate = this;
photoCropActivity.setArguments(params);
activity.presentFragment(photoCropActivity, "crop", false);
} else {
Intent cropIntent = new Intent("com.android.camera.action.CROP");
cropIntent.setDataAndType(Uri.fromFile(new File(path)), "image/*");
cropIntent.putExtra("crop", "true");
cropIntent.putExtra("aspectX", 1);
cropIntent.putExtra("aspectY", 1);
cropIntent.putExtra("outputX", 800);
cropIntent.putExtra("outputY", 800);
cropIntent.putExtra("scale", true);
cropIntent.putExtra("return-data", false);
picturePath = Utilities.generatePicturePath();
cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(picturePath));
cropIntent.putExtra("output", Uri.fromFile(picturePath));
if (parentFragment != null) {
parentFragment.startActivityForResult(cropIntent, 2);
} else if (parentActivity != null) {
parentActivity.startActivityForResult(cropIntent, 2);
}
} }
if (activity == null) {
return;
}
Bundle params = new Bundle();
if (path != null) {
params.putString("photoPath", path);
} else if (uri != null) {
params.putParcelable("photoUri", uri);
}
PhotoCropActivity photoCropActivity = new PhotoCropActivity();
photoCropActivity.delegate = this;
photoCropActivity.setArguments(params);
activity.presentFragment(photoCropActivity, "crop", false);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
Bitmap bitmap = FileLoader.loadBitmap(path, 800, 800); Bitmap bitmap = FileLoader.loadBitmap(path, uri, 800, 800);
processBitmap(bitmap); processBitmap(bitmap);
} }
} }
@ -130,25 +104,14 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (requestCode == 0) { if (requestCode == 0) {
Utilities.addMediaToGallery(currentPicturePath); Utilities.addMediaToGallery(currentPicturePath);
startCrop(currentPicturePath); startCrop(currentPicturePath, null);
currentPicturePath = null; currentPicturePath = null;
} else if (requestCode == 1) { } else if (requestCode == 1) {
if (data == null) { if (data == null || data.getData() == null) {
return; return;
} }
try { startCrop(null, data.getData());
Uri imageUri = data.getData();
if (imageUri != null) {
String imageFilePath = Utilities.getPath(imageUri);
startCrop(imageFilePath);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
} else if (requestCode == 2) {
Bitmap bitmap = FileLoader.loadBitmap(picturePath.getAbsolutePath(), 800, 800);
processBitmap(bitmap);
} }
} }
} }
@ -195,7 +158,6 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
uploadingAvatar = null; uploadingAvatar = null;
if (clearAfterUpdate) { if (clearAfterUpdate) {
parentFragment = null; parentFragment = null;
parentActivity = null;
delegate = null; delegate = null;
} }
} }
@ -210,10 +172,8 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
NotificationCenter.Instance.removeObserver(AvatarUpdater.this, FileLoader.FileDidUpload); NotificationCenter.Instance.removeObserver(AvatarUpdater.this, FileLoader.FileDidUpload);
NotificationCenter.Instance.removeObserver(AvatarUpdater.this, FileLoader.FileDidFailUpload); NotificationCenter.Instance.removeObserver(AvatarUpdater.this, FileLoader.FileDidFailUpload);
uploadingAvatar = null; uploadingAvatar = null;
//delegate.didUploadedPhoto(null, null, null);
if (clearAfterUpdate) { if (clearAfterUpdate) {
parentFragment = null; parentFragment = null;
parentActivity = null;
delegate = null; delegate = null;
} }
} }