diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3e7bc1321..e9b65c5df 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -37,6 +37,7 @@
+
@@ -47,8 +48,10 @@
+
+
@@ -60,6 +63,9 @@
android:theme="@style/Theme.Light"
android:allowBackup="true">
+
+
+
diff --git a/project.properties b/project.properties
index d05316c84..86c4a56a6 100644
--- a/project.properties
+++ b/project.properties
@@ -8,5 +8,6 @@
# project structure.
# Project target.
-target=android-19
+target=Google Inc.:Google APIs:19
android.library.reference.1=../android-support-v7-appcompat
+android.library.reference.2=../../../android-sdk-macosx/extras/google/google_play_services/libproject/google-play-services_lib
diff --git a/res/layout/compose_message.xml b/res/layout/compose_message.xml
index 09d205168..10cd24dcb 100644
--- a/res/layout/compose_message.xml
+++ b/res/layout/compose_message.xml
@@ -49,4 +49,8 @@
+
+
diff --git a/src/org/kontalk/message/CompositeMessage.java b/src/org/kontalk/message/CompositeMessage.java
index d50d368db..5b9197154 100644
--- a/src/org/kontalk/message/CompositeMessage.java
+++ b/src/org/kontalk/message/CompositeMessage.java
@@ -348,7 +348,9 @@ else if (VCardComponent.supportsMimeType(attMime)) {
if (!c.isNull(COLUMN_GEO_LATITUDE)) {
double lat = c.getDouble(COLUMN_GEO_LATITUDE);
double lon = c.getDouble(COLUMN_GEO_LONGITUDE);
- LocationComponent location = new LocationComponent(lat, lon);
+ String attPreview = c.getString(COLUMN_ATTACHMENT_PREVIEW_PATH);
+ File previewFile = (attPreview != null) ? new File(attPreview) : null;
+ LocationComponent location = new LocationComponent(lat, lon, previewFile);
addComponent(location);
}
diff --git a/src/org/kontalk/message/LocationComponent.java b/src/org/kontalk/message/LocationComponent.java
index 2fa40d4f9..d3e685884 100644
--- a/src/org/kontalk/message/LocationComponent.java
+++ b/src/org/kontalk/message/LocationComponent.java
@@ -18,8 +18,12 @@
package org.kontalk.message;
+import java.io.File;
+
import org.kontalk.crypto.Coder;
+import android.util.Log;
+
/**
@@ -28,9 +32,10 @@
* @author Andrea Cappelli
*/
public class LocationComponent extends MessageComponent {
-
- public LocationComponent(double lat, double lon) {
+ private File mCachedMap;
+ public LocationComponent(double lat, double lon, File cachedMap) {
super(new Location(lat,lon), 0, false, Coder.SECURITY_CLEARTEXT);
+ mCachedMap = cachedMap;
}
public double getLatitude() {
@@ -40,4 +45,9 @@ public double getLatitude() {
public double getLongitude() {
return mContent.getLongitude();
}
+
+ public File getCachedMap () {
+ Log.w ("PATH",""+mCachedMap.getAbsolutePath());
+ return mCachedMap;
+ }
}
diff --git a/src/org/kontalk/service/MessageCenterService.java b/src/org/kontalk/service/MessageCenterService.java
index 00d6eeef4..80ff090f5 100644
--- a/src/org/kontalk/service/MessageCenterService.java
+++ b/src/org/kontalk/service/MessageCenterService.java
@@ -939,6 +939,8 @@ private void resendPendingMessages(boolean retrying) {
Messages.ATTACHMENT_PREVIEW_PATH,
Messages.ATTACHMENT_LENGTH,
// TODO Messages.ATTACHMENT_SECURITY_FLAGS,
+ Messages.GEO_LATITUDE,
+ Messages.GEO_LONGITUDE,
},
filter.toString(),
null, Messages._ID);
@@ -985,6 +987,13 @@ else if (attFileUri != null) {
b.putLong("org.kontalk.message.length", attLength);
}
+ if (!c.isNull(9)){
+ double lat = c.getDouble(9);
+ double lon = c.getDouble(10);
+ b.putDouble("org.kontalk.message.geo_lat", lat);
+ b.putDouble("org.kontalk.message.geo_lon", lon);
+ }
+
Log.v(TAG, "resending pending message " + id);
sendMessage(b);
}
@@ -1399,6 +1408,8 @@ public void run() {
v.put(Messages.ATTACHMENT_PREVIEW_PATH, dest.toString());
Log.w ("Percorso: ",""+v.get(Messages.ATTACHMENT_PREVIEW_PATH));
getContentResolver().update(_uri, v, null, null);
+
+ MessagingNotification.delayedUpdateMessagesNotification(getApplicationContext(), false);
}
},
@@ -2601,7 +2612,7 @@ else if (VCardComponent.supportsMimeType(mime)) {
UserLocation location = (UserLocation) _location;
msg.addComponent(new LocationComponent
(location.getLatitude(),
- location.getLongitude()));
+ location.getLongitude(), null));
}
if (msg != null) {
diff --git a/src/org/kontalk/ui/ComposeMessage.java b/src/org/kontalk/ui/ComposeMessage.java
index da7d406f9..becac5189 100644
--- a/src/org/kontalk/ui/ComposeMessage.java
+++ b/src/org/kontalk/ui/ComposeMessage.java
@@ -41,11 +41,13 @@
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
+import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
+import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.ImageView;
@@ -58,7 +60,7 @@
* @author Daniele Ricci
* @version 1.0
*/
-public class ComposeMessage extends ActionBarActivity {
+public class ComposeMessage extends ActionBarActivity implements FragmentParent {
private static final String TAG = ComposeMessage.class.getSimpleName();
private static final int REQUEST_CONTACT_PICKER = 9721;
@@ -101,6 +103,14 @@ protected void onCreate(Bundle savedInstanceState) {
processIntent(savedInstanceState);
}
+ @Override
+ public void onChildClose(Fragment fragment) {
+ View v = mFragment.getView().findViewById(R.id.drawer);
+ LayoutParams p=v.getLayoutParams();
+ p.height=0;
+ v.setLayoutParams(p);
+ }
+
@TargetApi(android.os.Build.VERSION_CODES.HONEYCOMB)
private void setupActionBar() {
ActionBar bar = getSupportActionBar();
diff --git a/src/org/kontalk/ui/ComposeMessageFragment.java b/src/org/kontalk/ui/ComposeMessageFragment.java
index 220508c73..5af946cb8 100644
--- a/src/org/kontalk/ui/ComposeMessageFragment.java
+++ b/src/org/kontalk/ui/ComposeMessageFragment.java
@@ -62,6 +62,7 @@
import org.spongycastle.openpgp.PGPPublicKey;
import org.spongycastle.openpgp.PGPPublicKeyRing;
+import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.AsyncQueryHandler;
@@ -81,14 +82,13 @@
import android.database.sqlite.SQLiteException;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
-import android.location.Criteria;
-import android.location.LocationListener;
-import android.location.LocationManager;
+import android.location.Location;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.ContactsContract.Contacts;
import android.provider.MediaStore;
+import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.ListFragment;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.MenuItemCompat;
@@ -106,6 +106,8 @@
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewTreeObserver;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
@@ -183,6 +185,9 @@ public class ComposeMessageFragment extends ListFragment implements
private TextWatcher mChatStateListener;
private AdapterView.OnItemClickListener mSmileySelectListener;
+ private MyMapFragment mLocationFragment;
+
+
private static final class PresenceData {
public String status;
public int priority;
@@ -330,6 +335,20 @@ public void onClick(View v) {
}
});
+ final View root=getActivity().getWindow().getDecorView().findViewById(android.R.id.content);
+ root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
+ public void onGlobalLayout(){
+ int heightDiff = root.getRootView().getHeight()-
+ (root.getHeight()+getActivity().getWindow().getDecorView().findViewById(android.R.id.content).getTop());
+ Log.d(TAG,root.getRootView().getHeight()+" - "
+ +(root.getHeight()+getActivity().getWindow().getDecorView().findViewById(android.R.id.content).getTop())
+ +" = "+heightDiff);
+
+ if (heightDiff > 0)
+ MessagingPreferences.setDrawerHeight(getActivity(), heightDiff);
+ }
+ });
+
Configuration config = getResources().getConfiguration();
onKeyboardStateChanged(config.keyboardHidden == KEYBOARDHIDDEN_NO);
@@ -552,7 +571,7 @@ public void run() {
}
else {
MessageCenterService.sendLocationMessage(getActivity(),
- userId, "Location", mLatitude, mLongitude, MessagingPreferences
+ userId, mText, mLatitude, mLongitude, MessagingPreferences
.getEncryptionEnabled(getActivity()),
ContentUris.parseId(newMsg));
}
@@ -588,8 +607,15 @@ public void sendTextMessage(String text, boolean fromTextEntry) {
offlineModeWarning();
- // start thread
- new TextMessageThread(text).start();
+ if (mLocationFragment != null) {
+ Location l = mLocationFragment.getMap().getMyLocation();
+ new TextMessageThread(text, l.getLatitude(), l.getLongitude()).start();
+ }
+
+ else {
+ // start thread
+ new TextMessageThread(text).start();
+ }
if (fromTextEntry) {
// empty text
@@ -822,8 +848,25 @@ private void selectContactAttachment() {
startActivityForResult(i, SELECT_ATTACHMENT_CONTACT);
}
+ @SuppressLint("NewApi")
private void selectLocationAttachment() {
- final LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
+ /*InputMethodManager input = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ input.hideSoftInputFromWindow(getView().getWindowToken(), 0);*/
+
+ View v=getActivity().findViewById(R.id.drawer);
+ LayoutParams p=v.getLayoutParams();
+ p.height=MessagingPreferences.getDrawerHeight(getActivity());
+ v.setLayoutParams(p);
+
+ mLocationFragment= new MyMapFragment();
+ FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
+ ft.replace(R.id.drawer, mLocationFragment);
+ ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
+ ft.addToBackStack(null);
+ ft.commit();
+ mSendButton.setEnabled(true);
+
+ /*final LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
// TODO i18n
@@ -868,7 +911,7 @@ public void onLocationChanged(android.location.Location location) {
};
locationManager.requestLocationUpdates(provider, 0, 0, l);
- }
+ }*/
}
private void showSmileysPopup(View anchor) {
diff --git a/src/org/kontalk/ui/FragmentParent.java b/src/org/kontalk/ui/FragmentParent.java
new file mode 100644
index 000000000..e7e25f4f4
--- /dev/null
+++ b/src/org/kontalk/ui/FragmentParent.java
@@ -0,0 +1,7 @@
+package org.kontalk.ui;
+
+import android.support.v4.app.Fragment;
+
+public interface FragmentParent {
+ public void onChildClose (Fragment fragment);
+}
diff --git a/src/org/kontalk/ui/MessageListItem.java b/src/org/kontalk/ui/MessageListItem.java
index 08e368c3f..d0a7a94a8 100644
--- a/src/org/kontalk/ui/MessageListItem.java
+++ b/src/org/kontalk/ui/MessageListItem.java
@@ -18,6 +18,7 @@
package org.kontalk.ui;
+import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -27,6 +28,7 @@
import org.kontalk.message.AttachmentComponent;
import org.kontalk.message.CompositeMessage;
import org.kontalk.message.ImageComponent;
+import org.kontalk.message.LocationComponent;
import org.kontalk.message.TextComponent;
import org.kontalk.provider.MyMessages.Messages;
import org.kontalk.util.MessageUtils;
@@ -34,6 +36,7 @@
import android.content.Context;
import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
@@ -363,6 +366,23 @@ private SpannableStringBuilder formatMessage(final Contact contact, final Patter
}
}
+ else {
+ LocationComponent loc = (LocationComponent) mMessage.getComponent(LocationComponent.class);
+ if (loc != null) {
+ String placeholder = "Map";
+ buf.insert(0, placeholder);
+ try {
+ File preview = loc.getCachedMap();
+ Bitmap bitmap = BitmapFactory.decodeFile(preview.getAbsolutePath() /*"/data/data/org.kontalk/cache/41.771848_12.303395.png"*/);
+ if (bitmap != null) {
+ ImageSpan imgSpan = new MaxSizeImageSpan(getContext(), bitmap);
+ buf.setSpan(imgSpan, 0, placeholder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+ } catch (Exception e) {
+
+ }
+ }
+ }
}
diff --git a/src/org/kontalk/ui/MessagingNotification.java b/src/org/kontalk/ui/MessagingNotification.java
index 5a522b252..5d3c7d846 100644
--- a/src/org/kontalk/ui/MessagingNotification.java
+++ b/src/org/kontalk/ui/MessagingNotification.java
@@ -316,7 +316,6 @@ else if (content == null && attMime != null) {
CharSequence last = convs.get(peer)[1];
if (unread == 1 && previewPath != null) {
- Log.d ("PATH",previewPath);
Bitmap b=BitmapFactory.decodeFile(previewPath);
style = new BigPictureStyle();
((BigPictureStyle) style).bigPicture(b);
diff --git a/src/org/kontalk/ui/MessagingPreferences.java b/src/org/kontalk/ui/MessagingPreferences.java
index 9a4516140..75c228bc5 100644
--- a/src/org/kontalk/ui/MessagingPreferences.java
+++ b/src/org/kontalk/ui/MessagingPreferences.java
@@ -72,6 +72,8 @@
public final class MessagingPreferences extends PreferenceActivity {
private static final String TAG = MessagingPreferences.class.getSimpleName();
+ private static final float DEFAULT_DRAWER_HEIGHT = 200;
+
private static final int REQUEST_PICK_BACKGROUND = Activity.RESULT_FIRST_USER + 1;
private static Drawable customBackground;
@@ -561,6 +563,17 @@ public static String getPushSenderId(Context context) {
return getString(context, "pref_push_sender", null);
}
+ public static int getDrawerHeight (Context context) {
+ return getInt(context, "pref_drawer_height", MessageUtils.getDensityPixel(context, DEFAULT_DRAWER_HEIGHT));
+ }
+
+ public static boolean setDrawerHeight (Context context, int height) {
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ return prefs.edit()
+ .putInt("pref_drawer_height", height)
+ .commit();
+ }
+
public static boolean setPushSenderId(Context context, String senderId) {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
return prefs.edit()
diff --git a/src/org/kontalk/ui/MyMapFragment.java b/src/org/kontalk/ui/MyMapFragment.java
new file mode 100644
index 000000000..debe279ae
--- /dev/null
+++ b/src/org/kontalk/ui/MyMapFragment.java
@@ -0,0 +1,22 @@
+package org.kontalk.ui;
+
+import com.google.android.gms.maps.GoogleMap;
+import com.google.android.gms.maps.SupportMapFragment;
+
+public class MyMapFragment extends SupportMapFragment {
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ GoogleMap map = this.getMap();
+ map.setMyLocationEnabled(true);
+ map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ FragmentParent p = (FragmentParent) getActivity();
+ p.onChildClose(this);
+ }
+}
diff --git a/src/org/kontalk/util/MessageUtils.java b/src/org/kontalk/util/MessageUtils.java
index 64638b7d7..5d273ed97 100644
--- a/src/org/kontalk/util/MessageUtils.java
+++ b/src/org/kontalk/util/MessageUtils.java
@@ -198,7 +198,7 @@ public static QuickAction smileysPopup(Context context, AdapterView.OnItemClickL
return act;
}
- private static int getDensityPixel(Context context, float dp) {
+ public static int getDensityPixel(Context context, float dp) {
return (int) (dp * context.getResources().getDisplayMetrics().density);
}