diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e80ad5a8a..a8ab6ce5a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -107,6 +107,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/chat.xml b/res/layout/chat.xml
index 21f049284..a3a38ce09 100644
--- a/res/layout/chat.xml
+++ b/res/layout/chat.xml
@@ -3,7 +3,44 @@
xmlns:linphone="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:id="@+id/top_layout"
android:background="@drawable/background" >
+
+
+
+
+
+
+
+
-
Modifier
Annuler
Valider
+ Retour
Tous
SIP
+ Contact
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1b937c3f7..3c75ffeb3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -303,6 +303,7 @@
Edit
Cancel
Okay
+ Back
All
SIP
New contact
diff --git a/src/org/linphone/ChatFragment.java b/src/org/linphone/ChatActivity.java
similarity index 61%
rename from src/org/linphone/ChatFragment.java
rename to src/org/linphone/ChatActivity.java
index 593a1c04f..e988e6b23 100644
--- a/src/org/linphone/ChatFragment.java
+++ b/src/org/linphone/ChatActivity.java
@@ -1,7 +1,7 @@
package org.linphone;
/*
-ChatFragment.java
-Copyright (C) 2012 Belledonne Communications, Grenoble, France
+ChatActivity.java
+Copyright (C) 2015 Belledonne Communications, Grenoble, France
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@@ -17,6 +17,56 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.media.ExifInterface;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Parcelable;
+import android.provider.MediaStore;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.content.CursorLoader;
+import android.text.Editable;
+import android.text.InputType;
+import android.text.TextWatcher;
+import android.view.ContextMenu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.view.WindowManager;
+import android.view.View.OnClickListener;
+import android.widget.BaseAdapter;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.apache.http.util.ByteArrayBuffer;
+import org.linphone.compatibility.Compatibility;
+import org.linphone.core.LinphoneAddress;
+import org.linphone.core.LinphoneChatMessage;
+import org.linphone.core.LinphoneChatRoom;
+import org.linphone.core.LinphoneCore;
+import org.linphone.mediastream.Log;
+import org.linphone.ui.AvatarWithShadow;
+import org.linphone.ui.BubbleChat;
+
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
@@ -32,62 +82,16 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
-import org.apache.http.util.ByteArrayBuffer;
-import org.linphone.compatibility.Compatibility;
-import org.linphone.core.LinphoneAddress;
-import org.linphone.core.LinphoneChatMessage;
-import org.linphone.core.LinphoneChatMessage.State;
-import org.linphone.core.LinphoneChatRoom;
-import org.linphone.core.LinphoneCore;
+import org.linphone.core.LinphoneChatMessage.StateListener;
import org.linphone.core.LinphoneCoreListener.LinphoneComposingListener;
-import org.linphone.mediastream.Log;
-import org.linphone.ui.AvatarWithShadow;
-import org.linphone.ui.BubbleChat;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.CompressFormat;
-import android.graphics.BitmapFactory;
-import android.graphics.Matrix;
-import android.graphics.Rect;
-import android.media.ExifInterface;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.Parcelable;
-import android.provider.MediaStore;
-import android.support.v4.app.Fragment;
-import android.support.v4.content.CursorLoader;
-import android.text.Editable;
-import android.text.InputType;
-import android.text.TextWatcher;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.BaseAdapter;
-import android.widget.EditText;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.ProgressBar;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-import android.widget.Toast;
+import org.linphone.core.LinphoneCoreListener.LinphoneMessageListener;
/**
- * @author Sylvain Berfini
+ * @author Margaux Clerc
*/
-public class ChatFragment extends Fragment implements OnClickListener, LinphoneChatMessage.StateListener, LinphoneComposingListener {
+public class ChatActivity extends FragmentActivity implements OnClickListener, LinphoneMessageListener, StateListener, LinphoneComposingListener {
+ private static ChatActivity instance;
+
private static final int ADD_PHOTO = 1337;
private static final int MENU_DELETE_MESSAGE = 0;
private static final int MENU_SAVE_PICTURE = 1;
@@ -103,16 +107,17 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
private static final int SIZE_LARGE = 1500;
private LinphoneChatRoom chatRoom;
- private View view;
private String sipUri;
+ private String displayName;
+ private String pictureUri;
private EditText message;
private ImageView cancelUpload;
- private TextView sendImage, sendMessage, contactName, remoteComposing;
+ private LinearLayout topBar;
+ private TextView sendImage, sendMessage, contactName, remoteComposing, back;
private AvatarWithShadow contactPicture;
private RelativeLayout uploadLayout, textLayout;
private List lastSentMessagesBubbles;
private HashMap latestImageMessages;
- private boolean useLinphoneMessageStorage;
private ListView messagesList;
private Handler mHandler = new Handler();
@@ -124,87 +129,99 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
private Uri imageToUploadUri;
private Thread uploadThread;
private TextWatcher textWatcher;
- private OnGlobalLayoutListener keyboardListener;
+ private ViewTreeObserver.OnGlobalLayoutListener keyboardListener;
private ChatMessageAdapter adapter;
+ public static boolean isInstanciated() {
+ return instance != null;
+ }
+
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- sipUri = getArguments().getString("SipUri");
- String displayName = getArguments().getString("DisplayName");
- String pictureUri = getArguments().getString("PictureUri");
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ instance = this;
+ setContentView(R.layout.chat);
- view = inflater.inflate(R.layout.chat, container, false);
+ //Retrieve parameter from intent
+ sipUri = getIntent().getStringExtra("SipUri");
+ displayName = getIntent().getStringExtra("DisplayName");
+ pictureUri = getIntent().getStringExtra("PictureUri");
- useLinphoneMessageStorage = getResources().getBoolean(R.bool.use_linphone_chat_storage);
+ uploadServerUri = LinphonePreferences.instance().getSharingPictureServerUrl();
- contactName = (TextView) view.findViewById(R.id.contactName);
- contactPicture = (AvatarWithShadow) view.findViewById(R.id.contactPicture);
+ //Initialize UI
+ contactName = (TextView) findViewById(R.id.contactName);
+ contactPicture = (AvatarWithShadow) findViewById(R.id.contactPicture);
+ messagesList = (ListView) findViewById(R.id.chatMessageList);
+ textLayout = (RelativeLayout) findViewById(R.id.messageLayout);
+ progressBar = (ProgressBar) findViewById(R.id.progressbar);
+ topBar = (LinearLayout) findViewById(R.id.topbar);
- sendMessage = (TextView) view.findViewById(R.id.sendMessage);
- sendMessage.setOnClickListener(this);
+ sendMessage = (TextView) findViewById(R.id.sendMessage);
+ sendMessage.setOnClickListener(this);
- remoteComposing = (TextView) view.findViewById(R.id.remoteComposing);
- remoteComposing.setVisibility(View.GONE);
-
- messagesList = (ListView) view.findViewById(R.id.chatMessageList);
-
- message = (EditText) view.findViewById(R.id.message);
- if (!getActivity().getResources().getBoolean(R.bool.allow_chat_multiline)) {
- message.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE);
- message.setMaxLines(1);
- }
-
- uploadLayout = (RelativeLayout) view.findViewById(R.id.uploadLayout);
- uploadLayout.setVisibility(View.GONE);
- textLayout = (RelativeLayout) view.findViewById(R.id.messageLayout);
-
- progressBar = (ProgressBar) view.findViewById(R.id.progressbar);
- sendImage = (TextView) view.findViewById(R.id.sendPicture);
- if (!getResources().getBoolean(R.bool.disable_chat_send_file)) {
- registerForContextMenu(sendImage);
- sendImage.setOnClickListener(new OnClickListener() {
+ remoteComposing = (TextView) findViewById(R.id.remoteComposing);
+ remoteComposing.setVisibility(View.GONE);
+
+ uploadLayout = (RelativeLayout) findViewById(R.id.uploadLayout);
+ uploadLayout.setVisibility(View.GONE);
+
+ displayChatHeader(displayName, pictureUri);
+
+ //Manage multiline
+ message = (EditText) findViewById(R.id.message);
+ if (!getApplicationContext().getResources().getBoolean(R.bool.allow_chat_multiline)) {
+ message.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE);
+ message.setMaxLines(1);
+ }
+
+ sendImage = (TextView) findViewById(R.id.sendPicture);
+ if (!getResources().getBoolean(R.bool.disable_chat_send_file)) {
+ registerForContextMenu(sendImage);
+ sendImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pickImage();
}
});
- } else {
- sendImage.setEnabled(false);
- }
-
- cancelUpload = (ImageView) view.findViewById(R.id.cancelUpload);
- cancelUpload.setOnClickListener(new OnClickListener() {
+ } else {
+ sendImage.setEnabled(false);
+ }
+
+ back = (TextView) findViewById(R.id.back);
+ back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- uploadThread.interrupt();
- uploadLayout.setVisibility(View.GONE);
- textLayout.setVisibility(View.VISIBLE);
- progressBar.setProgress(0);
+ finish();
}
});
- LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
+ cancelUpload = (ImageView) findViewById(R.id.cancelUpload);
+ cancelUpload.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ uploadThread.interrupt();
+ uploadLayout.setVisibility(View.GONE);
+ textLayout.setVisibility(View.VISIBLE);
+ progressBar.setProgress(0);
+ fileToUploadPath = null;
+ imageToUpload = null;
+ }
+ });
+
+ LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null) {
chatRoom = lc.getOrCreateChatRoom(sipUri);
//Only works if using liblinphone storage
chatRoom.markAsRead();
}
-
- displayChatHeader(displayName, pictureUri);
- uploadServerUri = LinphonePreferences.instance().getSharingPictureServerUrl();
+ textWatcher = new TextWatcher() {
+ public void afterTextChanged(Editable arg0) {}
- textWatcher = new TextWatcher() {
- public void afterTextChanged(Editable arg0) {
+ public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
- }
-
- public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
-
- }
-
- public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3)
- {
+ public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
if (message.getText().toString().equals("")) {
sendMessage.setEnabled(false);
} else {
@@ -216,12 +233,11 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
};
// Force hide keyboard
- if (LinphoneActivity.isInstanciated()) {
- InputMethodManager imm = (InputMethodManager) LinphoneActivity.instance().getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(view.getWindowToken(),0);
- }
+ getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
// Workaround for SGS3 issue
+ imageToUpload = getIntent().getParcelableExtra("imageToUpload");
+
if (savedInstanceState != null) {
fileToUploadPath = savedInstanceState.getString("fileToUploadPath");
imageToUpload = savedInstanceState.getParcelable("imageToUpload");
@@ -234,65 +250,74 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
});
}
+ }
- return view;
- }
+ public static ChatActivity instance() {
+ return instance;
+ }
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("fileToUploadPath", fileToUploadPath);
outState.putParcelable("imageToUpload", imageToUpload);
outState.putString("messageDraft", message.getText().toString());
+
super.onSaveInstanceState(outState);
}
private void addVirtualKeyboardVisiblityListener() {
- keyboardListener = new OnGlobalLayoutListener() {
+ keyboardListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
- Rect visibleArea = new Rect();
- view.getWindowVisibleDisplayFrame(visibleArea);
+ Rect visibleArea = new Rect();
+ getWindow().getDecorView().getWindowVisibleDisplayFrame(visibleArea);
- int heightDiff = view.getRootView().getHeight() - (visibleArea.bottom - visibleArea.top);
- if (heightDiff > 200) {
- showKeyboardVisibleMode();
- } else {
- hideKeyboardVisibleMode();
- }
+ int heightDiff = getWindow().getDecorView().getRootView().getHeight() - (visibleArea.bottom - visibleArea.top);
+ if (heightDiff > 200) {
+ showKeyboardVisibleMode();
+ } else {
+ hideKeyboardVisibleMode();
+ }
}
};
- view.getViewTreeObserver().addOnGlobalLayoutListener(keyboardListener);
+ getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(keyboardListener);
}
private void removeVirtualKeyboardVisiblityListener() {
- Compatibility.removeGlobalLayoutListener(view.getViewTreeObserver(), keyboardListener);
+ Compatibility.removeGlobalLayoutListener(getWindow().getDecorView().getViewTreeObserver(), keyboardListener);
}
public void showKeyboardVisibleMode() {
- LinphoneActivity.instance().hideMenu(true);
+ boolean isOrientationLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
+ if (isOrientationLandscape) {
+ topBar.setVisibility(View.GONE);
+ }
contactPicture.setVisibility(View.GONE);
scrollToEnd();
}
public void hideKeyboardVisibleMode() {
- LinphoneActivity.instance().hideMenu(false);
+ boolean isOrientationLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
contactPicture.setVisibility(View.VISIBLE);
- //scrollToEnd();
+ if (isOrientationLandscape) {
+ topBar.setVisibility(View.VISIBLE);
+ }
+ scrollToEnd();
}
-
+
class ChatMessageAdapter extends BaseAdapter {
LinphoneChatMessage[] history;
Context context;
-
+
public ChatMessageAdapter(Context context, LinphoneChatMessage[] history) {
- this.history = history;
+ this.history = history;
this.context = context;
}
-
- public void refreshHistory(){
+
+ public void refreshHistory() {
this.history = chatRoom.getHistory();
}
-
+
@Override
public int getCount() {
return history.length;
@@ -307,54 +332,49 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
public long getItemId(int position) {
return history[position].getStorageId();
}
-
+
@Override
public View getView(int position, View convertView, ViewGroup parent) {
BubbleChat bubble;
LinphoneChatMessage msg = history[position];
View v;
- if (msg.getExternalBodyUrl() != null ) {
+ if (msg.getExternalBodyUrl() != null) {
bubble = displayImageMessage(msg.getStorageId(), null, msg.getTime(), !msg.isOutgoing(), msg.getStatus(), context, msg.getExternalBodyUrl());
} else {
bubble = displayMessage(msg.getStorageId(), msg.getText(), msg.getTime(), !msg.isOutgoing(), msg.getStatus(), context);
-
}
-
+
v = bubble.getView();
bubble.setNativeMessageObject(msg);
registerForContextMenu(v);
-
+
RelativeLayout rlayout = new RelativeLayout(context);
rlayout.addView(v);
-
+
return rlayout;
}
- }
-
- public View getBubble(int position){
- return messagesList.getChildAt(position);
}
-
- public void dispayMessageList(){
- adapter = new ChatMessageAdapter(this.getActivity(), chatRoom.getHistory());
- messagesList.setAdapter(adapter);
+
+ public void dispayMessageList() {
+ adapter = new ChatMessageAdapter(this, chatRoom.getHistory());
+ messagesList.setAdapter(adapter);
}
private void displayChatHeader(String displayName, String pictureUri) {
if (displayName == null && getResources().getBoolean(R.bool.only_display_username_if_unknown) && LinphoneUtils.isSipAddress(sipUri)) {
- contactName.setText(LinphoneUtils.getUsernameFromAddress(sipUri));
+ contactName.setText(LinphoneUtils.getUsernameFromAddress(sipUri));
} else if (displayName == null) {
contactName.setText(sipUri);
} else {
contactName.setText(displayName);
}
- if (pictureUri != null) {
- LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture.getView(), Uri.parse(pictureUri), R.drawable.unknown_small);
- } else {
- contactPicture.setImageResource(R.drawable.unknown_small);
- }
+ if (pictureUri != null) {
+ LinphoneUtils.setImagePictureFromUri(this, contactPicture.getView(), Uri.parse(pictureUri), R.drawable.unknown_small);
+ } else {
+ contactPicture.setImageResource(R.drawable.unknown_small);
+ }
}
private BubbleChat displayMessage(int id, String message, long time, boolean isIncoming, LinphoneChatMessage.State status, Context context) {
@@ -380,7 +400,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
if (url.startsWith("http")) { // Download
bubble.setShowOrDownloadText(getString(R.string.download_image));
- bubble.setShowOrDownloadImageButtonListener(new OnClickListener() {
+ bubble.setShowOrDownloadImageButtonListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
v.findViewById(R.id.spinner).setVisibility(View.VISIBLE);
@@ -389,19 +409,15 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
new Thread(new Runnable() {
@Override
public void run() {
- final Bitmap bm = ChatFragment.downloadImage(url);
+ final Bitmap bm = ChatActivity.instance().downloadImage(url);
if (bm != null) {
- if (useLinphoneMessageStorage) {
- String newFileUrl = saveImage(bm, finalId, getMessageForId(finalId));
- bubble.updateUrl(newFileUrl);
- adapter.refreshHistory();
- } else {
- LinphoneActivity.instance().getChatStorage().saveImage(finalId, bm);
- }
+ String newFileUrl = saveImage(bm, finalId, getMessageForId(finalId));
+ bubble.updateUrl(newFileUrl);
+ adapter.refreshHistory();
mHandler.post(new Runnable() {
@Override
public void run() {
- ((ImageView)v.findViewById(R.id.image)).setImageBitmap(bm);
+ ((ImageView) v.findViewById(R.id.image)).setImageBitmap(bm);
v.findViewById(R.id.image).setVisibility(View.VISIBLE);
v.findViewById(R.id.spinner).setVisibility(View.GONE);
}
@@ -422,11 +438,10 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
});
} else { // Show
Bitmap bm = BitmapFactory.decodeFile(url);
- ((ImageView)v.findViewById(R.id.image)).setImageBitmap(bm);
+ ((ImageView) v.findViewById(R.id.image)).setImageBitmap(bm);
v.findViewById(R.id.image).setVisibility(View.VISIBLE);
v.findViewById(R.id.download).setVisibility(View.GONE);
}
-
return bubble;
}
@@ -455,7 +470,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
@Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
if (v.getId() == R.id.sendPicture) {
menu.add(0, MENU_PICTURE_SMALL, 0, getString(R.string.share_picture_size_small));
menu.add(0, MENU_PICTURE_MEDIUM, 0, getString(R.string.share_picture_size_medium));
@@ -465,13 +480,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
} else {
menu.add(v.getId(), MENU_DELETE_MESSAGE, 0, getString(R.string.delete));
ImageView iv = (ImageView) v.findViewById(R.id.image);
- if (iv != null && iv.getVisibility() == View.VISIBLE) {
- if (!useLinphoneMessageStorage) {
- menu.add(v.getId(), MENU_SAVE_PICTURE, 0, getString(R.string.save_picture));
- }
- } else {
- menu.add(v.getId(), MENU_COPY_TEXT, 0, getString(R.string.copy_text));
- }
+ menu.add(v.getId(), MENU_COPY_TEXT, 0, getString(R.string.copy_text));
LinphoneChatMessage msg = getMessageForId(v.getId());
if (msg != null && msg.getStatus() == LinphoneChatMessage.State.NotDelivered) {
@@ -483,31 +492,31 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
- case MENU_DELETE_MESSAGE:
- LinphoneActivity.instance().getChatStorage().deleteMessage(chatRoom, item.getGroupId());
- hideMessageBubble(item.getGroupId());
- break;
- case MENU_SAVE_PICTURE:
- saveImage(item.getGroupId());
- break;
- case MENU_COPY_TEXT:
- copyTextMessageToClipboard(item.getGroupId());
- break;
- case MENU_PICTURE_SMALL:
- uploadAndSendImage(fileToUploadPath, imageToUpload, ImageSize.SMALL);
- break;
- case MENU_PICTURE_MEDIUM:
- uploadAndSendImage(fileToUploadPath, imageToUpload, ImageSize.MEDIUM);
- break;
- case MENU_PICTURE_LARGE:
- uploadAndSendImage(fileToUploadPath, imageToUpload, ImageSize.LARGE);
- break;
- case MENU_PICTURE_REAL:
- uploadAndSendImage(fileToUploadPath, imageToUpload, ImageSize.REAL);
- break;
- case MENU_RESEND_MESSAGE:
- resendMessage(item.getGroupId());
- break;
+ case MENU_DELETE_MESSAGE:
+ LinphoneActivity.instance().getChatStorage().deleteMessage(chatRoom, item.getGroupId());
+ hideMessageBubble(item.getGroupId());
+ break;
+ case MENU_SAVE_PICTURE:
+ saveImage(item.getGroupId());
+ break;
+ case MENU_COPY_TEXT:
+ copyTextMessageToClipboard(item.getGroupId());
+ break;
+ case MENU_PICTURE_SMALL:
+ uploadAndSendImage(fileToUploadPath, imageToUpload, ImageSize.SMALL);
+ break;
+ case MENU_PICTURE_MEDIUM:
+ uploadAndSendImage(fileToUploadPath, imageToUpload, ImageSize.MEDIUM);
+ break;
+ case MENU_PICTURE_LARGE:
+ uploadAndSendImage(fileToUploadPath, imageToUpload, ImageSize.LARGE);
+ break;
+ case MENU_PICTURE_REAL:
+ uploadAndSendImage(fileToUploadPath, imageToUpload, ImageSize.REAL);
+ break;
+ case MENU_RESEND_MESSAGE:
+ resendMessage(item.getGroupId());
+ break;
}
return true;
}
@@ -517,7 +526,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
latestImageMessages = null;
message.removeTextChangedListener(textWatcher);
removeVirtualKeyboardVisiblityListener();
-
+
LinphoneService.instance().removeMessageNotification();
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
@@ -525,9 +534,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
lc.removeListener(this);
}
+ getIntent().putExtra("MessageDraft", message.getText());
super.onPause();
-
- onSaveInstanceState(getArguments());
}
@SuppressLint("UseSparseArrays")
@@ -538,22 +546,20 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
addVirtualKeyboardVisiblityListener();
super.onResume();
-
+
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null) {
lc.addListener(this);
}
if (LinphoneActivity.isInstanciated()) {
- LinphoneActivity.instance().selectMenu(FragmentsAvailable.CHAT);
- LinphoneActivity.instance().updateChatFragment(this);
if (getResources().getBoolean(R.bool.show_statusbar_only_on_dialer)) {
LinphoneActivity.instance().hideStatusBar();
}
}
- String draft = getArguments().getString("messageDraft");
+ String draft = getIntent().getStringExtra("messageDraft");
message.setText(draft);
remoteComposing.setVisibility(chatRoom.isRemoteComposing() ? View.VISIBLE : View.GONE);
@@ -584,12 +590,12 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
chatRoom.sendMessage(chatMessage, this);
if (LinphoneActivity.isInstanciated()) {
- LinphoneActivity.instance().onMessageSent(sipUri, messageToSend);
+ LinphoneActivity.instance().onMessageSent(sipUri, messageToSend);
}
adapter.refreshHistory();
adapter.notifyDataSetChanged();
-
+
Log.i("Sent message current status: " + chatMessage.getStatus());
scrollToEnd();
} else if (!isNetworkReachable && LinphoneActivity.isInstanciated()) {
@@ -613,13 +619,14 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
newId = chatMessage.getStorageId();
latestImageMessages.put(newId, url);
- if (useLinphoneMessageStorage)
- url = saveImage(bitmap, newId, chatMessage);
-
+ url = saveImage(bitmap, newId, chatMessage);
+
adapter.refreshHistory();
adapter.notifyDataSetChanged();
-
+
scrollToEnd();
+ imageToUpload = null;
+ fileToUploadPath = null;
} else if (!isNetworkReachable && LinphoneActivity.isInstanciated()) {
LinphoneActivity.instance().displayCustomToast(getString(R.string.error_network_unreachable), Toast.LENGTH_LONG);
}
@@ -638,7 +645,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
}
}
-
return msg;
}
@@ -670,13 +676,15 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
private void copyTextMessageToClipboard(int id) {
String msg = LinphoneActivity.instance().getChatStorage().getTextMessageForId(chatRoom, id);
if (msg != null) {
- Compatibility.copyTextToClipboard(getActivity(), msg);
+ Compatibility.copyTextToClipboard(this, msg);
LinphoneActivity.instance().displayCustomToast(getString(R.string.text_copied_to_clipboard), Toast.LENGTH_SHORT);
}
}
- public void onMessageReceived(LinphoneAddress from, final LinphoneChatMessage message) {
- if (from.asStringUriOnly().equals(sipUri)) {
+ @Override
+ public void messageReceived(LinphoneCore lc, LinphoneChatRoom cr, LinphoneChatMessage message) {
+ LinphoneAddress from = cr.getPeerAddress();
+ if (from.asStringUriOnly().equals(sipUri)) {
if (message.getText() != null) {
adapter.refreshHistory();
adapter.notifyDataSetChanged();
@@ -689,11 +697,11 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
@Override
- public synchronized void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, State state) {
+ public synchronized void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, LinphoneChatMessage.State state) {
final LinphoneChatMessage finalMessage = msg;
final String finalImage = finalMessage.getExternalBodyUrl();
- final State finalState=state;
- if (LinphoneActivity.isInstanciated() && state != State.InProgress) {
+ final LinphoneChatMessage.State finalState = state;
+ if (LinphoneActivity.isInstanciated() && state != LinphoneChatMessage.State.InProgress) {
if (finalMessage != null && !finalMessage.equals("")) {
LinphoneActivity.instance().onMessageStateChanged(sipUri, finalMessage.getText(), finalState.toInt());
} else if (finalImage != null && !finalImage.equals("")) {
@@ -728,22 +736,22 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
private void pickImage() {
- final List cameraIntents = new ArrayList();
- final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name));
- imageToUploadUri = Uri.fromFile(file);
- captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageToUploadUri);
- cameraIntents.add(captureIntent);
+ final List cameraIntents = new ArrayList();
+ final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+ File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name));
+ imageToUploadUri = Uri.fromFile(file);
+ captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageToUploadUri);
+ cameraIntents.add(captureIntent);
- final Intent galleryIntent = new Intent();
- galleryIntent.setType("image/*");
- galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
+ final Intent galleryIntent = new Intent();
+ galleryIntent.setType("image/*");
+ galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
- final Intent chooserIntent = Intent.createChooser(galleryIntent, getString(R.string.image_picker_title));
- chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
+ final Intent chooserIntent = Intent.createChooser(galleryIntent, getString(R.string.image_picker_title));
+ chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
- startActivityForResult(chooserIntent, ADD_PHOTO);
- }
+ startActivityForResult(chooserIntent, ADD_PHOTO);
+ }
public static Bitmap downloadImage(String stringUrl) {
URL url;
@@ -751,17 +759,17 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
try {
url = new URL(stringUrl);
URLConnection ucon = url.openConnection();
- InputStream is = ucon.getInputStream();
- BufferedInputStream bis = new BufferedInputStream(is);
+ InputStream is = ucon.getInputStream();
+ BufferedInputStream bis = new BufferedInputStream(is);
- ByteArrayBuffer baf = new ByteArrayBuffer(50);
- int current = 0;
- while ((current = bis.read()) != -1) {
- baf.append((byte) current);
- }
+ ByteArrayBuffer baf = new ByteArrayBuffer(50);
+ int current = 0;
+ while ((current = bis.read()) != -1) {
+ baf.append((byte) current);
+ }
- byte[] rawImage = baf.toByteArray();
- bm = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length);
+ byte[] rawImage = baf.toByteArray();
+ bm = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length);
bis.close();
} catch (Exception e) {
e.printStackTrace();
@@ -774,9 +782,9 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
byte[] rawImage = LinphoneActivity.instance().getChatStorage().getRawImageFromMessage(id);
Bitmap bm = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length);
if (saveImage(bm, id, null) != null) {
- Toast.makeText(getActivity(), getString(R.string.image_saved), Toast.LENGTH_SHORT).show();
+ Toast.makeText(this, getString(R.string.image_saved), Toast.LENGTH_SHORT).show();
} else {
- Toast.makeText(getActivity(), getString(R.string.image_not_saved), Toast.LENGTH_LONG).show();
+ Toast.makeText(this, getString(R.string.image_not_saved), Toast.LENGTH_LONG).show();
}
}
@@ -798,23 +806,20 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
bm.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
fOut.flush();
fOut.close();
-
- if (useLinphoneMessageStorage) {
- //Update url path in liblinphone database
- if (message == null) {
- LinphoneChatMessage[] history = chatRoom.getHistory();
- for (LinphoneChatMessage msg : history) {
- if (msg.getStorageId() == id) {
- message = msg;
- break;
- }
+ //Update url path in liblinphone database
+ if (message == null) {
+ LinphoneChatMessage[] history = chatRoom.getHistory();
+ for (LinphoneChatMessage msg : history) {
+ if (msg.getStorageId() == id) {
+ message = msg;
+ break;
}
}
- message.setExternalBodyUrl(path + filename);
- chatRoom.updateUrl(message);
}
+ message.setExternalBodyUrl(path + filename);
+ chatRoom.updateUrl(message);
- MediaStore.Images.Media.insertImage(getActivity().getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());
+ MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName());
return file.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
@@ -822,11 +827,11 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
return null;
}
- private long hashBitmap(Bitmap bmp){
+ private long hashBitmap(Bitmap bmp) {
long hash = 31; // Random prime number
- for(int x = 0; x < bmp.getWidth(); x++){
- for (int y = 0; y < bmp.getHeight(); y++){
- hash *= (bmp.getPixel(x,y) + 31);
+ for (int x = 0; x < bmp.getWidth(); x++) {
+ for (int y = 0; y < bmp.getHeight(); y++) {
+ hash *= (bmp.getPixel(x, y) + 31);
}
}
return hash;
@@ -848,94 +853,97 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
String response = null;
HttpURLConnection conn = null;
try {
- String lineEnd = "\r\n";
+ String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "---------------------------14737809831466499882746641449";
- URL url = new URL(uploadServerUri);
- conn = (HttpURLConnection) url.openConnection();
- conn.setDoInput(true);
- conn.setDoOutput(true);
- conn.setUseCaches(false);
- conn.setRequestMethod("POST");
- conn.setRequestProperty("Connection", "Keep-Alive");
- conn.setRequestProperty("ENCTYPE", "multipart/form-data");
- conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
- conn.setRequestProperty("uploaded_file", fileName);
+ URL url = new URL(uploadServerUri);
+ conn = (HttpURLConnection) url.openConnection();
+ conn.setDoInput(true);
+ conn.setDoOutput(true);
+ conn.setUseCaches(false);
+ conn.setRequestMethod("POST");
+ conn.setRequestProperty("Connection", "Keep-Alive");
+ conn.setRequestProperty("ENCTYPE", "multipart/form-data");
+ conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
+ conn.setRequestProperty("uploaded_file", fileName);
- ProgressOutputStream pos = new ProgressOutputStream(conn.getOutputStream());
- pos.setListener(new OutputStreamListener() {
+ ProgressOutputStream pos = new ProgressOutputStream(conn.getOutputStream());
+ pos.setListener(new OutputStreamListener() {
@Override
public void onBytesWrite(int count) {
bytesSent += count;
progressBar.setProgress(bytesSent * 100 / imageSize);
}
- });
- DataOutputStream dos = new DataOutputStream(pos);
+ });
+ DataOutputStream dos = new DataOutputStream(pos);
- dos.writeBytes(lineEnd + twoHyphens + boundary + lineEnd);
- dos.writeBytes("Content-Disposition: form-data; name=\"userfile\"; filename=\""+ fileName + "\"" + lineEnd);
- dos.writeBytes("Content-Type: application/octet-stream" + lineEnd);
- dos.writeBytes(lineEnd);
+ dos.writeBytes(lineEnd + twoHyphens + boundary + lineEnd);
+ dos.writeBytes("Content-Disposition: form-data; name=\"userfile\"; filename=\"" + fileName + "\"" + lineEnd);
+ dos.writeBytes("Content-Type: application/octet-stream" + lineEnd);
+ dos.writeBytes(lineEnd);
- file.compress(CompressFormat.JPEG, compressorQuality, dos);
+ file.compress(Bitmap.CompressFormat.JPEG, compressorQuality, dos);
- dos.writeBytes(lineEnd);
- dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
+ dos.writeBytes(lineEnd);
+ dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
- dos.flush();
- dos.close();
+ dos.flush();
+ dos.close();
- InputStream is = conn.getInputStream();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ InputStream is = conn.getInputStream();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
- int bytesRead;
- byte[] bytes = new byte[1024];
- while((bytesRead = is.read(bytes)) != -1) {
- baos.write(bytes, 0, bytesRead);
- }
- byte[] bytesReceived = baos.toByteArray();
- baos.close();
- is.close();
+ int bytesRead;
+ byte[] bytes = new byte[1024];
+ while ((bytesRead = is.read(bytes)) != -1) {
+ baos.write(bytes, 0, bytesRead);
+ }
+ byte[] bytesReceived = baos.toByteArray();
+ baos.close();
+ is.close();
- response = new String(bytesReceived);
+ response = new String(bytesReceived);
} catch (Exception e) {
e.printStackTrace();
} finally {
- if (conn != null) {
- conn.disconnect();
- }
- }
+ if (conn != null) {
+ conn.disconnect();
+ }
+ }
return response;
}
public String getRealPathFromURI(Uri contentUri) {
- String[] proj = { MediaStore.Images.Media.DATA };
- CursorLoader loader = new CursorLoader(getActivity(), contentUri, proj, null, null, null);
- Cursor cursor = loader.loadInBackground();
- if (cursor != null && cursor.moveToFirst()) {
- int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
- String result = cursor.getString(column_index);
- cursor.close();
- return result;
- }
- return null;
- }
+ String[] proj = {MediaStore.Images.Media.DATA};
+ CursorLoader loader = new CursorLoader(this, contentUri, proj, null, null, null);
+ Cursor cursor = loader.loadInBackground();
+ if (cursor != null && cursor.moveToFirst()) {
+ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+ String result = cursor.getString(column_index);
+ cursor.close();
+ return result;
+ }
+ return null;
+ }
private void showPopupMenuAskingImageSize(final String filePath, final Bitmap image) {
fileToUploadPath = filePath;
imageToUpload = image;
try {
sendImage.showContextMenu();
- } catch (Exception e) { e.printStackTrace(); };
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ ;
}
private void uploadAndSendImage(final String filePath, final Bitmap image, final ImageSize size) {
uploadLayout.setVisibility(View.VISIBLE);
- textLayout.setVisibility(View.GONE);
+ textLayout.setVisibility(View.GONE);
- uploadThread = new Thread(new Runnable() {
+ uploadThread = new Thread(new Runnable() {
@Override
public void run() {
Bitmap bm = null;
@@ -943,15 +951,15 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
if (!uploadThread.isInterrupted()) {
if (filePath != null) {
- bm = BitmapFactory.decodeFile(filePath);
- if (bm != null && size != ImageSize.REAL) {
- int pixelsMax = size == ImageSize.SMALL ? SIZE_SMALL : size == ImageSize.MEDIUM ? SIZE_MEDIUM : SIZE_LARGE;
- if (bm.getWidth() > bm.getHeight() && bm.getWidth() > pixelsMax) {
- bm = Bitmap.createScaledBitmap(bm, pixelsMax, (pixelsMax * bm.getHeight()) / bm.getWidth(), false);
- } else if (bm.getHeight() > bm.getWidth() && bm.getHeight() > pixelsMax) {
- bm = Bitmap.createScaledBitmap(bm, (pixelsMax * bm.getWidth()) / bm.getHeight(), pixelsMax, false);
- }
- }
+ bm = BitmapFactory.decodeFile(filePath);
+ if (bm != null && size != ImageSize.REAL) {
+ int pixelsMax = size == ImageSize.SMALL ? SIZE_SMALL : size == ImageSize.MEDIUM ? SIZE_MEDIUM : SIZE_LARGE;
+ if (bm.getWidth() > bm.getHeight() && bm.getWidth() > pixelsMax) {
+ bm = Bitmap.createScaledBitmap(bm, pixelsMax, (pixelsMax * bm.getHeight()) / bm.getWidth(), false);
+ } else if (bm.getHeight() > bm.getWidth() && bm.getHeight() > pixelsMax) {
+ bm = Bitmap.createScaledBitmap(bm, (pixelsMax * bm.getWidth()) / bm.getHeight(), pixelsMax, false);
+ }
+ }
} else if (image != null) {
bm = image;
}
@@ -976,66 +984,63 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
e.printStackTrace();
}
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- if (bm != null) {
- bm.compress(CompressFormat.JPEG, COMPRESSOR_QUALITY, outStream);
- }
+ ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+ if (bm != null) {
+ bm.compress(Bitmap.CompressFormat.JPEG, COMPRESSOR_QUALITY, outStream);
+ }
- if (!uploadThread.isInterrupted() && bm != null) {
- url = uploadImage(filePath, bm, COMPRESSOR_QUALITY, outStream.size());
- File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name));
- file.delete();
- }
+ if (!uploadThread.isInterrupted() && bm != null) {
+ url = uploadImage(filePath, bm, COMPRESSOR_QUALITY, outStream.size());
+ File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name));
+ file.delete();
+ }
- if (!uploadThread.isInterrupted()) {
- final Bitmap fbm = bm;
- final String furl = url;
- mHandler.post(new Runnable() {
+ if (!uploadThread.isInterrupted()) {
+ final Bitmap fbm = bm;
+ final String furl = url;
+ mHandler.post(new Runnable() {
@Override
public void run() {
uploadLayout.setVisibility(View.GONE);
textLayout.setVisibility(View.VISIBLE);
progressBar.setProgress(0);
- if (furl != null) {
- sendImageMessage(furl, fbm);
- } else {
- Toast.makeText(getActivity(), getString(R.string.error), Toast.LENGTH_LONG).show();
- }
+ if (furl != null) {
+ sendImageMessage(furl, fbm);
+ } else {
+ Toast.makeText(ChatActivity.instance(), getString(R.string.error), Toast.LENGTH_LONG).show();
+ }
}
});
- }
+ }
}
});
- uploadThread.start();
+ uploadThread.start();
}
@Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == ADD_PHOTO && resultCode == Activity.RESULT_OK) {
- if (data != null && data.getExtras() != null && data.getExtras().get("data") != null) {
- Bitmap bm = (Bitmap) data.getExtras().get("data");
- showPopupMenuAskingImageSize(null, bm);
- }
- else if (data != null && data.getData() != null) {
- String filePath = getRealPathFromURI(data.getData());
- showPopupMenuAskingImageSize(filePath, null);
- }
- else if (imageToUploadUri != null) {
- String filePath = imageToUploadUri.getPath();
- showPopupMenuAskingImageSize(filePath, null);
- }
- else {
- File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name));
- if (file.exists()) {
- imageToUploadUri = Uri.fromFile(file);
- String filePath = imageToUploadUri.getPath();
- showPopupMenuAskingImageSize(filePath, null);
- }
- }
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == ADD_PHOTO && resultCode == Activity.RESULT_OK) {
+ if (data != null && data.getExtras() != null && data.getExtras().get("data") != null) {
+ Bitmap bm = (Bitmap) data.getExtras().get("data");
+ showPopupMenuAskingImageSize(null, bm);
+ } else if (data != null && data.getData() != null) {
+ String filePath = getRealPathFromURI(data.getData());
+ showPopupMenuAskingImageSize(filePath, null);
+ } else if (imageToUploadUri != null) {
+ String filePath = imageToUploadUri.getPath();
+ showPopupMenuAskingImageSize(filePath, null);
+ } else {
+ File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name));
+ if (file.exists()) {
+ imageToUploadUri = Uri.fromFile(file);
+ String filePath = imageToUploadUri.getPath();
+ showPopupMenuAskingImageSize(filePath, null);
+ }
+ }
} else {
super.onActivityResult(requestCode, resultCode, data);
}
- }
+ }
class ProgressOutputStream extends OutputStream {
OutputStream outputStream;
@@ -1080,3 +1085,4 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
}
}
+
diff --git a/src/org/linphone/FragmentsAvailable.java b/src/org/linphone/FragmentsAvailable.java
index 1b6fdfa43..224b38132 100644
--- a/src/org/linphone/FragmentsAvailable.java
+++ b/src/org/linphone/FragmentsAvailable.java
@@ -33,12 +33,7 @@ public enum FragmentsAvailable {
ABOUT_INSTEAD_OF_CHAT,
ACCOUNT_SETTINGS,
SETTINGS,
- CHATLIST,
- CHAT;
-
- public boolean shouldAddToBackStack() {
- return true;
- }
+ CHATLIST;
public boolean shouldAnimate() {
return true;
@@ -68,9 +63,6 @@ public enum FragmentsAvailable {
case CHATLIST:
return DIALER.isRightOf(fragment) || fragment == DIALER;
- case CHAT:
- return CHATLIST.isRightOf(fragment) || fragment == CHATLIST;
-
case ABOUT_INSTEAD_OF_SETTINGS:
case SETTINGS:
return CHATLIST.isRightOf(fragment) || fragment == CHATLIST || fragment == FragmentsAvailable.ABOUT_INSTEAD_OF_CHAT;
@@ -95,9 +87,6 @@ public enum FragmentsAvailable {
case EDIT_CONTACT:
return fragment == CONTACT || fragment == CONTACTS;
- case CHAT:
- return fragment == CHATLIST;
-
default:
return false;
}
diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java
index e39be9061..3db03525b 100644
--- a/src/org/linphone/LinphoneActivity.java
+++ b/src/org/linphone/LinphoneActivity.java
@@ -94,6 +94,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
private static final int FIRST_LOGIN_ACTIVITY = 101;
private static final int REMOTE_PROVISIONING_LOGIN_ACTIVITY = 102;
private static final int CALL_ACTIVITY = 19;
+ private static final int CHAT_ACTIVITY = 21;
private static LinphoneActivity instance;
@@ -104,7 +105,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
private RelativeLayout contacts, history, settings, chat, aboutChat, aboutSettings;
private FragmentsAvailable currentFragment, nextFragment;
private List fragmentsHistory;
- private Fragment dialerFragment, messageListenerFragment, messageListFragment, friendStatusListenerFragment;
+ private Fragment dialerFragment, messageListFragment, friendStatusListenerFragment;
private SavedState dialerSavedState;
private boolean preferLinphoneContacts = false, isAnimationDisabled = false, isContactPresenceDisabled = true;
private List contactList, sipContactList;
@@ -262,7 +263,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
@SuppressWarnings("incomplete-switch")
private void changeCurrentFragment(FragmentsAvailable newFragmentType, Bundle extras, boolean withoutAnimation) {
- if (newFragmentType == currentFragment && newFragmentType != FragmentsAvailable.CHAT) {
+ if (newFragmentType == currentFragment) {
return;
}
nextFragment = newFragmentType;
@@ -324,10 +325,6 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
case ABOUT_INSTEAD_OF_SETTINGS:
newFragment = new AboutFragment();
break;
- case CHAT:
- newFragment = new ChatFragment();
- messageListenerFragment = newFragment;
- break;
case CHATLIST:
newFragment = new ChatListFragment();
messageListFragment = new Fragment();
@@ -378,20 +375,12 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
}
}
-
- if (newFragmentType == FragmentsAvailable.DIALER
- || newFragmentType == FragmentsAvailable.ABOUT_INSTEAD_OF_CHAT
- || newFragmentType == FragmentsAvailable.ABOUT_INSTEAD_OF_SETTINGS
- || newFragmentType == FragmentsAvailable.SETTINGS
- || newFragmentType == FragmentsAvailable.CONTACTS
- || newFragmentType == FragmentsAvailable.CHATLIST
- || newFragmentType == FragmentsAvailable.HISTORY) {
- try {
- getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
- } catch (java.lang.IllegalStateException e) {
-
- }
- } else {
+ if (newFragmentType != FragmentsAvailable.DIALER
+ || newFragmentType != FragmentsAvailable.ABOUT_INSTEAD_OF_CHAT
+ || newFragmentType != FragmentsAvailable.ABOUT_INSTEAD_OF_SETTINGS
+ || newFragmentType != FragmentsAvailable.CONTACTS
+ || newFragmentType != FragmentsAvailable.CHATLIST
+ || newFragmentType != FragmentsAvailable.HISTORY) {
transaction.addToBackStack(newFragmentType.toString());
}
transaction.replace(R.id.fragmentContainer, newFragment, newFragmentType.toString());
@@ -568,24 +557,15 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
String displayName = lAddress.getDisplayName();
String pictureUri = uri == null ? null : uri.toString();
- if (currentFragment == FragmentsAvailable.CHATLIST || currentFragment == FragmentsAvailable.CHAT) {
- Fragment fragment2 = getSupportFragmentManager().findFragmentById(R.id.fragmentContainer2);
- if (fragment2 != null && fragment2.isVisible() && currentFragment == FragmentsAvailable.CHAT) {
- ChatFragment chatFragment = (ChatFragment) fragment2;
- chatFragment.changeDisplayedChat(sipUri, displayName, pictureUri);
- } else {
- Bundle extras = new Bundle();
- extras.putString("SipUri", sipUri);
- if (lAddress.getDisplayName() != null) {
- extras.putString("DisplayName", displayName);
- extras.putString("PictureUri", pictureUri);
- }
- changeCurrentFragment(FragmentsAvailable.CHAT, extras);
- }
- } else {
- changeCurrentFragment(FragmentsAvailable.CHATLIST, null);
- displayChat(sipUri);
+ Intent intent = new Intent(this, ChatActivity.class);
+ intent.putExtra("SipUri", sipUri);
+ if (lAddress.getDisplayName() != null) {
+ intent.putExtra("DisplayName", displayName);
+ intent.putExtra("PictureUri", pictureUri);
}
+ startOrientationSensor();
+ startActivityForResult(intent, CHAT_ACTIVITY);
+
LinphoneService.instance().resetMessageNotifCount();
LinphoneService.instance().removeMessageNotification();
displayMissedChats(getChatStorage().getUnreadMessageCount());
@@ -664,7 +644,6 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
case ABOUT_INSTEAD_OF_SETTINGS:
aboutSettings.setSelected(true);
break;
- case CHAT:
case CHATLIST:
chat.setSelected(true);
break;
@@ -677,12 +656,6 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
}
- public void updateChatFragment(ChatFragment fragment) {
- messageListenerFragment = fragment;
- // Hack to maintain soft input flags
- getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
- }
-
public void updateChatListFragment(ChatListFragment fragment) {
messageListFragment = fragment;
}
@@ -740,16 +713,10 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
@Override
public void messageReceived(LinphoneCore lc, LinphoneChatRoom cr, LinphoneChatMessage message) {
- LinphoneAddress from = cr.getPeerAddress();
- ChatFragment chatFragment = ((ChatFragment) messageListenerFragment);
- if (messageListenerFragment != null && messageListenerFragment.isVisible() && chatFragment.getSipUri().equals(from.asStringUriOnly())) {
- chatFragment.onMessageReceived(from, message);
- } else if (LinphoneService.isReady()) {
- displayMissedChats(getChatStorage().getUnreadMessageCount());
- if (messageListFragment != null && messageListFragment.isVisible()) {
- ((ChatListFragment) messageListFragment).refresh();
- }
- }
+ displayMissedChats(getChatStorage().getUnreadMessageCount());
+ if (messageListFragment != null && messageListFragment.isVisible()) {
+ ((ChatListFragment) messageListFragment).refresh();
+ }
}
public void updateMissedChatCount() {
@@ -1374,7 +1341,12 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
- if (currentFragment == FragmentsAvailable.DIALER) {
+ if (currentFragment == FragmentsAvailable.DIALER
+ || currentFragment == FragmentsAvailable.CONTACTS
+ || currentFragment == FragmentsAvailable.HISTORY
+ || currentFragment == FragmentsAvailable.CHATLIST
+ || currentFragment == FragmentsAvailable.ABOUT_INSTEAD_OF_CHAT
+ || currentFragment == FragmentsAvailable.ABOUT_INSTEAD_OF_SETTINGS) {
boolean isBackgroundModeActive = LinphonePreferences.instance().isBackgroundModeEnabled();
if (!isBackgroundModeActive) {
stopService(new Intent(Intent.ACTION_MAIN).setClass(this, LinphoneService.class));