summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2020-12-16 13:17:19 +0300
committerAndrew Dolgov <[email protected]>2020-12-16 13:17:19 +0300
commit3659599f84ba76252a334c8b70d2f85a54717dc4 (patch)
treec8f45f2b72cbc303c35877e3093a0e9158680c18
parentded93942a8e51a4bb8908bb77f5812dd19fce685 (diff)
allow sharing both image bitmap and image URL from gallery, webview context menu, etc
-rwxr-xr-xorg.fox.ttrss/src/main/AndroidManifest.xml14
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java2
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java70
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java47
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java7
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java3
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java11
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java11
-rwxr-xr-xorg.fox.ttrss/src/main/res/menu/content_gallery_entry.xml7
-rwxr-xr-xorg.fox.ttrss/src/main/res/values/strings.xml2
-rw-r--r--org.fox.ttrss/src/main/res/xml/file_provider_paths.xml6
11 files changed, 145 insertions, 35 deletions
diff --git a/org.fox.ttrss/src/main/AndroidManifest.xml b/org.fox.ttrss/src/main/AndroidManifest.xml
index ce02e2a2..fd57a336 100755
--- a/org.fox.ttrss/src/main/AndroidManifest.xml
+++ b/org.fox.ttrss/src/main/AndroidManifest.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.fox.ttrss"
- android:versionCode="528"
- android:versionName="1.294">
+ android:versionCode="529"
+ android:versionName="1.295">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -263,6 +263,16 @@
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/title_activity_video_player" >
</activity>
+
+ <provider
+ android:name="androidx.core.content.FileProvider"
+ android:authorities="org.fox.ttrss.SharedFileProvider"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/file_provider_paths" />
+ </provider>
</application>
</manifest>
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java
index c0a55775..ed961e38 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java
@@ -130,7 +130,7 @@ public class ArticleFragment extends StateSavedFragment {
menu.setHeaderTitle(result.getExtra());
getActivity().getMenuInflater().inflate(R.menu.content_gallery_entry, menu);
-
+
/* FIXME I have no idea how to do this correctly ;( */
m_activity.setLastContentImageHitTestUrl(result.getExtra());
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java
index 9461e6a5..3a177813 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java
@@ -17,6 +17,7 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.database.sqlite.SQLiteDatabase;
+import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
@@ -32,7 +33,20 @@ import android.view.Display;
import android.view.View;
import android.widget.CheckBox;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatDelegate;
+import androidx.browser.customtabs.CustomTabsCallback;
+import androidx.browser.customtabs.CustomTabsClient;
+import androidx.browser.customtabs.CustomTabsIntent;
+import androidx.browser.customtabs.CustomTabsServiceConnection;
+import androidx.browser.customtabs.CustomTabsSession;
+import androidx.core.app.JobIntentService;
+import androidx.core.content.FileProvider;
+
import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.bumptech.glide.request.animation.GlideAnimation;
+import com.bumptech.glide.request.target.SimpleTarget;
import com.google.android.material.snackbar.Snackbar;
import com.livefront.bridge.Bridge;
@@ -43,18 +57,12 @@ import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
+import java.io.File;
+import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.app.AppCompatDelegate;
-import androidx.browser.customtabs.CustomTabsCallback;
-import androidx.browser.customtabs.CustomTabsClient;
-import androidx.browser.customtabs.CustomTabsIntent;
-import androidx.browser.customtabs.CustomTabsServiceConnection;
-import androidx.browser.customtabs.CustomTabsSession;
-import androidx.core.app.JobIntentService;
import icepick.State;
public class CommonActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
@@ -396,6 +404,52 @@ public class CommonActivity extends AppCompatActivity implements SharedPreferenc
startActivity(Intent.createChooser(getShareIntent(text, subject), text));
}
+ protected void shareImageFromUri(String url) {
+ Glide.with(this)
+ .load(url)
+ .asBitmap()
+ .skipMemoryCache(false)
+ .diskCacheStrategy(DiskCacheStrategy.ALL)
+ .into(new SimpleTarget<Bitmap>() {
+ @Override
+ public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
+ Log.d(TAG, "image resource ready: " + resource);
+
+ if (resource != null) {
+ File shareFolder = new File(getCacheDir(), "shared");
+
+ try {
+ shareFolder.mkdirs();
+
+ File file = new File(shareFolder, "shared.png");
+
+ FileOutputStream stream = new FileOutputStream(file);
+ resource.compress(Bitmap.CompressFormat.PNG, 90, stream);
+ stream.flush();
+ stream.close();
+
+ Uri shareUri = FileProvider.getUriForFile(CommonActivity.this,
+ "org.fox.ttrss.SharedFileProvider", file);
+
+ Intent intent = new Intent(android.content.Intent.ACTION_SEND);
+ intent.putExtra(Intent.EXTRA_STREAM, shareUri);
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ intent.setType("image/png");
+
+ startActivity(intent);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ toast(e.getMessage());
+ }
+
+ } else {
+ toast("Failed to load image for sharing");
+ }
+ }
+ });
+ }
+
private void openUriWithCustomTab(Uri uri) {
if (m_customTabClient != null) {
TypedValue tvBackground = new TypedValue();
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java
index 0dfce8b2..8bd7ed38 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java
@@ -12,6 +12,14 @@ import android.view.View;
import android.widget.PopupMenu;
import android.widget.ProgressBar;
+import androidx.appcompat.app.AppCompatDelegate;
+import androidx.appcompat.widget.Toolbar;
+import androidx.core.app.ActivityCompat;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentStatePagerAdapter;
+import androidx.viewpager.widget.ViewPager;
+
import com.ToxicBakery.viewpager.transforms.DepthPageTransformer;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
@@ -26,13 +34,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
-import androidx.appcompat.app.AppCompatDelegate;
-import androidx.appcompat.widget.Toolbar;
-import androidx.core.app.ActivityCompat;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentStatePagerAdapter;
-import androidx.viewpager.widget.ViewPager;
import icepick.State;
import me.relex.circleindicator.CircleIndicator;
@@ -266,12 +267,15 @@ public class GalleryActivity extends CommonActivity {
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.content_gallery_entry, popup.getMenu());
+ final GalleryEntry entry = m_items.get(m_pager.getCurrentItem());
+
+ popup.getMenu().findItem(R.id.article_img_share)
+ .setVisible(entry.type == GalleryEntry.GalleryEntryType.TYPE_IMAGE);
+
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
- String url = m_items.get(m_pager.getCurrentItem()).url;
-
- return onImageMenuItemSelected(item, url);
+ return onImageMenuItemSelected(item, entry);
}
});
@@ -326,15 +330,22 @@ public class GalleryActivity extends CommonActivity {
@Override
public boolean onContextItemSelected(MenuItem item) {
int position = m_pager.getCurrentItem();
- String url = m_items.get(position).url;
- if (onImageMenuItemSelected(item, url))
+ GalleryEntry entry = m_items.get(position);
+
+ //String url = m_items.get(position).url;
+
+
+
+ if (onImageMenuItemSelected(item, entry))
return true;
return super.onContextItemSelected(item);
}
- public boolean onImageMenuItemSelected(MenuItem item, String url) {
+ public boolean onImageMenuItemSelected(MenuItem item, GalleryEntry entry) {
+ String url = entry.url;
+
switch (item.getItemId()) {
case R.id.article_img_open:
if (url != null) {
@@ -353,6 +364,15 @@ public class GalleryActivity extends CommonActivity {
return true;
case R.id.article_img_share:
if (url != null) {
+ if (entry.type == GalleryEntry.GalleryEntryType.TYPE_IMAGE) {
+ Log.d(TAG, "image sharing image from URL=" + url);
+
+ shareImageFromUri(url);
+ }
+ }
+ return true;
+ case R.id.article_img_share_url:
+ if (url != null) {
shareText(url);
}
return true;
@@ -366,5 +386,4 @@ public class GalleryActivity extends CommonActivity {
return false;
}
}
-
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java
index e4142b52..e058ca7b 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java
@@ -8,6 +8,9 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
+import androidx.core.app.ActivityCompat;
+import androidx.core.view.ViewCompat;
+
import com.bogdwellers.pinchtozoom.ImageMatrixTouchHandler;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
@@ -16,8 +19,6 @@ import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
import com.bumptech.glide.request.target.Target;
-import androidx.core.app.ActivityCompat;
-import androidx.core.view.ViewCompat;
import icepick.State;
public class GalleryImageFragment extends GalleryBaseFragment {
@@ -50,7 +51,7 @@ public class GalleryImageFragment extends GalleryBaseFragment {
final GlideDrawableImageViewTarget glideImage = new GlideDrawableImageViewTarget(imgView);
- Glide.with(this)
+ Glide.with(getContext())
.load(m_url)
//.dontAnimate()
.diskCacheStrategy(DiskCacheStrategy.ALL)
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
index f5e5d993..81b81f40 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
@@ -1165,6 +1165,9 @@ public class HeadlinesFragment extends StateSavedFragment {
m_activity.copyToClipboard(mediaUri.toString());
return true;
case R.id.article_img_share:
+ m_activity.shareImageFromUri(mediaUri.toString());
+ return true;
+ case R.id.article_img_share_url:
m_activity.shareText(mediaUri.toString());
return true;
case R.id.article_img_view_caption:
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java
index a5ea4778..3f12a1c6 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java
@@ -31,6 +31,9 @@ import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
+import androidx.appcompat.view.ActionMode;
+import androidx.appcompat.widget.Toolbar;
+
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -50,9 +53,6 @@ import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
-import androidx.appcompat.view.ActionMode;
-import androidx.appcompat.widget.Toolbar;
-
public class OnlineActivity extends CommonActivity {
private final String TAG = this.getClass().getSimpleName();
@@ -527,6 +527,11 @@ public class OnlineActivity extends CommonActivity {
return true;
case R.id.article_img_share:
if (getLastContentImageHitTestUrl() != null) {
+ shareImageFromUri(getLastContentImageHitTestUrl());
+ }
+ return true;
+ case R.id.article_img_share_url:
+ if (getLastContentImageHitTestUrl() != null) {
shareText(getLastContentImageHitTestUrl());
}
return true;
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java
index e2864d4e..5b63356d 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java
@@ -21,14 +21,14 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.EditText;
+import androidx.appcompat.view.ActionMode;
+import androidx.appcompat.widget.Toolbar;
+
import org.fox.ttrss.CommonActivity;
import org.fox.ttrss.OnlineActivity;
import org.fox.ttrss.PreferencesActivity;
import org.fox.ttrss.R;
-import androidx.appcompat.view.ActionMode;
-import androidx.appcompat.widget.Toolbar;
-
public class OfflineActivity extends CommonActivity {
private final String TAG = this.getClass().getSimpleName();
@@ -119,6 +119,11 @@ public class OfflineActivity extends CommonActivity {
return true;
case R.id.article_img_share:
if (getLastContentImageHitTestUrl() != null) {
+ shareImageFromUri(getLastContentImageHitTestUrl());
+ }
+ return true;
+ case R.id.article_img_share_url:
+ if (getLastContentImageHitTestUrl() != null) {
shareText(getLastContentImageHitTestUrl());
}
return true;
diff --git a/org.fox.ttrss/src/main/res/menu/content_gallery_entry.xml b/org.fox.ttrss/src/main/res/menu/content_gallery_entry.xml
index 67dbd6d8..70e2bdfb 100755
--- a/org.fox.ttrss/src/main/res/menu/content_gallery_entry.xml
+++ b/org.fox.ttrss/src/main/res/menu/content_gallery_entry.xml
@@ -13,7 +13,12 @@
android:id="@+id/article_img_share"
android:icon="@drawable/ic_share"
app:showAsAction=""
- android:title="@string/article_media_share"/>
+ android:title="@string/img_share_image"/>
+ <item
+ android:id="@+id/article_img_share_url"
+ android:icon="@drawable/ic_share"
+ app:showAsAction=""
+ android:title="@string/img_share_url"/>
<item
android:id="@+id/article_img_view_caption"
app:showAsAction=""
diff --git a/org.fox.ttrss/src/main/res/values/strings.xml b/org.fox.ttrss/src/main/res/values/strings.xml
index e2a6ca8e..e0628f0c 100755
--- a/org.fox.ttrss/src/main/res/values/strings.xml
+++ b/org.fox.ttrss/src/main/res/values/strings.xml
@@ -290,4 +290,6 @@
<string name="catchup_dialog_1day">Older than one day</string>
<string name="catchup_dialog_1week">Older than one week</string>
<string name="catchup_dialog_2week">Older than two weeks</string>
+ <string name="img_share_url">Share URL</string>
+ <string name="img_share_image">Share image</string>
</resources>
diff --git a/org.fox.ttrss/src/main/res/xml/file_provider_paths.xml b/org.fox.ttrss/src/main/res/xml/file_provider_paths.xml
new file mode 100644
index 00000000..ca092e5a
--- /dev/null
+++ b/org.fox.ttrss/src/main/res/xml/file_provider_paths.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <paths>
+ <cache-path name="shared" path="shared/"/>
+ </paths>
+</resources> \ No newline at end of file