Improved back swipe, new photo viewer(not finished, disabed) bug fixes

This commit is contained in:
DrKLO 2014-06-07 03:35:21 +04:00
parent cdb39ac30f
commit 92e1b0503b
34 changed files with 1013 additions and 498 deletions

View file

@ -82,7 +82,7 @@ android {
defaultConfig { defaultConfig {
minSdkVersion 8 minSdkVersion 8
targetSdkVersion 19 targetSdkVersion 19
versionCode 238 versionCode 240
versionName "1.4.15" versionName "1.4.15"
} }
} }

View file

@ -1603,7 +1603,6 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
} }
} }
@SuppressWarnings("unused")
ByteBufferDesc createConnectionData(ArrayList<NetworkMessage> messages, ArrayList<Integer> quickAckId, TcpConnection connection) { ByteBufferDesc createConnectionData(ArrayList<NetworkMessage> messages, ArrayList<Integer> quickAckId, TcpConnection connection) {
Datacenter datacenter = datacenterWithId(connection.getDatacenterId()); Datacenter datacenter = datacenterWithId(connection.getDatacenterId());
if (datacenter.authKey == null) { if (datacenter.authKey == null) {

View file

@ -433,7 +433,12 @@ public class ContactsController {
FileLog.e("tmessages", "detected account deletion!"); FileLog.e("tmessages", "detected account deletion!");
currentAccount = new Account(UserConfig.currentUser.phone, "org.telegram.account"); currentAccount = new Account(UserConfig.currentUser.phone, "org.telegram.account");
am.addAccountExplicitly(currentAccount, "", null); am.addAccountExplicitly(currentAccount, "", null);
performWriteContactsToPhoneBookInternal(); Utilities.RunOnUIThread(new Runnable() {
@Override
public void run() {
performWriteContactsToPhoneBook();
}
});
} }
} }
} catch (Exception e) { } catch (Exception e) {
@ -1149,7 +1154,7 @@ public class ContactsController {
sortedUsersSectionsArray = sortedSectionsArray; sortedUsersSectionsArray = sortedSectionsArray;
} }
private void performWriteContactsToPhoneBookInternal() { private void performWriteContactsToPhoneBookInternal(ArrayList<TLRPC.TL_contact> contactsArray) {
try { try {
Uri rawContactUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, currentAccount.name).appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, currentAccount.type).build(); Uri rawContactUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, currentAccount.name).appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, currentAccount.type).build();
Cursor c1 = ApplicationLoader.applicationContext.getContentResolver().query(rawContactUri, new String[]{BaseColumns._ID, ContactsContract.RawContacts.SYNC2}, null, null, null); Cursor c1 = ApplicationLoader.applicationContext.getContentResolver().query(rawContactUri, new String[]{BaseColumns._ID, ContactsContract.RawContacts.SYNC2}, null, null, null);
@ -1160,7 +1165,7 @@ public class ContactsController {
} }
c1.close(); c1.close();
for (TLRPC.TL_contact u : contacts) { for (TLRPC.TL_contact u : contactsArray) {
if (!bookContacts.containsKey(u.user_id)) { if (!bookContacts.containsKey(u.user_id)) {
TLRPC.User user = MessagesController.getInstance().users.get(u.user_id); TLRPC.User user = MessagesController.getInstance().users.get(u.user_id);
addContactToPhoneBook(user, false); addContactToPhoneBook(user, false);
@ -1173,10 +1178,12 @@ public class ContactsController {
} }
private void performWriteContactsToPhoneBook() { private void performWriteContactsToPhoneBook() {
final ArrayList<TLRPC.TL_contact> contactsArray = new ArrayList<TLRPC.TL_contact>();
contactsArray.addAll(contacts);
Utilities.globalQueue.postRunnable(new Runnable() { Utilities.globalQueue.postRunnable(new Runnable() {
@Override @Override
public void run() { public void run() {
performWriteContactsToPhoneBookInternal(); performWriteContactsToPhoneBookInternal(contactsArray);
} }
}); });
} }

View file

@ -11,9 +11,10 @@ package org.telegram.messenger;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.util.Log;
public class DispatchQueue extends Thread { public class DispatchQueue extends Thread {
public Handler handler; public volatile Handler handler = null;
private final Object handlerSyncObject = new Object(); private final Object handlerSyncObject = new Object();
public DispatchQueue(final String threadName) { public DispatchQueue(final String threadName) {
@ -47,12 +48,14 @@ public class DispatchQueue extends Thread {
public void postRunnable(Runnable runnable, int delay) { public void postRunnable(Runnable runnable, int delay) {
if (handler == null) { if (handler == null) {
try { synchronized (handlerSyncObject) {
synchronized (handlerSyncObject) { if (handler == null) {
handlerSyncObject.wait(); try {
handlerSyncObject.wait();
} catch (Throwable t) {
t.printStackTrace();
}
} }
} catch (Throwable t) {
t.printStackTrace();
} }
} }
@ -67,8 +70,8 @@ public class DispatchQueue extends Thread {
public void run() { public void run() {
Looper.prepare(); Looper.prepare();
handler = new Handler();
synchronized (handlerSyncObject) { synchronized (handlerSyncObject) {
handler = new Handler();
handlerSyncObject.notify(); handlerSyncObject.notify();
} }
Looper.loop(); Looper.loop();

View file

@ -3403,7 +3403,6 @@ public class MessagesController implements NotificationCenter.NotificationCenter
ConnectionsManager.getInstance().connectionState = 0; ConnectionsManager.getInstance().connectionState = 0;
processUpdatesQueue(true); processUpdatesQueue(true);
} else if (res instanceof TLRPC.TL_updates_differenceSlice) { } else if (res instanceof TLRPC.TL_updates_differenceSlice) {
//MessagesStorage.lastSeqValue = res.intermediate_state.seq;
MessagesStorage.lastDateValue = res.intermediate_state.date; MessagesStorage.lastDateValue = res.intermediate_state.date;
MessagesStorage.lastPtsValue = res.intermediate_state.pts; MessagesStorage.lastPtsValue = res.intermediate_state.pts;
MessagesStorage.lastQtsValue = res.intermediate_state.qts; MessagesStorage.lastQtsValue = res.intermediate_state.qts;
@ -3424,8 +3423,14 @@ public class MessagesController implements NotificationCenter.NotificationCenter
}); });
} else { } else {
gettingDifference = false; gettingDifference = false;
getDifference(); ConnectionsManager.getInstance().connectionState = 0;
FileLog.e("tmessages", "get difference error, don't know what to do :("); final int stateCopy = ConnectionsManager.getInstance().connectionState;
Utilities.RunOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(703, stateCopy);
}
});
} }
} }
}, null, true, RPCRequest.RPCRequestClassGeneric); }, null, true, RPCRequest.RPCRequestClassGeneric);

View file

@ -8,8 +8,6 @@
package org.telegram.messenger; package org.telegram.messenger;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.Html; import android.text.Html;
import android.util.SparseArray; import android.util.SparseArray;
@ -40,8 +38,6 @@ public class MessagesStorage {
public static final int wallpapersDidLoaded = 171; public static final int wallpapersDidLoaded = 171;
private boolean appliedDialogFix = false;
private static volatile MessagesStorage Instance = null; private static volatile MessagesStorage Instance = null;
public static MessagesStorage getInstance() { public static MessagesStorage getInstance() {
MessagesStorage localInstance = Instance; MessagesStorage localInstance = Instance;
@ -66,22 +62,10 @@ public class MessagesStorage {
cacheFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "cache4.db"); cacheFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "cache4.db");
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("dbconfig", Context.MODE_PRIVATE);
appliedDialogFix = preferences.getBoolean("appliedDialogFix", false);
boolean createTable = false; boolean createTable = false;
//cacheFile.delete(); //cacheFile.delete();
if (!cacheFile.exists()) { if (!cacheFile.exists()) {
createTable = true; createTable = true;
try {
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("appliedDialogFix", true);
appliedDialogFix = true;
editor.commit();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
} }
try { try {
database = new SQLiteDatabase(cacheFile.getPath()); database = new SQLiteDatabase(cacheFile.getPath());
@ -202,66 +186,11 @@ public class MessagesStorage {
cacheFile.delete(); cacheFile.delete();
cacheFile = null; cacheFile = null;
} }
try {
File old = new File(ApplicationLoader.applicationContext.getFilesDir(), "cache.db");
if (old.exists()) {
old.delete();
}
old = new File(ApplicationLoader.applicationContext.getFilesDir(), "cache2.db");
if (old.exists()) {
old.delete();
}
old = new File(ApplicationLoader.applicationContext.getFilesDir(), "cache3.db");
if (old.exists()) {
old.delete();
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
openDatabase(); openDatabase();
} }
}); });
} }
public void applyDialogsFix() { //server bug on 20.02.2014
if (!appliedDialogFix) {
try {
SQLiteCursor cursor = database.queryFinalized("SELECT d.did, m.data FROM dialogs as d LEFT JOIN messages as m ON d.last_mid = m.mid WHERE m.mid < 0 AND m.date >= 1392930900 AND m.date <= 1392935700");
String dids = "";
while (cursor.next()) {
long did = cursor.longValue(0);
byte[] messageData = cursor.byteArrayValue(1);
if (messageData != null) {
SerializedData data = new SerializedData(messageData);
TLRPC.Message message = (TLRPC.Message)TLClassStore.Instance().TLdeserialize(data, data.readInt32());
if (message != null) {
if (message.action != null && message.action instanceof TLRPC.TL_messageActionUserJoined) {
if (dids.length() != 0) {
dids += ",";
}
dids += "" + did;
}
}
}
}
cursor.dispose();
if (dids.length() != 0) {
database.executeFast("DELETE FROM dialogs WHERE did IN(" + dids + ")").stepThis().dispose();
}
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("dbconfig", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("appliedDialogFix", true);
appliedDialogFix = true;
editor.commit();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
}
public void saveSecretParams(final int lsv, final int sg, final byte[] pbytes) { public void saveSecretParams(final int lsv, final int sg, final byte[] pbytes) {
storageQueue.postRunnable(new Runnable() { storageQueue.postRunnable(new Runnable() {
@Override @Override

View file

@ -90,6 +90,10 @@ public class TcpConnection extends ConnectionContext {
connectionState = TcpConnectionState.TcpConnectionStageConnecting; connectionState = TcpConnectionState.TcpConnectionStageConnecting;
try { try {
Datacenter datacenter = ConnectionsManager.getInstance().datacenterWithId(datacenterId);
hostAddress = datacenter.getCurrentAddress();
hostPort = datacenter.getCurrentPort();
if(android.os.Build.VERSION.SDK_INT < 11) { if(android.os.Build.VERSION.SDK_INT < 11) {
if (!ConnectionsManager.isNetworkOnline() && !tryWithNoNetworkAnyway) { if (!ConnectionsManager.isNetworkOnline() && !tryWithNoNetworkAnyway) {
handleConnectionError(null); handleConnectionError(null);
@ -108,9 +112,7 @@ public class TcpConnection extends ConnectionContext {
} catch (Exception e2) { } catch (Exception e2) {
FileLog.e("tmessages", e2); FileLog.e("tmessages", e2);
} }
Datacenter datacenter = ConnectionsManager.getInstance().datacenterWithId(datacenterId);
hostAddress = datacenter.getCurrentAddress();
hostPort = datacenter.getCurrentPort();
FileLog.d("tmessages", String.format(TcpConnection.this + " Connecting (%s:%d)", hostAddress, hostPort)); FileLog.d("tmessages", String.format(TcpConnection.this + " Connecting (%s:%d)", hostAddress, hostPort));
firstPacket = true; firstPacket = true;
if (restOfTheData != null) { if (restOfTheData != null) {
@ -292,6 +294,7 @@ public class TcpConnection extends ConnectionContext {
} }
if (client == null || client.isDisconnected()) { if (client == null || client.isDisconnected()) {
BuffersStorage.getInstance().reuseFreeBuffer(buff);
return; return;
} }

View file

@ -99,6 +99,7 @@ public class ChatBaseCell extends BaseCell {
protected int timeX; protected int timeX;
private TextPaint currentTimePaint; private TextPaint currentTimePaint;
private String currentTimeString; private String currentTimeString;
protected boolean drawTime = true;
private TLRPC.User currentUser; private TLRPC.User currentUser;
private TLRPC.FileLocation currentPhoto; private TLRPC.FileLocation currentPhoto;
@ -542,91 +543,93 @@ public class ChatBaseCell extends BaseCell {
canvas.restore(); canvas.restore();
} }
if (media) { if (drawTime) {
setDrawableBounds(mediaBackgroundDrawable, timeX - Utilities.dp(3), layoutHeight - Utilities.dpf(27.5f), timeWidth + Utilities.dp(6 + (currentMessageObject.isOut() ? 20 : 0)), Utilities.dpf(16.5f)); if (media) {
mediaBackgroundDrawable.draw(canvas); setDrawableBounds(mediaBackgroundDrawable, timeX - Utilities.dp(3), layoutHeight - Utilities.dpf(27.5f), timeWidth + Utilities.dp(6 + (currentMessageObject.isOut() ? 20 : 0)), Utilities.dpf(16.5f));
mediaBackgroundDrawable.draw(canvas);
canvas.save(); canvas.save();
canvas.translate(timeX, layoutHeight - Utilities.dpf(12.0f) - timeLayout.getHeight()); canvas.translate(timeX, layoutHeight - Utilities.dpf(12.0f) - timeLayout.getHeight());
timeLayout.draw(canvas); timeLayout.draw(canvas);
canvas.restore(); canvas.restore();
} else { } else {
canvas.save(); canvas.save();
canvas.translate(timeX, layoutHeight - Utilities.dpf(6.5f) - timeLayout.getHeight()); canvas.translate(timeX, layoutHeight - Utilities.dpf(6.5f) - timeLayout.getHeight());
timeLayout.draw(canvas); timeLayout.draw(canvas);
canvas.restore(); canvas.restore();
} }
if (currentMessageObject.isOut()) { if (currentMessageObject.isOut()) {
boolean drawCheck1 = false; boolean drawCheck1 = false;
boolean drawCheck2 = false; boolean drawCheck2 = false;
boolean drawClock = false; boolean drawClock = false;
boolean drawError = false; boolean drawError = false;
if (currentMessageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SENDING) { if (currentMessageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SENDING) {
drawCheck1 = false;
drawCheck2 = false;
drawClock = true;
drawError = false;
} else if (currentMessageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SEND_ERROR) {
drawCheck1 = false;
drawCheck2 = false;
drawClock = false;
drawError = true;
} else if (currentMessageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SENT) {
if (!currentMessageObject.messageOwner.unread) {
drawCheck1 = true;
drawCheck2 = true;
} else {
drawCheck1 = false; drawCheck1 = false;
drawCheck2 = true; drawCheck2 = false;
drawClock = true;
drawError = false;
} else if (currentMessageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SEND_ERROR) {
drawCheck1 = false;
drawCheck2 = false;
drawClock = false;
drawError = true;
} else if (currentMessageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SENT) {
if (!currentMessageObject.messageOwner.unread) {
drawCheck1 = true;
drawCheck2 = true;
} else {
drawCheck1 = false;
drawCheck2 = true;
}
drawClock = false;
drawError = false;
} }
drawClock = false;
drawError = false;
}
if (drawClock) { if (drawClock) {
if (!media) { if (!media) {
setDrawableBounds(clockDrawable, layoutWidth - Utilities.dpf(18.5f) - clockDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - clockDrawable.getIntrinsicHeight()); setDrawableBounds(clockDrawable, layoutWidth - Utilities.dpf(18.5f) - clockDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - clockDrawable.getIntrinsicHeight());
clockDrawable.draw(canvas); clockDrawable.draw(canvas);
} else {
setDrawableBounds(clockMediaDrawable, layoutWidth - Utilities.dpf(22.0f) - clockMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - clockMediaDrawable.getIntrinsicHeight());
clockMediaDrawable.draw(canvas);
}
}
if (drawCheck2) {
if (!media) {
if (drawCheck1) {
setDrawableBounds(checkDrawable, layoutWidth - Utilities.dpf(22.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight());
} else { } else {
setDrawableBounds(checkDrawable, layoutWidth - Utilities.dpf(18.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight()); setDrawableBounds(clockMediaDrawable, layoutWidth - Utilities.dpf(22.0f) - clockMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - clockMediaDrawable.getIntrinsicHeight());
clockMediaDrawable.draw(canvas);
} }
checkDrawable.draw(canvas); }
} else { if (drawCheck2) {
if (drawCheck1) { if (!media) {
setDrawableBounds(checkMediaDrawable, layoutWidth - Utilities.dpf(26.0f) - checkMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - checkMediaDrawable.getIntrinsicHeight()); if (drawCheck1) {
setDrawableBounds(checkDrawable, layoutWidth - Utilities.dpf(22.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight());
} else {
setDrawableBounds(checkDrawable, layoutWidth - Utilities.dpf(18.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight());
}
checkDrawable.draw(canvas);
} else { } else {
setDrawableBounds(checkMediaDrawable, layoutWidth - Utilities.dpf(22.0f) - checkMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - checkMediaDrawable.getIntrinsicHeight()); if (drawCheck1) {
setDrawableBounds(checkMediaDrawable, layoutWidth - Utilities.dpf(26.0f) - checkMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - checkMediaDrawable.getIntrinsicHeight());
} else {
setDrawableBounds(checkMediaDrawable, layoutWidth - Utilities.dpf(22.0f) - checkMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - checkMediaDrawable.getIntrinsicHeight());
}
checkMediaDrawable.draw(canvas);
} }
checkMediaDrawable.draw(canvas);
} }
} if (drawCheck1) {
if (drawCheck1) { if (!media) {
if (!media) { setDrawableBounds(halfCheckDrawable, layoutWidth - Utilities.dp(18) - halfCheckDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - halfCheckDrawable.getIntrinsicHeight());
setDrawableBounds(halfCheckDrawable, layoutWidth - Utilities.dp(18) - halfCheckDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - halfCheckDrawable.getIntrinsicHeight()); halfCheckDrawable.draw(canvas);
halfCheckDrawable.draw(canvas); } else {
} else { setDrawableBounds(halfCheckMediaDrawable, layoutWidth - Utilities.dpf(20.5f) - halfCheckMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - halfCheckMediaDrawable.getIntrinsicHeight());
setDrawableBounds(halfCheckMediaDrawable, layoutWidth - Utilities.dpf(20.5f) - halfCheckMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - halfCheckMediaDrawable.getIntrinsicHeight()); halfCheckMediaDrawable.draw(canvas);
halfCheckMediaDrawable.draw(canvas); }
} }
} if (drawError) {
if (drawError) { if (!media) {
if (!media) { setDrawableBounds(errorDrawable, layoutWidth - Utilities.dp(18) - errorDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(6.5f) - errorDrawable.getIntrinsicHeight());
setDrawableBounds(errorDrawable, layoutWidth - Utilities.dp(18) - errorDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(6.5f) - errorDrawable.getIntrinsicHeight()); errorDrawable.draw(canvas);
errorDrawable.draw(canvas); } else {
} else { setDrawableBounds(errorDrawable, layoutWidth - Utilities.dpf(20.5f) - errorDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(12.5f) - errorDrawable.getIntrinsicHeight());
setDrawableBounds(errorDrawable, layoutWidth - Utilities.dpf(20.5f) - errorDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(12.5f) - errorDrawable.getIntrinsicHeight()); errorDrawable.draw(canvas);
errorDrawable.draw(canvas); }
} }
} }
} }

View file

@ -39,7 +39,7 @@ import java.util.Locale;
public class ChatMediaCell extends ChatBaseCell implements MediaController.FileDownloadProgressListener { public class ChatMediaCell extends ChatBaseCell implements MediaController.FileDownloadProgressListener {
public static interface ChatMediaCellDelegate { public static interface ChatMediaCellDelegate {
public abstract void didPressedImage(ChatBaseCell cell); public abstract void didPressedImage(ChatMediaCell cell, ImageReceiver imageReceiver);
} }
private static Drawable placeholderInDrawable; private static Drawable placeholderInDrawable;
@ -196,7 +196,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
if (currentMessageObject.type == 1) { if (currentMessageObject.type == 1) {
if (buttonState == -1) { if (buttonState == -1) {
if (mediaDelegate != null) { if (mediaDelegate != null) {
mediaDelegate.didPressedImage(this); mediaDelegate.didPressedImage(this, photoImage);
} }
} else if (buttonState == 0) { } else if (buttonState == 0) {
didPressedButton(); didPressedButton();
@ -217,7 +217,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
} }
} else if (currentMessageObject.type == 4) { } else if (currentMessageObject.type == 4) {
if (mediaDelegate != null) { if (mediaDelegate != null) {
mediaDelegate.didPressedImage(this); mediaDelegate.didPressedImage(this, photoImage);
} }
} }
} }
@ -271,7 +271,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
} }
} else if (buttonState == 3) { } else if (buttonState == 3) {
if (mediaDelegate != null) { if (mediaDelegate != null) {
mediaDelegate.didPressedImage(this); mediaDelegate.didPressedImage(this, photoImage);
} }
} }
} }
@ -545,6 +545,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
canvas.restore(); canvas.restore();
} else { } else {
photoImage.draw(canvas, photoImage.imageX, photoImage.imageY, photoWidth, photoHeight); photoImage.draw(canvas, photoImage.imageX, photoImage.imageY, photoWidth, photoHeight);
drawTime = photoImage.getVisible();
} }
if (progressVisible) { if (progressVisible) {

View file

@ -35,7 +35,6 @@ import android.text.Html;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.text.style.ImageSpan; import android.text.style.ImageSpan;
import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.Gravity; import android.view.Gravity;
import android.view.KeyEvent; import android.view.KeyEvent;
@ -91,6 +90,7 @@ import org.telegram.ui.Views.ActionBar.ActionBarMenuItem;
import org.telegram.ui.Views.BackupImageView; import org.telegram.ui.Views.BackupImageView;
import org.telegram.ui.Views.ActionBar.BaseFragment; import org.telegram.ui.Views.ActionBar.BaseFragment;
import org.telegram.ui.Views.EmojiView; import org.telegram.ui.Views.EmojiView;
import org.telegram.ui.Views.ImageReceiver;
import org.telegram.ui.Views.LayoutListView; import org.telegram.ui.Views.LayoutListView;
import org.telegram.ui.Views.MessageActionLayout; import org.telegram.ui.Views.MessageActionLayout;
import org.telegram.ui.Views.SizeNotifierRelativeLayout; import org.telegram.ui.Views.SizeNotifierRelativeLayout;
@ -152,7 +152,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
private View pagedownButton; private View pagedownButton;
private TextView topPanelText; private TextView topPanelText;
private long dialog_id; private long dialog_id;
AlertDialog visibleDialog = null;
private SizeNotifierRelativeLayout sizeNotifierRelativeLayout; private SizeNotifierRelativeLayout sizeNotifierRelativeLayout;
private HashMap<Integer, MessageObject> selectedMessagesIds = new HashMap<Integer, MessageObject>(); private HashMap<Integer, MessageObject> selectedMessagesIds = new HashMap<Integer, MessageObject>();
private HashMap<Integer, MessageObject> selectedMessagesCanCopyIds = new HashMap<Integer, MessageObject>(); private HashMap<Integer, MessageObject> selectedMessagesCanCopyIds = new HashMap<Integer, MessageObject>();
@ -404,14 +403,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
sizeNotifierRelativeLayout = null; sizeNotifierRelativeLayout = null;
} }
try {
if (visibleDialog != null) {
visibleDialog.dismiss();
visibleDialog = null;
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
if (mWakeLock != null) { if (mWakeLock != null) {
try { try {
mWakeLock.release(); mWakeLock.release();
@ -543,7 +534,10 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
} }
} }
selectedMessagesIds.clear();
selectedMessagesCanCopyIds.clear();
actionBarLayer.hideActionMode(); actionBarLayer.hideActionMode();
updateVisibleRows();
} else if (id == delete) { } else if (id == delete) {
ArrayList<Integer> ids = new ArrayList<Integer>(selectedMessagesIds.keySet()); ArrayList<Integer> ids = new ArrayList<Integer>(selectedMessagesIds.keySet());
ArrayList<Long> random_ids = null; ArrayList<Long> random_ids = null;
@ -1006,8 +1000,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
visibleDialog = builder.show(); showAlertDialog(builder);
visibleDialog.setCanceledOnTouchOutside(true);
} }
}); });
@ -1336,8 +1329,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
visibleDialog = builder.show(); showAlertDialog(builder);
visibleDialog.setCanceledOnTouchOutside(true);
} }
}); });
timerButton.setTime(currentEncryptedChat.ttl); timerButton.setTime(currentEncryptedChat.ttl);
@ -2584,8 +2576,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
visibleDialog = builder.show(); showAlertDialog(builder);
visibleDialog.setCanceledOnTouchOutside(true);
} }
}); });
} }
@ -2671,8 +2662,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
showActionBar();
checkActionBarMenu(); checkActionBarMenu();
if (chatAdapter != null) { if (chatAdapter != null) {
chatAdapter.notifyDataSetChanged(); chatAdapter.notifyDataSetChanged();
@ -2730,6 +2719,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
@Override @Override
public void onBeginSlide() { public void onBeginSlide() {
super.onBeginSlide();
hideEmojiPopup(); hideEmojiPopup();
} }
@ -2806,6 +2796,12 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override @Override
public boolean onPreDraw() { public boolean onPreDraw() {
if (chatListView != null) {
chatListView.getViewTreeObserver().removeOnPreDrawListener(this);
}
if (getParentActivity() == null) {
return true;
}
int height = Utilities.dp(48); int height = Utilities.dp(48);
if (getParentActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { if (getParentActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
height = Utilities.dp(40); height = Utilities.dp(40);
@ -2819,7 +2815,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
params.height = height; params.height = height;
avatarImageView.setLayoutParams(params); avatarImageView.setLayoutParams(params);
} }
chatListView.getViewTreeObserver().removeOnPreDrawListener(this);
return false; return false;
} }
}); });
@ -3011,15 +3006,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setMessage(LocaleController.getString("IncorrectLocalization", R.string.IncorrectLocalization)); builder.setMessage(LocaleController.getString("IncorrectLocalization", R.string.IncorrectLocalization));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
visibleDialog = builder.show(); showAlertDialog(builder);
visibleDialog.setCanceledOnTouchOutside(true);
visibleDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
visibleDialog = null;
}
});
} }
} }
} }
@ -3028,15 +3015,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
}); });
builder.setTitle(LocaleController.getString("Message", R.string.Message)); builder.setTitle(LocaleController.getString("Message", R.string.Message));
visibleDialog = builder.show(); showAlertDialog(builder);
visibleDialog.setCanceledOnTouchOutside(true);
visibleDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
visibleDialog = null;
}
});
} }
return; return;
} }
@ -3272,9 +3251,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
} }
}); });
builder.setNegativeButton(R.string.Cancel, null); builder.setNegativeButton(R.string.Cancel, null);
visibleDialog = builder.create(); showAlertDialog(builder);
visibleDialog.setCanceledOnTouchOutside(true);
visibleDialog.show();
return false; return false;
} }
} }
@ -3387,15 +3364,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
} else { } else {
builder.setMessage(LocaleController.formatString("NoHandleAppInstalled", R.string.NoHandleAppInstalled, message.messageOwner.media.document.mime_type)); builder.setMessage(LocaleController.formatString("NoHandleAppInstalled", R.string.NoHandleAppInstalled, message.messageOwner.media.document.mime_type));
} }
visibleDialog = builder.show(); showAlertDialog(builder);
visibleDialog.setCanceledOnTouchOutside(true);
visibleDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
visibleDialog = null;
}
});
} }
private class ChatAdapter extends BaseAdapter { private class ChatAdapter extends BaseAdapter {
@ -3548,7 +3517,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
if (view instanceof ChatMediaCell) { if (view instanceof ChatMediaCell) {
((ChatMediaCell)view).mediaDelegate = new ChatMediaCell.ChatMediaCellDelegate() { ((ChatMediaCell)view).mediaDelegate = new ChatMediaCell.ChatMediaCellDelegate() {
@Override @Override
public void didPressedImage(ChatBaseCell cell) { public void didPressedImage(ChatMediaCell cell, ImageReceiver imageReceiver) {
MessageObject message = cell.getMessageObject(); MessageObject message = cell.getMessageObject();
if (message.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SEND_ERROR) { if (message.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SEND_ERROR) {
createMenu(cell, false); createMenu(cell, false);
@ -3557,6 +3526,9 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
return; return;
} }
if (message.type == 1) { if (message.type == 1) {
// int coords[] = new int[2];
// cell.getLocationInWindow(coords);
// PhotoViewer.getInstance().openPhoto(imageReceiver, coords[0], coords[1] - Utilities.statusBarHeight, chatListView);
NotificationCenter.getInstance().addToMemCache(51, message); NotificationCenter.getInstance().addToMemCache(51, message);
Intent intent = new Intent(getParentActivity(), GalleryImageViewer.class); Intent intent = new Intent(getParentActivity(), GalleryImageViewer.class);
getParentActivity().startActivity(intent); getParentActivity().startActivity(intent);
@ -4061,37 +4033,31 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
} }
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setItems(new CharSequence[] {LocaleController.getString("Copy", R.string.Copy), LocaleController.getString("Call", R.string.Call)}, new DialogInterface.OnClickListener() { builder.setItems(new CharSequence[] {LocaleController.getString("Copy", R.string.Copy), LocaleController.getString("Call", R.string.Call)}, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialogInterface, int i) {
if (i == 1) { if (i == 1) {
try { try {
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + message.messageOwner.media.phone_number)); Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + message.messageOwner.media.phone_number));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getParentActivity().startActivity(intent); getParentActivity().startActivity(intent);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
} else if (i == 0) { } else if (i == 0) {
int sdk = android.os.Build.VERSION.SDK_INT; int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager)ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); android.text.ClipboardManager clipboard = (android.text.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(message.messageOwner.media.phone_number); clipboard.setText(message.messageOwner.media.phone_number);
} else { } else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager)ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("label", message.messageOwner.media.phone_number); android.content.ClipData clip = android.content.ClipData.newPlainText("label", message.messageOwner.media.phone_number);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
}
}
} }
} }
} );
}); showAlertDialog(builder);
visibleDialog = builder.show();
visibleDialog.setCanceledOnTouchOutside(true);
visibleDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
visibleDialog = null;
}
});
} }
} }
} }

View file

@ -191,7 +191,7 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen
} }
} }
}); });
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
return true; return true;
} }
@ -269,7 +269,7 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
} }
}); });
@ -585,7 +585,7 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen
processPhotoMenu(action); processPhotoMenu(action);
} }
}); });
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
}); });
} else { } else {
@ -709,7 +709,7 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
}); });
} }

View file

@ -307,7 +307,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
} }
} }
@ -346,7 +346,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter
} }
}); });
builder.setNegativeButton(R.string.Cancel, null); builder.setNegativeButton(R.string.Cancel, null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} else { } else {
if (delegate != null) { if (delegate != null) {
delegate.didSelectContact(user); delegate.didSelectContact(user);

View file

@ -200,7 +200,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati
} }
} }
}); });
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
}); });

View file

@ -93,6 +93,12 @@ public class IdenticonActivity extends BaseFragment {
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override @Override
public boolean onPreDraw() { public boolean onPreDraw() {
if (fragmentView != null) {
fragmentView.getViewTreeObserver().removeOnPreDrawListener(this);
}
if (getParentActivity() == null) {
return true;
}
LinearLayout layout = (LinearLayout)fragmentView; LinearLayout layout = (LinearLayout)fragmentView;
WindowManager manager = (WindowManager)ApplicationLoader.applicationContext.getSystemService(Context.WINDOW_SERVICE); WindowManager manager = (WindowManager)ApplicationLoader.applicationContext.getSystemService(Context.WINDOW_SERVICE);
int rotation = manager.getDefaultDisplay().getRotation(); int rotation = manager.getDefaultDisplay().getRotation();
@ -104,8 +110,6 @@ public class IdenticonActivity extends BaseFragment {
} }
fragmentView.setPadding(fragmentView.getPaddingLeft(), 0, fragmentView.getPaddingRight(), fragmentView.getPaddingBottom()); fragmentView.setPadding(fragmentView.getPaddingLeft(), 0, fragmentView.getPaddingRight(), fragmentView.getPaddingBottom());
fragmentView.getViewTreeObserver().removeOnPreDrawListener(this);
return false; return false;
} }
}); });

View file

@ -166,7 +166,7 @@ public class LanguageSelectActivity extends BaseFragment {
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
return true; return true;
} }
}); });

View file

@ -168,6 +168,8 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen
} }
handleIntent(getIntent(), false, savedInstanceState != null); handleIntent(getIntent(), false, savedInstanceState != null);
PhotoViewer.getInstance().setParentActivity(this);
} }
private void handleIntent(Intent intent, boolean isNew, boolean restore) { private void handleIntent(Intent intent, boolean isNew, boolean restore) {
@ -744,4 +746,22 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
} }
@Override
public void onBackPressed() {
if (PhotoViewer.getInstance().isVisible()) {
PhotoViewer.getInstance().closePhoto();
} else {
super.onBackPressed();
}
}
@Override
public boolean onPreIme() {
if (PhotoViewer.getInstance().isVisible()) {
PhotoViewer.getInstance().closePhoto();
return true;
}
return super.onPreIme();
}
} }

View file

@ -215,7 +215,7 @@ public class LoginActivity extends BaseFragment implements SlideView.SlideViewDe
builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
builder.setMessage(text); builder.setMessage(text);
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
}); });
} }

View file

@ -337,7 +337,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter
}); });
} }
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
return true; return true;
} }
}); });
@ -487,7 +487,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter
} }
}); });
builder.setNegativeButton(R.string.Cancel, null); builder.setNegativeButton(R.string.Cancel, null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} else { } else {
if (delegate != null) { if (delegate != null) {
delegate.didSelectDialog(MessagesActivity.this, dialog_id); delegate.didSelectDialog(MessagesActivity.this, dialog_id);

View file

@ -0,0 +1,463 @@
/*
* This is the source code of Telegram for Android v. 1.4.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.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.FrameLayout;
import org.telegram.messenger.R;
import org.telegram.messenger.Utilities;
import org.telegram.ui.Views.ActionBar.ActionBar;
import org.telegram.ui.Views.ActionBar.ActionBarLayer;
import org.telegram.ui.Views.ActionBar.ActionBarMenu;
import org.telegram.ui.Views.ImageReceiver;
public class PhotoViewer {
private FrameLayout containerView;
private ClippingImageView animatingImageView;
private ColorDrawable backgroundDrawable = new ColorDrawable(0xff000000);
private View parentView;
private int imageX, imageY;
private ImageReceiver currentImageReceiver;
private boolean animationInProgress = false;
private ActionBar actionBar;
private ActionBarLayer actionBarLayer;
private Activity parentActivity;
private WindowManager.LayoutParams windowLayoutParams;
private boolean isVisible;
private boolean isActionBarVisible = true;
public static class FrameLayoutTest extends FrameLayout {
public FrameLayoutTest(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return getInstance().onTouchEvent(event);
}
}
public static class ClippingImageView extends View {
private int clipBottom;
private int clipLeft;
private int clipRight;
private int clipTop;
private Rect drawRect;
private Paint paint;
private Bitmap bmp;
public onDrawListener drawListener;
public static interface onDrawListener {
public abstract void onDraw();
}
public ClippingImageView(Context paramContext) {
super(paramContext);
paint = new Paint();
paint.setFilterBitmap(true);
drawRect = new Rect();
}
public int getClipBottom() {
return clipBottom;
}
public int getClipHorizontal() {
return clipRight;
}
public int getClipLeft() {
return clipLeft;
}
public int getClipRight() {
return clipRight;
}
public int getClipTop() {
return clipTop;
}
public void onDraw(Canvas canvas) {
if (drawListener != null) {
drawListener.onDraw();
}
if (bmp != null) {
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);
canvas.restore();
}
}
public void setClipBottom(int value) {
clipBottom = value;
invalidate();
}
public void setClipHorizontal(int value) {
clipRight = value;
clipLeft = value;
invalidate();
}
public void setClipLeft(int value) {
clipLeft = value;
invalidate();
}
public void setClipRight(int value) {
clipRight = value;
invalidate();
}
public void setClipTop(int value) {
clipTop = value;
invalidate();
}
public void setClipVertical(int value) {
clipBottom = value;
clipTop = value;
invalidate();
}
public void setImageBitmap(Bitmap bitmap) {
bmp = bitmap;
invalidate();
}
}
private static volatile PhotoViewer Instance = null;
public static PhotoViewer getInstance() {
PhotoViewer localInstance = Instance;
if (localInstance == null) {
synchronized (PhotoViewer.class) {
localInstance = Instance;
if (localInstance == null) {
Instance = localInstance = new PhotoViewer();
}
}
}
return localInstance;
}
public void setParentActivity(Activity activity) {
parentActivity = activity;
containerView = new FrameLayoutTest(activity);
containerView.setFocusable(false);
containerView.setBackground(backgroundDrawable);
windowLayoutParams = new WindowManager.LayoutParams();
windowLayoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
windowLayoutParams.format = PixelFormat.TRANSLUCENT;
windowLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
windowLayoutParams.gravity = Gravity.TOP;
windowLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
animatingImageView = new ClippingImageView(containerView.getContext());
containerView.addView(animatingImageView);
actionBar = new ActionBar(activity);
containerView.addView(actionBar);
actionBar.setBackgroundColor(0xdd000000);
actionBar.setItemsBackground(R.drawable.bar_selector_white);
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)actionBar.getLayoutParams();
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
actionBar.setLayoutParams(layoutParams);
actionBarLayer = actionBar.createLayer();
actionBarLayer.setDisplayHomeAsUpEnabled(true);
actionBarLayer.setTitle("Photo");
actionBar.setCurrentActionBarLayer(actionBarLayer);
actionBarLayer.setActionBarMenuOnItemClick(new ActionBarLayer.ActionBarMenuOnItemClick() {
@Override
public void onItemClick(int id) {
if (id == -1) {
closePhoto();
}
}
});
ActionBarMenu menu = actionBarLayer.createMenu();
menu.addItem(0, R.drawable.ic_ab_other_white);
}
public void openPhoto(final ImageReceiver imageReceiver, final int x, final int y, final View parent) {
if (parentActivity == null || isVisible) {
return;
}
WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE);
wm.addView(containerView, windowLayoutParams);
if(android.os.Build.VERSION.SDK_INT >= 11) {
if (animationInProgress) {
return;
}
isVisible = true;
animationInProgress = true;
toggleActionBar(true, false);
parentView = parent;
imageX = x;
imageY = y;
currentImageReceiver = imageReceiver;
animatingImageView.setVisibility(View.VISIBLE);
containerView.invalidate();
animatingImageView.invalidate();
animatingImageView.setImageBitmap(imageReceiver.getBitmap());
containerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
containerView.getViewTreeObserver().removeOnPreDrawListener(this);
animatingImageView.drawListener = new ClippingImageView.onDrawListener() {
@Override
public void onDraw() {
animatingImageView.drawListener = null;
animatingImageView.post(new Runnable() {
@Override
public void run() {
imageReceiver.setVisible(false);
}
});
}
};
animatingImageView.setPivotX(0);
animatingImageView.setPivotY(0);
animatingImageView.setScaleX(1);
animatingImageView.setScaleY(1);
animatingImageView.setTranslationX(x + imageReceiver.drawRegion.left);
animatingImageView.setTranslationY(y + imageReceiver.drawRegion.top);
ViewGroup.LayoutParams layoutParams = animatingImageView.getLayoutParams();
layoutParams.width = imageReceiver.drawRegion.right - imageReceiver.drawRegion.left;
layoutParams.height = imageReceiver.drawRegion.bottom - imageReceiver.drawRegion.top;
animatingImageView.setLayoutParams(layoutParams);
float scaleX = (float)Utilities.displaySize.x / layoutParams.width;
float scaleY = (float)(Utilities.displaySize.y - Utilities.statusBarHeight) / layoutParams.height;
float scale = scaleX > scaleY ? scaleY : scaleX;
float width = layoutParams.width * scale;
float height = layoutParams.height * scale;
float xPos = (Utilities.displaySize.x - width) / 2.0f;
float yPos = (Utilities.displaySize.y - Utilities.statusBarHeight - height) / 2.0f;
int clipHorizontal = Math.abs(imageReceiver.drawRegion.left - imageReceiver.imageX);
int coords2[] = new int[2];
parent.getLocationInWindow(coords2);
int clipTop = coords2[1] - Utilities.statusBarHeight - (y + imageReceiver.drawRegion.top);
if (clipTop < 0) {
clipTop = 0;
}
int clipBottom = (y + imageReceiver.drawRegion.top + layoutParams.height) - (coords2[1] + parent.getHeight() - Utilities.statusBarHeight);
if (clipBottom < 0) {
clipBottom = 0;
}
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
ObjectAnimator.ofFloat(animatingImageView, "scaleX", scale),
ObjectAnimator.ofFloat(animatingImageView, "scaleY", scale),
ObjectAnimator.ofFloat(animatingImageView, "translationX", xPos),
ObjectAnimator.ofFloat(animatingImageView, "translationY", yPos),
ObjectAnimator.ofInt(backgroundDrawable, "alpha", 0, 255),
ObjectAnimator.ofInt(animatingImageView, "clipHorizontal", clipHorizontal, 0),
ObjectAnimator.ofInt(animatingImageView, "clipTop", clipTop, 0),
ObjectAnimator.ofInt(animatingImageView, "clipBottom", clipBottom, 0),
ObjectAnimator.ofFloat(actionBar, "alpha", 0.0f, 1.0f)
);
animatorSet.setDuration(250);
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
animationInProgress = false;
}
});
animatorSet.start();
return true;
}
});
}
}
public void closePhoto() {
if (parentActivity == null || !isVisible) {
return;
}
if(android.os.Build.VERSION.SDK_INT >= 11) {
if (animationInProgress) {
return;
}
isVisible = false;
animationInProgress = true;
isActionBarVisible = false;
animatingImageView.setVisibility(View.VISIBLE);
int clipHorizontal = Math.abs(currentImageReceiver.drawRegion.left - currentImageReceiver.imageX);
int coords2[] = new int[2];
parentView.getLocationInWindow(coords2);
int clipTop = coords2[1] - Utilities.statusBarHeight - (imageY + currentImageReceiver.drawRegion.top);
if (clipTop < 0) {
clipTop = 0;
}
int clipBottom = (imageY + currentImageReceiver.drawRegion.top + (currentImageReceiver.drawRegion.bottom - currentImageReceiver.drawRegion.top)) - (coords2[1] + parentView.getHeight() - Utilities.statusBarHeight);
if (clipBottom < 0) {
clipBottom = 0;
}
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
ObjectAnimator.ofFloat(animatingImageView, "scaleX", 1),
ObjectAnimator.ofFloat(animatingImageView, "scaleY", 1),
ObjectAnimator.ofFloat(animatingImageView, "translationX", imageX + currentImageReceiver.drawRegion.left),
ObjectAnimator.ofFloat(animatingImageView, "translationY", imageY + currentImageReceiver.drawRegion.top),
ObjectAnimator.ofInt(backgroundDrawable, "alpha", 0),
ObjectAnimator.ofInt(animatingImageView, "clipHorizontal", clipHorizontal),
ObjectAnimator.ofInt(animatingImageView, "clipTop", clipTop),
ObjectAnimator.ofInt(animatingImageView, "clipBottom", clipBottom),
ObjectAnimator.ofFloat(actionBar, "alpha", 0.0f)
);
animatorSet.setDuration(250);
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
containerView.post(new Runnable() {
@Override
public void run() {
WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE);
wm.removeView(containerView);
}
});
animationInProgress = false;
currentImageReceiver.setVisible(true);
}
});
animatorSet.start();
} else {
WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE);
wm.removeView(containerView);
}
}
public boolean isVisible() {
return isVisible;
}
private boolean maybeStartDragDown = false;
private boolean draggingDown = false;
private int startDraggingPointerIndex = -1;
private float dragY;
private float startDragOriginY = 0;
public boolean onTouchEvent(MotionEvent ev) {
if (animationInProgress) {
return false;
}
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
if (!maybeStartDragDown) {
maybeStartDragDown = true;
dragY = ev.getY();
}
} else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
if (!draggingDown && maybeStartDragDown) {
if (Math.abs(ev.getY() - dragY) >= Utilities.dp(10)) {
draggingDown = true;
maybeStartDragDown = false;
dragY = ev.getY();
startDragOriginY = animatingImageView.getTranslationY();
if (isActionBarVisible) {
toggleActionBar(false, true);
}
return true;
}
} else if (draggingDown) {
float diff = ev.getY() - dragY;
float maxValue = Utilities.displaySize.y / 4.0f;
backgroundDrawable.setAlpha((int)Math.max(127, 255 * (1.0f - (Math.min(Math.abs(diff), maxValue) / maxValue))));
animatingImageView.setTranslationY(startDragOriginY + diff);
}
} else if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {
if (draggingDown) {
if (Math.abs(dragY - ev.getY()) > Utilities.displaySize.y / 6.0f) {
closePhoto();
} else {
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
ObjectAnimator.ofFloat(animatingImageView, "translationY", startDragOriginY),
ObjectAnimator.ofInt(backgroundDrawable, "alpha", 255)
);
animatorSet.setDuration(250);
animatorSet.start();
}
draggingDown = false;
} else {
toggleActionBar(!isActionBarVisible, true);
}
}
return false;
}
private void toggleActionBar(boolean show, boolean animated) {
if (show) {
actionBar.setVisibility(View.VISIBLE);
}
isActionBarVisible = show;
actionBar.setEnabled(show);
actionBarLayer.setEnabled(show);
if (animated) {
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
ObjectAnimator.ofFloat(actionBar, "alpha", show ? 1.0f : 0.0f)
);
if (!show) {
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
actionBar.setVisibility(View.GONE);
}
});
}
animatorSet.setDuration(250);
animatorSet.start();
} else {
actionBar.setAlpha(show ? 1.0f : 0.0f);
if (!show) {
actionBar.setVisibility(View.GONE);
}
}
}
}

View file

@ -254,7 +254,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} else if (i == enableAnimationsRow) { } else if (i == enableAnimationsRow) {
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
boolean animations = preferences.getBoolean("view_animations", true); boolean animations = preferences.getBoolean("view_animations", true);
@ -286,7 +286,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} else if (i == sendLogsRow) { } else if (i == sendLogsRow) {
sendLogs(); sendLogs();
} else if (i == clearLogsRow) { } else if (i == clearLogsRow) {
@ -325,7 +325,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} else if (i == languageRow) { } else if (i == languageRow) {
presentFragment(new LanguageSelectActivity()); presentFragment(new LanguageSelectActivity());
} else if (i == switchBackendButtonRow) { } else if (i == switchBackendButtonRow) {
@ -339,7 +339,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} else if (i == telegramFaqRow) { } else if (i == telegramFaqRow) {
try { try {
Intent pickIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(LocaleController.getString("TelegramFaqUrl", R.string.TelegramFaqUrl))); Intent pickIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(LocaleController.getString("TelegramFaqUrl", R.string.TelegramFaqUrl)));
@ -369,7 +369,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} else if (i == photoDownloadChatRow || i == photoDownloadPrivateRow || i == audioDownloadChatRow || i == audioDownloadPrivateRow) { } else if (i == photoDownloadChatRow || i == photoDownloadPrivateRow || i == audioDownloadChatRow || i == audioDownloadPrivateRow) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
@ -398,7 +398,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
} }
}); });
@ -547,7 +547,6 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
showActionBar();
if (listAdapter != null) { if (listAdapter != null) {
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
} }
@ -696,7 +695,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
} }
} }
}); });
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
}); });
} }
@ -844,12 +843,14 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialogInterface, int i) {
NotificationCenter.getInstance().postNotificationName(1234); NotificationCenter.getInstance().postNotificationName(1234);
MessagesController.getInstance().unregistedPush(); MessagesController.getInstance().unregistedPush();
listView.setAdapter(null); MessagesStorage.getInstance().cleanUp();
MessagesController.getInstance().cleanUp();
ConnectionsManager.getInstance().cleanUp();
UserConfig.clearConfig(); UserConfig.clearConfig();
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
}); });
} }

View file

@ -151,7 +151,7 @@ public class SettingsBlockedUsers extends BaseFragment implements NotificationCe
} }
} }
}); });
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
return true; return true;
} }

View file

@ -279,7 +279,7 @@ public class SettingsNotificationsActivity extends BaseFragment {
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
} }
} }

View file

@ -96,62 +96,15 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
@Override @Override
public View createView(LayoutInflater inflater, ViewGroup container) { public View createView(LayoutInflater inflater, ViewGroup container) {
if (fragmentView == null) { if (fragmentView == null) {
fragmentView = inflater.inflate(R.layout.settings_wallpapers_layout, container, false); actionBarLayer.setCustomView(R.layout.settings_do_action_layout);
listAdapter = new ListAdapter(getParentActivity()); Button cancelButton = (Button)actionBarLayer.findViewById(R.id.cancel_button);
progressBar = (ProgressBar)fragmentView.findViewById(R.id.action_progress);
backgroundImage = (ImageView)fragmentView.findViewById(R.id.background_image);
listView = (HorizontalListView)fragmentView.findViewById(R.id.listView);
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (i == 0) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
CharSequence[] items = new CharSequence[] {LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("Cancel", R.string.Cancel)};
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == 0) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File image = Utilities.generatePicturePath();
if (image != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
currentPicturePath = image.getAbsolutePath();
}
getParentActivity().startActivityForResult(takePictureIntent, 10);
} else if (i == 1) {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
getParentActivity().startActivityForResult(photoPickerIntent, 11);
}
}
});
builder.show().setCanceledOnTouchOutside(true);
} else {
TLRPC.WallPaper wallPaper = wallPapers.get(i - 1);
selectedBackground = wallPaper.id;
listAdapter.notifyDataSetChanged();
processSelectedBackground();
}
}
});
TextView textView = (TextView)fragmentView.findViewById(R.id.done_button_text);
textView.setText(LocaleController.getString("Set", R.string.Set));
Button cancelButton = (Button)fragmentView.findViewById(R.id.cancel_button);
cancelButton.setText(LocaleController.getString("Cancel", R.string.Cancel));
cancelButton.setOnClickListener(new View.OnClickListener() { cancelButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
finishFragment(); finishFragment();
} }
}); });
doneButton = actionBarLayer.findViewById(R.id.done_button);
doneButton = fragmentView.findViewById(R.id.done_button);
doneButton.setOnClickListener(new View.OnClickListener() { doneButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
@ -190,6 +143,53 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
} }
}); });
cancelButton.setText(LocaleController.getString("Cancel", R.string.Cancel));
TextView textView = (TextView)doneButton.findViewById(R.id.done_button_text);
textView.setText(LocaleController.getString("Set", R.string.Set));
fragmentView = inflater.inflate(R.layout.settings_wallpapers_layout, container, false);
listAdapter = new ListAdapter(getParentActivity());
progressBar = (ProgressBar)fragmentView.findViewById(R.id.action_progress);
backgroundImage = (ImageView)fragmentView.findViewById(R.id.background_image);
listView = (HorizontalListView)fragmentView.findViewById(R.id.listView);
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (i == 0) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
CharSequence[] items = new CharSequence[] {LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("Cancel", R.string.Cancel)};
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == 0) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File image = Utilities.generatePicturePath();
if (image != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
currentPicturePath = image.getAbsolutePath();
}
getParentActivity().startActivityForResult(takePictureIntent, 10);
} else if (i == 1) {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
getParentActivity().startActivityForResult(photoPickerIntent, 11);
}
}
});
showAlertDialog(builder);
} else {
TLRPC.WallPaper wallPaper = wallPapers.get(i - 1);
selectedBackground = wallPaper.id;
listAdapter.notifyDataSetChanged();
processSelectedBackground();
}
}
});
processSelectedBackground(); processSelectedBackground();
} else { } else {
ViewGroup parent = (ViewGroup)fragmentView.getParent(); ViewGroup parent = (ViewGroup)fragmentView.getParent();
@ -428,7 +428,6 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
if (listAdapter != null) { if (listAdapter != null) {
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
} }
hideActionBar();
processSelectedBackground(); processSelectedBackground();
fixLayout(); fixLayout();
} }

View file

@ -194,7 +194,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
} }
}); });
@ -222,7 +222,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
}); });
if (dialog_id == 0) { if (dialog_id == 0) {
@ -268,7 +268,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} else if (i == settingsSoundRow) { } else if (i == settingsSoundRow) {
try { try {
Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
@ -351,7 +351,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
} }
}); });
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
} }
}); });
@ -633,7 +633,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
} }
} }
}); });
builder.show().setCanceledOnTouchOutside(true); showAlertDialog(builder);
} }
}); });
} }

View file

@ -32,6 +32,7 @@ public class ActionBar extends FrameLayout {
private View currentBackOverlay; private View currentBackOverlay;
private View shadowView = null; private View shadowView = null;
private int currentBackOverlayWidth; private int currentBackOverlayWidth;
protected int itemsBackgroundResourceId;
public ActionBar(Context context) { public ActionBar(Context context) {
super(context); super(context);
@ -139,7 +140,6 @@ public class ActionBar extends FrameLayout {
layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.width = LayoutParams.MATCH_PARENT;
layoutParams.height = LayoutParams.MATCH_PARENT; layoutParams.height = LayoutParams.MATCH_PARENT;
layer.setLayoutParams(layoutParams); layer.setLayoutParams(layoutParams);
currentLayer.setBackgroundDrawable(getBackground());
shadowView.setX(-Utilities.dp(2)); shadowView.setX(-Utilities.dp(2));
shadowView.setVisibility(VISIBLE); shadowView.setVisibility(VISIBLE);
} }
@ -148,7 +148,6 @@ public class ActionBar extends FrameLayout {
if (currentLayer == null) { if (currentLayer == null) {
return; return;
} }
currentLayer.setBackgroundDrawable(null);
currentLayer.setX(0); currentLayer.setX(0);
if (!backAnimation) { if (!backAnimation) {
removeView(currentLayer); removeView(currentLayer);
@ -206,4 +205,8 @@ public class ActionBar extends FrameLayout {
currentLayer.onMenuButtonPressed(); currentLayer.onMenuButtonPressed();
} }
} }
public void setItemsBackground(int resourceId) {
itemsBackgroundResourceId = resourceId;
}
} }

View file

@ -42,22 +42,23 @@ public class ActionBarActivity extends Activity {
protected ActionBar actionBar; protected ActionBar actionBar;
private FrameLayout containerView; private FrameLayout containerView;
private FrameLayout containerViewBack; private FrameLayout containerViewBack;
private FrameLayout contentView; protected FrameLayout contentView;
private View shadowView; private View shadowView;
private Animation openAnimation; private Animation openAnimation;
private Animation closeAnimation; private Animation closeAnimation;
private boolean maybeStartTracking = false; private boolean maybeStartTracking = false;
private boolean startedTracking = false; protected boolean startedTracking = false;
private int startedTrackingX; private int startedTrackingX;
private int prevOrientation = -10; private int prevOrientation = -10;
private boolean animationInProgress = false; protected boolean animationInProgress = false;
private VelocityTracker velocityTracker = null; private VelocityTracker velocityTracker = null;
private boolean beginTrackingSent = false; private boolean beginTrackingSent = false;
private boolean transitionAnimationInProgress = false; private boolean transitionAnimationInProgress = false;
private long transitionAnimationStartTime; private long transitionAnimationStartTime;
private boolean inActionMode = false; private boolean inActionMode = false;
private int startedTrackingPointerId;
private class FrameLayoutTouch extends FrameLayout { private class FrameLayoutTouch extends FrameLayout {
public FrameLayoutTouch(Context context) { public FrameLayoutTouch(Context context) {
@ -66,8 +67,7 @@ public class ActionBarActivity extends Activity {
@Override @Override
public boolean onInterceptTouchEvent(MotionEvent ev) { public boolean onInterceptTouchEvent(MotionEvent ev) {
return ((ActionBarActivity)getContext()).onTouchEvent(ev); return !(!animationInProgress && !checkTransitionAnimation()) || ((ActionBarActivity) getContext()).onTouchEvent(ev);
//return super.onInterceptTouchEvent(ev);
} }
@Override @Override
@ -75,6 +75,19 @@ public class ActionBarActivity extends Activity {
((ActionBarActivity)getContext()).onTouchEvent(null); ((ActionBarActivity)getContext()).onTouchEvent(null);
super.requestDisallowInterceptTouchEvent(disallowIntercept); super.requestDisallowInterceptTouchEvent(disallowIntercept);
} }
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
return ((ActionBarActivity)getContext()).onPreIme() || super.dispatchKeyEventPreIme(event);
}
return super.dispatchKeyEventPreIme(event);
}
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
return super.onKeyPreIme(keyCode, event);
}
} }
public static ArrayList<BaseFragment> fragmentsStack = new ArrayList<BaseFragment>(); public static ArrayList<BaseFragment> fragmentsStack = new ArrayList<BaseFragment>();
@ -116,7 +129,7 @@ public class ActionBarActivity extends Activity {
shadowView.setVisibility(View.INVISIBLE); shadowView.setVisibility(View.INVISIBLE);
actionBar = new ActionBar(this); actionBar = new ActionBar(this);
actionBar.setBackgroundResource(R.color.header); actionBar.setItemsBackground(R.drawable.bar_selector);
contentView.addView(actionBar); contentView.addView(actionBar);
layoutParams = actionBar.getLayoutParams(); layoutParams = actionBar.getLayoutParams();
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
@ -205,68 +218,75 @@ public class ActionBarActivity extends Activity {
animationInProgress = false; animationInProgress = false;
} }
private void prepareForMoving(MotionEvent ev) {
maybeStartTracking = false;
startedTracking = true;
startedTrackingX = (int) ev.getX();
shadowView.setVisibility(View.VISIBLE);
shadowView.setX(-Utilities.dp(2));
containerViewBack.setVisibility(View.VISIBLE);
beginTrackingSent = false;
BaseFragment lastFragment = fragmentsStack.get(fragmentsStack.size() - 2);
actionBar.prepareForMoving(lastFragment.actionBarLayer);
View fragmentView = lastFragment.createView(getLayoutInflater(), null);
ViewGroup parentView = (ViewGroup)fragmentView.getParent();
if (parentView != null) {
parentView.removeView(fragmentView);
}
containerViewBack.addView(fragmentView);
ViewGroup.LayoutParams layoutParams = fragmentView.getLayoutParams();
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT;
fragmentView.setLayoutParams(layoutParams);
if (fragmentView.getBackground() == null) {
fragmentView.setBackgroundColor(0xffffffff);
}
lastFragment.onResume();
try {
prevOrientation = getRequestedOrientation();
WindowManager manager = (WindowManager)getSystemService(Activity.WINDOW_SERVICE);
if (manager != null && manager.getDefaultDisplay() != null) {
int rotation = manager.getDefaultDisplay().getRotation();
if (rotation == Surface.ROTATION_270) {
if (Build.VERSION.SDK_INT >= 9) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
} else if (rotation == Surface.ROTATION_90) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if (rotation == Surface.ROTATION_0) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
if (Build.VERSION.SDK_INT >= 9) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
}
}
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
public boolean onTouchEvent(MotionEvent ev) { public boolean onTouchEvent(MotionEvent ev) {
if(android.os.Build.VERSION.SDK_INT >= 11 && !checkTransitionAnimation() && !inActionMode && fragmentsStack.size() > 1 && !animationInProgress) { if(android.os.Build.VERSION.SDK_INT >= 11 && !checkTransitionAnimation() && !inActionMode && fragmentsStack.size() > 1 && !animationInProgress) {
if (ev != null && ev.getAction() == MotionEvent.ACTION_DOWN && !startedTracking && !maybeStartTracking) { if (ev != null && ev.getAction() == MotionEvent.ACTION_DOWN && !startedTracking && !maybeStartTracking) {
startedTrackingPointerId = ev.getPointerId(0);
maybeStartTracking = true; maybeStartTracking = true;
startedTrackingX = (int) ev.getX(); startedTrackingX = (int) ev.getX();
} else if (ev != null && ev.getAction() == MotionEvent.ACTION_MOVE) { if (velocityTracker != null) {
velocityTracker.clear();
}
} else if (ev != null && ev.getAction() == MotionEvent.ACTION_MOVE && ev.getPointerId(0) == startedTrackingPointerId) {
if (velocityTracker == null) {
velocityTracker = VelocityTracker.obtain();
}
int dx = Math.max(0, (int) (ev.getX() - startedTrackingX)); int dx = Math.max(0, (int) (ev.getX() - startedTrackingX));
velocityTracker.addMovement(ev);
if (maybeStartTracking && !startedTracking && dx >= Utilities.dp(10)) { if (maybeStartTracking && !startedTracking && dx >= Utilities.dp(10)) {
maybeStartTracking = false; prepareForMoving(ev);
startedTracking = true;
startedTrackingX = (int) ev.getX();
shadowView.setVisibility(View.VISIBLE);
shadowView.setX(-Utilities.dp(2));
containerViewBack.setVisibility(View.VISIBLE);
beginTrackingSent = false;
BaseFragment lastFragment = fragmentsStack.get(fragmentsStack.size() - 2);
actionBar.prepareForMoving(lastFragment.actionBarLayer);
View fragmentView = lastFragment.createView(getLayoutInflater(), null);
ViewGroup parentView = (ViewGroup)fragmentView.getParent();
if (parentView != null) {
parentView.removeView(fragmentView);
}
containerViewBack.addView(fragmentView);
ViewGroup.LayoutParams layoutParams = fragmentView.getLayoutParams();
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT;
fragmentView.setLayoutParams(layoutParams);
if (fragmentView.getBackground() == null) {
fragmentView.setBackgroundColor(0xffffffff);
}
lastFragment.onResume();
try {
prevOrientation = getRequestedOrientation();
WindowManager manager = (WindowManager)getSystemService(Activity.WINDOW_SERVICE);
if (manager != null && manager.getDefaultDisplay() != null) {
int rotation = manager.getDefaultDisplay().getRotation();
if (rotation == Surface.ROTATION_270) {
if (Build.VERSION.SDK_INT >= 9) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
} else if (rotation == Surface.ROTATION_90) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if (rotation == Surface.ROTATION_0) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
if (Build.VERSION.SDK_INT >= 9) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
}
}
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
if (velocityTracker == null) {
velocityTracker = VelocityTracker.obtain();
} else {
velocityTracker.clear();
}
} else if (startedTracking) { } else if (startedTracking) {
if (!beginTrackingSent) { if (!beginTrackingSent) {
if (getCurrentFocus() != null) { if (getCurrentFocus() != null) {
@ -276,61 +296,80 @@ public class ActionBarActivity extends Activity {
currentFragment.onBeginSlide(); currentFragment.onBeginSlide();
beginTrackingSent = true; beginTrackingSent = true;
} }
velocityTracker.addMovement(ev);
actionBar.moveActionBarByX(dx); actionBar.moveActionBarByX(dx);
containerView.setX(dx); containerView.setX(dx);
shadowView.setX(dx - Utilities.dp(2)); shadowView.setX(dx - Utilities.dp(2));
} }
} else if (ev != null && startedTracking && (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP)) { } else if (ev != null && ev.getPointerId(0) == startedTrackingPointerId && (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_POINTER_UP)) {
velocityTracker.computeCurrentVelocity(1000); if (velocityTracker == null) {
float x = containerView.getX(); velocityTracker = VelocityTracker.obtain();
ArrayList<Animator> animators = new ArrayList<Animator>();
final boolean backAnimation = x < containerView.getMeasuredWidth() / 3.0f && velocityTracker.getXVelocity() < 6000;
float distToMove = 0;
if (!backAnimation) {
distToMove = containerView.getMeasuredWidth() - x;
animators.add(ObjectAnimator.ofFloat(containerView, "x", containerView.getMeasuredWidth()));
animators.add(ObjectAnimator.ofFloat(shadowView, "x", containerView.getMeasuredWidth() - Utilities.dp(2)));
} else {
distToMove = x;
animators.add(ObjectAnimator.ofFloat(containerView, "x", 0));
animators.add(ObjectAnimator.ofFloat(shadowView, "x", -Utilities.dp(2)));
} }
actionBar.setupAnimations(animators, backAnimation); velocityTracker.computeCurrentVelocity(1000);
if (!startedTracking) {
AnimatorSet animatorSet = new AnimatorSet(); float velX = velocityTracker.getXVelocity();
animatorSet.playTogether(animators); float velY = velocityTracker.getYVelocity();
animatorSet.setDuration((int)(200.0f / containerView.getMeasuredWidth() * distToMove)); if (velX >= 3500 && velX > velY) {
animatorSet.start(); prepareForMoving(ev);
animationInProgress = true;
animatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
} }
}
@Override if (startedTracking) {
public void onAnimationEnd(Animator animator) { float x = containerView.getX();
onSlideAnimationEnd(backAnimation); ArrayList<Animator> animators = new ArrayList<Animator>();
float velX = velocityTracker.getXVelocity();
float velY = velocityTracker.getYVelocity();
final boolean backAnimation = x < containerView.getMeasuredWidth() / 3.0f && (velX < 3500 || velX < velY);
float distToMove = 0;
if (!backAnimation) {
distToMove = containerView.getMeasuredWidth() - x;
animators.add(ObjectAnimator.ofFloat(containerView, "x", containerView.getMeasuredWidth()));
animators.add(ObjectAnimator.ofFloat(shadowView, "x", containerView.getMeasuredWidth() - Utilities.dp(2)));
} else {
distToMove = x;
animators.add(ObjectAnimator.ofFloat(containerView, "x", 0));
animators.add(ObjectAnimator.ofFloat(shadowView, "x", -Utilities.dp(2)));
} }
actionBar.setupAnimations(animators, backAnimation);
@Override AnimatorSet animatorSet = new AnimatorSet();
public void onAnimationCancel(Animator animator) { animatorSet.playTogether(animators);
onSlideAnimationEnd(backAnimation); animatorSet.setDuration(Math.max((int) (200.0f / containerView.getMeasuredWidth() * distToMove), 50));
} animatorSet.start();
animationInProgress = true;
animatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
@Override }
public void onAnimationRepeat(Animator animator) {
} @Override
}); public void onAnimationEnd(Animator animator) {
velocityTracker.recycle(); onSlideAnimationEnd(backAnimation);
velocityTracker = null; }
} else if (ev == null || ev != null && (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP)) {
@Override
public void onAnimationCancel(Animator animator) {
onSlideAnimationEnd(backAnimation);
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
} else {
maybeStartTracking = false;
startedTracking = false;
}
if (velocityTracker != null) {
velocityTracker.recycle();
velocityTracker = null;
}
} else if (ev == null) {
maybeStartTracking = false; maybeStartTracking = false;
startedTracking = false; startedTracking = false;
if (velocityTracker != null) { if (velocityTracker != null) {
velocityTracker.recycle(); velocityTracker.recycle();
velocityTracker = null;
} }
} }
return startedTracking; return startedTracking;
@ -456,7 +495,7 @@ public class ActionBarActivity extends Activity {
} }
public boolean presentFragment(final BaseFragment fragment, final boolean removeLast, boolean forceWithoutAnimation) { public boolean presentFragment(final BaseFragment fragment, final boolean removeLast, boolean forceWithoutAnimation) {
if (!fragment.onFragmentCreate() || checkTransitionAnimation()) { if (checkTransitionAnimation() || !fragment.onFragmentCreate()) {
return false; return false;
} }
if (getCurrentFocus() != null) { if (getCurrentFocus() != null) {
@ -651,4 +690,8 @@ public class ActionBarActivity extends Activity {
showActionBar(); showActionBar();
inActionMode = false; inActionMode = false;
} }
public boolean onPreIme() {
return false;
}
} }

View file

@ -37,7 +37,7 @@ public class ActionBarLayer extends FrameLayout {
private TextView subTitleTextView; private TextView subTitleTextView;
private ActionBarMenu menu; private ActionBarMenu menu;
private ActionBarMenu actionMode; private ActionBarMenu actionMode;
private ActionBar parentActionBar; protected ActionBar parentActionBar;
private boolean oldUseLogo; private boolean oldUseLogo;
private boolean oldUseBack; private boolean oldUseBack;
private boolean isBackLayoutHidden = false; private boolean isBackLayoutHidden = false;
@ -53,8 +53,8 @@ public class ActionBarLayer extends FrameLayout {
layoutParams.width = LayoutParams.WRAP_CONTENT; layoutParams.width = LayoutParams.WRAP_CONTENT;
layoutParams.height = LayoutParams.FILL_PARENT; layoutParams.height = LayoutParams.FILL_PARENT;
layoutParams.gravity = Gravity.TOP | Gravity.LEFT; layoutParams.gravity = Gravity.TOP | Gravity.LEFT;
backButtonFrameLayout.setBackgroundResource(R.drawable.bar_selector);
backButtonFrameLayout.setLayoutParams(layoutParams); backButtonFrameLayout.setLayoutParams(layoutParams);
backButtonFrameLayout.setBackgroundResource(actionBar.itemsBackgroundResourceId);
backButtonFrameLayout.setPadding(0, 0, Utilities.dp(4), 0); backButtonFrameLayout.setPadding(0, 0, Utilities.dp(4), 0);
backButtonFrameLayout.setOnClickListener(new OnClickListener() { backButtonFrameLayout.setOnClickListener(new OnClickListener() {
@Override @Override
@ -432,6 +432,16 @@ public class ActionBarLayer extends FrameLayout {
super.onMeasure(widthMeasureSpec, heightMeasureSpec); super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} }
@Override
public void setAlpha(float alpha) {
if (menu != null) {
menu.setAlpha(alpha);
}
if (backButtonFrameLayout != null) {
backButtonFrameLayout.setAlpha(alpha);
}
}
public void onMenuButtonPressed() { public void onMenuButtonPressed() {
if (menu != null) { if (menu != null) {
menu.onMenuButtonPressed(); menu.onMenuButtonPressed();

View file

@ -16,7 +16,6 @@ import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import org.telegram.messenger.R;
import org.telegram.messenger.Utilities; import org.telegram.messenger.Utilities;
public class ActionBarMenu extends LinearLayout { public class ActionBarMenu extends LinearLayout {
@ -50,7 +49,7 @@ public class ActionBarMenu extends LinearLayout {
addView(view); addView(view);
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)view.getLayoutParams(); LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)view.getLayoutParams();
layoutParams.height = FrameLayout.LayoutParams.FILL_PARENT; layoutParams.height = FrameLayout.LayoutParams.FILL_PARENT;
view.setBackgroundResource(R.drawable.bar_selector); view.setBackgroundResource(parentActionBar.itemsBackgroundResourceId);
view.setLayoutParams(layoutParams); view.setLayoutParams(layoutParams);
view.setOnClickListener(new OnClickListener() { view.setOnClickListener(new OnClickListener() {
@Override @Override

View file

@ -48,7 +48,7 @@ public class ActionBarMenuItem extends ImageView {
public ActionBarMenuItem(Context context, ActionBarMenu menu, ActionBar actionBar) { public ActionBarMenuItem(Context context, ActionBarMenu menu, ActionBar actionBar) {
super(context); super(context);
setBackgroundResource(R.drawable.bar_selector); setBackgroundResource(actionBar.itemsBackgroundResourceId);
parentMenu = menu; parentMenu = menu;
parentActionBar = actionBar; parentActionBar = actionBar;
} }

View file

@ -8,6 +8,8 @@
package org.telegram.ui.Views.ActionBar; package org.telegram.ui.Views.ActionBar;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -15,6 +17,8 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.ConnectionsManager;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.R;
public class BaseFragment { public class BaseFragment {
private boolean isFinished = false; private boolean isFinished = false;
@ -23,6 +27,7 @@ public class BaseFragment {
protected ActionBarLayer actionBarLayer; protected ActionBarLayer actionBarLayer;
protected int classGuid = 0; protected int classGuid = 0;
protected Bundle arguments; protected Bundle arguments;
private AlertDialog visibleDialog = null;
public BaseFragment() { public BaseFragment() {
classGuid = ConnectionsManager.getInstance().generateClassGuid(); classGuid = ConnectionsManager.getInstance().generateClassGuid();
@ -54,9 +59,9 @@ public class BaseFragment {
if (parentActivity != null) { if (parentActivity != null) {
if (actionBarLayer != null) { if (actionBarLayer != null) {
actionBarLayer.onDestroy(); actionBarLayer.onDestroy();
actionBarLayer = null;
} }
actionBarLayer = parentActivity.getInternalActionBar().createLayer(); actionBarLayer = parentActivity.getInternalActionBar().createLayer();
actionBarLayer.setBackgroundResource(R.color.header);
} }
} }
} }
@ -96,6 +101,14 @@ public class BaseFragment {
actionBarLayer.onPause(); actionBarLayer.onPause();
actionBarLayer.closeSearchField(); actionBarLayer.closeSearchField();
} }
try {
if (visibleDialog != null && visibleDialog.isShowing()) {
visibleDialog.dismiss();
visibleDialog = null;
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
} }
public void onConfigurationChanged(android.content.res.Configuration newConfig) { public void onConfigurationChanged(android.content.res.Configuration newConfig) {
@ -156,7 +169,17 @@ public class BaseFragment {
} }
public void onBeginSlide() { public void onBeginSlide() {
try {
if (visibleDialog != null && visibleDialog.isShowing()) {
visibleDialog.dismiss();
visibleDialog = null;
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
if (actionBarLayer != null) {
actionBarLayer.onPause();
}
} }
public void onOpenAnimationEnd() { public void onOpenAnimationEnd() {
@ -166,4 +189,22 @@ public class BaseFragment {
public void onLowMemory() { public void onLowMemory() {
} }
protected void showAlertDialog(AlertDialog.Builder builder) {
if (parentActivity == null || parentActivity.checkTransitionAnimation() || parentActivity.animationInProgress || parentActivity.startedTracking) {
return;
}
if (visibleDialog != null && visibleDialog.isShowing()) {
visibleDialog.dismiss();
visibleDialog = null;
}
visibleDialog = builder.show();
visibleDialog.setCanceledOnTouchOutside(true);
visibleDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
visibleDialog = null;
}
});
}
} }

View file

@ -10,6 +10,7 @@ package org.telegram.ui.Views;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.database.DataSetObserver; import android.database.DataSetObserver;
import android.graphics.Rect; import android.graphics.Rect;
@ -139,6 +140,7 @@ public class HorizontalListView extends AdapterView<ListAdapter> {
@SuppressLint("DrawAllocation")
@Override @Override
protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) { protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom); super.onLayout(changed, left, top, right, bottom);
@ -308,6 +310,12 @@ public class HorizontalListView extends AdapterView<ListAdapter> {
return handled; return handled;
} }
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
requestDisallowInterceptTouchEvent(true);
return super.onInterceptTouchEvent(ev);
}
protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) { float velocityY) {
synchronized(HorizontalListView.this){ synchronized(HorizontalListView.this){

View file

@ -10,6 +10,7 @@ package org.telegram.ui.Views;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
@ -34,6 +35,8 @@ public class ImageReceiver {
public Integer TAG = null; public Integer TAG = null;
public WeakReference<View> parentView = null; public WeakReference<View> parentView = null;
public int imageX = 0, imageY = 0, imageW = 0, imageH = 0; public int imageX = 0, imageY = 0, imageW = 0, imageH = 0;
public Rect drawRegion = new Rect();
private boolean isVisible = true;
private boolean selfSetting = false; private boolean selfSetting = false;
public void setImage(TLRPC.FileLocation path, String filter, Drawable placeholder) { public void setImage(TLRPC.FileLocation path, String filter, Drawable placeholder) {
@ -172,6 +175,9 @@ public class ImageReceiver {
} }
public void draw(Canvas canvas, int x, int y, int w, int h) { public void draw(Canvas canvas, int x, int y, int w, int h) {
if (!isVisible) {
return;
}
try { try {
if (currentImage != null) { if (currentImage != null) {
int bitmapW = currentImage.getIntrinsicWidth(); int bitmapW = currentImage.getIntrinsicWidth();
@ -179,27 +185,29 @@ public class ImageReceiver {
float scaleW = bitmapW / (float)w; float scaleW = bitmapW / (float)w;
float scaleH = bitmapH / (float)h; float scaleH = bitmapH / (float)h;
if (Math.abs(scaleW - scaleH) > 0.05f) { if (Math.abs(scaleW - scaleH) > 0.00001f) {
canvas.save(); canvas.save();
canvas.clipRect(x, y, x + w, y + h); canvas.clipRect(x, y, x + w, y + h);
if (bitmapW / scaleH > w) { if (bitmapW / scaleH > w) {
bitmapW /= scaleH; bitmapW /= scaleH;
currentImage.setBounds(x - (bitmapW - w) / 2, y, x + (bitmapW + w) / 2, y + h); drawRegion.set(x - (bitmapW - w) / 2, y, x + (bitmapW + w) / 2, y + h);
} else { } else {
bitmapH /= scaleW; bitmapH /= scaleW;
currentImage.setBounds(x, y - (bitmapH - h) / 2, x + w, y + (bitmapH + h) / 2); drawRegion.set(x, y - (bitmapH - h) / 2, x + w, y + (bitmapH + h) / 2);
} }
currentImage.setBounds(drawRegion);
currentImage.draw(canvas); currentImage.draw(canvas);
canvas.restore(); canvas.restore();
} else { } else {
currentImage.setBounds(x, y, x + w, y + h); drawRegion.set(x, y, x + w, y + h);
currentImage.setBounds(drawRegion);
currentImage.draw(canvas); currentImage.draw(canvas);
} }
} else if (last_placeholder != null) { } else if (last_placeholder != null) {
last_placeholder.setBounds(x, y, x + w, y + h); drawRegion.set(x, y, x + w, y + h);
last_placeholder.setBounds(drawRegion);
last_placeholder.draw(canvas); last_placeholder.draw(canvas);
} }
} catch (Exception e) { } catch (Exception e) {
@ -211,4 +219,28 @@ public class ImageReceiver {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
} }
public Bitmap getBitmap() {
if (currentImage != null && currentImage instanceof BitmapDrawable) {
return ((BitmapDrawable)currentImage).getBitmap();
} else if (isPlaceholder && last_placeholder != null && last_placeholder instanceof BitmapDrawable) {
return ((BitmapDrawable)last_placeholder).getBitmap();
}
return null;
}
public void setVisible(boolean value) {
if (isVisible == value) {
return;
}
isVisible = value;
View parent = parentView.get();
if (parent != null) {
parent.invalidate();
}
}
public boolean getVisible() {
return isVisible;
}
} }

View file

@ -0,0 +1,27 @@
<!--
~ This is the source code of Telegram for Android v. 1.4.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.
-->
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#40ffffff" />
</shape>
</item>
<item android:state_focused="true">
<shape android:shape="rectangle">
<solid android:color="#40ffffff" />
</shape>
</item>
<item android:state_selected="true">
<shape android:shape="rectangle">
<solid android:color="#40ffffff" />
</shape>
</item>
<item android:drawable="@drawable/transparent" />
</selector>

View file

@ -7,8 +7,7 @@
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:id="@+id/background_image" android:id="@+id/background_image"/>
android:layout_marginBottom="48dp"/>
<ProgressBar <ProgressBar
android:background="#99000000" android:background="#99000000"
@ -27,56 +26,6 @@
android:id="@+id/listView" android:id="@+id/listView"
android:clipToPadding="false" android:clipToPadding="false"
android:paddingLeft="40dp" android:paddingLeft="40dp"
android:paddingRight="40dp" android:paddingRight="40dp"/>
android:layout_marginBottom="48dp"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="48dp"
android:layout_gravity="bottom">
<Button
android:textSize="12dp"
android:textColor="#111111"
android:id="@+id/cancel_button"
android:background="@drawable/list_selector"
android:paddingLeft="3dp"
android:layout_width="0.0dip"
android:layout_height="fill_parent"
android:textAllCaps="true"
android:layout_weight="1.0"
android:textStyle="bold"/>
<View
android:layout_gravity="center_vertical"
android:background="#c9c9c9"
android:layout_width="1px"
android:layout_height="28dp" />
<FrameLayout
android:id="@+id/done_button"
android:background="@drawable/list_selector"
android:paddingRight="3dp"
android:clickable="true"
android:layout_width="0.0dip"
android:layout_height="fill_parent"
android:layout_weight="1.0">
<TextView
android:textSize="12dp"
android:textColor="#111111"
android:gravity="center"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAllCaps="true"
android:id="@+id/done_button_text"
android:drawableLeft="@drawable/ic_ab_done_gray"
android:drawablePadding="8dp"
android:textStyle="bold"/>
</FrameLayout>
</LinearLayout>
</FrameLayout> </FrameLayout>