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); + } + } }