diff --git a/res/values-FR/strings.xml b/res/values-FR/strings.xml
index e35901499..56499cb7d 100644
--- a/res/values-FR/strings.xml
+++ b/res/values-FR/strings.xml
@@ -310,6 +310,8 @@
Grande
Taille réelle
Sauvegarder l\'image
+ Copier le texte
+ Texte copié dans le presse papier
Choisissez la source
Image sauvegardée
Erreur, image non sauvegardée
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9b0ef7c24..ee4094851 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -361,6 +361,8 @@
Large
Real size
Save picture
+ Text copied to clipboard
+ Copy text
Select source
Image saved
Error, image not saved
diff --git a/src/org/linphone/ChatFragment.java b/src/org/linphone/ChatFragment.java
index 14837e9f6..35b79df2f 100644
--- a/src/org/linphone/ChatFragment.java
+++ b/src/org/linphone/ChatFragment.java
@@ -33,6 +33,7 @@ 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;
@@ -87,6 +88,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
private static final int MENU_PICTURE_MEDIUM = 3;
private static final int MENU_PICTURE_LARGE = 4;
private static final int MENU_PICTURE_REAL = 5;
+ private static final int MENU_COPY_TEXT = 6;
private static final int COMPRESSOR_QUALITY = 100;
private static final int SIZE_SMALL = 500;
private static final int SIZE_MEDIUM = 1000;
@@ -309,6 +311,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
ImageView iv = (ImageView) v.findViewById(R.id.image);
if (iv != null && iv.getVisibility() == View.VISIBLE) {
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));
}
}
}
@@ -323,6 +327,9 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
case MENU_SAVE_PICTURE:
saveImage(item.getGroupId());
break;
+ case MENU_COPY_TEXT:
+ copyText(item.getGroupId());
+ break;
case MENU_PICTURE_SMALL:
uploadAndSendImage(fileToUploadPath, imageToUpload, ImageSize.SMALL);
break;
@@ -423,6 +430,14 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
}
}, 100);
}
+
+ private void copyText(int id) {
+ String msg = LinphoneActivity.instance().getChatStorage().getTextMessageForId(id);
+ if (msg != null) {
+ Compatibility.copyTextToClipboard(getActivity(), msg);
+ LinphoneActivity.instance().displayCustomToast(getString(R.string.text_copied_to_clipboard), Toast.LENGTH_SHORT);
+ }
+ }
public void onMessageReceived(int id, LinphoneAddress from, LinphoneChatMessage message) {
if (from.asStringUriOnly().equals(sipUri)) {
diff --git a/src/org/linphone/ChatStorage.java b/src/org/linphone/ChatStorage.java
index ebe19d3ae..b62d9a2db 100644
--- a/src/org/linphone/ChatStorage.java
+++ b/src/org/linphone/ChatStorage.java
@@ -187,6 +187,22 @@ public class ChatStorage {
return chatMessages;
}
+
+ public String getTextMessageForId(int id) {
+ Cursor c = db.query(TABLE_NAME, null, "id LIKE " + id, null, null, null, null);
+
+ String message = null;
+ if (c.moveToFirst()) {
+ try {
+ message = c.getString(c.getColumnIndex("message"));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ c.close();
+
+ return message;
+ }
public void removeDiscussion(String correspondent) {
db.delete(TABLE_NAME, "remoteContact LIKE \"" + correspondent + "\"", null);
diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java
index 7d27d5c98..614fdb467 100644
--- a/src/org/linphone/LinphoneActivity.java
+++ b/src/org/linphone/LinphoneActivity.java
@@ -782,7 +782,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
displayMissedCalls(missedCalls);
}
- private void displayCustomToast(final String message, final int duration) {
+ public void displayCustomToast(final String message, final int duration) {
mHandler.post(new Runnable() {
@Override
public void run() {
diff --git a/src/org/linphone/compatibility/ApiElevenPlus.java b/src/org/linphone/compatibility/ApiElevenPlus.java
index 0fee020a3..23d7e8293 100644
--- a/src/org/linphone/compatibility/ApiElevenPlus.java
+++ b/src/org/linphone/compatibility/ApiElevenPlus.java
@@ -5,6 +5,8 @@ import org.linphone.R;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
+import android.content.ClipData;
+import android.content.ClipboardManager;
import android.content.Context;
import android.graphics.Bitmap;
@@ -80,4 +82,10 @@ public class ApiElevenPlus {
Context context, String title, String content, PendingIntent intent) {
notif.setLatestEventInfo(context, title, content, intent);
}
+
+ public static void copyTextToClipboard(Context context, String msg) {
+ ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
+ ClipData clip = android.content.ClipData.newPlainText("Message", msg);
+ clipboard.setPrimaryClip(clip);
+ }
}
diff --git a/src/org/linphone/compatibility/ApiFivePlus.java b/src/org/linphone/compatibility/ApiFivePlus.java
index 20082aff1..842f6edf1 100644
--- a/src/org/linphone/compatibility/ApiFivePlus.java
+++ b/src/org/linphone/compatibility/ApiFivePlus.java
@@ -33,6 +33,7 @@ import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Intents.Insert;
+import android.text.ClipboardManager;
import android.view.Display;
/*
@@ -56,6 +57,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
/**
* @author Sylvain Berfini
*/
+@SuppressWarnings("deprecation")
@TargetApi(5)
public class ApiFivePlus {
public static void overridePendingTransition(Activity activity, int idAnimIn, int idAnimOut) {
@@ -309,12 +311,10 @@ public class ApiFivePlus {
return null;
}
- @SuppressWarnings("deprecation")
public static int getRotation(Display display) {
return display.getOrientation();
}
- @SuppressWarnings("deprecation")
public static Notification createMessageNotification(Context context, String title, String msg, PendingIntent intent) {
Notification notif = new Notification();
notif.icon = R.drawable.chat_icon_over;
@@ -331,7 +331,6 @@ public class ApiFivePlus {
return notif;
}
- @SuppressWarnings("deprecation")
public static Notification createInCallNotification(Context context,
String title, String msg, int iconID, PendingIntent intent) {
Notification notif = new Notification();
@@ -345,7 +344,6 @@ public class ApiFivePlus {
return notif;
}
- @SuppressWarnings("deprecation")
public static void setNotificationLatestEventInfo(Notification notif, Context context, String title, String content, PendingIntent intent) {
notif.setLatestEventInfo(context, title, content, intent);
}
@@ -357,4 +355,9 @@ public class ApiFivePlus {
public static boolean isPreferenceChecked(Preference preference) {
return ((CheckBoxPreference) preference).isChecked();
}
+
+ public static void copyTextToClipboard(Context context, String msg) {
+ ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
+ clipboard.setText(msg);
+ }
}
diff --git a/src/org/linphone/compatibility/Compatibility.java b/src/org/linphone/compatibility/Compatibility.java
index 7a03421d1..e286db7da 100644
--- a/src/org/linphone/compatibility/Compatibility.java
+++ b/src/org/linphone/compatibility/Compatibility.java
@@ -201,4 +201,12 @@ public class Compatibility {
ApiEightPlus.initPushNotificationService(context);
}
}
+
+ public static void copyTextToClipboard(Context context, String msg) {
+ if(Version.sdkAboveOrEqual(11)) {
+ ApiElevenPlus.copyTextToClipboard(context, msg);
+ } else {
+ ApiFivePlus.copyTextToClipboard(context, msg);
+ }
+ }
}