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