From fe76420bfc927ee5fc002215724c09a6d2d614c2 Mon Sep 17 00:00:00 2001 From: Renard Date: Fri, 8 Apr 2016 20:14:59 -0300 Subject: Nuevo visor de imágenes --- app/build.gradle | 5 +- .../main/java/layout/FragmentBoardItemList.java | 781 +++++++++++++++++++++ app/src/main/java/layout/FragmentImage.java | 197 ++++++ app/src/main/java/layout/fragmentThreadList.java | 779 -------------------- .../baiparser/MainActivity.java | 24 +- .../baiparser/ThreadListAdapter.java | 27 +- .../baiparser/ViewerActivity.java | 204 ++---- .../baiparser/structure/BoardItemFile.java | 49 ++ app/src/main/res/layout/activity_viewer.xml | 20 +- .../main/res/layout/fragment_fragment_image.xml | 15 + app/src/main/res/values/strings.xml | 3 + 11 files changed, 1136 insertions(+), 968 deletions(-) create mode 100644 app/src/main/java/layout/FragmentBoardItemList.java create mode 100644 app/src/main/java/layout/FragmentImage.java delete mode 100644 app/src/main/java/layout/fragmentThreadList.java create mode 100644 app/src/main/java/org/bienvenidoainternet/baiparser/structure/BoardItemFile.java create mode 100644 app/src/main/res/layout/fragment_fragment_image.xml diff --git a/app/build.gradle b/app/build.gradle index 3eaec0f..a41bd51 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.bienvenidoainternet.baiparser" minSdkVersion 15 targetSdkVersion 23 - versionCode 5 - versionName "1.5" + versionCode 6 + versionName "1.6" } buildTypes { release { @@ -30,3 +30,4 @@ dependencies { compile 'com.koushikdutta.ion:ion:2.+' } + diff --git a/app/src/main/java/layout/FragmentBoardItemList.java b/app/src/main/java/layout/FragmentBoardItemList.java new file mode 100644 index 0000000..38e4819 --- /dev/null +++ b/app/src/main/java/layout/FragmentBoardItemList.java @@ -0,0 +1,781 @@ +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.baiparser.MainActivity; +import org.bienvenidoainternet.baiparser.R; +import org.bienvenidoainternet.baiparser.RecentPostAdapter; +import org.bienvenidoainternet.baiparser.ResponseActivity; +import org.bienvenidoainternet.baiparser.ThreadListAdapter; +import org.bienvenidoainternet.baiparser.structure.Board; +import org.bienvenidoainternet.baiparser.structure.BoardItem; +import org.bienvenidoainternet.baiparser.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; + +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; + + 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); + } + } + + @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 = ((MainActivity)getActivity()).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((((MainActivity) getActivity()).themeManager).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, (((MainActivity) getActivity()).themeManager)); + 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); + } + } + } +// System.out.println("[Scroll] firstItem: " + firstVisibleItem + " visible: " + visibleItemCount + " total: " + totalItemCount); + 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 +// new TaskParseJSON(currentBoard, true).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + } + }); + 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(); +// new TaskParseJSON(board).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + 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(); +// new TaskParseJSON(currentBoard, currentThread).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + 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.putParcelable("theBoard", currentBoard); + 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(); +// listViewAdapter = new ThreadListAdapter(themedContext.getContext(), boardItems, ((MainActivity)getActivity()).themeManager); + listViewBoardItems.setAdapter(listViewAdapter); + this.recentPostMode = false; + } + } + + public void loadRecentPost(){ + // Cambiamos el flag + setRecentPostMode(); + mListener.updateToolbar("Post recientes"); + // Borramos el listview + boardItems.clear(); + listViewAdapter.clear(); + listViewAdapter.notifyDataSetChanged(); + // Cargamos un nuevo adaptador. +// recentPostAdapter = new RecentPostAdapter(themedContext.getContext(), boardItems); + listViewBoardItems.setAdapter(recentPostAdapter); + // Cargamos la nueva lista + 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(); + } + + 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) +// .progressBar(barThreadProcess) + .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.setMessage(thread.getString("message")); + 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")); + 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); + } + 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.setMessage(jReply.getString("message")); + 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()); + }else{ + reply.setTimeStamp(jReply.getLong("timestamp")); + reply.setId(jReply.getInt("id")); + reply.isReply = true; + } + boardItems.add(reply); + } + } + } + } catch (JSONException e1) { + e1.printStackTrace(); + displayError(e1.getMessage()); + } + } + listViewAdapter.notifyDataSetChanged(); + listViewAdapter.updateBoardItems(boardItems); + 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.setMessage(reply.getString("message")); + 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.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); + } + } + + } 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(); + } + 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) +// .progressBar(barThreadProcess) + .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.setMessage(jPost.getString("message")); + 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")); + boardItems.add(recentPost); + } + } catch (JSONException e1) { + e1.printStackTrace(); + displayError(e1.getMessage()); + } + } + recentPostAdapter.notifyDataSetChanged(); + } + }); + + } + + 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); + File mypath = new File(directory, currentBoard.getBoardDir() + "_" + bi.getThumb()); + if (mypath.exists()){ + try { + Bitmap b = BitmapFactory.decodeStream(new FileInputStream(mypath)); + bi.setThumbBitmap(b); + 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; + } + Ion.with(getContext()) + .load("http://bienvenidoainternet.org/" + bi.getParentBoard().getBoardDir() + "/thumb/" + bi.getThumb()) + .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(result); + listViewAdapter.notifyDataSetChanged(); + } + } + }); + } + + 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))){ + idList.add(new ReplyID(s)); + } + for (ReplyID r : idList){ + if (r.id.equals(s)){return r.color;} + } + return 0; + } + + private void setUpThreadProgess(){ +// barThreadProcess.setVisibility(View.VISIBLE); + 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); + } + + } +} diff --git a/app/src/main/java/layout/FragmentImage.java b/app/src/main/java/layout/FragmentImage.java new file mode 100644 index 0000000..399e9f3 --- /dev/null +++ b/app/src/main/java/layout/FragmentImage.java @@ -0,0 +1,197 @@ +package layout; + +import android.content.Context; +import android.content.ContextWrapper; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.davemorrissey.labs.subscaleview.ImageSource; +import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; +import com.koushikdutta.async.future.FutureCallback; +import com.koushikdutta.ion.Ion; + +import org.bienvenidoainternet.baiparser.R; +import org.bienvenidoainternet.baiparser.ViewerActivity; +import org.bienvenidoainternet.baiparser.structure.BoardItem; +import org.bienvenidoainternet.baiparser.structure.BoardItemFile; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; + +import pl.droidsonroids.gif.GifDrawable; +import pl.droidsonroids.gif.GifImageView; + +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * {@link FragmentImage.OnFragmentInteractionListener} interface + * to handle interaction events. + * Use the {@link FragmentImage#newInstance} factory method to + * create an instance of this fragment. + */ +public class FragmentImage extends Fragment { + private static final String ARG_BOARD_ITEM = "param1"; + + public BoardItemFile boardItemFile; + + private OnFragmentInteractionListener mListener; + private SubsamplingScaleImageView imageView; + private GifImageView gifView; + private static final String ARG_FILE_URL = "fileURL"; + private ProgressBar downloadBar; + + public FragmentImage() { + // Required empty public constructor + } + + public static FragmentImage newInstance(BoardItemFile boardItemFile) { + FragmentImage fragment = new FragmentImage(); + Bundle args = new Bundle(); + args.putParcelable(ARG_BOARD_ITEM, boardItemFile); +// args.putString(ARG_FILE_URL, file); + fragment.setArguments(args); + Log.v("FragmentImage", fragment.toString() + " new Fragment"); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { +// currentThread = getArguments().getParcelable(ARG_BOARD_ITEM); + boardItemFile = getArguments().getParcelable(ARG_BOARD_ITEM); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View view = inflater.inflate(R.layout.fragment_fragment_image, container, false); + imageView = (SubsamplingScaleImageView) view.findViewById(R.id.imageView); + gifView = (GifImageView) view.findViewById(R.id.gifView); + imageView.setVisibility(View.GONE); + gifView.setVisibility(View.GONE); + if (boardItemFile.file != null) { + if (!boardItemFile.file.endsWith(".webm") && !boardItemFile.file.endsWith(".swf")) { + downloadFile(); + } + } + return view; + } + + // TODO: Rename method, update argument and hook method into UI event + public void onButtonPressed(Uri uri) { + if (mListener != null) { + mListener.onFragmentInteraction(uri); + } + } + + @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; + } + + public void setDownloadBar(ProgressBar downloadBar) { + this.downloadBar = downloadBar; + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + *

+ * See the Android Training lesson Communicating with Other Fragments for more information. + */ + public interface OnFragmentInteractionListener { + // TODO: Update argument type and name + void onFragmentInteraction(Uri uri); + } + + private void downloadFile() { + downloadBar = ((ViewerActivity)getActivity()).barDownload; + downloadBar.setVisibility(View.VISIBLE); + ContextWrapper cw = new ContextWrapper(getContext()); + File directory = cw.getDir("src", Context.MODE_PRIVATE); + final File filePath = new File(directory, boardItemFile.boardDir + "_" + boardItemFile.file); + if (filePath.exists()) { + downloadBar.setVisibility(View.GONE); + if (boardItemFile.file.endsWith(".gif")) { + try { + GifDrawable gifFromFile = new GifDrawable(filePath); + gifView.setImageDrawable(gifFromFile); + gifView.setVisibility(View.VISIBLE); + imageView.setVisibility(View.GONE); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + imageView.setImage(ImageSource.uri(filePath.toURI().getPath())); + imageView.setVisibility(View.VISIBLE); + gifView.setVisibility(View.GONE); + } + } + Ion.with(getContext()) + .load(boardItemFile.fileURL) + .progressBar(downloadBar) + .asInputStream() + .setCallback(new FutureCallback() { + @Override + public void onCompleted(Exception e, InputStream result) { + downloadBar.setVisibility(View.GONE); + if (e != null) { + e.printStackTrace(); + } else { + FileOutputStream fout; + try { + fout = new FileOutputStream(filePath); + final byte data[] = new byte[1024]; + int count; + while ((count = result.read(data, 0, 1024)) != -1) { + fout.write(data, 0, count); + } + } catch (Exception e1) { + e1.printStackTrace(); + } + if (boardItemFile.file.endsWith(".gif")) { + try { + GifDrawable gifFromFile = new GifDrawable(filePath); + gifView.setImageDrawable(gifFromFile); + gifView.setVisibility(View.VISIBLE); + imageView.setVisibility(View.GONE); + } catch (Exception e2) { + e2.printStackTrace(); + } + } else { + imageView.setImage(ImageSource.uri(filePath.toURI().getPath())); + gifView.setVisibility(View.GONE); + imageView.setVisibility(View.VISIBLE); + } + } + } + }); + } +} diff --git a/app/src/main/java/layout/fragmentThreadList.java b/app/src/main/java/layout/fragmentThreadList.java deleted file mode 100644 index c06fd93..0000000 --- a/app/src/main/java/layout/fragmentThreadList.java +++ /dev/null @@ -1,779 +0,0 @@ -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.baiparser.MainActivity; -import org.bienvenidoainternet.baiparser.R; -import org.bienvenidoainternet.baiparser.RecentPostAdapter; -import org.bienvenidoainternet.baiparser.ResponseActivity; -import org.bienvenidoainternet.baiparser.ThreadListAdapter; -import org.bienvenidoainternet.baiparser.structure.Board; -import org.bienvenidoainternet.baiparser.structure.BoardItem; -import org.bienvenidoainternet.baiparser.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; - -public class fragmentThreadList 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; - - public fragmentThreadList() { - // Required empty public constructor - - } - - public static fragmentThreadList newInstance(boolean mainFragment, Board board, BoardItem thread){ - fragmentThreadList fragment = new fragmentThreadList(); - 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); - } - } - - @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 = ((MainActivity)getActivity()).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((((MainActivity) getActivity()).themeManager).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, (((MainActivity) getActivity()).themeManager)); - 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); - } - } - } -// System.out.println("[Scroll] firstItem: " + firstVisibleItem + " visible: " + visibleItemCount + " total: " + totalItemCount); - 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 -// new TaskParseJSON(currentBoard, true).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - } - }); - 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(); -// new TaskParseJSON(board).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - 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(); -// new TaskParseJSON(currentBoard, currentThread).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - 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.putParcelable("theBoard", currentBoard); - 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(); -// listViewAdapter = new ThreadListAdapter(themedContext.getContext(), boardItems, ((MainActivity)getActivity()).themeManager); - listViewBoardItems.setAdapter(listViewAdapter); - this.recentPostMode = false; - } - } - - public void loadRecentPost(){ - // Cambiamos el flag - setRecentPostMode(); - mListener.updateToolbar("Post recientes"); - // Borramos el listview - boardItems.clear(); - listViewAdapter.clear(); - listViewAdapter.notifyDataSetChanged(); - // Cargamos un nuevo adaptador. -// recentPostAdapter = new RecentPostAdapter(themedContext.getContext(), boardItems); - listViewBoardItems.setAdapter(recentPostAdapter); - // Cargamos la nueva lista - 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(); - } - - 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) -// .progressBar(barThreadProcess) - .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.setMessage(thread.getString("message")); - 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")); - 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); - } - 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.setMessage(jReply.getString("message")); - 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()); - }else{ - reply.setTimeStamp(jReply.getLong("timestamp")); - reply.setId(jReply.getInt("id")); - reply.isReply = true; - } - boardItems.add(reply); - } - } - } - } catch (JSONException e1) { - e1.printStackTrace(); - displayError(e1.getMessage()); - } - } - listViewAdapter.notifyDataSetChanged(); - 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.setMessage(reply.getString("message")); - 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.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); - } - } - - } 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(); - if (settings.getBoolean("setting_scrollatnewthread", true)){ - listViewBoardItems.setSelection(boardItems.size()); - mListener.showActionButton(); - } - 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) -// .progressBar(barThreadProcess) - .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.setMessage(jPost.getString("message")); - 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")); - boardItems.add(recentPost); - } - } catch (JSONException e1) { - e1.printStackTrace(); - displayError(e1.getMessage()); - } - } - recentPostAdapter.notifyDataSetChanged(); - } - }); - - } - - 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); - File mypath = new File(directory, currentBoard.getBoardDir() + "_" + bi.getThumb()); - if (mypath.exists()){ - try { - Bitmap b = BitmapFactory.decodeStream(new FileInputStream(mypath)); - bi.setThumbBitmap(b); - 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; - } - Ion.with(getContext()) - .load("http://bienvenidoainternet.org/" + bi.getParentBoard().getBoardDir() + "/thumb/" + bi.getThumb()) - .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(result); - listViewAdapter.notifyDataSetChanged(); - } - } - }); - } - - 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))){ - idList.add(new ReplyID(s)); - } - for (ReplyID r : idList){ - if (r.id.equals(s)){return r.color;} - } - return 0; - } - - private void setUpThreadProgess(){ -// barThreadProcess.setVisibility(View.VISIBLE); - 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); - } - - } -} diff --git a/app/src/main/java/org/bienvenidoainternet/baiparser/MainActivity.java b/app/src/main/java/org/bienvenidoainternet/baiparser/MainActivity.java index 65b51e2..9130160 100644 --- a/app/src/main/java/org/bienvenidoainternet/baiparser/MainActivity.java +++ b/app/src/main/java/org/bienvenidoainternet/baiparser/MainActivity.java @@ -3,13 +3,11 @@ package org.bienvenidoainternet.baiparser; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; -import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.NavigationView; -import android.support.design.widget.Snackbar; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; @@ -39,21 +37,18 @@ import org.json.JSONObject; import java.util.ArrayList; import java.util.Random; -import layout.fragmentThreadList; +import layout.FragmentBoardItemList; public class MainActivity extends AppCompatActivity - implements NavigationView.OnNavigationItemSelectedListener, fragmentThreadList.OnFragmentInteractionListener { - - public static final float CURRENT_VERSION = 1.5F; + implements NavigationView.OnNavigationItemSelectedListener, FragmentBoardItemList.OnFragmentInteractionListener { private ViewPager pager; // variable del ViewPager CustomFragmentPagerAdapter pagerAdapter; // Adaptador del ViewPager NavigationView navigationView; DrawerLayout drawer; FloatingActionButton fab; public ThemeManager themeManager; - fragmentThreadList childFragment; // Segunda página del ViewPager, se muestra un solo hilo (selecionado del catálogo) - fragmentThreadList mainFragment; // Primera página del ViewPager, se muestra una lista de hilos. (catálogo) -// fragmentThreadList recentFragment; + FragmentBoardItemList childFragment; // Segunda página del ViewPager, se muestra un solo hilo (selecionado del catálogo) + FragmentBoardItemList mainFragment; // Primera página del ViewPager, se muestra una lista de hilos. (catálogo) Toolbar toolbar = null; public int currentThemeId = 0, themeId = 0; // Id del recurso, Id del tema public ArrayList boardList = new ArrayList<>(); @@ -155,20 +150,17 @@ public class MainActivity extends AppCompatActivity navigationView.setNavigationItemSelectedListener(this); if (savedInstanceState != null) { - mainFragment = (fragmentThreadList) getSupportFragmentManager().getFragment(savedInstanceState, "mainFragment"); - childFragment = (fragmentThreadList) getSupportFragmentManager().getFragment(savedInstanceState, "childFragment"); -// recentFragment = (fragmentThreadList) getSupportFragmentManager().getFragment(savedInstanceState, "recentFragment"); + mainFragment = (FragmentBoardItemList) getSupportFragmentManager().getFragment(savedInstanceState, "mainFragment"); + childFragment = (FragmentBoardItemList) getSupportFragmentManager().getFragment(savedInstanceState, "childFragment"); } else { - mainFragment = fragmentThreadList.newInstance(true, null, null); - childFragment = fragmentThreadList.newInstance(false, null, null); -// recentFragment = fragmentThreadList.newInstance(false, null, -1); + mainFragment = FragmentBoardItemList.newInstance(true, null, null); + childFragment = FragmentBoardItemList.newInstance(false, null, null); } this.pager = (ViewPager) findViewById(R.id.pager); this.pagerAdapter = new CustomFragmentPagerAdapter(getSupportFragmentManager()); pagerAdapter.addFragment(mainFragment); pagerAdapter.addFragment(childFragment); -// pagerAdapter.addFragment(recentFragment); this.pager.setAdapter(pagerAdapter); pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { diff --git a/app/src/main/java/org/bienvenidoainternet/baiparser/ThreadListAdapter.java b/app/src/main/java/org/bienvenidoainternet/baiparser/ThreadListAdapter.java index 57aa362..85cd891 100644 --- a/app/src/main/java/org/bienvenidoainternet/baiparser/ThreadListAdapter.java +++ b/app/src/main/java/org/bienvenidoainternet/baiparser/ThreadListAdapter.java @@ -1,12 +1,8 @@ package org.bienvenidoainternet.baiparser; -import android.animation.ArgbEvaluator; -import android.animation.ObjectAnimator; -import android.animation.ValueAnimator; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.graphics.drawable.ColorDrawable; @@ -28,6 +24,7 @@ import android.widget.ImageView; import android.widget.TextView; import org.bienvenidoainternet.baiparser.structure.BoardItem; +import org.bienvenidoainternet.baiparser.structure.BoardItemFile; import java.util.ArrayList; import java.util.Collections; @@ -36,7 +33,6 @@ import java.util.EnumSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Random; import java.util.concurrent.TimeUnit; /** @@ -47,6 +43,8 @@ public class ThreadListAdapter extends ArrayAdapter{ private ThemeManager tm; Typeface monaFont; public boolean listThreads = false; + private ArrayList boardItems = new ArrayList(); + private static final String EXTRA_FILELIST = "fileList"; public ThreadListAdapter(Context context, List objects, ThemeManager tm) { super(context, 0, objects); @@ -55,6 +53,10 @@ public class ThreadListAdapter extends ArrayAdapter{ monaFont = Typeface.createFromAsset(context.getAssets(), "fonts/mona.ttf"); } + public void updateBoardItems(ArrayList boardItems){ + this.boardItems = boardItems; + } + private String intToHexString(int i){ return String.format("#%06X", (0xFFFFFF & i)); } @@ -73,7 +75,7 @@ public class ThreadListAdapter extends ArrayAdapter{ return result; } @Override - public View getView(int position, final View convertView, final ViewGroup parent){ + public View getView(final int position, final View convertView, final ViewGroup parent){ LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View listItemView = convertView; @@ -120,7 +122,18 @@ public class ThreadListAdapter extends ArrayAdapter{ }else { Intent in = new Intent(convertView.getContext(), ViewerActivity.class); Bundle b = new Bundle(); - b.putParcelable("boardItem", boardItem); + ArrayList fileList = new ArrayList(); + int relativePosition = 0; + for (int i = 0; i < boardItems.size(); i++){ + if (!boardItems.get(i).getFile().isEmpty()){ + if (boardItems.get(i).getFile().equals(boardItem.getFile())){ + relativePosition = fileList.size(); + } + fileList.add(new BoardItemFile("http://bienvenidoainternet.org/" + boardItems.get(i).getParentBoard().getBoardDir() + "/src/" + boardItems.get(i).getFile(), boardItems.get(i).getFile(), boardItems.get(i).getParentBoard().getBoardDir())); + } + } + b.putParcelableArrayList(EXTRA_FILELIST, fileList); + b.putInt("position", relativePosition); in.putExtras(b); convertView.getContext().startActivity(in); } diff --git a/app/src/main/java/org/bienvenidoainternet/baiparser/ViewerActivity.java b/app/src/main/java/org/bienvenidoainternet/baiparser/ViewerActivity.java index 4501c0f..9d140ec 100644 --- a/app/src/main/java/org/bienvenidoainternet/baiparser/ViewerActivity.java +++ b/app/src/main/java/org/bienvenidoainternet/baiparser/ViewerActivity.java @@ -2,55 +2,75 @@ package org.bienvenidoainternet.baiparser; import android.content.Context; import android.content.ContextWrapper; -import android.graphics.Bitmap; -import android.os.AsyncTask; +import android.media.MediaScannerConnection; +import android.net.Uri; import android.os.Bundle; import android.os.Environment; +import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; -import android.view.View; import android.widget.ProgressBar; import android.widget.Toast; -import com.davemorrissey.labs.subscaleview.ImageSource; import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; -import com.koushikdutta.async.future.FutureCallback; -import com.koushikdutta.ion.Ion; import org.bienvenidoainternet.baiparser.structure.BoardItem; +import org.bienvenidoainternet.baiparser.structure.BoardItemFile; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; +import java.util.ArrayList; -import pl.droidsonroids.gif.GifDrawable; +import layout.FragmentImage; import pl.droidsonroids.gif.GifImageView; -public class ViewerActivity extends AppCompatActivity { - private SubsamplingScaleImageView imageView; - private GifImageView gifView; - private BoardItem bi; - File imagePath; - +public class ViewerActivity extends AppCompatActivity implements FragmentImage.OnFragmentInteractionListener { + private static final String EXTRA_FILELIST = "fileList", EXTRA_RELATIVEPOSITION = "position"; + private ViewPager imagePager; + public ProgressBar barDownload; + private int relativePosition = 0; + public ArrayList fileList = new ArrayList(); + private CustomFragmentPagerAdapter pagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (savedInstanceState != null){ - bi = savedInstanceState.getParcelable("boardItem"); - } if (getIntent().getExtras() != null){ - bi = getIntent().getParcelableExtra("boardItem"); + fileList = getIntent().getParcelableArrayListExtra(EXTRA_FILELIST); + relativePosition = getIntent().getIntExtra(EXTRA_RELATIVEPOSITION, 0); } setContentView(R.layout.activity_viewer); - imageView = (SubsamplingScaleImageView)findViewById(R.id.imageView); - gifView = (GifImageView) findViewById(R.id.gifView); - setTitle(bi.getFile()); - downloadFile(); + barDownload = (ProgressBar) findViewById(R.id.downloadProgressBar); + imagePager = (ViewPager) findViewById(R.id.imagePager); + this.pagerAdapter = new CustomFragmentPagerAdapter(getSupportFragmentManager()); + for (int i = 0; i < fileList.size(); i++){ + Log.v("ImageViewer", fileList.get(i).toString()); + pagerAdapter.addFragment(FragmentImage.newInstance(fileList.get(i))); + } + imagePager.setAdapter(pagerAdapter); + imagePager.setCurrentItem(relativePosition); + imagePager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + getSupportActionBar().setSubtitle(fileList.get(position).file); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); this.getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @@ -61,9 +81,13 @@ public class ViewerActivity extends AppCompatActivity { baiDir.mkdir(); } if (item.getItemId() == R.id.menu_save_img){ - File to = new File(Environment.getExternalStorageDirectory().getPath() + "/Bai/" + bi.getFile()); + BoardItemFile boardItemFile = fileList.get(imagePager.getCurrentItem()); + File to = new File(Environment.getExternalStorageDirectory().getPath() + "/Bai/" + boardItemFile.file); + ContextWrapper cw = new ContextWrapper(getApplicationContext()); + File directory = cw.getDir("src", Context.MODE_PRIVATE); + File fileSource = new File(directory, boardItemFile.boardDir + "_" + boardItemFile.file); try{ - InputStream in = new FileInputStream(imagePath); + InputStream in = new FileInputStream(fileSource); OutputStream out = new FileOutputStream(to); byte[] buf = new byte[1024]; int len; @@ -72,7 +96,8 @@ public class ViewerActivity extends AppCompatActivity { } in.close(); out.close(); - Toast.makeText(getApplicationContext(), bi.getFile() + " guardado.", Toast.LENGTH_LONG).show(); + Toast.makeText(getApplicationContext(), boardItemFile.file + " guardado.", Toast.LENGTH_LONG).show(); + MediaScannerConnection.scanFile(this, new String[]{to.getPath()}, new String[]{"image/jpeg"}, null); }catch (Exception e){ e.printStackTrace(); } @@ -91,135 +116,8 @@ public class ViewerActivity extends AppCompatActivity { return true; } - private void downloadFile(){ - ContextWrapper cw = new ContextWrapper(getApplicationContext()); - File directory = cw.getDir("src", Context.MODE_PRIVATE); - final File filePath = new File(directory, bi.getParentBoard().getBoardDir() + "_" + bi.getFile()); - final ProgressBar downloadBar = (ProgressBar) findViewById(R.id.downloadProgressBar); - if (filePath.exists()){ - downloadBar.setVisibility(View.GONE); - if (bi.getFile().endsWith(".gif")){ - try { - GifDrawable gifFromFile = new GifDrawable(filePath); - gifView.setImageDrawable(gifFromFile); - imageView.setVisibility(View.GONE); - }catch(Exception e){ - e.printStackTrace(); - } - }else{ - imageView.setImage(ImageSource.uri(filePath.toURI().getPath())); - gifView.setVisibility(View.GONE); - } - } - Ion.with(getApplicationContext()) - .load("http://bienvenidoainternet.org/" + bi.getParentBoard().getBoardDir() + "/src/" + bi.getFile()) - .progressBar(downloadBar) - .asInputStream() - .setCallback(new FutureCallback() { - @Override - public void onCompleted(Exception e, InputStream result) { - downloadBar.setVisibility(View.GONE); - if (e != null){ - e.printStackTrace(); - }else{ - FileOutputStream fout; - try { - fout = new FileOutputStream(filePath); - final byte data[] = new byte[1024]; - int count; - while ((count = result.read(data, 0, 1024)) != -1) { - fout.write(data, 0, count); - } - }catch(Exception e1) { - e1.printStackTrace(); - } - if (bi.getFile().endsWith(".gif")){ - try { - GifDrawable gifFromFile = new GifDrawable(filePath); - gifView.setImageDrawable(gifFromFile); - imageView.setVisibility(View.GONE); - }catch(Exception e2){ - e2.printStackTrace(); - } - }else{ - imageView.setImage(ImageSource.uri(filePath.toURI().getPath())); - gifView.setVisibility(View.GONE); - } - } - } - }); - } - - class TaskDownloadFile extends AsyncTask { - - @Override - protected File doInBackground(Void... params) { - Bitmap downloadedBitmap = null; - ContextWrapper cw = new ContextWrapper(getApplicationContext()); - File directory = cw.getDir("src", Context.MODE_PRIVATE); - File mypath = new File(directory, bi.getParentBoard().getBoardDir() + "_" + bi.getFile()); - if (mypath.exists()){ - System.out.println("[Viewer] resource exist!"); - return mypath; - } - try { - String sUrl = "http://bienvenidoainternet.org/" + bi.getParentBoard().getBoardDir() + "/src/" + bi.getFile(); - System.out.println("[Viewer]dwonloading " + sUrl); -// System.out.println(sUrl); - InputStream in = new java.net.URL(sUrl).openStream(); -// downloadedBitmap = BitmapFactory.decodeStream(in); - -// if (downloadedBitmap != null){ - FileOutputStream fout = null; - try { -// in = new BufferedInputStream(new URL(urlString).openStream()); - fout = new FileOutputStream(mypath); - - final byte data[] = new byte[1024]; - int count; - while ((count = in.read(data, 0, 1024)) != -1) { - fout.write(data, 0, count); - } - - - }catch(Exception e){ - e.printStackTrace(); - }finally { - if (in != null) { - in.close(); - } - if (fout != null) { - fout.close(); - } - } -// } - } catch (Exception e) { - e.printStackTrace(); - } - - return mypath; - } - - @Override - protected void onPostExecute(File file) { - super.onPostExecute(file); - imagePath = file; -// iv.setImageBitmap(bitmap); - if (bi.getFile().endsWith(".gif")){ - try { - GifDrawable gifFromFile = new GifDrawable(file); - gifView.setImageDrawable(gifFromFile); - imageView.setVisibility(View.GONE); - }catch(Exception e){ - e.printStackTrace(); - } - }else{ - imageView.setImage(ImageSource.uri(file.toURI().getPath())); - gifView.setVisibility(View.GONE); -// imageView.setImage(ImageSource.resource(R.drawable.bai)); -// System.out.println("not a gif file: " + file.toURI().getPath()); - } + @Override + public void onFragmentInteraction(Uri uri) { - } } } diff --git a/app/src/main/java/org/bienvenidoainternet/baiparser/structure/BoardItemFile.java b/app/src/main/java/org/bienvenidoainternet/baiparser/structure/BoardItemFile.java new file mode 100644 index 0000000..eeff1c4 --- /dev/null +++ b/app/src/main/java/org/bienvenidoainternet/baiparser/structure/BoardItemFile.java @@ -0,0 +1,49 @@ +package org.bienvenidoainternet.baiparser.structure; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Created by Renard on 08-04-2016. + */ +public class BoardItemFile implements Parcelable{ + public String file; + public String fileURL; + public String boardDir; + + public BoardItemFile(String fileURL, String file, String boardDir){ + this.fileURL = fileURL; + this.file = file; + this.boardDir = boardDir; + } + + protected BoardItemFile(Parcel in) { + file = in.readString(); + fileURL = in.readString(); + boardDir = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public BoardItemFile createFromParcel(Parcel in) { + return new BoardItemFile(in); + } + + @Override + public BoardItemFile[] newArray(int size) { + return new BoardItemFile[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(file); + dest.writeString(fileURL); + dest.writeString(boardDir); + } +} diff --git a/app/src/main/res/layout/activity_viewer.xml b/app/src/main/res/layout/activity_viewer.xml index b66e66b..7febe39 100644 --- a/app/src/main/res/layout/activity_viewer.xml +++ b/app/src/main/res/layout/activity_viewer.xml @@ -4,21 +4,19 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:context="org.bienvenidoainternet.baiparser.ViewerActivity"> - - - - + android:layout_alignParentLeft="true" + android:layout_alignParentStart="true" /> + diff --git a/app/src/main/res/layout/fragment_fragment_image.xml b/app/src/main/res/layout/fragment_fragment_image.xml new file mode 100644 index 0000000..093508a --- /dev/null +++ b/app/src/main/res/layout/fragment_fragment_image.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7fa3e34..f5be573 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -73,4 +73,7 @@ Opciones + + Hello blank fragment + -- cgit v1.2.1-18-gbd029