package org.wordpress.android.task; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.Log; import com.justsystems.hpb.pad.AbsStartPageActivity; import com.justsystems.hpb.pad.util.Debug; import org.xmlrpc.android.XMLRPCClient; import org.xmlrpc.android.XMLRPCException; import org.wordpress.android.WordPress; import org.wordpress.android.models.PostType; import org.wordpress.android.ui.WPActionBarActivity; public final class RefreshMenuTask extends MultiAsyncTask<Integer, Integer, Void> { private final WPActionBarActivity activity; private static final int PROGRESS_UPDATE_LIST = 1; private static final int PROGRESS_UPDATE_IMAGE = 2; private static final boolean IS_LOAD_ICON = false; private static boolean isUnderTask = false; public RefreshMenuTask(WPActionBarActivity activity) { this.activity = activity; isUnderTask = true; } @Override protected Void doInBackground(Integer... params) { if (params.length <= 0) { return null; } final Map<String, String> fields = new HashMap<String, String>(); fields.put("labels", "labels"); fields.put("cap", "cap"); fields.put("menu", "menu"); fields.put("taxonomies", "taxonomies"); final Map<String, Object> filter = new HashMap<String, Object>(); filter.put("_builtin", false); filter.put("public", true); filter.put("show_ui", true); int id = params[0]; List<Object> blogVals = WordPress.wpDB.loadSettings(id); final String url = blogVals.get(0).toString(); final String httpUser = blogVals.get(4).toString(); final String httpPassword = blogVals.get(5).toString(); final int blogId = (Integer) blogVals.get(12); final String userName = blogVals.get(2).toString(); final String password = blogVals.get(3).toString(); XMLRPCClient client = new XMLRPCClient(url, httpUser, httpPassword); Object[] vParams = { blogId, userName, password, filter, fields }; final Object versionResult; try { versionResult = client.call("wp.getPostTypes", vParams); } catch (XMLRPCException e) { Log.v("error xmlrcp", e.getMessage()); return null; } if (versionResult == null || !(versionResult instanceof HashMap<?, ?>)) { Debug.logd(this.getClass().toString(), "class cast " + versionResult.getClass().toString() + " cast to hashmap"); //delete old post type WordPress.wpDB.savePostTypes(new HashMap<String, String>(), id); publishProgress(PROGRESS_UPDATE_LIST); return null; } HashMap<?, ?> map = (HashMap<?, ?>) versionResult; WordPress.wpDB.savePostTypes(map, id); saveTaxonomy(client, blogId, id, userName, password); publishProgress(PROGRESS_UPDATE_LIST); ArrayList<PostType> items = new ArrayList<PostType>(); String[] names = WordPress.wpDB.getPostTypes(id); for (String name : names) { PostType type = new PostType(id, name); items.add(type); } if (IS_LOAD_ICON) { for (int i = 0; i < items.size(); i++) { PostType type = items.get(i); saveIcon(type); } } return null; } private void saveIcon(PostType type) { final String urlString = type.getMenuIcon(); if (urlString == null) { return; } final Bitmap bitmap; try { URL iconUrl = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) iconUrl .openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); bitmap = BitmapFactory.decodeStream(input); } catch (OutOfMemoryError e) { e.printStackTrace(); return; } catch (IOException e) { e.printStackTrace(); return; } try { // ローカルファイルへ保存 File dir = new File(activity.getFilesDir().getAbsolutePath() + File.separator + type.getBlogID()); if (!dir.exists()) { dir.mkdir(); } final FileOutputStream out = new FileOutputStream( dir.getAbsolutePath() + File.separator + type.getName() + ".png"); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); out.close(); } catch (IOException e) { e.printStackTrace(); return; } final Drawable d = new BitmapDrawable(this.activity.getResources(), bitmap); type.setIcon(d); publishProgress(PROGRESS_UPDATE_IMAGE); } public static void saveTaxonomy(XMLRPCClient client, int blogId, int blogUniqueId, String userName, String password) { final Map<String, String> fields = new HashMap<String, String>(); fields.put("labels", "labels"); fields.put("cap", "cap"); fields.put("object_type", "object_type"); final Map<String, Object> filter = new HashMap<String, Object>(); // filter.put("_builtin", false); Object[] vParams = { blogId, userName, password, filter, fields }; final Object versionResult; try { versionResult = client.call("wp.getTaxonomies", vParams); } catch (XMLRPCException e) { Log.v("error xmlrcp", e.getMessage()); return; } if (versionResult == null) { return; } if (!(versionResult instanceof Object[])) { Debug.logd("Refresh Menu Task", "class cast " + versionResult.getClass().toString() + " cast to hashmap"); return; } Object[] maps = (Object[]) versionResult; Log.v("count", maps.length + ""); if (maps.length > 0) { WordPress.wpDB.saveTaxonomies(maps, blogUniqueId); } } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if (values.length == 0) { return; } final int type = values[0]; switch (type) { case PROGRESS_UPDATE_LIST: this.activity.updateMenuDrawer(); if (this.activity instanceof AbsStartPageActivity) { ((AbsStartPageActivity) activity).onTypeUpdated(); } break; case PROGRESS_UPDATE_IMAGE: this.activity.invalidateList(); break; default: break; } } @Override protected void onPostExecute(Void v) { isUnderTask = false; } @Override protected void onCancelled() { super.onCancelled(); isUnderTask = false; } public static boolean isUnedrTask() { return isUnderTask; } }