package shts.jp.android.nogifeed.fragments; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Bundle; import android.os.Looper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import com.squareup.otto.Subscribe; import net.i2p.android.ext.floatingactionbutton.FloatingActionButton; import net.i2p.android.ext.floatingactionbutton.FloatingActionsMenu; import java.io.File; import java.util.ArrayList; import shts.jp.android.nogifeed.R; import shts.jp.android.nogifeed.activities.PermissionRequireActivity; import shts.jp.android.nogifeed.models.Entry; import shts.jp.android.nogifeed.models.eventbus.BusHolder; import shts.jp.android.nogifeed.providers.dao.UnreadArticles; import shts.jp.android.nogifeed.utils.PreferencesUtils; import shts.jp.android.nogifeed.utils.SdCardUtils; import shts.jp.android.nogifeed.utils.ShareUtils; import shts.jp.android.nogifeed.utils.SimpleImageDownloader; import shts.jp.android.nogifeed.utils.WaitMinimunImageDownloader; import shts.jp.android.nogifeed.views.dialogs.DownloadConfirmDialog; public class BlogFragment extends Fragment { private static final String TAG = BlogFragment.class.getSimpleName(); private static final int DOWNLOAD = 0; private static final int DOWNLOAD_LIST = 1; private WebView webView; private CoordinatorLayout coordinatorLayout; private FloatingActionButton fabDownload; private FloatingActionsMenu floatingActionsMenu; private Entry entry; public static BlogFragment newInstance(Entry entry) { Bundle bundle = new Bundle(); bundle.putParcelable("entry", entry); BlogFragment blogFragment = new BlogFragment(); blogFragment.setArguments(bundle); return blogFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); if (savedInstanceState != null) { entry = savedInstanceState.getParcelable("entry"); } else { entry = getArguments().getParcelable("entry"); } } @Override public void onSaveInstanceState(Bundle outState) { outState.putParcelable("entry", entry); super.onSaveInstanceState(outState); } @Override public void onResume() { super.onResume(); BusHolder.get().register(this); } @Override public void onPause() { super.onPause(); BusHolder.get().unregister(this); } @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @SuppressLint("InflateParams") View view = inflater.inflate(R.layout.fragment_blog, null); floatingActionsMenu = (FloatingActionsMenu) view.findViewById(R.id.multiple_actions); FloatingActionButton fabShare = (FloatingActionButton) view.findViewById(R.id.fab_action_share); fabShare.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { floatingActionsMenu.collapse(); startActivity(ShareUtils.getShareBlogIntent(entry)); } }); fabDownload = (FloatingActionButton) view.findViewById(R.id.fab_action_download); fabDownload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ArrayList<String> urlList = new ArrayList<>(); if (downloadThumbnail()) { urlList.addAll(entry.getUploadedThumbnailUrls()); } // 高画質画像が有効期限切れのトーストを表示する if (entry.getUploadedRawImageUrls() == null || entry.getUploadedRawImageUrls().isEmpty()) { Toast.makeText(getActivity(), R.string.recomend_download_thumbnail, Toast.LENGTH_SHORT).show(); } else { urlList.addAll(entry.getUploadedRawImageUrls()); } if (urlList.isEmpty()) { if (downloadThumbnail()) { Snackbar.make(coordinatorLayout, R.string.no_download_image, Snackbar.LENGTH_LONG) .show(); } else { Snackbar.make(coordinatorLayout, R.string.recomend_download_thumbnail, Snackbar.LENGTH_LONG) .show(); } return; } fabDownload.setColorNormalResId(R.color.primary); fabDownload.setTitle(getString(R.string.downloading_image)); startActivityForResult(PermissionRequireActivity .getDownloadStartIntent(getActivity(), urlList), DOWNLOAD_LIST); } }); coordinatorLayout = (CoordinatorLayout) view.findViewById(R.id.coordinator); webView = (WebView) view.findViewById(R.id.browser); webView.getSettings().setJavaScriptEnabled(true); webView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { showDownloadConfirmDialog((WebView) view); return false; } }); webView.setWebViewClient(new BrowserViewClient()); webView.loadUrl(entry.getUrl()); UnreadArticles.remove(getContext(), entry.getUrl()); return view; } private boolean downloadThumbnail() { return PreferencesUtils.getBoolean(getContext(), getString(R.string.setting_enable_thumbnail_download_key), true); } private void showDownloadConfirmDialog(WebView webView) { WebView.HitTestResult hr = webView.getHitTestResult(); if ((WebView.HitTestResult.IMAGE_TYPE == hr.getType()) || (WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE == hr.getType())) { final String url = hr.getExtra(); DownloadConfirmDialog confirmDialog = new DownloadConfirmDialog(); confirmDialog.setCallbacks(new DownloadConfirmDialog.Callbacks() { @Override public void onClickPositiveButton() { startActivityForResult(PermissionRequireActivity .getDownloadStartIntent(getActivity(), url), DOWNLOAD); } @Override public void onClickNegativeButton() {} }); confirmDialog.show(getFragmentManager(), TAG); } } private class BrowserViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (Uri.parse(url).getHost().equals("blog.nogizaka46.com")) { return super.shouldOverrideUrlLoading(view, url); } Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != Activity.RESULT_OK) { fabDownload.setColorNormalResId(R.color.accent); fabDownload.setTitle(getString(R.string.download_image)); Snackbar.make(coordinatorLayout, R.string.no_permission_download, Snackbar.LENGTH_LONG) .show(); return; } switch (requestCode) { case DOWNLOAD: if (!new SimpleImageDownloader(getActivity(), data.getStringArrayListExtra( PermissionRequireActivity.ExtraKey.DOWNLOAD)).get()) { Snackbar.make(coordinatorLayout, R.string.failed_to_download, Snackbar.LENGTH_LONG) .show(); } break; case DOWNLOAD_LIST: if (!new WaitMinimunImageDownloader(getActivity(), data.getStringArrayListExtra( PermissionRequireActivity.ExtraKey.DOWNLOAD)).get()) { Snackbar.make(coordinatorLayout, R.string.failed_to_download, Snackbar.LENGTH_LONG) .show(); } break; } } /** * WaitMinimunImageDownloader のコールバック * @param callback callback */ @Subscribe public void onFinishDownload( WaitMinimunImageDownloader.Callback.CompleteDownloadImage callback) { fabDownload.setColorNormalResId(R.color.accent); fabDownload.setTitle(getString(R.string.download_image)); if (callback != null && !callback.responseList.isEmpty() && callback.responseList != null) { for (int i = callback.responseList.size(); 0 < i; --i) { WaitMinimunImageDownloader.Response response = callback.responseList.get(i - 1); File file = response.getFile(); if (file != null) { scanComplete(getActivity(), file, 0 <= i); } } } } /** * SimpleImageDownloader のコールバック * @param callback callback */ @Subscribe public void onFinishDownload(SimpleImageDownloader.Callback callback) { fabDownload.setColorNormalResId(R.color.accent); fabDownload.setTitle(getString(R.string.download_image)); if (callback != null && callback.file != null) { scanComplete(getActivity(), callback.file); } } private void scanComplete(@Nullable Context context, @NonNull File file) { scanComplete(context, file, true); } private void scanComplete(@Nullable Context context, @NonNull File file, final boolean showSnackbar) { if (context == null) return; SdCardUtils.scanFile(context, file, new MediaScannerConnection.OnScanCompletedListener() { @Override public void onScanCompleted(String path, final Uri uri) { new android.os.Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { if (showSnackbar) showSnackbar(uri); } }); } }); } private void showSnackbar(final Uri uri) { Snackbar.make(coordinatorLayout, R.string.download_finish, Snackbar.LENGTH_LONG) .setAction(R.string.confirm, new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(uri, "image/jpeg"); startActivity(intent); } }) .setActionTextColor(ContextCompat.getColor(getActivity(), R.color.accent)) .show(); } public boolean goBack() { if (webView.canGoBack()) { webView.goBack(); return true; } return false; } public boolean onBackPressed() { if (floatingActionsMenu != null && floatingActionsMenu.isExpanded()) { floatingActionsMenu.collapse(); return true; } return false; } }