package layout; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.ColorDrawable; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.support.v7.view.ContextThemeWrapper; import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.koushikdutta.async.future.FutureCallback; import com.koushikdutta.ion.Ion; import org.bienvenidoainternet.app.MainActivity; import org.bienvenidoainternet.app.R; import org.bienvenidoainternet.app.RecentPostAdapter; import org.bienvenidoainternet.app.ResponseActivity; import org.bienvenidoainternet.app.ThemeManager; import org.bienvenidoainternet.app.ThreadListAdapter; import org.bienvenidoainternet.app.structure.Board; import org.bienvenidoainternet.app.structure.BoardItem; import org.bienvenidoainternet.app.structure.ReplyID; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; /** * BaiApp - Bienvenido a internet Android Application * Copyright (C) 2016 Renard1911(https://github.com/Renard1911) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ public class FragmentBoardItemList extends Fragment { public static final String ARG_CURRENTBOARD = "currentBoard", ARG_THREAD_ID = "currentThreadId", ARG_MAIN_FRAGMENT = "imMainFragment", SAVED_BOARDITEMS = "savedBoardItems", RECENT_POST_MODE = "recentpostmode", ARG_CURRENT_THREAD = "currentThread"; List idList = new ArrayList<>(); public ArrayList boardItems = new ArrayList(); public Board currentBoard = null; public BoardItem currentThread = null; private boolean imMainFragment; private OnFragmentInteractionListener mListener; private ThreadListAdapter listViewAdapter; private RecentPostAdapter recentPostAdapter; private ListView listViewBoardItems = null;; private ProgressBar loadingBar = null; SharedPreferences settings; private boolean loadingMoreThreads = false; View themedContext; private int currentOffset = 0; ViewGroup rootView; private boolean recentPostMode = false; // ProgressBar barThreadProcess; LinearLayout layoutThreadProcess; TextView txtThreadProcess; ThemeManager tm; public FragmentBoardItemList() { // Required empty public constructor } public static FragmentBoardItemList newInstance(boolean mainFragment, Board board, BoardItem thread){ FragmentBoardItemList fragment = new FragmentBoardItemList(); Bundle args = new Bundle(); args.putParcelable(ARG_CURRENTBOARD, board); args.putParcelable(ARG_CURRENT_THREAD, thread); args.putBoolean(ARG_MAIN_FRAGMENT, mainFragment); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRetainInstance(true); if (getArguments() != null) { this.currentBoard = getArguments().getParcelable(ARG_CURRENTBOARD); this.currentThread = getArguments().getParcelable(ARG_CURRENT_THREAD); this.imMainFragment = getArguments().getBoolean(ARG_MAIN_FRAGMENT); } tm = new ThemeManager(getActivity()); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelableArrayList(SAVED_BOARDITEMS, boardItems); outState.putBoolean(RECENT_POST_MODE, recentPostMode); outState.putParcelable(ARG_CURRENT_THREAD, currentThread); outState.putParcelable(ARG_CURRENTBOARD, currentBoard); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // cargamos la instancia si esta guardada if (savedInstanceState != null){ recentPostMode = savedInstanceState.getBoolean(RECENT_POST_MODE); currentBoard = savedInstanceState.getParcelable(ARG_CURRENTBOARD); currentThread = savedInstanceState.getParcelable(ARG_CURRENT_THREAD); boardItems = savedInstanceState.getParcelableArrayList(SAVED_BOARDITEMS); } // Aplicación del Tema settings = PreferenceManager.getDefaultSharedPreferences(this.getContext()); int themeResId = tm.getCurrentThemeId(); Context context = new ContextThemeWrapper(getActivity(), themeResId); LayoutInflater localInflater = inflater.cloneInContext(context); View v = localInflater.inflate(R.layout.fragment_fragment_thread_list, container, false); themedContext = v; this.rootView = (ViewGroup)v; // Seteamos los controles que son guardados globalmente listViewBoardItems = (ListView)v.findViewById(R.id.lvThreadList); // barThreadProcess = (ProgressBar)rootView.findViewById(R.id.barThreadProcess); layoutThreadProcess = (LinearLayout)rootView.findViewById(R.id.layoutThreadProcess); txtThreadProcess = (TextView)rootView.findViewById(R.id.txtThreadError); this.loadingBar = (ProgressBar)rootView.findViewById(R.id.progressBar); // Agregamos color al divider del listview ColorDrawable cd = new ColorDrawable(tm.getMarginColor()); listViewBoardItems.setDivider(cd); listViewBoardItems.setDividerHeight(1); // registramos los menus del listview registerForContextMenu(listViewBoardItems); // Creamos los dos adaptadores y los seteamos dependiendo del modo del fragmento listViewAdapter = new ThreadListAdapter(v.getContext(), boardItems, tm); recentPostAdapter = new RecentPostAdapter(v.getContext(), boardItems); if (recentPostMode){ listViewBoardItems.setAdapter(recentPostAdapter); }else{ listViewBoardItems.setAdapter(listViewAdapter); } if (!imMainFragment){ listViewAdapter.listThreads = true; } listViewBoardItems.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { if (imMainFragment && !recentPostMode) { BoardItem bi = listViewAdapter.getItem(position); mListener.showThread(currentBoard, bi); }else if (imMainFragment && recentPostMode){ BoardItem bi = boardItems.get(position); mListener.showThread(bi.getParentBoard(), bi); } } }); listViewBoardItems.setOnScrollListener(new AbsListView.OnScrollListener() { private int lastFirstVisibleItem = 0; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(lastFirstVisibleItem < firstVisibleItem) { // Scrolling down mListener.hideActionButton(); }else if(lastFirstVisibleItem > firstVisibleItem) { // Scrolling Up mListener.showActionButton(); } lastFirstVisibleItem = firstVisibleItem; for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) { if (!recentPostMode){ BoardItem bi = listViewAdapter.getItem(i); if (!bi.getThumb().isEmpty() && bi.getThumbBitmap() == null && !bi.downloadingThumb) { getThumbnail(bi); } } } if (totalItemCount == firstVisibleItem + visibleItemCount && !loadingMoreThreads && imMainFragment && totalItemCount != 0 && !recentPostMode) { loadingMoreThreads = true; currentOffset += 10; System.out.println("[Scroll] loading more threads! currentThreadCount " + totalItemCount); getThreadList(currentOffset); // TODO: Offset incorrecto } } }); hideProgressBar(); if (boardItems.isEmpty()){ if (currentBoard == null && currentThread == null && imMainFragment){ loadRecentPost(); }else{ updateBoardItems(currentBoard, currentThread); } }else{ listViewAdapter.notifyDataSetChanged(); recentPostAdapter.notifyDataSetChanged(); } return v; } private void hideProgressBar(){ if (loadingBar != null) loadingBar.setVisibility(View.GONE); } private void showProgressBar(){ if (loadingBar != null) loadingBar.setVisibility(View.VISIBLE); } public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } public void updateBoardItems(Board board, BoardItem thread){ currentBoard = board; currentThread = thread; if (listViewAdapter != null){ boardItems.clear(); listViewAdapter.notifyDataSetChanged(); } if (imMainFragment){ if (currentBoard != null) { System.out.println("[MainFragment] Updating -> boardName: " + board.getBoardName() + " dir: " + board.getBoardDir()); if (currentThread == null){ System.out.println("[MainFragment] isCurrentThread null? (it should be!) " + (currentThread == null)); } showProgressBar(); getThreadList(0); }else{ System.out.println("[MainFragment] Trying to update from a null board object"); } }else{ if (currentBoard != null && currentThread != null){ System.out.println("atUpdateBoardItems ChildFragment threadID: " + currentThread.getId() + " parentID: " + currentThread.getParentId() + " boardName: " + board.getBoardName() + " " + board.getBoardDir()); showProgressBar(); getThreadReplies(); }else{ System.out.println("[childFragment] trying to update from null objects"); System.out.println("[childFragment] isCurrentBoard null? " + (currentBoard == null)); System.out.println("[childFragment] isCurrentThread null? " + (currentThread == null)); } } } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); if (info.targetView.getParent() == listViewBoardItems){ BoardItem bi = boardItems.get(info.position); switch (item.getItemId()){ case R.id.menu_copy: System.out.println("Post copiado"); ClipboardManager cm = (ClipboardManager)getActivity().getSystemService(Context.CLIPBOARD_SERVICE); ClipData cd = ClipData.newPlainText("Reply", boardItems.get(info.position).getMessage()); cm.setPrimaryClip(cd); break; case R.id.menu_reply: Intent in = new Intent(getActivity().getApplicationContext(), ResponseActivity.class); Bundle b = new Bundle(); b.putParcelable("theReply", boardItems.get(info.position)); b.putBoolean("quoting", true); in.putExtras(b); getActivity().startActivity(in); break; case R.id.menu_savereply: try { File txt = new File(Environment.getExternalStorageDirectory().getPath() + "/Bai/" + bi.getParentBoard().getBoardDir() + "_" + bi.getId() + ".txt"); FileOutputStream stream = new FileOutputStream(txt); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(stream); outputStreamWriter.write(bi.getMessage()); outputStreamWriter.close(); stream.close(); Toast.makeText(getContext(), bi.getParentBoard().getBoardDir() + "_" + bi.getId() + ".txt guardado.", Toast.LENGTH_SHORT).show(); }catch (Exception e){ e.printStackTrace(); } break; case R.id.menu_delpost: deletePost(false, bi); break; case R.id.menu_delimage: deletePost(true, bi); break; } } return super.onContextItemSelected(item); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { if (v.getId() == R.id.lvThreadList){ getActivity().getMenuInflater().inflate(R.menu.menu_reply, menu); return; } super.onCreateContextMenu(menu, v, menuInfo); } public void refresh() { if (recentPostMode){ boardItems.clear(); recentPostAdapter.notifyDataSetChanged(); getRecentPosts(); }else{ updateBoardItems(currentBoard, currentThread); } } public void setRecentPostMode() { this.recentPostMode = true; } public void setCatalogMode() { if (recentPostMode){ boardItems.clear(); listViewBoardItems.setAdapter(listViewAdapter); this.recentPostMode = false; } } public void loadRecentPost(){ setRecentPostMode(); mListener.updateToolbar("Post recientes"); boardItems.clear(); listViewAdapter.clear(); listViewAdapter.notifyDataSetChanged(); listViewBoardItems.setAdapter(recentPostAdapter); getRecentPosts(); } public boolean getMode() { return recentPostMode; } public interface OnFragmentInteractionListener { void onFragmentInteraction(Uri uri); void showThread(Board board, BoardItem thread); void updateToolbar(Board currentBoard, BoardItem boardItem); void updateToolbar(String s); void hideActionButton(); void showActionButton(); void onThreadList(); void onThread(); void onRecentPosts(); } public void scrollToBotton(){ if (!listViewAdapter.isEmpty()){ listViewBoardItems.setSelection(boardItems.size()); } } public void scrollToTop(){ if (!listViewAdapter.isEmpty()){ listViewBoardItems.setSelection(0); } } public void getThreadList(int offset){ loadingMoreThreads = true; showProgressBar(); String strOffset = ""; if (offset == 0){ currentOffset = 0; boardItems.clear(); }else{ strOffset = "&offset=" + offset; } setUpThreadProgess(); final String repliesForCatalog = settings.getString("pref_repliesperthread", "5"); Ion.with(getContext()) .load("http://bienvenidoainternet.org/cgi/api/list?dir=" + currentBoard.getBoardDir() + "&replies=" + repliesForCatalog + strOffset) .setLogging("getThreadList", Log.INFO) .noCache() .asString() .setCallback(new FutureCallback() { @Override public void onCompleted(Exception e, String result) { hideProgressBar(); if (e != null) { e.printStackTrace(); displayError(e.getMessage()); } else { try { JSONObject json = new JSONObject(result); JSONArray threads = json.getJSONArray("threads"); for (int i = 0; i < threads.length(); i++) { JSONObject thread = threads.getJSONObject(i); BoardItem item = new BoardItem(); item.setEmail(thread.getString("email")); item.setFile(thread.getString("file")); item.setFilesize(thread.getInt("file_size")); item.setId(thread.getInt("id")); item.setName(thread.getString("name")); item.setSubject(thread.getString("subject")); item.setThumb(thread.getString("thumb")); item.setThumbHeight(thread.getInt("thumb_height")); item.setThumbWidth(thread.getInt("thumb_width")); item.setTimeStamp(thread.getLong("timestamp")); item.setTotalFiles(thread.getInt("total_files")); item.setTotalReplies(thread.getInt("total_replies")); item.setTripcode(thread.getString("tripcode")); item.setTimeStampFormatted(thread.getString("timestamp_formatted")); item.setLockStatus(thread.getInt("locked")); if (item.getTimeStampFormatted().contains("ID")){ item.setPosterId(item.getTimeStampFormatted().split(" ")[1].replace("ID :", "")); } item.setParentBoard(currentBoard); item.setParentId(0); item.setIdColor(addReplyID(item.getPosterId())); if (currentBoard.getBoardType() == 1){ item.setBbsId(1); } item.setMessage(thread.getString("message")); boardItems.add(item); if (!repliesForCatalog.equals("0")){ JSONArray replies = thread.getJSONArray("replies"); for (int r = 0; r < replies.length(); r++){ JSONObject jReply = replies.getJSONObject(r); BoardItem reply = new BoardItem(); reply.setDeletedCode(jReply.getInt("IS_DELETED")); if (currentBoard.getBoardType() == 1){ reply.setBbsId(item.getTotalReplies() - (Integer.valueOf(repliesForCatalog) - r) + 2); } if (reply.getDeletedCode() == 0){ reply.setEmail(jReply.getString("email")); reply.setFile(jReply.getString("file")); reply.setFilesize(jReply.getInt("file_size")); reply.setId(jReply.getInt("id")); reply.setParentId(item.getId()); reply.setLockStatus(item.isLocked ? 1 : 0); reply.setName(jReply.getString("name")); reply.setSubject(jReply.getString("subject")); reply.setThumb(jReply.getString("thumb")); reply.setThumbHeight(jReply.getInt("thumb_height")); reply.setThumbWidth(jReply.getInt("thumb_width")); reply.setTimeStamp(jReply.getLong("timestamp")); reply.setTripcode(jReply.getString("tripcode")); reply.setParentBoard(currentBoard); reply.setTimeStampFormatted(jReply.getString("timestamp_formatted")); reply.isReply = true; if (reply.getTimeStampFormatted().contains("ID")){ reply.setPosterId(reply.getTimeStampFormatted().split(" ")[1].replace("ID:", "")); } reply.setIdColor(addReplyID(reply.getPosterId())); // reply.setTotalReplies(item.getTotalReplies()); reply.setMessage(jReply.getString("message")); }else{ reply.setTimeStamp(jReply.getLong("timestamp")); reply.setId(jReply.getInt("id")); reply.isReply = true; reply.setLockStatus(item.isLocked ? 1 : 0); } boardItems.add(reply); } } } } catch (JSONException e1) { e1.printStackTrace(); displayError(e1.getMessage()); } } listViewAdapter.notifyDataSetChanged(); listViewAdapter.updateBoardItems(boardItems); mListener.onThreadList(); loadingMoreThreads = false; if (boardItems.isEmpty()){ mListener.updateToolbar(currentBoard, currentThread); } } }); } private void getThreadReplies() { showProgressBar(); boardItems.clear(); setUpThreadProgess(); int limit = Integer.valueOf(settings.getString("pref_lastreplies", "1000")); int parentTotalReplies = currentThread.getTotalReplies(); // TODO: asddas String offset = "&offset=0"; if (limit <= parentTotalReplies){ offset = "&offset=" + (parentTotalReplies - limit + 1); }else{ limit = 1337; } final int finalLimit = limit; Ion.with(getContext()) .load("http://bienvenidoainternet.org/cgi/api/thread?id=" + currentThread.realParentId() + "&dir=" + currentThread.getParentBoard().getBoardDir() + "&limit=" + limit + offset) .setLogging("getThreadReplies", Log.INFO) .noCache() .asString() .setCallback(new FutureCallback() { @Override public void onCompleted(Exception e, String result) { if (e != null){ e.printStackTrace(); displayError(e.getMessage()); }else{ try { JSONObject json = new JSONObject(result); JSONArray thread = json.getJSONArray("posts"); for (int i = 0; i < thread.length(); i++){ JSONObject reply = thread.getJSONObject(i); BoardItem item = new BoardItem(); item.setDeletedCode(reply.getInt("IS_DELETED")); if (item.getDeletedCode() == 0){ item.setEmail(reply.getString("email")); item.setFile(reply.getString("file")); item.setFilesize(reply.getInt("file_size")); item.setId(reply.getInt("id")); item.setName(reply.getString("name")); item.setSubject(reply.getString("subject")); item.setThumb(reply.getString("thumb")); item.setThumbHeight(reply.getInt("thumb_height")); item.setThumbWidth(reply.getInt("thumb_width")); item.setTimeStamp(reply.getLong("timestamp")); item.setParentId(json.getInt("id")); item.setLockStatus(json.getInt("locked")); item.setTripcode(reply.getString("tripcode")); item.setTimeStampFormatted(reply.getString("timestamp_formatted")); if (item.getTimeStampFormatted().contains("ID")){ item.setPosterId(item.getTimeStampFormatted().split(" ")[1].replace("ID:", "")); } item.setParentBoard(currentBoard); item.isReply = true; item.setIdColor(addReplyID(item.getPosterId())); item.setTotalReplies(json.getInt("total_replies")); if (currentBoard.getBoardType() == 1){ if (item.getTotalReplies() < finalLimit){ item.setBbsId(i + 1); }else{ item.setBbsId((item.getTotalReplies() - finalLimit + i) + 2); } } item.setMessage(reply.getString("message")); } else { item.setId(reply.getInt("id")); item.setTimeStamp(reply.getLong("timestamp")); item.isReply = true; item.setTotalReplies(json.getInt("total_replies")); if (currentBoard.getBoardType() == 1){ if (item.getTotalReplies() < finalLimit){ item.setBbsId(i + 1); }else{ item.setBbsId((item.getTotalReplies() - finalLimit + i) + 2); } } } boardItems.add(item); } } catch (JSONException e1) { e1.printStackTrace(); displayError(e1.getMessage()); } } listViewAdapter.notifyDataSetChanged(); listViewAdapter.updateBoardItems(boardItems); if (settings.getBoolean("setting_scrollatnewthread", true)){ listViewBoardItems.setSelection(boardItems.size()); mListener.showActionButton(); } mListener.onThread(); hideProgressBar(); } }); } private void getRecentPosts(){ boardItems.clear(); loadingMoreThreads = true; setUpThreadProgess(); String limit = settings.getString("pref_lastreplies_limit", "30"); Ion.with(getContext()) .load("http://bienvenidoainternet.org/cgi/api/last?limit=" + limit) .setLogging("getRecentPosts", Log.INFO) .noCache() .asString() .setCallback(new FutureCallback() { @Override public void onCompleted(Exception e, String result) { if (e != null){ e.printStackTrace(); displayError(e.getMessage()); }else{ try { JSONObject json = new JSONObject(result); JSONArray posts = json.getJSONArray("posts"); for (int i = 0; i < posts.length(); i++){ JSONObject jPost = posts.getJSONObject(i); BoardItem recentPost = new BoardItem(); recentPost.setEmail(jPost.getString("email")); recentPost.setFile(jPost.getString("file")); recentPost.setFilesize(jPost.getInt("file_size")); recentPost.setId(jPost.getInt("id")); recentPost.setName(jPost.getString("name")); recentPost.setSubject(jPost.getString("subject")); recentPost.setThumb(jPost.getString("thumb")); recentPost.setThumbHeight(jPost.getInt("thumb_height")); recentPost.setThumbWidth(jPost.getInt("thumb_width")); recentPost.setTimeStamp(jPost.getLong("timestamp")); recentPost.setTripcode(jPost.getString("tripcode")); recentPost.setTimeStampFormatted(jPost.getString("timestamp_formatted")); if (recentPost.getTimeStampFormatted().contains("ID")){ recentPost.setPosterId(recentPost.getTimeStampFormatted().split(" ")[1].replace("ID:", "")); } recentPost.setParentBoard(((MainActivity) getActivity()).getBoardFromDir(jPost.getString("dir"))); recentPost.setParentId(jPost.getInt("parentid")); recentPost.setMessage(jPost.getString("message")); boardItems.add(recentPost); } } catch (JSONException e1) { e1.printStackTrace(); displayError(e1.getMessage()); } } recentPostAdapter.notifyDataSetChanged(); mListener.onRecentPosts(); } }); } private void getThumbnail(final BoardItem bi){ bi.downloadingThumb = true; ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); boolean usingWifi = (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI); ContextWrapper cw = new ContextWrapper(getActivity().getApplicationContext()); File directory = cw.getDir("thumbs", Context.MODE_PRIVATE); if (!directory.exists()){ directory.mkdir(); } final File mypath; if (bi.youtubeLink){ mypath = new File(directory, currentBoard.getBoardDir() + "_" + bi.youtubeID); }else{ mypath = new File(directory, currentBoard.getBoardDir() + "_" + bi.getThumb()); } if (mypath.exists()){ try { Bitmap b = BitmapFactory.decodeStream(new FileInputStream(mypath)); bi.setThumbBitmap(Bitmap.createScaledBitmap(b, 128, 128, false)); listViewAdapter.notifyDataSetChanged(); Log.i("getThumb", bi.getThumb() + " from cache"); return; }catch (Exception e){ e.printStackTrace(); displayError(e.getMessage()); } } if (settings.getBoolean("setting_downloadOnlyWithWifi", false) == true && !usingWifi){ Log.i("getThumb", "Not using wifi"); return; } String imgURL = "http://bienvenidoainternet.org/" + bi.getParentBoard().getBoardDir() + "/thumb/" + bi.getThumb(); if (bi.getThumb().startsWith("http")){ imgURL = bi.getThumb(); } Ion.with(getContext()) .load(imgURL) .setLogging("getThumbnail", Log.INFO) .asBitmap() .setCallback(new FutureCallback() { @Override public void onCompleted(Exception e, Bitmap result) { if (e != null) { displayError(e.getMessage()); e.printStackTrace(); }else{ bi.setThumbBitmap(Bitmap.createScaledBitmap(result, 128, 128, false)); listViewAdapter.notifyDataSetChanged(); FileOutputStream out; try{ out = new FileOutputStream(mypath); result.compress(Bitmap.CompressFormat.PNG, 100, out); if(out != null){ out.close(); } Log.v("getThumb", bi.getThumb() + " saved."); }catch (Exception e1){ e1.printStackTrace(); } } } }); } private void deletePost(final boolean imageOnly, BoardItem reply) { String password = settings.getString("pref_password", "12345678"); Ion.with(getContext()) .load("http://bienvenidoainternet.org/cgi/api/delete?dir=" + currentThread.getParentBoard().getBoardDir() + "&id=" + reply.getId() + "&password=" + password + "&imageonly=" + (imageOnly ? 1 : 0)) .setLogging("deletePost", Log.INFO) .asString() .setCallback(new FutureCallback() { @Override public void onCompleted(Exception e, String result) { if (e != null) { e.printStackTrace(); displayError(e.getMessage()); } else { JSONObject json = null; try { json = new JSONObject(result); if (json.getString("state").equals("success")) { Toast.makeText(getContext(), imageOnly ? "Imágen" : "Respuesta" + " eliminada", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getContext(), URLDecoder.decode(json.getString("message"), "UTF-8"), Toast.LENGTH_LONG).show(); } } catch (JSONException e1) { e1.printStackTrace(); displayError(e1.getMessage()); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); displayError(e1.getMessage()); } } } }); } public int addReplyID(String s){ if (!idList.contains(new ReplyID(s, tm))){ idList.add(new ReplyID(s, tm)); } for (ReplyID r : idList){ if (r.id.equals(s)){return r.color;} } return 0; } private void setUpThreadProgess(){ txtThreadProcess.setVisibility(View.GONE); layoutThreadProcess.setVisibility(View.VISIBLE); } private void displayError(String error){ hideProgressBar(); if (error != null){ layoutThreadProcess.setVisibility(View.VISIBLE); txtThreadProcess.setVisibility(View.VISIBLE); txtThreadProcess.setText("( ; u ; ) \r\n/!\\ ERROR\r\n" + error); } } }