package info.justaway; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentActivity; import android.support.v4.content.ContextCompat; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; import com.viewpagerindicator.CirclePageIndicator; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; import butterknife.ButterKnife; import butterknife.Bind; import info.justaway.adapter.SimplePagerAdapter; import info.justaway.fragment.ScaleImageFragment; import info.justaway.model.TwitterManager; import info.justaway.util.MessageUtil; import info.justaway.util.StatusUtil; import info.justaway.widget.ScaleImageViewPager; /** * 画像の拡大表示用のActivity、かぶせて使う * * @author aska */ public class ScaleImageActivity extends FragmentActivity { @Bind(R.id.pager) ScaleImageViewPager pager; @Bind(R.id.symbol) CirclePageIndicator symbol; private ArrayList<String> imageUrls = new ArrayList<>(); private SimplePagerAdapter simplePagerAdapter; static final int REQUEST_PERMISSIONS_STORAGE = 1; public ScaleImageActivity() { } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_scale_image); ButterKnife.bind(this); simplePagerAdapter = new SimplePagerAdapter(this, pager); symbol.setViewPager(pager); pager.setOffscreenPageLimit(4); String firstUrl; // インテント経由での起動をサポート Intent intent = getIntent(); if (Intent.ACTION_VIEW.equals(intent.getAction())) { Uri data = intent.getData(); if (data == null) { return; } firstUrl = data.toString(); } else { Bundle args = intent.getExtras(); if (args == null) { return; } twitter4j.Status status = (twitter4j.Status) args.getSerializable("status"); if (status != null) { Integer index = args.getInt("index", 0); showStatus(status, index); } firstUrl = args.getString("url"); } if (firstUrl == null) { return; } Pattern pattern = Pattern.compile("https?://twitter\\.com/\\w+/status/(\\d+)/photo/(\\d+)/?.*"); Matcher matcher = pattern.matcher(firstUrl); if (matcher.find()) { final Long statusId = Long.valueOf(matcher.group(1)); new AsyncTask<Void, Void, twitter4j.Status>() { @Override protected twitter4j.Status doInBackground(Void... params) { try { return TwitterManager.getTwitter().showStatus(statusId); } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(twitter4j.Status status) { if (status != null) { showStatus(status, 0); } } }.execute(); return; } symbol.setVisibility(View.GONE); imageUrls.add(firstUrl); Bundle args = new Bundle(); args.putString("url", firstUrl); simplePagerAdapter.addTab(ScaleImageFragment.class, args); simplePagerAdapter.notifyDataSetChanged(); } public void showStatus(twitter4j.Status status, Integer index) { ArrayList<String> urls = StatusUtil.getImageUrls(status); if (urls.size() == 1) { symbol.setVisibility(View.GONE); } for (final String imageURL : urls) { imageUrls.add(imageURL); Bundle args = new Bundle(); args.putString("url", imageURL); simplePagerAdapter.addTab(ScaleImageFragment.class, args); } simplePagerAdapter.notifyDataSetChanged(); pager.setCurrentItem(index); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.scale_image, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); if (itemId == R.id.save) { int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { saveImage(); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS_STORAGE); } } return true; } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_PERMISSIONS_STORAGE: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { saveImage(); } else { MessageUtil.showToast(R.string.toast_save_image_failure); } } } } public void saveImage() { final URL url; try { url = new URL(imageUrls.get(pager.getCurrentItem())); } catch (MalformedURLException e) { e.printStackTrace(); MessageUtil.showToast(R.string.toast_save_image_failure); return; } AsyncTask<Void, Void, Boolean> task = new AsyncTask<Void, Void, Boolean>() { @Override protected Boolean doInBackground(Void... params) { int count; Boolean isSuccess; try { URLConnection connection = url.openConnection(); connection.connect(); InputStream input = new BufferedInputStream(url.openStream(), 10 * 1024); File root = new File(Environment.getExternalStorageDirectory(), "/Download/"); File file = new File(root, new Date().getTime() + ".jpg"); OutputStream output = new FileOutputStream(file); byte data[] = new byte[1024]; while ((count = input.read(data)) != -1) { output.write(data, 0, count); } output.flush(); output.close(); input.close(); String[] paths = {file.getPath()}; String[] types = {"image/jpeg"}; MediaScannerConnection.scanFile(getApplicationContext(), paths, types, null); isSuccess = true; } catch (Exception e) { e.printStackTrace(); isSuccess = false; } return isSuccess; } @Override protected void onPostExecute(Boolean isSuccess) { if (isSuccess) { MessageUtil.showToast(R.string.toast_save_image_success); } else { MessageUtil.showToast(R.string.toast_save_image_failure); } } }; task.execute(); } }