From 3659599f84ba76252a334c8b70d2f85a54717dc4 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 16 Dec 2020 13:17:19 +0300 Subject: allow sharing both image bitmap and image URL from gallery, webview context menu, etc --- org.fox.ttrss/src/main/AndroidManifest.xml | 14 ++++- .../main/java/org/fox/ttrss/ArticleFragment.java | 2 +- .../main/java/org/fox/ttrss/CommonActivity.java | 70 +++++++++++++++++++--- .../main/java/org/fox/ttrss/GalleryActivity.java | 47 ++++++++++----- .../java/org/fox/ttrss/GalleryImageFragment.java | 7 ++- .../main/java/org/fox/ttrss/HeadlinesFragment.java | 3 + .../main/java/org/fox/ttrss/OnlineActivity.java | 11 +++- .../org/fox/ttrss/offline/OfflineActivity.java | 11 +++- .../src/main/res/menu/content_gallery_entry.xml | 7 ++- org.fox.ttrss/src/main/res/values/strings.xml | 2 + .../src/main/res/xml/file_provider_paths.xml | 6 ++ 11 files changed, 145 insertions(+), 35 deletions(-) create mode 100644 org.fox.ttrss/src/main/res/xml/file_provider_paths.xml 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 @@ + android:versionCode="529" + android:versionName="1.295"> @@ -263,6 +263,16 @@ android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/title_activity_video_player" > + + + + 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() { + @Override + public void onResourceReady(Bitmap resource, GlideAnimation 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) { @@ -352,6 +363,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); } @@ -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(); @@ -526,6 +526,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()); } 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(); @@ -118,6 +118,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()); } 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"/> + Older than one day Older than one week Older than two weeks + Share URL + Share image 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 @@ + + + + + + \ No newline at end of file -- cgit v1.2.3