package com.justsystems.hpb.pad; import java.io.File; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.graphics.Matrix; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.MarginLayoutParams; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.justsystems.hpb.pad.util.Debug; import org.wordpress.android.util.DeviceUtils; public class SiteThumbnailFragment extends Fragment { static final String CAPTURE_DIRECTORY = "capture"; private LinearLayout holder = null; private ImageView image; private int blogId; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.blogId = getArguments().getInt("id"); this.image = (ImageView) inflater.inflate(R.layout.site_preview, null); if (setMainImage()) { return image; } else { this.holder = (LinearLayout) inflater.inflate( R.layout.preview_loading, null); this.holder.addView(this.image); this.image.setVisibility(View.GONE); onSelected(); return holder; } } @Override public void onDestroyView() { super.onDestroyView(); this.holder = null; this.image = null; } public void onSelected() { if (holder != null) { if (DeviceUtils.isConnected(getActivity().getApplicationContext())) { holder.findViewById(R.id.progressBar1).setVisibility( View.VISIBLE); TextView tv = (TextView) holder.findViewById(R.id.textView1); tv.setText(R.string.loading); } else { holder.findViewById(R.id.progressBar1).setVisibility(View.GONE); TextView tv = (TextView) holder.findViewById(R.id.textView1); tv.setText(R.string.connection_error); } } } private Drawable getPreviewPicture() { String fileName = getActivity().getFilesDir().getAbsolutePath() + File.separator + CAPTURE_DIRECTORY + File.separator + blogId + ".png"; Bitmap bitmap = null; if (new File(fileName).exists()) { bitmap = tryLoadPicture(fileName); } if (bitmap == null) { return null; } else { return new BitmapDrawable(getActivity().getResources(), bitmap); } } private Bitmap tryLoadPicture(final String fileName) { BitmapFactory.Options options = new Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(fileName, options); for (int i = 0; i < 10; i++) { Bitmap bmp = null; try { switch (i) { case 0: options = new Options(); options.inPreferredConfig = Config.RGB_565; bmp = BitmapFactory.decodeFile(fileName, options); break; default: options = new Options(); options.inPreferredConfig = Config.RGB_565; options.inSampleSize = (int) Math.pow(2, i); bmp = BitmapFactory.decodeFile(fileName, options); } } catch (OutOfMemoryError e) { Debug.toast(getActivity(), i + "OOM " + blogId); System.gc(); } if (options.outWidth > 0) { return bmp; } } return null; } private static boolean isXLargeLandscape(Context context) { final Configuration conf = context.getResources().getConfiguration(); final boolean xLarge = (conf.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4; final boolean isLandScape = conf.orientation == Configuration.ORIENTATION_LANDSCAPE; return xLarge && isLandScape; } static int getViewWidth(Context context, boolean withMargin) { // FIXME レイアウトに依存しすぎるコード Resources r = context.getResources(); final int width; if (isXLargeLandscape(context)) { width = r.getDisplayMetrics().widthPixels - r.getDimensionPixelSize(R.dimen.menu_drawer_size); } else { width = r.getDisplayMetrics().widthPixels; } final int margin = withMargin ? r .getDimensionPixelSize(R.dimen.startpage_page_icon_margin) : 0; final int padding = r .getDimensionPixelSize(R.dimen.startpage_slidingview_padding) + margin; return width - padding * 2; } public void optimizeImageSize(int viewWidth) { if (this.image == null || this.holder != null) { return; } if (viewWidth == -1) { viewWidth = getViewWidth(getActivity(), true); } Drawable d = this.image.getDrawable(); Matrix matrix = this.image.getImageMatrix(); if (matrix == null) { matrix = new Matrix(); this.image.setImageMatrix(matrix); } if (false && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { int dx = (viewWidth - d.getIntrinsicWidth()) / 2; matrix.setScale(1.0f, 1.0f); LayoutParams params = this.image.getLayoutParams(); MarginLayoutParams marginParams; if (params == null) { marginParams = new RelativeLayout.LayoutParams( MarginLayoutParams.MATCH_PARENT, MarginLayoutParams.MATCH_PARENT); this.image.setLayoutParams(marginParams); } else { assert params instanceof MarginLayoutParams; marginParams = (MarginLayoutParams) params; } marginParams.rightMargin = dx; marginParams.leftMargin = dx; } else { LayoutParams params = this.image.getLayoutParams(); if (params != null) { assert params instanceof MarginLayoutParams; MarginLayoutParams marginParams = (MarginLayoutParams) params; marginParams.rightMargin = 0; marginParams.leftMargin = 0; } final float rate = viewWidth / (float) d.getIntrinsicWidth(); matrix.setScale(rate, rate); } this.image.invalidate(); } private boolean setMainImage() { if (getActivity() == null) { return false; } final int viewWidth = getViewWidth(getActivity(), true); Drawable d = getPreviewPicture(); if (d == null) { return false; } else { if (this.holder != null) { this.holder.removeAllViews(); this.holder.addView(this.image); this.image.setVisibility(View.VISIBLE); this.holder = null; } this.image.setImageDrawable(d); if (d instanceof AnimationDrawable) { ((AnimationDrawable) d).start(); } optimizeImageSize(viewWidth); } return true; } public void refreshImage() { setMainImage(); } }