Java tutorial
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 <http://www.gnu.org/licenses/>. */ 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<ReplyID> idList = new ArrayList<>(); public ArrayList<BoardItem> boardItems = new ArrayList<BoardItem>(); 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); } // Aplicacin 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<String>() { @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<String>() { @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<String>() { @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<Bitmap>() { @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<String>() { @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 ? "Imgen" : "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); } } }