Fixed photo sharing on devices with low memory

This commit is contained in:
DrKLO 2014-03-27 00:16:28 +04:00
parent 0e9d92e8f9
commit 22918f143a
15 changed files with 447 additions and 62 deletions

View File

@ -82,7 +82,7 @@ android {
defaultConfig { defaultConfig {
minSdkVersion 8 minSdkVersion 8
targetSdkVersion 19 targetSdkVersion 19
versionCode 212 versionCode 213
versionName "1.4.9" versionName "1.4.9"
} }
} }

View File

@ -26,6 +26,7 @@ import java.util.Locale;
public class LocaleController { public class LocaleController {
public static boolean isRTL = false; public static boolean isRTL = false;
private static boolean is24HourFormat = false;
public static FastDateFormat formatterDay; public static FastDateFormat formatterDay;
public static FastDateFormat formatterWeek; public static FastDateFormat formatterWeek;
public static FastDateFormat formatterMonth; public static FastDateFormat formatterMonth;
@ -121,6 +122,7 @@ public class LocaleController {
sortedLanguages.add(0, localeInfo); sortedLanguages.add(0, localeInfo);
systemDefaultLocale = Locale.getDefault(); systemDefaultLocale = Locale.getDefault();
is24HourFormat = DateFormat.is24HourFormat(ApplicationLoader.applicationContext);
LocaleInfo currentInfo = null; LocaleInfo currentInfo = null;
boolean override = false; boolean override = false;
@ -226,6 +228,7 @@ public class LocaleController {
if (changingConfiguration) { if (changingConfiguration) {
return; return;
} }
is24HourFormat = DateFormat.is24HourFormat(ApplicationLoader.applicationContext);
systemDefaultLocale = newConfig.locale; systemDefaultLocale = newConfig.locale;
if (languageOverride != null) { if (languageOverride != null) {
LocaleInfo toSet = currentLocaleInfo; LocaleInfo toSet = currentLocaleInfo;
@ -324,7 +327,7 @@ public class LocaleController {
formatterWeek = FastDateFormat.getInstance("EEE", locale); formatterWeek = FastDateFormat.getInstance("EEE", locale);
if (lang != null) { if (lang != null) {
if (DateFormat.is24HourFormat(ApplicationLoader.applicationContext)) { if (is24HourFormat) {
formatterDay = FastDateFormat.getInstance("HH:mm", locale); formatterDay = FastDateFormat.getInstance("HH:mm", locale);
} else { } else {
if (lang.toLowerCase().equals("ar")) { if (lang.toLowerCase().equals("ar")) {

View File

@ -831,26 +831,30 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
recordDialogId = dialog_id; recordDialogId = dialog_id;
fileBuffer.rewind(); fileBuffer.rewind();
/*if (android.os.Build.VERSION.SDK_INT >= 16) { some devices crash with it if (android.os.Build.VERSION.SDK_INT >= 16) {
AutomaticGainControl agc = null; File f = new File("/vendor/lib/libaudioeffect_jni.so");
try { File f2 = new File("/system/lib/libaudioeffect_jni.so");
if (AutomaticGainControl.isAvailable()) { if (f.exists() || f2.exists()) {
agc = AutomaticGainControl.create(audioRecorder.getAudioSessionId()); AutomaticGainControl agc = null;
agc.setEnabled(true);
audioGainObj = agc;
}
} catch (Exception e) {
try { try {
if (agc != null) { if (AutomaticGainControl.isAvailable()) {
agc.release(); agc = AutomaticGainControl.create(audioRecorder.getAudioSessionId());
agc = null; agc.setEnabled(true);
audioGainObj = agc;
} }
} catch (Exception e2) { } catch (Exception e) {
FileLog.e("tmessages", e2); try {
if (agc != null) {
agc.release();
agc = null;
}
} catch (Exception e2) {
FileLog.e("tmessages", e2);
}
FileLog.e("tmessages", e);
} }
FileLog.e("tmessages", e);
} }
}*/ }
audioRecorder.startRecording(); audioRecorder.startRecording();
} catch (Exception e) { } catch (Exception e) {

View File

@ -2825,4 +2825,109 @@ public class MessagesStorage {
} }
}); });
} }
public TLRPC.User getUser(final int user_id) {
TLRPC.User user = null;
try {
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, status FROM users WHERE uid = %d", user_id));
if (cursor.next()) {
byte[] userData = cursor.byteArrayValue(0);
if (userData != null) {
SerializedData data = new SerializedData(userData);
user = (TLRPC.User) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
if (user != null) {
if (user.status != null) {
user.status.expires = cursor.intValue(1);
}
}
}
}
cursor.dispose();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
return user;
}
public ArrayList<TLRPC.User> getUsers(final ArrayList<Integer> uids, final boolean[] error) {
ArrayList<TLRPC.User> users = new ArrayList<TLRPC.User>();
try {
String uidsStr = "";
for (Integer uid : uids) {
if (uidsStr.length() != 0) {
uidsStr += ",";
}
uidsStr += uid;
}
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, status FROM users WHERE uid IN (%s)", uidsStr));
while (cursor.next()) {
byte[] userData = cursor.byteArrayValue(0);
if (userData != null) {
SerializedData data = new SerializedData(userData);
TLRPC.User user = (TLRPC.User) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
if (user != null) {
if (user.status != null) {
user.status.expires = cursor.intValue(1);
}
users.add(user);
} else {
error[0] = true;
break;
}
} else {
error[0] = true;
break;
}
}
cursor.dispose();
} catch (Exception e) {
error[0] = true;
FileLog.e("tmessages", e);
}
return users;
}
public TLRPC.Chat getChat(final int chat_id) {
TLRPC.Chat chat = null;
try {
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM chats WHERE uid = %d", chat_id));
if (cursor.next()) {
byte[] chatData = cursor.byteArrayValue(0);
if (chatData != null) {
SerializedData data = new SerializedData(chatData);
chat = (TLRPC.Chat) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
}
}
cursor.dispose();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
return chat;
}
public TLRPC.EncryptedChat getEncryptedChat(final int chat_id) {
TLRPC.EncryptedChat chat = null;
try {
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, user, g, authkey, ttl FROM enc_chats WHERE uid = %d", chat_id));
if (cursor.next()) {
byte[] chatData = cursor.byteArrayValue(0);
if (chatData != null) {
SerializedData data = new SerializedData(chatData);
chat = (TLRPC.EncryptedChat) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
if (chat != null) {
chat.user_id = cursor.intValue(1);
chat.a_or_b = cursor.byteArrayValue(2);
chat.auth_key = cursor.byteArrayValue(3);
chat.ttl = cursor.intValue(4);
}
}
}
cursor.dispose();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
return chat;
}
} }

View File

@ -104,6 +104,7 @@ import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.Semaphore;
public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLayout.SizeNotifierRelativeLayoutDelegate, NotificationCenter.NotificationCenterDelegate, MessagesActivity.MessagesActivityDelegate, DocumentSelectActivity.DocumentSelectActivityDelegate { public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLayout.SizeNotifierRelativeLayoutDelegate, NotificationCenter.NotificationCenterDelegate, MessagesActivity.MessagesActivityDelegate, DocumentSelectActivity.DocumentSelectActivityDelegate {
private LayoutListView chatListView; private LayoutListView chatListView;
@ -288,31 +289,99 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
@Override @Override
public boolean onFragmentCreate() { public boolean onFragmentCreate() {
super.onFragmentCreate(); super.onFragmentCreate();
int chatId = getArguments().getInt("chat_id", 0); final int chatId = getArguments().getInt("chat_id", 0);
int userId = getArguments().getInt("user_id", 0); final int userId = getArguments().getInt("user_id", 0);
int encId = getArguments().getInt("enc_id", 0); final int encId = getArguments().getInt("enc_id", 0);
if (chatId != 0) { if (chatId != 0) {
currentChat = MessagesController.getInstance().chats.get(chatId); currentChat = MessagesController.getInstance().chats.get(chatId);
if (currentChat == null) { if (currentChat == null) {
return false; final Semaphore semaphore = new Semaphore(0);
MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() {
@Override
public void run() {
currentChat = MessagesStorage.getInstance().getChat(chatId);
semaphore.release();
}
});
try {
semaphore.acquire();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
if (currentChat != null) {
MessagesController.getInstance().chats.put(currentChat.id, currentChat);
} else {
return false;
}
} }
MessagesController.getInstance().loadChatInfo(currentChat.id); MessagesController.getInstance().loadChatInfo(currentChat.id);
dialog_id = -chatId; dialog_id = -chatId;
} else if (userId != 0) { } else if (userId != 0) {
currentUser = MessagesController.getInstance().users.get(userId); currentUser = MessagesController.getInstance().users.get(userId);
if (currentUser == null) { if (currentUser == null) {
return false; final Semaphore semaphore = new Semaphore(0);
MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() {
@Override
public void run() {
currentUser = MessagesStorage.getInstance().getUser(userId);
semaphore.release();
}
});
try {
semaphore.acquire();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
if (currentUser != null) {
MessagesController.getInstance().users.putIfAbsent(currentUser.id, currentUser);
} else {
return false;
}
} }
dialog_id = userId; dialog_id = userId;
} else if (encId != 0) { } else if (encId != 0) {
currentEncryptedChat = MessagesController.getInstance().encryptedChats.get(encId); currentEncryptedChat = MessagesController.getInstance().encryptedChats.get(encId);
if (currentEncryptedChat == null) { if (currentEncryptedChat == null) {
return false; final Semaphore semaphore = new Semaphore(0);
MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() {
@Override
public void run() {
currentEncryptedChat = MessagesStorage.getInstance().getEncryptedChat(encId);
semaphore.release();
}
});
try {
semaphore.acquire();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
if (currentEncryptedChat != null) {
MessagesController.getInstance().encryptedChats.putIfAbsent(currentEncryptedChat.id, currentEncryptedChat);
} else {
return false;
}
} }
currentUser = MessagesController.getInstance().users.get(currentEncryptedChat.user_id); currentUser = MessagesController.getInstance().users.get(currentEncryptedChat.user_id);
if (currentUser == null) { if (currentUser == null) {
return false; final Semaphore semaphore = new Semaphore(0);
MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() {
@Override
public void run() {
currentUser = MessagesStorage.getInstance().getUser(currentEncryptedChat.user_id);
semaphore.release();
}
});
try {
semaphore.acquire();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
if (currentUser != null) {
MessagesController.getInstance().users.putIfAbsent(currentUser.id, currentUser);
} else {
return false;
}
} }
dialog_id = ((long)encId) << 32; dialog_id = ((long)encId) << 32;
maxMessageId = Integer.MIN_VALUE; maxMessageId = Integer.MIN_VALUE;
@ -1400,8 +1469,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (requestCode == 0) { if (requestCode == 0) {
Utilities.addMediaToGallery(currentPicturePath); Utilities.addMediaToGallery(currentPicturePath);
@ -1450,6 +1518,18 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
} }
} }
@Override
public void saveSelfArgs(Bundle args) {
if (currentPicturePath != null) {
args.putString("path", currentPicturePath);
}
}
@Override
public void restoreSelfArgs(Bundle args) {
currentPicturePath = args.getString("path");
}
public boolean processSendingText(String text) { public boolean processSendingText(String text) {
text = text.replaceAll("\n\n+", "\n\n"); text = text.replaceAll("\n\n+", "\n\n");
text = text.replaceAll(" +", " "); text = text.replaceAll(" +", " ");
@ -3104,7 +3184,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
currentPicturePath = image.getAbsolutePath(); currentPicturePath = image.getAbsolutePath();
} }
startActivityForResult(takePictureIntent, 0); parentActivity.startActivityForResult(takePictureIntent, 0);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
@ -3114,7 +3194,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
try { try {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*"); photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 1); parentActivity.startActivityForResult(photoPickerIntent, 1);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
@ -3138,7 +3218,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa
Intent chooserIntent = Intent.createChooser(pickIntent, ""); Intent chooserIntent = Intent.createChooser(pickIntent, "");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takeVideoIntent }); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takeVideoIntent });
startActivityForResult(chooserIntent, 2); parentActivity.startActivityForResult(chooserIntent, 2);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }

View File

@ -163,6 +163,9 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen
editor.commit(); editor.commit();
listView.invalidateViews(); listView.invalidateViews();
} else if (i == 3) { } else if (i == 3) {
if (parentActivity == null) {
return;
}
try { try {
Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
@ -187,7 +190,7 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen
} }
tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound);
startActivityForResult(tmpIntent, 15); parentActivity.startActivityForResult(tmpIntent, 3);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
@ -247,11 +250,10 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
avatarUpdater.onActivityResult(requestCode, resultCode, data); avatarUpdater.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (requestCode == 15) { if (requestCode == 3) {
Uri ringtone = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); Uri ringtone = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
String name = null; String name = null;
if (ringtone != null && parentActivity != null) { if (ringtone != null && parentActivity != null) {

View File

@ -431,11 +431,12 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen
if (!selectedContacts.isEmpty()) { if (!selectedContacts.isEmpty()) {
ArrayList<Integer> result = new ArrayList<Integer>(); ArrayList<Integer> result = new ArrayList<Integer>();
result.addAll(selectedContacts.keySet()); result.addAll(selectedContacts.keySet());
NotificationCenter.getInstance().addToMemCache(2, result); Bundle args = new Bundle();
} else { args.putIntegerArrayList("result", result);
return; GroupCreateFinalActivity fragment = new GroupCreateFinalActivity();
fragment.setArguments(args);
((LaunchActivity)parentActivity).presentFragment(fragment, "group_craate_final", false);
} }
((LaunchActivity)parentActivity).presentFragment(new GroupCreateFinalActivity(), "group_craate_final", false);
} }
}); });
} }

View File

@ -28,6 +28,7 @@ import android.widget.TextView;
import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.ConnectionsManager;
import org.telegram.messenger.LocaleController; import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessagesStorage;
import org.telegram.messenger.TLRPC; import org.telegram.messenger.TLRPC;
import org.telegram.messenger.FileLog; import org.telegram.messenger.FileLog;
import org.telegram.messenger.MessagesController; import org.telegram.messenger.MessagesController;
@ -42,10 +43,11 @@ import org.telegram.ui.Views.PinnedHeaderListView;
import org.telegram.ui.Views.SectionedBaseAdapter; import org.telegram.ui.Views.SectionedBaseAdapter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.concurrent.Semaphore;
public class GroupCreateFinalActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, AvatarUpdater.AvatarUpdaterDelegate { public class GroupCreateFinalActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, AvatarUpdater.AvatarUpdaterDelegate {
private PinnedHeaderListView listView; private PinnedHeaderListView listView;
private TextView nameTextView; private EditText nameTextView;
private TLRPC.FileLocation avatar; private TLRPC.FileLocation avatar;
private TLRPC.InputFile uploadedAvatar; private TLRPC.InputFile uploadedAvatar;
private ArrayList<Integer> selectedContacts; private ArrayList<Integer> selectedContacts;
@ -54,6 +56,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati
private boolean donePressed; private boolean donePressed;
private AvatarUpdater avatarUpdater = new AvatarUpdater(); private AvatarUpdater avatarUpdater = new AvatarUpdater();
private ProgressDialog progressDialog = null; private ProgressDialog progressDialog = null;
private String nameToSet = null;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
@ -64,7 +67,40 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati
NotificationCenter.getInstance().addObserver(this, MessagesController.chatDidFailCreate); NotificationCenter.getInstance().addObserver(this, MessagesController.chatDidFailCreate);
avatarUpdater.parentFragment = this; avatarUpdater.parentFragment = this;
avatarUpdater.delegate = this; avatarUpdater.delegate = this;
selectedContacts = (ArrayList<Integer>)NotificationCenter.getInstance().getFromMemCache(2); selectedContacts = getArguments().getIntegerArrayList("result");
final ArrayList<Integer> usersToLoad = new ArrayList<Integer>();
for (Integer uid : selectedContacts) {
if (MessagesController.getInstance().users.get(uid) == null) {
usersToLoad.add(uid);
}
}
if (!usersToLoad.isEmpty()) {
final Semaphore semaphore = new Semaphore(0);
final ArrayList<TLRPC.User> users = new ArrayList<TLRPC.User>();
final boolean[] error = new boolean[1];
MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() {
@Override
public void run() {
users.addAll(MessagesStorage.getInstance().getUsers(usersToLoad, error));
semaphore.release();
}
});
try {
semaphore.acquire();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
if (error[0]) {
return false;
}
if (!users.isEmpty()) {
for (TLRPC.User user : users) {
MessagesController.getInstance().users.putIfAbsent(user.id, user);
}
} else {
return false;
}
}
return true; return true;
} }
@ -125,6 +161,10 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati
nameTextView = (EditText)fragmentView.findViewById(R.id.bubble_input_text); nameTextView = (EditText)fragmentView.findViewById(R.id.bubble_input_text);
nameTextView.setHint(LocaleController.getString("EnterGroupNamePlaceholder", R.string.EnterGroupNamePlaceholder)); nameTextView.setHint(LocaleController.getString("EnterGroupNamePlaceholder", R.string.EnterGroupNamePlaceholder));
if (nameToSet != null) {
nameTextView.setText(nameToSet);
nameToSet = null;
}
listView = (PinnedHeaderListView)fragmentView.findViewById(R.id.listView); listView = (PinnedHeaderListView)fragmentView.findViewById(R.id.listView);
listView.setAdapter(new ListAdapter(parentActivity)); listView.setAdapter(new ListAdapter(parentActivity));
} else { } else {
@ -200,11 +240,38 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
avatarUpdater.onActivityResult(requestCode, resultCode, data); avatarUpdater.onActivityResult(requestCode, resultCode, data);
} }
@Override
public void saveSelfArgs(Bundle args) {
if (avatarUpdater != null && avatarUpdater.currentPicturePath != null) {
args.putString("path", avatarUpdater.currentPicturePath);
}
if (nameTextView != null) {
String text = nameTextView.getText().toString();
if (text != null && text.length() != 0) {
args.putString("nameTextView", text);
}
}
}
@Override
public void restoreSelfArgs(Bundle args) {
if (avatarUpdater != null) {
avatarUpdater.currentPicturePath = args.getString("path");
}
String text = args.getString("nameTextView");
if (text != null) {
if (nameTextView != null) {
nameTextView.setText(text);
} else {
nameToSet = text;
}
}
}
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.group_create_menu, menu); inflater.inflate(R.menu.group_create_menu, menu);

View File

@ -140,6 +140,46 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen
MessagesActivity fragment = new MessagesActivity(); MessagesActivity fragment = new MessagesActivity();
fragment.onFragmentCreate(); fragment.onFragmentCreate();
ApplicationLoader.fragmentsStack.add(fragment); ApplicationLoader.fragmentsStack.add(fragment);
try {
if (savedInstanceState != null) {
String fragmentName = savedInstanceState.getString("fragment");
if (fragmentName != null) {
Bundle args = savedInstanceState.getBundle("args");
if (fragmentName.equals("chat")) {
if (args != null) {
ChatActivity chat = new ChatActivity();
chat.setArguments(args);
if (chat.onFragmentCreate()) {
ApplicationLoader.fragmentsStack.add(chat);
chat.restoreSelfArgs(savedInstanceState);
}
}
} else if (fragmentName.equals("settings")) {
SettingsActivity settings = new SettingsActivity();
settings.onFragmentCreate();
settings.restoreSelfArgs(savedInstanceState);
ApplicationLoader.fragmentsStack.add(settings);
} else if (fragmentName.equals("group")) {
if (args != null) {
GroupCreateFinalActivity group = new GroupCreateFinalActivity();
group.setArguments(args);
if (group.onFragmentCreate()) {
group.restoreSelfArgs(savedInstanceState);
ApplicationLoader.fragmentsStack.add(group);
}
}
} else if (fragmentName.equals("wallpapers")) {
SettingsWallpapersActivity settings = new SettingsWallpapersActivity();
settings.onFragmentCreate();
settings.restoreSelfArgs(savedInstanceState);
ApplicationLoader.fragmentsStack.add(settings);
}
}
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
} }
handleIntent(getIntent(), false, savedInstanceState != null); handleIntent(getIntent(), false, savedInstanceState != null);
@ -536,6 +576,15 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen
} }
} }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (ApplicationLoader.fragmentsStack.size() != 0) {
BaseFragment fragment = ApplicationLoader.fragmentsStack.get(ApplicationLoader.fragmentsStack.size() - 1);
fragment.onActivityResultFragment(requestCode, resultCode, data);
}
}
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
@ -932,6 +981,22 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen
protected void onSaveInstanceState(Bundle outState) { protected void onSaveInstanceState(Bundle outState) {
try { try {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
if (!ApplicationLoader.fragmentsStack.isEmpty()) {
BaseFragment lastFragment = ApplicationLoader.fragmentsStack.get(ApplicationLoader.fragmentsStack.size() - 1);
Bundle args = lastFragment.getArguments();
if (lastFragment instanceof ChatActivity && args != null) {
outState.putBundle("args", args);
outState.putString("fragment", "chat");
} else if (lastFragment instanceof SettingsActivity) {
outState.putString("fragment", "settings");
} else if (lastFragment instanceof GroupCreateFinalActivity && args != null) {
outState.putBundle("args", args);
outState.putString("fragment", "group");
} else if (lastFragment instanceof SettingsWallpapersActivity) {
outState.putString("fragment", "wallpapers");
}
lastFragment.saveSelfArgs(outState);
}
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }

View File

@ -445,11 +445,24 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
avatarUpdater.onActivityResult(requestCode, resultCode, data); avatarUpdater.onActivityResult(requestCode, resultCode, data);
} }
@Override
public void saveSelfArgs(Bundle args) {
if (avatarUpdater != null && avatarUpdater.currentPicturePath != null) {
args.putString("path", avatarUpdater.currentPicturePath);
}
}
@Override
public void restoreSelfArgs(Bundle args) {
if (avatarUpdater != null) {
avatarUpdater.currentPicturePath = args.getString("path");
}
}
@Override @Override
public void didReceivedNotification(int id, Object... args) { public void didReceivedNotification(int id, Object... args) {
if (id == MessagesController.updateInterfaces) { if (id == MessagesController.updateInterfaces) {

View File

@ -103,6 +103,9 @@ public class SettingsNotificationsActivity extends BaseFragment {
editor.commit(); editor.commit();
listView.invalidateViews(); listView.invalidateViews();
} else if (i == 4 || i == 9) { } else if (i == 4 || i == 9) {
if (parentActivity == null) {
return;
}
try { try {
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
@ -137,7 +140,7 @@ public class SettingsNotificationsActivity extends BaseFragment {
} }
} }
tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound);
startActivityForResult(tmpIntent, i); parentActivity.startActivityForResult(tmpIntent, i);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
@ -228,8 +231,7 @@ public class SettingsNotificationsActivity extends BaseFragment {
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
Uri ringtone = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); Uri ringtone = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
String name = null; String name = null;

View File

@ -113,6 +113,9 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
builder.setItems(items, new DialogInterface.OnClickListener() { builder.setItems(items, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialogInterface, int i) {
if (parentActivity == null) {
return;
}
if (i == 0) { if (i == 0) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File image = Utilities.generatePicturePath(); File image = Utilities.generatePicturePath();
@ -120,11 +123,11 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
currentPicturePath = image.getAbsolutePath(); currentPicturePath = image.getAbsolutePath();
} }
startActivityForResult(takePictureIntent, 0); parentActivity.startActivityForResult(takePictureIntent, 10);
} else if (i == 1) { } else if (i == 1) {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*"); photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 1); parentActivity.startActivityForResult(photoPickerIntent, 11);
} }
} }
}); });
@ -194,10 +197,9 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (requestCode == 0) { if (requestCode == 10) {
Utilities.addMediaToGallery(currentPicturePath); Utilities.addMediaToGallery(currentPicturePath);
try { try {
Bitmap bitmap = FileLoader.loadBitmap(currentPicturePath, null, Utilities.dp(320), Utilities.dp(480)); Bitmap bitmap = FileLoader.loadBitmap(currentPicturePath, null, Utilities.dp(320), Utilities.dp(480));
@ -211,7 +213,7 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
currentPicturePath = null; currentPicturePath = null;
} else if (requestCode == 1) { } else if (requestCode == 11) {
Uri imageUri = data.getData(); Uri imageUri = data.getData();
Cursor cursor = parentActivity.getContentResolver().query(imageUri, new String[]{android.provider.MediaStore.Images.ImageColumns.DATA}, null, null, null); Cursor cursor = parentActivity.getContentResolver().query(imageUri, new String[]{android.provider.MediaStore.Images.ImageColumns.DATA}, null, null, null);
if (cursor == null) { if (cursor == null) {
@ -239,6 +241,18 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica
} }
} }
@Override
public void saveSelfArgs(Bundle args) {
if (currentPicturePath != null) {
args.putString("path", currentPicturePath);
}
}
@Override
public void restoreSelfArgs(Bundle args) {
currentPicturePath = args.getString("path");
}
private void processSelectedBackground() { private void processSelectedBackground() {
TLRPC.WallPaper wallPaper = wallpappersByIds.get(selectedBackground); TLRPC.WallPaper wallPaper = wallpappersByIds.get(selectedBackground);
if (selectedBackground != -1 && selectedBackground != 1000001 && wallPaper != null && wallPaper instanceof TLRPC.TL_wallPaper) { if (selectedBackground != -1 && selectedBackground != 1000001 && wallPaper != null && wallPaper instanceof TLRPC.TL_wallPaper) {

View File

@ -144,6 +144,9 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
} else if (i == 5 && dialog_id == 0 || } else if (i == 5 && dialog_id == 0 ||
dialog_id != 0 && (i == 7 && currentEncryptedChat instanceof TLRPC.TL_encryptedChat || dialog_id != 0 && (i == 7 && currentEncryptedChat instanceof TLRPC.TL_encryptedChat ||
i == 5 && !(currentEncryptedChat instanceof TLRPC.TL_encryptedChat))) { i == 5 && !(currentEncryptedChat instanceof TLRPC.TL_encryptedChat))) {
if (parentActivity == null) {
return;
}
try { try {
Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
@ -168,7 +171,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
} }
tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound);
startActivityForResult(tmpIntent, 0); parentActivity.startActivityForResult(tmpIntent, 12);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
@ -256,8 +259,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (data == null) { if (data == null) {
return; return;
@ -279,7 +281,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit(); SharedPreferences.Editor editor = preferences.edit();
if (requestCode == 0) { if (requestCode == 12) {
if (name != null && ringtone != null) { if (name != null && ringtone != null) {
editor.putString("sound_" + user_id, name); editor.putString("sound_" + user_id, name);
editor.putString("sound_path_" + user_id, ringtone.toString()); editor.putString("sound_path_" + user_id, ringtone.toString());

View File

@ -58,7 +58,7 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
currentPicturePath = image.getAbsolutePath(); currentPicturePath = image.getAbsolutePath();
} }
parentFragment.startActivityForResult(takePictureIntent, 0); parentFragment.parentActivity.startActivityForResult(takePictureIntent, 13);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
@ -68,7 +68,7 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
try { try {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*"); photoPickerIntent.setType("image/*");
parentFragment.startActivityForResult(photoPickerIntent, 1); parentFragment.parentActivity.startActivityForResult(photoPickerIntent, 14);
} catch (Exception e) { } catch (Exception e) {
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
@ -102,12 +102,12 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (requestCode == 0) { if (requestCode == 13) {
Utilities.addMediaToGallery(currentPicturePath); Utilities.addMediaToGallery(currentPicturePath);
startCrop(currentPicturePath, null); startCrop(currentPicturePath, null);
currentPicturePath = null; currentPicturePath = null;
} else if (requestCode == 1) { } else if (requestCode == 14) {
if (data == null || data.getData() == null) { if (data == null || data.getData() == null) {
return; return;
} }

View File

@ -8,6 +8,7 @@
package org.telegram.ui.Views; package org.telegram.ui.Views;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarActivity;
@ -28,6 +29,7 @@ public class BaseFragment extends Fragment {
public int classGuid = 0; public int classGuid = 0;
public boolean firstStart = true; public boolean firstStart = true;
public boolean animationInProgress = false; public boolean animationInProgress = false;
private long currentAnimationDuration = 0;
private boolean removeParentOnDestroy = false; private boolean removeParentOnDestroy = false;
private boolean removeParentOnAnimationEnd = true; private boolean removeParentOnAnimationEnd = true;
@ -108,6 +110,16 @@ public class BaseFragment extends Fragment {
public void onAnimationStart() { public void onAnimationStart() {
animationInProgress = true; animationInProgress = true;
if (fragmentView != null) {
fragmentView.postDelayed(new Runnable() {
@Override
public void run() {
if (animationInProgress) {
onAnimationEnd();
}
}
}, currentAnimationDuration);
}
} }
public void onAnimationEnd() { public void onAnimationEnd() {
@ -137,6 +149,7 @@ public class BaseFragment extends Fragment {
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
if (nextAnim != 0) { if (nextAnim != 0) {
Animation anim = AnimationUtils.loadAnimation(getActivity(), nextAnim); Animation anim = AnimationUtils.loadAnimation(getActivity(), nextAnim);
currentAnimationDuration = anim.getDuration();
anim.setAnimationListener(new Animation.AnimationListener() { anim.setAnimationListener(new Animation.AnimationListener() {
@ -149,7 +162,9 @@ public class BaseFragment extends Fragment {
} }
public void onAnimationEnd(Animation animation) { public void onAnimationEnd(Animation animation) {
BaseFragment.this.onAnimationEnd(); if (animationInProgress) {
BaseFragment.this.onAnimationEnd();
}
} }
}); });
@ -166,4 +181,16 @@ public class BaseFragment extends Fragment {
public void applySelfActionBar() { public void applySelfActionBar() {
} }
public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
}
public void saveSelfArgs(Bundle args) {
}
public void restoreSelfArgs(Bundle args) {
}
} }