From b30c1e4aa30929a67071a440c059aa409eb75b29 Mon Sep 17 00:00:00 2001 From: fkloft Date: Sat, 1 Mar 2014 13:07:40 +0100 Subject: [PATCH] [IITCm] new feature: share a screenshot of the current view --- mobile/res/menu/main.xml | 5 ++ mobile/res/values/strings.xml | 1 + .../cradle/iitc_mobile/IITC_JSInterface.java | 14 +--- .../com/cradle/iitc_mobile/IITC_Mobile.java | 27 +++++++ .../iitc_mobile/share/IntentGenerator.java | 12 ++- .../iitc_mobile/share/ShareActivity.java | 73 +++++++++++++++---- 6 files changed, 103 insertions(+), 29 deletions(-) diff --git a/mobile/res/menu/main.xml b/mobile/res/menu/main.xml index bffdd6ab..4953812b 100644 --- a/mobile/res/menu/main.xml +++ b/mobile/res/menu/main.xml @@ -36,6 +36,11 @@ android:orderInCategory="130" android:showAsAction="never" android:title="@string/menu_clear_cookies"/> + Clear Cookies Search Debug + Send screenshot Add external plugins Choose account to login Login failed. diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java index d489ca6e..95556a1d 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java @@ -3,7 +3,6 @@ package com.cradle.iitc_mobile; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; -import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Environment; @@ -30,22 +29,13 @@ public class IITC_JSInterface { @JavascriptInterface public void intentPosLink( final double lat, final double lng, final int zoom, final String title, final boolean isPortal) { - final Intent intent = new Intent(mIitc, ShareActivity.class); - intent.putExtra("lat", lat); - intent.putExtra("lng", lng); - intent.putExtra("zoom", zoom); - intent.putExtra("title", title); - intent.putExtra("isPortal", isPortal); - mIitc.startActivity(intent); + mIitc.startActivity(ShareActivity.forPosition(mIitc, lat, lng, zoom, title, isPortal)); } // share a string to the IITC share activity. only uses the share tab. @JavascriptInterface public void shareString(final String str) { - final Intent intent = new Intent(mIitc, ShareActivity.class); - intent.putExtra("shareString", str); - intent.putExtra("onlyShare", true); - mIitc.startActivity(intent); + mIitc.startActivity(ShareActivity.forString(mIitc, str)); } // disable javascript injection while spinner is enabled diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 50511b75..f974b9f4 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -13,6 +13,8 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.Bitmap.CompressFormat; import android.net.Uri; import android.nfc.NdefMessage; import android.nfc.NdefRecord; @@ -38,11 +40,13 @@ import android.widget.TextView; import android.widget.Toast; import com.cradle.iitc_mobile.IITC_NavigationHelper.Pane; +import com.cradle.iitc_mobile.share.ShareActivity; import org.json.JSONException; import org.json.JSONObject; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.net.URISyntaxException; import java.util.Stack; @@ -571,6 +575,9 @@ public class IITC_Mobile extends Activity final CookieManager cm = CookieManager.getInstance(); cm.removeAllCookie(); return true; + case R.id.menu_send_screenshot: + sendScreenshot(); + return true; case R.id.menu_debug: mDebugging = !mDebugging; updateViews(); @@ -842,6 +849,26 @@ public class IITC_Mobile extends Activity mPermalink = href; } + private void sendScreenshot() { + mIitcWebView.setDrawingCacheEnabled(true); + final Bitmap bitmap = mIitcWebView.getDrawingCache(); + if (bitmap == null) { + Log.e("getDrawingCache() returned null!"); + return; + } + try { + final File cache = getExternalCacheDir(); + final File file = File.createTempFile("IITC screenshot", ".png", cache); + if (!Bitmap.createBitmap(bitmap).compress(CompressFormat.PNG, 100, new FileOutputStream(file))) { + // quality is ignored by PNG + throw new IOException("Could not compress bitmap!"); + } + startActivity(ShareActivity.forFile(this, file, "image/png")); + } catch (final IOException e) { + Log.e("Could not generate screenshot", e); + } + } + @Override public NdefMessage createNdefMessage(final NfcEvent event) { NdefRecord[] records; diff --git a/mobile/src/com/cradle/iitc_mobile/share/IntentGenerator.java b/mobile/src/com/cradle/iitc_mobile/share/IntentGenerator.java index b4b68893..0c07a23e 100644 --- a/mobile/src/com/cradle/iitc_mobile/share/IntentGenerator.java +++ b/mobile/src/com/cradle/iitc_mobile/share/IntentGenerator.java @@ -140,8 +140,8 @@ public class IntentGenerator { final Intent intent = new Intent(Intent.ACTION_SEND) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) .setType("text/plain") - .putExtra(Intent.EXTRA_TEXT, text) - .putExtra(Intent.EXTRA_SUBJECT, title); + .putExtra(Intent.EXTRA_SUBJECT, title) + .putExtra(Intent.EXTRA_TEXT, text); final ArrayList targets = resolveTargets(intent); @@ -154,4 +154,12 @@ public class IntentGenerator { return targets; } + + public ArrayList getShareIntents(final String title, final Uri uri, final String type) { + return resolveTargets(new Intent(Intent.ACTION_SEND) + .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) + .setType(type) + .putExtra(Intent.EXTRA_SUBJECT, title) + .putExtra(Intent.EXTRA_STREAM, uri)); + } } diff --git a/mobile/src/com/cradle/iitc_mobile/share/ShareActivity.java b/mobile/src/com/cradle/iitc_mobile/share/ShareActivity.java index 0578a7dc..813d0f76 100644 --- a/mobile/src/com/cradle/iitc_mobile/share/ShareActivity.java +++ b/mobile/src/com/cradle/iitc_mobile/share/ShareActivity.java @@ -2,8 +2,10 @@ package com.cradle.iitc_mobile.share; import android.app.ActionBar; import android.app.FragmentTransaction; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.FragmentActivity; @@ -11,20 +13,49 @@ import android.support.v4.app.NavUtils; import android.support.v4.view.ViewPager; import android.view.MenuItem; +import com.cradle.iitc_mobile.Log; import com.cradle.iitc_mobile.R; +import java.io.File; import java.util.ArrayList; public class ShareActivity extends FragmentActivity implements ActionBar.TabListener { + private static final String EXTRA_TYPE = "share-type"; + private static final String TYPE_FILE = "file"; + private static final String TYPE_PERMALINK = "permalink"; + private static final String TYPE_PORTAL_LINK = "portal_link"; + private static final String TYPE_STRING = "string"; + + public static Intent forFile(final Context context, final File file, final String type) { + return new Intent(context, ShareActivity.class) + .putExtra(EXTRA_TYPE, TYPE_FILE) + .putExtra("uri", Uri.fromFile(file)) + .putExtra("type", type); + } + + public static Intent forPosition(final Context context, final double lat, final double lng, final int zoom, + final String title, final boolean isPortal) { + return new Intent(context, ShareActivity.class) + .putExtra(EXTRA_TYPE, isPortal ? TYPE_PORTAL_LINK : TYPE_PERMALINK) + .putExtra("lat", lat) + .putExtra("lng", lng) + .putExtra("zoom", zoom) + .putExtra("title", title) + .putExtra("isPortal", isPortal); + } + + public static Intent forString(final Context context, final String str) { + return new Intent(context, ShareActivity.class) + .putExtra(EXTRA_TYPE, TYPE_STRING) + .putExtra("shareString", str); + } + private IntentComparator mComparator; private FragmentAdapter mFragmentAdapter; private IntentGenerator mGenerator; - private boolean mIsPortal; - private String mLl; private SharedPreferences mSharedPrefs = null; private String mTitle; private ViewPager mViewPager; - private int mZoom; private void addTab(final ArrayList intents, final int label, final int icon) { final IntentListFragment fragment = new IntentListFragment(); @@ -36,10 +67,10 @@ public class ShareActivity extends FragmentActivity implements ActionBar.TabList mFragmentAdapter.add(fragment); } - private String getIntelUrl() { - String url = "http://www.ingress.com/intel?ll=" + mLl + "&z=" + mZoom; - if (mIsPortal) { - url += "&pll=" + mLl; + private String getIntelUrl(final String ll, final int zoom, final boolean isPortal) { + String url = "http://www.ingress.com/intel?ll=" + ll + "&z=" + zoom; + if (isPortal) { + url += "&pll=" + ll; } return url; } @@ -68,29 +99,41 @@ public class ShareActivity extends FragmentActivity implements ActionBar.TabList actionBar.setDisplayHomeAsUpEnabled(true); final Intent intent = getIntent(); + final String type = intent.getStringExtra(EXTRA_TYPE); // from portallinks/permalinks we build 3 intents (share / geo / vanilla-intel-link) - if (!intent.getBooleanExtra("onlyShare", false)) { + if (TYPE_PERMALINK.equals(type) || TYPE_PORTAL_LINK.equals(type)) { mTitle = intent.getStringExtra("title"); - mLl = intent.getDoubleExtra("lat", 0) + "," + intent.getDoubleExtra("lng", 0); - mZoom = intent.getIntExtra("zoom", 0); - mIsPortal = intent.getBooleanExtra("isPortal", false); + final String ll = intent.getDoubleExtra("lat", 0) + "," + intent.getDoubleExtra("lng", 0); + final int zoom = intent.getIntExtra("zoom", 0); + final String url = getIntelUrl(ll, zoom, TYPE_PORTAL_LINK.equals(type)); actionBar.setTitle(mTitle); - addTab(mGenerator.getShareIntents(mTitle, getIntelUrl()), + addTab(mGenerator.getShareIntents(mTitle, url), R.string.tab_share, R.drawable.ic_action_share); - addTab(mGenerator.getGeoIntents(mTitle, mLl, mZoom), + addTab(mGenerator.getGeoIntents(mTitle, ll, zoom), R.string.tab_map, R.drawable.ic_action_place); - addTab(mGenerator.getBrowserIntents(mTitle, getIntelUrl()), + addTab(mGenerator.getBrowserIntents(mTitle, url), R.string.tab_browser, R.drawable.ic_action_web_site); - } else { + } else if (TYPE_STRING.equals(type)) { mTitle = getString(R.string.app_name); final String shareString = intent.getStringExtra("shareString"); addTab(mGenerator.getShareIntents(mTitle, shareString), R.string.tab_share, R.drawable.ic_action_share); + } else if (TYPE_FILE.equals(type)) { + mTitle = "Screenshot"; + + final Uri uri = intent.getParcelableExtra("uri"); + final String mime = intent.getStringExtra("type"); + + addTab(mGenerator.getShareIntents(mTitle, uri, mime), R.string.tab_share, R.drawable.ic_action_share); + } else { + Log.w("Unknown sharing type: " + type); + finish(); + return; } mViewPager = (ViewPager) findViewById(R.id.pager);