diff --git a/android/res/drawable/img_sharing_editor.png b/android/res/drawable/img_sharing_editor.png new file mode 100644 index 0000000000..0cb66b37c8 Binary files /dev/null and b/android/res/drawable/img_sharing_editor.png differ diff --git a/android/res/menu/menu_viral_editor.xml b/android/res/menu/menu_viral_editor.xml deleted file mode 100644 index de52738b9f..0000000000 --- a/android/res/menu/menu_viral_editor.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java index b6afc82dd5..dced9ac59e 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java @@ -96,6 +96,9 @@ public enum BookmarkManager public native void nativeShowBookmarkOnMap(int catId, int bmkId); + /** + * @return null, if wrong category is passed. + */ public native @Nullable String nativeSaveToKmzFile(int catId, String tmpPath); public native Bookmark nativeAddBookmarkToLastEditedCategory(String name, double lat, double lon); diff --git a/android/src/com/mapswithme/maps/editor/ViralFragment.java b/android/src/com/mapswithme/maps/editor/ViralFragment.java index 6d0b6cf9f9..a06dd2504f 100644 --- a/android/src/com/mapswithme/maps/editor/ViralFragment.java +++ b/android/src/com/mapswithme/maps/editor/ViralFragment.java @@ -2,12 +2,10 @@ package com.mapswithme.maps.editor; import android.annotation.SuppressLint; import android.app.Dialog; -import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; -import android.view.MenuItem; import android.view.View; import android.widget.TextView; @@ -16,9 +14,8 @@ import java.util.Random; import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; import com.mapswithme.maps.base.BaseMwmDialogFragment; -import com.mapswithme.util.BottomSheetHelper; import com.mapswithme.util.ConnectionState; -import com.mapswithme.util.sharing.ShareOption; +import com.mapswithme.util.sharing.SharingHelper; import com.mapswithme.util.statistics.Statistics; public class ViralFragment extends BaseMwmDialogFragment @@ -55,6 +52,7 @@ public class ViralFragment extends BaseMwmDialogFragment public void onClick(View v) { share(); + dismiss(); Statistics.INSTANCE.trackEvent(Statistics.EventName.EDITOR_SHARE_CLICK); } }); @@ -64,7 +62,6 @@ public class ViralFragment extends BaseMwmDialogFragment public void onClick(View v) { dismiss(); - // TODO send statistics } }); return builder.setView(root).create(); @@ -72,41 +69,7 @@ public class ViralFragment extends BaseMwmDialogFragment private void share() { - // TODO add custom sharing in twitter and url to facebook sharing - BottomSheetHelper.Builder sheet = BottomSheetHelper.create(getActivity()) - .sheet(R.menu.menu_viral_editor) - .listener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) - { - if (item.getItemId() == R.id.share_message) - { - ShareOption.SMS.share(getActivity(), - getString(R.string.whatsnew_editor_message_1)); - } - else - { - ShareOption.ANY.share(getActivity(), - getString(R.string.whatsnew_editor_message_1), - R.string.editor_sharing_title); - } - - dismiss(); - return false; - } - }); - - if (!ShareOption.SMS.isSupported(getActivity())) - sheet.getMenu().removeItem(R.id.share_message); - - sheet.tint().show(); - } - - @Override - public void onDismiss(DialogInterface dialog) - { - super.onDismiss(dialog); - // TODO remove before merge + SharingHelper.shareViralEditor(getActivity(), R.drawable.img_sharing_editor, R.string.editor_sharing_title, R.string.whatsnew_editor_message_1); } private void initViralText() diff --git a/android/src/com/mapswithme/util/UiUtils.java b/android/src/com/mapswithme/util/UiUtils.java index 2aa1f1a327..753142235e 100644 --- a/android/src/com/mapswithme/util/UiUtils.java +++ b/android/src/com/mapswithme/util/UiUtils.java @@ -2,9 +2,14 @@ package com.mapswithme.util; import android.animation.Animator; import android.app.Activity; +import android.content.ContentResolver; +import android.content.Context; import android.content.DialogInterface; import android.content.res.Configuration; +import android.content.res.Resources; +import android.net.Uri; import android.os.Build; +import android.support.annotation.AnyRes; import android.support.annotation.DimenRes; import android.support.annotation.IdRes; import android.support.annotation.NonNull; @@ -286,6 +291,15 @@ public final class UiUtils : R.attr.accentButtonTextColorDisabled)); } + public static Uri getUriToResId(@NonNull Context context, @AnyRes int resId) + { + final Resources resources = context.getResources(); + return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + + resources.getResourcePackageName(resId) + '/' + + resources.getResourceTypeName(resId) + '/' + + resources.getResourceEntryName(resId)); + } + // utility class private UiUtils() {} } diff --git a/android/src/com/mapswithme/util/sharing/BaseShareable.java b/android/src/com/mapswithme/util/sharing/BaseShareable.java index 1ec31d7dd9..f01107bfe1 100644 --- a/android/src/com/mapswithme/util/sharing/BaseShareable.java +++ b/android/src/com/mapswithme/util/sharing/BaseShareable.java @@ -12,9 +12,9 @@ import com.mapswithme.util.statistics.AlohaHelper; public abstract class BaseShareable { private final Activity mActivity; - private Intent mBaseIntent; - private String mText; - private String mSubject; + protected Intent mBaseIntent; + protected String mText; + protected String mSubject; public BaseShareable(Activity activity) { diff --git a/android/src/com/mapswithme/util/sharing/LocalFileShareable.java b/android/src/com/mapswithme/util/sharing/LocalFileShareable.java index 142b0a5489..596dc89151 100644 --- a/android/src/com/mapswithme/util/sharing/LocalFileShareable.java +++ b/android/src/com/mapswithme/util/sharing/LocalFileShareable.java @@ -5,6 +5,8 @@ import android.content.Intent; import android.net.Uri; import android.support.annotation.Nullable; +import java.io.File; + public class LocalFileShareable extends BaseShareable { private final String mFileName; @@ -21,7 +23,7 @@ public class LocalFileShareable extends BaseShareable protected void modifyIntent(Intent intent, @Nullable SharingTarget target) { super.modifyIntent(intent, target); - intent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.parse("file://" + mFileName)); + intent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.fromFile(new File(mFileName))); } @Override diff --git a/android/src/com/mapswithme/util/sharing/ShareOption.java b/android/src/com/mapswithme/util/sharing/ShareOption.java index 4f5147627d..c5ce2f3622 100644 --- a/android/src/com/mapswithme/util/sharing/ShareOption.java +++ b/android/src/com/mapswithme/util/sharing/ShareOption.java @@ -48,7 +48,7 @@ public abstract class ShareOption public void share(Activity activity, String body) { Intent smsIntent = new Intent(); - TargetUtils.fillSmsIntent(activity, smsIntent, body); + TargetUtils.fillSmsIntent(smsIntent, body); activity.startActivity(smsIntent); Statistics.INSTANCE.trackPlaceShared("SMS"); } diff --git a/android/src/com/mapswithme/util/sharing/SharingHelper.java b/android/src/com/mapswithme/util/sharing/SharingHelper.java index aaee847449..4571f5a7ae 100644 --- a/android/src/com/mapswithme/util/sharing/SharingHelper.java +++ b/android/src/com/mapswithme/util/sharing/SharingHelper.java @@ -8,6 +8,7 @@ import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.support.annotation.DrawableRes; import android.support.annotation.StringRes; import android.text.TextUtils; @@ -86,7 +87,6 @@ public final class SharingHelper mPrefs.edit().putString(PREFS_KEY_ITEMS, json).apply(); } - private static String guessAppName(PackageManager pm, ResolveInfo ri) { CharSequence name = ri.activityInfo.loadLabel(pm); @@ -110,7 +110,6 @@ public final class SharingHelper PackageManager pm = MwmApplication.get().getPackageManager(); List rlist = pm.queryIntentActivities(it, 0); - final List res = new ArrayList<>(rlist.size()); for (ResolveInfo ri : rlist) { @@ -216,17 +215,20 @@ public final class SharingHelper public static void shareBookmarksCategory(Activity context, int id) { - String path = MwmApplication.get().getTempPath(); - String name = BookmarkManager.INSTANCE.nativeSaveToKmzFile(id, path); + String name = BookmarkManager.INSTANCE.nativeSaveToKmzFile(id, MwmApplication.get().getTempPath()); if (name == null) - // some error occurred return; - path += name + ".kmz"; - - // FIXME bug with "%s.kmz" - shareOutside(new LocalFileShareable(context, path, "application/vnd.google-earth.kmz") - .setText(R.string.share_bookmarks_email_body) - .setSubject(R.string.share_bookmarks_email_subject)); + shareOutside(new LocalFileShareable(context, name + ".kmz", "application/vnd.google-earth.kmz") + .setText(R.string.share_bookmarks_email_body) + .setSubject(R.string.share_bookmarks_email_subject)); } + + public static void shareViralEditor(Activity context, @DrawableRes int imageId, @StringRes int subject, @StringRes int text) + { + shareOutside(new ViralEditorShareable(context, imageId) + .setText(text) + .setSubject(subject)); + } + } \ No newline at end of file diff --git a/android/src/com/mapswithme/util/sharing/TargetUtils.java b/android/src/com/mapswithme/util/sharing/TargetUtils.java index ea95e2c39a..55726e4501 100644 --- a/android/src/com/mapswithme/util/sharing/TargetUtils.java +++ b/android/src/com/mapswithme/util/sharing/TargetUtils.java @@ -1,10 +1,7 @@ package com.mapswithme.util.sharing; -import android.app.Activity; import android.content.Intent; import android.net.Uri; -import android.os.Build; -import android.provider.Telephony; final class TargetUtils { @@ -16,18 +13,9 @@ final class TargetUtils private TargetUtils() {} - public static void fillSmsIntent(Activity activity, Intent smsIntent, String body) + public static void fillSmsIntent(Intent smsIntent, String body) { smsIntent.setData(Uri.parse(URI_STRING_SMS)); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) - { - final String defaultSms = Telephony.Sms.getDefaultSmsPackage(activity); - smsIntent.setType(TYPE_TEXT_PLAIN); - smsIntent.putExtra(EXTRA_SMS_TEXT, body); - if (defaultSms != null) - smsIntent.setPackage(defaultSms); - } - else - smsIntent.putExtra(EXTRA_SMS_BODY, body); + smsIntent.putExtra(EXTRA_SMS_BODY, body); } } diff --git a/android/src/com/mapswithme/util/sharing/ViralEditorShareable.java b/android/src/com/mapswithme/util/sharing/ViralEditorShareable.java new file mode 100644 index 0000000000..38816e84b9 --- /dev/null +++ b/android/src/com/mapswithme/util/sharing/ViralEditorShareable.java @@ -0,0 +1,81 @@ +package com.mapswithme.util.sharing; + +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.support.annotation.DrawableRes; +import android.support.annotation.Nullable; + +import java.util.Locale; + +import com.facebook.FacebookSdk; +import com.facebook.share.model.ShareLinkContent; +import com.facebook.share.widget.ShareDialog; +import com.mapswithme.util.UiUtils; + +public class ViralEditorShareable extends BaseShareable +{ + private static final String FACEBOOK_SHARE_URL = "http://maps.me/fb-editor-v1?lang=" + Locale.getDefault().getLanguage(); + + private final Uri mUri; + + public ViralEditorShareable(Activity context, @DrawableRes int resId) + { + super(context); + mUri = UiUtils.getUriToResId(context, resId); + } + + @Override + protected void modifyIntent(Intent intent, @Nullable SharingTarget target) + { + super.modifyIntent(intent, target); + intent.putExtra(Intent.EXTRA_STREAM, mUri); + } + + @Override + public String getMimeType() + { + return TargetUtils.TYPE_TEXT_PLAIN; + } + + @Override + public void share(SharingTarget target) + { + Intent intent = getTargetIntent(target); + String lowerCaseName = target.activityName.toLowerCase(); + + if (lowerCaseName.contains("facebook")) + { + shareFacebook(); + return; + } + + if (lowerCaseName.contains("sms") || lowerCaseName.contains("mms")) + TargetUtils.fillSmsIntent(intent, mText); + else if (lowerCaseName.contains("twitter")) + setSubject(""); + else if (!lowerCaseName.contains("mail")) + { + setText(mSubject + "\n" + mText); + setSubject(""); + } + + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + + super.share(target); + } + + private void shareFacebook() + { + FacebookSdk.sdkInitialize(getActivity()); + ShareDialog shareDialog = new ShareDialog(getActivity()); + if (ShareDialog.canShow(ShareLinkContent.class)) + { + ShareLinkContent linkContent = new ShareLinkContent.Builder() + .setContentUrl(Uri.parse(FACEBOOK_SHARE_URL)) + .build(); + + shareDialog.show(linkContent); + } + } +}