package com.justsystems.hpb.pad;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.ref.WeakReference;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Canvas;
import android.graphics.Picture;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.animation.TranslateAnimation;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import com.actionbarsherlock.app.ActionBar;
import com.justsystems.hpb.pad.AbsSlidingView.OnStateChengeListener;
import com.justsystems.hpb.pad.marketplace.MarketPlaceAdapter;
import com.justsystems.hpb.pad.marketplace.Template;
import com.justsystems.hpb.pad.marketplace.TempleteGetTask;
import com.justsystems.hpb.pad.util.Debug;
import org.wordpress.android.Constants;
import org.wordpress.android.WordPress;
import org.wordpress.android.models.Blog;
import org.wordpress.android.task.MultiAsyncTask;
import org.wordpress.android.task.RefreshMenuTask;
import org.wordpress.android.ui.ViewSiteActivity;
import org.wordpress.android.ui.WPActionBarActivity;
import org.wordpress.android.ui.posts.CustomPostTypePostsActivity;
import org.wordpress.android.ui.posts.EditCustomTypePostActivity;
import org.wordpress.android.ui.posts.EditPostActivity;
import org.wordpress.android.ui.posts.PagesActivity;
import org.wordpress.android.ui.posts.PostsActivity;
import org.wordpress.android.util.DeviceUtils;
public class AbsStartPageActivity extends WPActionBarActivity implements
OnClickListener, OnStateChengeListener, OnPageChangeListener,
OnGestureListener {
private static final int WHAT_LOAD_CAPTURE = 1;
private static final int WHAT_LOAD_CAPTURE_AND_TYPE = 2;
/** 読み込みの遅延時間(長) */
private static final int DELAY_LOADING_SHORT = 1000;
/** 読み込みの遅延時間(短) */
private static final int DELAY_LOADING_LONG = 3000;
private static final int TEMPLETE_COUNT = 5;
/** キャプチャの読み込み時に投稿タイプも読み込むか */
private static final boolean LOAD_TYPE_WITH_CAPTURE = true;
/** ドロワーを下ろすかのフラグ。起動時にドロワーが上から降りてくる際に利用する。 */
private boolean shouldOpenDrawer = true;
private AbsSlidingView drawer;
private WebView webView;
private MyWebviewClient client;
private LinearLayout mpParent;
private ActionBarView barView;
private MarketPlaceAdapter mpAdapter;
private ViewPager preview;
private CustomFragmentStatePagerAdapter siteAdapter;
private ViewPager postType;
private PostTypePagerAdapter typeAdapter;
private ImageView blogLeft;
private ImageView blogRight;
private String loadingUrl;
private Handler loadPageTask;
private ImageView list;
private ImageView newPost;
private ImageView camera;
private GestureDetector detector;
/** サイトのプレビューを更新するかのフラグ */
private boolean refreshImageFlg;
/** 投稿タイプのViewを更新するかのフラグ */
private boolean typeUpdateFlg;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createMenuDrawer(R.layout.new_start_page);
final String prefName = getString(R.string.mp_pref_name);
SharedPreferences pref = getSharedPreferences(prefName, MODE_PRIVATE);
ListView listView = (ListView) findViewById(R.id.template);
LayoutInflater inflater = getLayoutInflater();
this.mpParent = (LinearLayout) inflater.inflate(R.layout.mp_logo, null);
final String promoKey = getString(R.string.pref_promotion);
final String promotion = pref.getString(promoKey, "");
WebView mpPromo = (WebView) mpParent.findViewById(R.id.mp_promo);
mpPromo.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
mpPromo.setBackgroundColor(0x00000000);
if (!"".equals(promotion)) {
setPromotionText(promotion);
}
listView.addHeaderView(mpParent);
this.mpAdapter = new MarketPlaceAdapter(this);
listView.setAdapter(this.mpAdapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Template template = mpAdapter.getItem(position - 1);
if (template == null) {
return;
}
final String url = template.getLink();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
}
});
this.drawer = (AbsSlidingView) findViewById(R.id.slidingDrawer1);
this.drawer.setOnStateChangeListener(this);
this.preview = (ViewPager) findViewById(R.id.preview);
this.preview.setOnTouchListener(new OnTouchListener() {
private final GestureDetector tapGestureDetector = new GestureDetector(
AbsStartPageActivity.this,
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
startViewSite();
return true;
}
});
@Override
public boolean onTouch(View v, MotionEvent event) {
this.tapGestureDetector.onTouchEvent(event);
return false;
}
});
this.blogLeft = (ImageView) findViewById(R.id.type_left);
this.blogLeft.setOnClickListener(this);
this.blogRight = (ImageView) findViewById(R.id.type_right);
this.blogRight.setOnClickListener(this);
this.postType = (ViewPager) findViewById(R.id.postType);
this.webView = (WebView) findViewById(R.id.webview);
this.client = new MyWebviewClient(this);
this.webView.setWebViewClient(this.client);
final WebSettings settings = this.webView.getSettings();
settings.setLoadWithOverviewMode(true);
settings.setUseWideViewPort(true);
this.list = (ImageView) findViewById(R.id.list);
this.list.setOnClickListener(this);
this.newPost = (ImageView) findViewById(R.id.newPost);
this.newPost.setOnClickListener(this);
this.camera = (ImageView) findViewById(R.id.quick_photo);
this.camera.setOnClickListener(this);
ActionBar bar = getSupportActionBar();
bar.setDisplayShowTitleEnabled(false);
bar.setDisplayShowCustomEnabled(true);
bar.setBackgroundDrawable(new ColorDrawable(0xFF4A4848));
//3.xと4.0はアニメーション関連の不具合があるので、特別に処理する
if (DeviceUtils.isOverEqualThanHoneycomb()
&& DeviceUtils.isLessThanJB()) {
this.barView = new ActionBarViewICS(this);
} else {
this.barView = new ActionBarView(this);
}
this.barView.setImageResource(R.drawable.ic_actionbar_logo);
this.barView.setOnTouchListener(touchListener);
ActionBar.LayoutParams params = new ActionBar.LayoutParams(
ActionBar.LayoutParams.MATCH_PARENT,
ActionBar.LayoutParams.MATCH_PARENT);
//アイコンを中心に表示させる
final int marginLeft = getResources().getDimensionPixelSize(
R.dimen.startpage_actionbar_left_margin);
final int marginRight = getResources().getDimensionPixelSize(
R.dimen.startpage_actionbar_right_margin);
params.leftMargin = marginLeft;
params.rightMargin = marginRight;
bar.setCustomView(this.barView, params);
this.detector = new GestureDetector(this, this);
final String timeKey = getString(R.string.pref_last_get_time);
long lastTime = pref.getLong(timeKey, 0);
if (System.currentTimeMillis() - lastTime > 7 * 24 * 60 * 60 * 1000) {
TempleteGetTask task = new TempleteGetTask(this);
task.executeOnMultiThread(TEMPLETE_COUNT);
}
}
private void updateUI() {
final Blog currentBlog = WordPress.getCurrentBlog();
if (currentBlog == null) {
return;
}
final int currentBlogId = currentBlog.getId();
final int[] blogIDs = super.blogIDs;
int currentblogIndex = -1;
for (int i = 0; i < blogIDs.length; i++) {
if (blogIDs[i] == currentBlogId) {
currentblogIndex = i;
break;
}
}
this.siteAdapter = new CustomFragmentStatePagerAdapter(
getSupportFragmentManager(), blogIDs);
this.preview.setAdapter(this.siteAdapter);
this.preview.setCurrentItem(currentblogIndex);
if (currentblogIndex == 0) {
blogLeft.setVisibility(View.GONE);
}
if (currentblogIndex == siteAdapter.getCount() - 1) {
blogRight.setVisibility(View.GONE);
}
this.preview.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
final int blogId = siteAdapter.getCurrentBlogId(position);
WordPress.setCurrentBlog(blogId);
onBlogChanged();
getCurrentFragment().onSelected();
if (position == 0) {
blogLeft.setVisibility(View.GONE);
} else if (blogLeft.getVisibility() == View.GONE) {
blogLeft.setVisibility(View.VISIBLE);
}
if (position == siteAdapter.getCount() - 1) {
blogRight.setVisibility(View.GONE);
} else if (blogRight.getVisibility() == View.GONE) {
blogRight.setVisibility(View.VISIBLE);
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
this.typeAdapter = new PostTypePagerAdapter(this, currentBlog.getId());
this.postType.setAdapter(this.typeAdapter);
setTypeMargin();
this.postType.setOnPageChangeListener(this);
this.postType.setOffscreenPageLimit(5);
this.postType.setCurrentItem(0);
saveCaptureWithDelay(currentBlog.getHomeURL(), currentBlog.getId());
}
@Override
protected void onResume() {
super.onResume();
updateUI();
}
@Override
protected void onDestroy() {
super.onDestroy();
this.webView.stopLoading();
this.webView.setWebViewClient(null);
((ViewGroup) this.webView.getParent()).removeView(this.webView);
this.webView.destroy();
this.webView = null;
}
private SiteThumbnailFragment getCurrentFragment() {
final int index = this.preview.getCurrentItem();
return (SiteThumbnailFragment) this.siteAdapter.getItem(index);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && this.shouldOpenDrawer) {
this.drawer.close();
this.drawer.setVisibility(View.VISIBLE);
this.drawer.animateOpen();
this.shouldOpenDrawer = false;
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (!this.drawer.isOpened()) {
// viewに設定したoffsetがviewPagerの更新によってリセットされる問題があるため回避
this.drawer.open();
onOpen();
}
super.onConfigurationChanged(newConfig);
if (this.siteAdapter != null) {
this.siteAdapter.onConfigurationChanged();
}
if (this.typeAdapter != null) {
setTypeMargin();
}
this.barView.onConfigraionChanged();
}
@Override
public void onClick(View v) {
if (v == this.blogLeft) {
final int current = this.preview.getCurrentItem();
if (current > 0) {
this.preview.setCurrentItem(current - 1);
}
} else if (v == this.blogRight) {
final int current = this.preview.getCurrentItem();
if (this.siteAdapter.getCount() > current + 1) {
this.preview.setCurrentItem(current + 1);
}
} else if (v == this.list) {
startList();
} else if (v == this.newPost) {
startNewPost();
} else if (v == this.camera) {
startCamera();
}
}
@Override
public void onBlogChanged() {
if (!this.drawer.isOpened()) {
// viewに設定したoffsetがviewPagerの更新によってリセットされる問題があるため回避
this.drawer.open();
onOpen();
}
super.onBlogChanged();
if (this.client.saveCaptureTask != null) {
this.client.saveCaptureTask.cancel(false);
}
this.webView.stopLoading();
Handler task = this.client.captureDelayTask;
if (task != null) {
task.removeMessages(MyWebviewClient.WHAT_CAPTURE);
}
final Blog currentBlog = WordPress.getCurrentBlog();
saveCaptureWithDelay(currentBlog.getHomeURL(), currentBlog.getId());
this.typeAdapter.onBlogChanged(currentBlog.getId());
this.postType.setCurrentItem(0, false);
}
@Override
public void onOpen() {
this.barView.moveLogoCenter();
if (this.refreshImageFlg) {
getCurrentFragment().refreshImage();
this.refreshImageFlg = false;
}
if (typeUpdateFlg) {
onTypeUpdated();
this.typeUpdateFlg = false;
}
}
@Override
public void onClose() {
this.barView.moveLogoRight();
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int position) {
this.typeAdapter.setSelected(position, true);
this.typeAdapter.setSelected(position - 1, false);
this.typeAdapter.setSelected(position + 1, false);
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Debug.logd("onSingleTapUp");
if (!this.drawer.isOpened()) {
this.drawer.animateOpen();
}
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Debug.logd("onFling");
if (velocityY > 0 && velocityY > Math.abs(velocityX)) {
final float difY = e2.getY() - e1.getY();
final float distY = Math.abs(difY);
final long time = e2.getEventTime() - e1.getEventTime();
final float restY = drawer.getHeight() - distY;
Debug.logd("restY" + restY + " time " + time + " distY" + distY);
final int animationDuration = (int) (time * restY / distY);
Debug.logd("animationDuration" + animationDuration);
if (!this.drawer.isOpened()) {
if (DeviceUtils.isOverEqualThanHoneycomb()) {
this.drawer.open();
} else {
((SlidingView) this.drawer).animateOpen(animationDuration);
}
}
return true;
}
return false;
}
private OnTouchListener touchListener = new OnTouchListener() {
private int prevY;
@Override
public boolean onTouch(View v, MotionEvent event) {
//homeAsUpと被っているところはタッチイベントをスルーする
if (event.getAction() == MotionEvent.ACTION_DOWN
&& event.getX() < -((MarginLayoutParams) barView
.getLayoutParams()).leftMargin) {
return false;
}
if (detector.onTouchEvent(event)) {
return true;
}
if (drawer.isOpened()) {
return true;
}
final int action = event.getAction();
final int y = (int) event.getY();
final int offset = y - prevY;
final int top = drawer.getTop();
final int height = drawer.getHeight();
switch (action) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
if (drawer instanceof SlidingDrawerView) {
break;
}
SlidingView view = (SlidingView) drawer;
if (y > barView.getBottom()) {
if (top + offset < 0) {
view.offsetTopAndBottom(offset);
} else {
view.offsetTopAndBottom(-top);
}
invalidateDrawer(view);
if (prevY < barView.getBottom()
&& !DeviceUtils.isLessThanJB()) {
TranslateAnimation anim = new TranslateAnimation(0, 0,
0, 0);
anim.setDuration(10);
view.startAnimation(anim);
}
} else {
if (top > -height) {
view.offsetTopAndBottom(-top - height);
invalidateDrawer(view);
}
}
break;
case MotionEvent.ACTION_UP:
if (y > barView.getBottom() + height / 2) {
drawer.open();
} else {
if (drawer instanceof SlidingDrawerView) {
drawer.close();
} else {
view = (SlidingView) drawer;
view.offsetTopAndBottom(-top - height);
invalidateDrawer(view);
}
}
break;
default:
break;
}
this.prevY = y;
return true;
}
private void invalidateDrawer(SlidingView view) {
final int top = drawer.getTop();
final int height = drawer.getHeight();
view.invalidate(0, -top, drawer.getWidth(), height - top);
}
};
public void invalidateMpItem() {
this.mpAdapter.setItem();
}
public void onTypeUpdated() {
if (!drawer.isOpened()) {
// viewに設定したoffsetがviewPagerの更新によってリセットされる問題があるため回避
this.typeUpdateFlg = true;
return;
}
final Blog currentBlog = WordPress.getCurrentBlog();
this.typeAdapter = new PostTypePagerAdapter(this, currentBlog.getId());
setTypeMargin();
this.postType.setAdapter(this.typeAdapter);
}
public void setPromotionText(String promotion) {
WebView mpPromo = (WebView) mpParent.findViewById(R.id.mp_promo);
if (!"".equals(promotion)) {
mpPromo.loadDataWithBaseURL("", promotion, "text/html", "utf-8", "");
if (mpPromo.getVisibility() == View.GONE) {
mpPromo.setVisibility(View.VISIBLE);
}
} else {
if (mpPromo.getVisibility() == View.VISIBLE) {
mpPromo.setVisibility(View.GONE);
}
}
}
private void setTypeMargin() {
final int viewWidth = SiteThumbnailFragment.getViewWidth(this, false);
final int margin = viewWidth * 2 / 3;
this.postType.setPageMargin(-margin);
this.typeAdapter.setTextViewPadding(margin / 2);
}
private void saveCaptureWithDelay(final String url, final int blogId) {
if (this.loadPageTask != null) {
this.loadPageTask.removeMessages(WHAT_LOAD_CAPTURE);
this.loadPageTask.removeMessages(WHAT_LOAD_CAPTURE_AND_TYPE);
}
this.loadPageTask = new Handler() {
@Override
public void handleMessage(Message msg) {
loadPageTask = null;
switch (msg.what) {
case WHAT_LOAD_CAPTURE_AND_TYPE:
Blog currentBlog = WordPress.getCurrentBlog();
if (!currentBlog.isDotcomFlag()) {
new RefreshMenuTask(AbsStartPageActivity.this)
.executeOnMultiThread(blogId);
}
// do not break
default:
saveCaptureInner(url, blogId);
break;
}
}
};
File preview = new File(getFilesDir().getAbsolutePath()
+ File.separator + SiteThumbnailFragment.CAPTURE_DIRECTORY
+ File.separator + blogId + ".png");
if (!LOAD_TYPE_WITH_CAPTURE && preview.exists()) {
this.loadPageTask.sendEmptyMessageDelayed(WHAT_LOAD_CAPTURE,
DELAY_LOADING_LONG);
} else {
this.loadPageTask.sendEmptyMessageDelayed(
WHAT_LOAD_CAPTURE_AND_TYPE, DELAY_LOADING_SHORT);
}
}
private void saveCaptureInner(String url, int blogId) {
if (isFinishing()) {
return;
}
this.client.loadingBlogId = blogId;
this.client.hasError = false;
this.loadingUrl = url;
this.webView.loadUrl(url);
}
private void startViewSite() {
Intent intent = new Intent(this, ViewSiteActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
}
private void startList() {
final int selected = this.postType.getCurrentItem();
final String postType = this.typeAdapter.getSelectedPostType(selected);
if (postType.equals("post")) {
Intent intent = new Intent(this, PostsActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
} else if (postType.equals("page")) {
Intent intent = new Intent(this, PagesActivity.class);
intent.putExtra("id", WordPress.currentBlog.getId());
intent.putExtra("isNew", true);
intent.putExtra("viewPages", true);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
} else {
Intent intent = new Intent(this, CustomPostTypePostsActivity.class);
intent.putExtra("id", WordPress.currentBlog.getId());
intent.putExtra("isNew", true);
intent.putExtra("type_name", postType);
final String typeLabel = typeAdapter.getPageTitle(selected)
.toString();
intent.putExtra("type_label", typeLabel);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
}
finish();
}
private void startNewPost() {
final int selected = this.postType.getCurrentItem();
final String postType = this.typeAdapter.getSelectedPostType(selected);
if (postType.equals("post")) {
startNewPost(POSTS_ACTIVITY, null);
} else if (postType.equals("page")) {
startNewPost(PAGES_ACTIVITY, null);
} else {
startNewPost(CUSTOM_TYPE_ACTIVITY, postType);
}
finish();
}
private void startCamera() {
final int selected = this.postType.getCurrentItem();
final String postType = this.typeAdapter.getSelectedPostType(selected);
if (postType.equals("post")) {
Intent intent = new Intent(this, EditPostActivity.class);
intent.putExtra(
"quick-media",
DeviceUtils.hasCamera(getApplicationContext()) ? Constants.QUICK_POST_PHOTO_CAMERA
: Constants.QUICK_POST_PHOTO_LIBRARY);
intent.putExtra("isNew", true);
intent.putExtra("fromList", false);
startActivity(intent);
} else if (postType.equals("page")) {
Intent intent = new Intent(this, EditPostActivity.class);
intent.putExtra(
"quick-media",
DeviceUtils.hasCamera(getApplicationContext()) ? Constants.QUICK_POST_PHOTO_CAMERA
: Constants.QUICK_POST_PHOTO_LIBRARY);
intent.putExtra("isNew", true);
intent.putExtra("isPage", true);
intent.putExtra("fromList", false);
startActivity(intent);
} else {
Intent intent = new Intent(this, EditCustomTypePostActivity.class);
intent.putExtra(
"quick-media",
DeviceUtils.hasCamera(getApplicationContext()) ? Constants.QUICK_POST_PHOTO_CAMERA
: Constants.QUICK_POST_PHOTO_LIBRARY);
intent.putExtra("isNew", true);
intent.putExtra("fromList", false);
intent.putExtra("type_name", postType);
final String typeLabel = typeAdapter.getPageTitle(selected)
.toString();
intent.putExtra("type_label", typeLabel);
startActivity(intent);
}
finish();
}
private static final class SaveCaptureTask extends
MultiAsyncTask<Picture, Picture, Bitmap> {
private WeakReference<AbsStartPageActivity> activity;
private WeakReference<SiteThumbnailFragment> fragment;
private final int blogId;
public SaveCaptureTask(AbsStartPageActivity activity, int blogId) {
this.blogId = blogId;
this.activity = new WeakReference<AbsStartPageActivity>(activity);
SiteThumbnailFragment fragment = activity.getCurrentFragment();
this.fragment = new WeakReference<SiteThumbnailFragment>(fragment);
}
@Override
protected Bitmap doInBackground(Picture... params) {
if (params == null || params.length == 0) {
return null;
}
AbsStartPageActivity act = this.activity.get();
if (act == null) {
return null;
}
//そのままだと幅1024で保存され、読み込みの際にOOMを引き起こしやすくなる。
//回避するために画面幅の正方形として保存する。
final int width = DeviceUtils.getSmallestWidthPixcel(act
.getResources());
Picture pic = params[0];
Bitmap bmp = null;
try {
bmp = Bitmap.createBitmap(width, width, Bitmap.Config.RGB_565);
} catch (OutOfMemoryError e) {
//GCしてもう一回トライする
System.gc();
}
if (bmp == null) {
try {
bmp = Bitmap.createBitmap(width, width,
Bitmap.Config.RGB_565);
} catch (OutOfMemoryError e) {
return null;
}
}
final float scale = width / (float) pic.getWidth();
Canvas canvas = new Canvas(bmp);
canvas.save();
canvas.scale(scale, scale);
pic.draw(canvas);
canvas.restore();
try {
File dir = new File(act.getFilesDir().getAbsolutePath()
+ File.separator
+ SiteThumbnailFragment.CAPTURE_DIRECTORY);
if (!dir.exists()) {
dir.mkdir();
}
final FileOutputStream out = new FileOutputStream(
dir.getAbsolutePath() + File.separator + this.blogId
+ ".png");
bmp.compress(CompressFormat.PNG, 100, out);
out.close();
} catch (FileNotFoundException e) {
return null;
} catch (IOException e) {
return null;
}
return bmp;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if (!isCancelled() && result != null) {
SiteThumbnailFragment frag = this.fragment.get();
AbsStartPageActivity activity = this.activity.get();
// viewに設定したoffsetがviewPagerの更新によってリセットされる問題があるため回避
if (frag != null && activity != null
&& activity.drawer.isOpened()) {
frag.refreshImage();
} else if (activity != null) {
activity.refreshImageFlg = true;
}
}
if (result != null) {
result.recycle();
}
}
}
private static class MyWebviewClient extends WebViewClient {
private static final int WHAT_CAPTURE = 1;
private AbsStartPageActivity activity;
private boolean hasError;
private int loadingBlogId;
private Handler captureDelayTask;
private SaveCaptureTask saveCaptureTask;
public MyWebviewClient(AbsStartPageActivity activity) {
this.activity = activity;
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
hasError = true;
}
@Override
public void onPageFinished(final WebView view, String url) {
super.onPageFinished(view, url);
Handler task = activity.loadPageTask;
if ((task != null && task.hasMessages(WHAT_LOAD_CAPTURE))
|| hasError) {
return;
}
// 念のためURLではじく。
if (!url.equals(activity.loadingUrl)) {
return;
}
if (this.captureDelayTask != null) {
this.captureDelayTask.removeMessages(WHAT_CAPTURE);
}
this.captureDelayTask = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (activity == null) {
return;
}
final Picture pic = view.capturePicture();
if (pic == null) {
Debug.toast(activity,
"something was happened. picture null");
return;
} else if (pic.getWidth() <= 10 || pic.getHeight() <= 10) {
//404エラーの際にここにくることがある。
Debug.toast(activity,
"did not save width:" + pic.getWidth()
+ " height:" + pic.getHeight());
return;
}
saveCaptureTask = new SaveCaptureTask(activity,
loadingBlogId);
saveCaptureTask.executeOnMultiThread(pic);
}
};
this.captureDelayTask.sendEmptyMessageDelayed(WHAT_CAPTURE, 1000);
}
}
}