diff --git a/app/src/main/java/com/github/dfa/diaspora_android/service/AvatarImageLoader.java b/app/src/main/java/com/github/dfa/diaspora_android/service/AvatarImageLoader.java index 20f0a4f9..ab975326 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/service/AvatarImageLoader.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/service/AvatarImageLoader.java @@ -24,6 +24,8 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.widget.ImageView; +import net.gsantner.opoc.util.DownloadTask; + import java.io.File; public class AvatarImageLoader { @@ -52,7 +54,9 @@ public class AvatarImageLoader { public void startImageDownload(ImageView imageView, String avatarUrl) { if (!avatarUrl.equals("")) { - new ImageDownloadTask(imageView, avatarFile.getAbsolutePath()).execute(avatarUrl); + new DownloadTask(new File(avatarFile.getAbsolutePath()), (ok, file) -> { + loadToImageView(imageView); + }).execute(avatarUrl); } } } diff --git a/app/src/main/java/com/github/dfa/diaspora_android/service/ImageDownloadTask.java b/app/src/main/java/com/github/dfa/diaspora_android/service/ImageDownloadTask.java deleted file mode 100644 index 5a3fd465..00000000 --- a/app/src/main/java/com/github/dfa/diaspora_android/service/ImageDownloadTask.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - This file is part of the dandelion*. - - dandelion* is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - dandelion* is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with the dandelion*. - - If not, see . - */ -package com.github.dfa.diaspora_android.service; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.AsyncTask; -import android.support.annotation.Nullable; -import android.widget.ImageView; - -import com.github.dfa.diaspora_android.util.AppLog; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; - -import javax.net.ssl.HttpsURLConnection; - -import info.guardianproject.netcipher.NetCipher; - -/** - * Task that can be used to download images from URLs and store them in storage - * Created by gsantner (http://gsantner.net/) on 24.03.16. - */ -public class ImageDownloadTask extends AsyncTask { - private final ImageView imageView; - private String savePath; - - /** - * Download image from URL - * - * @param imageView ImageView to set image to (null = don't set) - * @param savePath Save image to file (null = don't save) - */ - public ImageDownloadTask(@Nullable ImageView imageView, @Nullable String savePath) { - this.imageView = imageView; - this.savePath = savePath; - } - - protected Bitmap doInBackground(String... urls) { - String url = urls[0]; - Bitmap bitmap = null; - FileOutputStream out = null; - InputStream inStream; - HttpsURLConnection connection; - try { - connection = NetCipher.getHttpsURLConnection(url); - inStream = connection.getInputStream(); - bitmap = BitmapFactory.decodeStream(inStream); - - // Save to file if not null - if (savePath != null) { - out = new FileOutputStream(savePath); - bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); - } - - try { - inStream.close(); - } catch (IOException e) {/*Nothing*/} - - connection.disconnect(); - - } catch (Exception e) { - AppLog.e(this, e.getMessage()); - } finally { - try { - if (out != null) { - out.close(); - } - } catch (IOException ignored) { - } - } - return bitmap; - } - - protected void onPostExecute(Bitmap result) { - // Display on imageview if not null - if (imageView != null) { - imageView.setImageBitmap(result); - } - } -} diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java b/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java index 9e10a218..6cb85c8f 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/web/ContextMenuWebView.java @@ -18,30 +18,27 @@ */ package com.github.dfa.diaspora_android.web; -import android.Manifest; import android.app.Activity; -import android.app.AlertDialog; -import android.app.DownloadManager; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; -import android.content.pm.PackageManager; -import android.graphics.Bitmap; import android.net.Uri; -import android.os.Environment; import android.util.AttributeSet; import android.view.ContextMenu; import android.view.MenuItem; import android.widget.Toast; +import com.github.dfa.diaspora_android.BuildConfig; import com.github.dfa.diaspora_android.R; -import com.github.dfa.diaspora_android.activity.MainActivity; -import com.github.dfa.diaspora_android.service.ImageDownloadTask; -import com.github.dfa.diaspora_android.util.ActivityUtils; +import com.github.dfa.diaspora_android.util.AppSettings; + +import net.gsantner.opoc.util.DownloadTask; +import net.gsantner.opoc.util.PermissionChecker; +import net.gsantner.opoc.util.ShareUtil; import java.io.File; +import java.util.Date; /** * Subclass of WebView which adds a context menu for long clicks on images or links to share, save @@ -81,108 +78,46 @@ public class ContextMenuWebView extends NestedWebView { public boolean onMenuItemClick(MenuItem item) { HitTestResult result = getHitTestResult(); String url = result.getExtra(); + final ShareUtil shu = new ShareUtil(context).setFileProviderAuthority(BuildConfig.APPLICATION_ID); + final PermissionChecker permc = new PermissionChecker(parentActivity); + final AppSettings appSettings = new AppSettings(context); + switch (item.getItemId()) { //Save image to external memory case ID_SAVE_IMAGE: { - boolean writeToStoragePermitted = true; - if (android.os.Build.VERSION.SDK_INT >= 23) { - int hasWRITE_EXTERNAL_STORAGE = parentActivity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); - if (hasWRITE_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) { - writeToStoragePermitted = false; - if (!parentActivity.shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - new AlertDialog.Builder(parentActivity) - .setMessage(R.string.permissions_image) - .setPositiveButton(context.getText(android.R.string.yes), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (android.os.Build.VERSION.SDK_INT >= 23) - parentActivity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, - MainActivity.REQUEST_CODE__ACCESS_EXTERNAL_STORAGE); - } - }) - .setCancelable(false) - .setNegativeButton(context.getText(android.R.string.no), null) - .show(); - } - parentActivity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, - MainActivity.REQUEST_CODE__ACCESS_EXTERNAL_STORAGE); - } - } - if (writeToStoragePermitted) { - //Make sure, Diaspora Folder exists - File destinationFolder = new File(Environment.getExternalStorageDirectory() + "/Pictures/Diaspora"); - if (!destinationFolder.exists()) { - destinationFolder.mkdirs(); - } - - if (url != null) { - Uri source = Uri.parse(url); + if (permc.doIfExtStoragePermissionGranted(context.getString(R.string.permissions_image))) { + File fileSaveDirectory = appSettings.getAppSaveDirectory(); + if (permc.mkdirIfStoragePermissionGranted(fileSaveDirectory)) { + String filename = "dandelion-" + ShareUtil.SDF_SHORT.format(new Date()) + url.substring(url.lastIndexOf(".")); + /*Uri source = Uri.parse(url); DownloadManager.Request request = new DownloadManager.Request(source); - File destinationFile = new File(Environment.getExternalStorageDirectory() + "/Pictures/Diaspora/" + System.currentTimeMillis() + ".png"); - - request.setDestinationUri(Uri.fromFile(destinationFile)); - ((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request); - - Toast.makeText(context, context.getText(R.string.share__toast_saved_image_to_location) + " " + - destinationFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); + request.setDestinationUri(Uri.fromFile(new File(fileSaveDirectory, filename))); + ((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);*/ + new DownloadTask(new File(fileSaveDirectory, filename), (ok, dlfile) -> { + if (ok) { + Toast.makeText(context, context.getText(R.string.share__toast_saved_image_to_location) + " " + dlfile.getName(), Toast.LENGTH_LONG).show(); + } + }).execute(url); } } - } - break; - - case ID_SHARE_IMAGE: - if (url != null) { - boolean writeToStoragePermitted = true; - if (android.os.Build.VERSION.SDK_INT >= 23) { - int hasWRITE_EXTERNAL_STORAGE = parentActivity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); - if (hasWRITE_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) { - writeToStoragePermitted = false; - if (!parentActivity.shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - new AlertDialog.Builder(parentActivity) - .setMessage(R.string.permissions_image) - .setPositiveButton(context.getText(android.R.string.yes), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (android.os.Build.VERSION.SDK_INT >= 23) - parentActivity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, - MainActivity.REQUEST_CODE__ACCESS_EXTERNAL_STORAGE); - } - }) - .setNegativeButton(context.getText(android.R.string.no), null) - .show(); - } else { - parentActivity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, - MainActivity.REQUEST_CODE__ACCESS_EXTERNAL_STORAGE); - } - } - } - if (writeToStoragePermitted) { - //Make sure, Diaspora Folder exists - File destinationFolder = new File(Environment.getExternalStorageDirectory() + "/Pictures/Diaspora"); - if (!destinationFolder.exists()) { - destinationFolder.mkdirs(); - } - - final Uri local = Uri.parse(Environment.getExternalStorageDirectory() + "/Pictures/Diaspora/" + System.currentTimeMillis() + ".png"); - new ImageDownloadTask(null, local.getPath()) { - @Override - protected void onPostExecute(Bitmap result) { - - Uri myUri = ActivityUtils.getFileSharingUri(context, new File(local.getPath())); - Intent sharingIntent = new Intent(); - sharingIntent.setAction(Intent.ACTION_SEND); - sharingIntent.putExtra(Intent.EXTRA_STREAM, myUri); - sharingIntent.setType("image/png"); - sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - context.startActivity(Intent.createChooser(sharingIntent, getResources().getString(R.string.action_share_dotdotdot))); - } - }.execute(url); - } - } else { - Toast.makeText(context, "Cannot share image: url is null", Toast.LENGTH_SHORT).show(); - } - break; + } + + case ID_SHARE_IMAGE: { + if (permc.doIfExtStoragePermissionGranted(context.getString(R.string.permissions_image))) { + File fileSaveDirectory = appSettings.getAppSaveDirectory(); + if (permc.mkdirIfStoragePermissionGranted(fileSaveDirectory)) { + String filename = ".dandelion-shared" + url.substring(url.lastIndexOf(".")); + new DownloadTask(new File(fileSaveDirectory, filename), (ok, dlfile) -> { + if (ok) { + Toast.makeText(context, context.getText(R.string.share__toast_saved_image_to_location) + " " + dlfile.getName(), Toast.LENGTH_LONG).show(); + shu.shareStream(dlfile, "image/" + dlfile.getAbsolutePath().lastIndexOf(".") + 1); + } + }).execute(url); + } + } + break; + } case ID_IMAGE_EXTERNAL_BROWSER: if (url != null) { diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/CustomTabsHelper.java b/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/CustomTabsHelper.java index 29ea60bb..aaa89f06 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/CustomTabsHelper.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/web/custom_tab/CustomTabsHelper.java @@ -108,7 +108,7 @@ public class CustomTabsHelper { sPackageNameToUse = CHROMIUM; } else if (packagesSupportingCustomTabs.contains(FENNEC)) { sPackageNameToUse = FENNEC; - }else if (packagesSupportingCustomTabs.contains(KLAR)) { + } else if (packagesSupportingCustomTabs.contains(KLAR)) { sPackageNameToUse = KLAR; } return sPackageNameToUse; diff --git a/app/src/main/java/net/gsantner/opoc/format/markdown/SimpleMarkdownParser.java b/app/src/main/java/net/gsantner/opoc/format/markdown/SimpleMarkdownParser.java index d42c73e5..adaafa3b 100644 --- a/app/src/main/java/net/gsantner/opoc/format/markdown/SimpleMarkdownParser.java +++ b/app/src/main/java/net/gsantner/opoc/format/markdown/SimpleMarkdownParser.java @@ -9,7 +9,7 @@ * #########################################################*/ - /* +/* * Parses most common markdown tags. Only inline tags are supported, multiline/block syntax * is not supported (citation, multiline code, ..). This is intended to stay as easy as possible. * diff --git a/app/src/main/java/net/gsantner/opoc/preference/nonsupport/LanguagePreference.java b/app/src/main/java/net/gsantner/opoc/preference/nonsupport/LanguagePreference.java index 52dfc3d1..76284a11 100644 --- a/app/src/main/java/net/gsantner/opoc/preference/nonsupport/LanguagePreference.java +++ b/app/src/main/java/net/gsantner/opoc/preference/nonsupport/LanguagePreference.java @@ -48,8 +48,8 @@ package net.gsantner.opoc.preference.nonsupport; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; -import android.support.annotation.Nullable; import android.preference.ListPreference; +import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.AttributeSet; diff --git a/app/src/main/java/net/gsantner/opoc/util/DownloadTask.java b/app/src/main/java/net/gsantner/opoc/util/DownloadTask.java new file mode 100644 index 00000000..aec5b868 --- /dev/null +++ b/app/src/main/java/net/gsantner/opoc/util/DownloadTask.java @@ -0,0 +1,57 @@ +/* + This file is part of the dandelion*. + + dandelion* is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dandelion* is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the dandelion*. + + If not, see . + */ +package net.gsantner.opoc.util; + +import android.os.AsyncTask; +import android.support.annotation.Nullable; + +import java.io.File; +import java.io.IOException; + +import javax.net.ssl.HttpsURLConnection; + +import info.guardianproject.netcipher.NetCipher; + +public class DownloadTask extends AsyncTask { + private File _targetFile; + private Callback.a2 _callback; + + public DownloadTask(File targetFile, @Nullable Callback.a2 callback) { + _targetFile = targetFile; + _callback = callback; + } + + protected Boolean doInBackground(String... urls) { + if (urls != null && urls.length > 0 && urls[0] != null) { + try { + HttpsURLConnection connection = NetCipher.getHttpsURLConnection(urls[0]); + return NetworkUtils.downloadFile(null, _targetFile, connection, null); + } catch (IOException e) { + e.printStackTrace(); + } + } + return false; + } + + protected void onPostExecute(Boolean result) { + if (_callback != null) { + _callback.callback(result, _targetFile); + } + } +} diff --git a/app/src/main/java/net/gsantner/opoc/util/NetworkUtils.java b/app/src/main/java/net/gsantner/opoc/util/NetworkUtils.java index f4586d7b..ebd7c31d 100644 --- a/app/src/main/java/net/gsantner/opoc/util/NetworkUtils.java +++ b/app/src/main/java/net/gsantner/opoc/util/NetworkUtils.java @@ -53,11 +53,16 @@ public class NetworkUtils { } public static boolean downloadFile(final URL url, final File outFile, final Callback.a1 progressCallback) { + return downloadFile(url, outFile, null, progressCallback); + } + + public static boolean downloadFile(final URL url, final File outFile, HttpURLConnection connection, final Callback.a1 progressCallback) { InputStream input = null; OutputStream output = null; - HttpURLConnection connection = null; try { - connection = (HttpURLConnection) url.openConnection(); + if (connection == null) { + connection = (HttpURLConnection) url.openConnection(); + } connection.connect(); input = connection.getInputStream();