aboutsummaryrefslogblamecommitdiff
path: root/app/src/main/java/org/bienvenidoainternet/baiparser/MainActivity.java
blob: 9a6a344ea92d08930c920fbabfb43a362a1d0742 (plain) (tree)
1
2
3
4
5
6
7
8
9
10




                                          




                                                          






















                                                             
                          





                              
                                    
 

















                                                                          
                                                   
                                                                                                                         





                                                                       

                                                                                                                              




























                                                                                                      

                                                    





                                                                                         





                                                               




                                                       



                                                            






























                                                                                                                                        
















                                                                                                          

                                                                                                                                 
                

                                                                                 





                                                                                        










                                                                                                      
                                                                   







                                                                                      




                                                
                                         
                                                             




                                                                                              
                                   




















                                                             


                                                          

     
 





































































                                                                                         


                                                                                           
















































































                                                                                                              

























                                                                                            




                                                                      

                                                           
                             
                                                                         


                                                                                                              




                                                                                                 
                                                                                                                                                                                                        

                                                                        
                                 


                                                                                                                   



                             



                                                                         













                                                                                                    
    


                                                                                                                
















                                               
 
package org.bienvenidoainternet.baiparser;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
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.v4.view.GravityCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.HeaderViewListAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;

import org.bienvenidoainternet.baiparser.structure.Board;
import org.bienvenidoainternet.baiparser.structure.BoardItem;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Random;

import layout.FragmentBoardItemList;

/**
 *   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 MainActivity extends AppCompatActivity
        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;
    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<Board> boardList = new ArrayList<>();

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("currentThemeId", currentThemeId);
        outState.putInt("themeId", themeId);
        outState.putParcelableArrayList("boardList", boardList);
        if (getSupportFragmentManager().getFragments() != null) {
            if (getSupportFragmentManager().getFragments().size() != 0) {
                try {
                    getSupportFragmentManager().putFragment(outState, "mainFragment", mainFragment);
                    getSupportFragmentManager().putFragment(outState, "childFragment", childFragment);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }

    public int getCurrentThemeId() {
        return currentThemeId;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ThemeManager tm = new ThemeManager(this);
        this.setTheme(tm.getThemeForMainActivity());

        if (savedInstanceState != null) {
            currentThemeId = savedInstanceState.getInt("currentThemeId");
            boardList = savedInstanceState.getParcelableArrayList("boardList");
        }
        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
        if (settings.getString("pref_password", "").isEmpty()){
            SharedPreferences.Editor edit = settings.edit();
            edit.putString("pref_password", makePassword());
            edit.commit();
        }

        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle("Bievenido a internet");
        this.setSupportActionBar(toolbar);

        fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (pager.getCurrentItem() == 0){
                    if (!mainFragment.getMode() && mainFragment.currentBoard != null){
                        Intent in = new Intent(getApplicationContext(), ResponseActivity.class);
                        Bundle b = new Bundle();
                        BoardItem temp = new BoardItem();
                        temp.setParentBoard(mainFragment.currentBoard);
                        b.putParcelable("theReply", temp);
                        b.putBoolean("quoting", false);
                        b.putBoolean("newthread", true);
                        in.putExtras(b);
                        startActivity(in);
                    }
                }else{
                    if (childFragment.currentBoard != null) {
                        if (!childFragment.boardItems.isEmpty()) {
                            try {
                                Intent in = new Intent(getApplicationContext(), ResponseActivity.class);
                                Bundle b = new Bundle();
                                BoardItem reply = childFragment.boardItems.get(0);
                                if (!reply.isLocked) {
                                    b.putParcelable("theReply", reply);
                                    b.putBoolean("quoting", false);
                                    b.putBoolean("newthread", false);
                                    in.putExtras(b);
                                    startActivity(in);
                                }else{
                                    Toast.makeText(getApplicationContext(), "Error: Este hilo está cerrado", Toast.LENGTH_LONG).show();
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        });
        fab.setVisibility(View.GONE);

        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        if (savedInstanceState != null) {
            mainFragment = (FragmentBoardItemList) getSupportFragmentManager().getFragment(savedInstanceState, "mainFragment");
            childFragment = (FragmentBoardItemList) getSupportFragmentManager().getFragment(savedInstanceState, "childFragment");
        } else {
            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);
        this.pager.setAdapter(pagerAdapter);

        pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if (position == 0){
                    fab.setImageResource(R.drawable.ic_action_add);
                    if (mainFragment.currentBoard != null) {
                        toolbar.setTitle("Catálogo");
                        toolbar.setSubtitle(mainFragment.currentBoard.getBoardName());
                    }
                    if (mainFragment.getMode()){
                        toolbar.setTitle("Post recientes");
                        toolbar.setSubtitle("");
                    }
                    if (mainFragment.getMode()){
                        fab.hide();
                    }else{
                        fab.show();
                    }
                }else if (position == 1){
                    fab.setImageResource(R.drawable.ic_edit);
                    if (childFragment.currentBoard != null) {
                        toolbar.setTitle(childFragment.currentBoard.getBoardName());
                        if (!childFragment.boardItems.isEmpty()){
                            toolbar.setSubtitle(childFragment.boardItems.get(0).getSubject());
                        }
                        fab.show();
                    }
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        if (boardList.isEmpty()){
            getBoardList();
        }else{
            Menu menu = navigationView.getMenu();
            SubMenu sub = menu.addSubMenu("Lista de Boards");
            for (Board b : boardList) {
                sub.add(b.getBoardName());
            }
            refreshNavigator();
        }

        if (tm.isDarkTheme()){
            navigationView.setBackgroundColor(0xFF888888);
        }
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if(resultCode == Activity.RESULT_OK){
                boolean result = data.getBooleanExtra("result", false);
                if (result){
                    this.recreate();
                }
            }
        }
    }

    @Override
    public void onBackPressed() {
        if (this.pager.getCurrentItem() == 0) {
            super.onBackPressed();
        } else {
            this.pager.setCurrentItem(this.pager.getCurrentItem() - 1);
            return;
        }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case R.id.action_exit:
                System.exit(0);
                break;
            case R.id.action_refresh:
                if (pager.getCurrentItem() == 0) {
                    mainFragment.refresh();
                } else {
                    childFragment.refresh();
                }
                if (boardList.isEmpty()){
                    getBoardList();
                }
                break;
            case R.id.action_settings:
                Intent in2 = new Intent(getApplicationContext(), SettingsActivity.class);
                startActivityForResult(in2, 1);
                break;
            case R.id.action_to_bot:
                if (pager.getCurrentItem() == 0) {
                    mainFragment.scrollToBotton();
                } else {
                    childFragment.scrollToBotton();
                }
                break;
            case R.id.action_to_top:
                if (pager.getCurrentItem() == 0) {
                    mainFragment.scrollToTop();
                } else {
                    childFragment.scrollToTop();
                }
                break;
            case R.id.action_about:
                startActivity(new Intent(getApplicationContext(), LicensesActivity.class));
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        int id = item.getItemId();
        toolbar.setSubtitle(item.getTitle());
        if (id == R.id.nav_recent_post){
            toolbar.setTitle("Post recientes");
            toolbar.setSubtitle("");
            pager.setCurrentItem(0);
            mainFragment.loadRecentPost();
        }
        for (Board b : boardList){
            if (b.getBoardName() == item.getTitle()){
                System.out.println("Updating mainfragment to " + b.getBoardName() + " d: " + b.getBoardDir());
                mainFragment.setCatalogMode();
                mainFragment.updateBoardItems(b, null);
                pager.setCurrentItem(0);
                navigationView.getMenu().findItem(R.id.nav_recent_post).setChecked(false);
            }
        }
        return true;
    }

    public Board getBoardFromDir(String dir){
        for (Board b : boardList){
            if (b.getBoardDir().equals(dir)){
                return b;
            }
        }
        System.out.println("[MainActivity] Board not found " + dir);
        return null;
    }


    @Override
    public void onFragmentInteraction(Uri uri) {

    }

    @Override
    public void showThread(Board board, BoardItem thread) {
        childFragment.updateBoardItems(board, thread);
        pager.setCurrentItem(1);
    }


    @Override
    public void updateToolbar(Board cBoard, BoardItem btem) {
        if (pager.getCurrentItem() == 1){
            toolbar.setTitle(cBoard.getBoardName());
            toolbar.setSubtitle(btem.getSubject());
        }
    }

    @Override
    public void updateToolbar(String s) {
        toolbar.setTitle(s);
        toolbar.setSubtitle("");
    }

    @Override
    public void hideActionButton() {
        if (pager.getCurrentItem() == 1){
            fab.hide();
        }
    }

    @Override
    public void showActionButton() {
        if (pager.getCurrentItem() == 1){
            fab.show();
        }
    }

    @Override
    public void onThreadList() {
        if (pager.getCurrentItem() == 0){
            getSupportActionBar().setTitle("Catálogo");
            getSupportActionBar().setSubtitle(mainFragment.currentBoard.getBoardName());
            fab.show();
        }
    }

    @Override
    public void onThread() {
        if (pager.getCurrentItem() == 1){
            getSupportActionBar().setTitle(childFragment.currentBoard.getBoardName());
            getSupportActionBar().setSubtitle(childFragment.boardItems.get(0).getSubject());
        }
    }

    @Override
    public void onRecentPosts() {
        if (pager.getCurrentItem() == 0){
            getSupportActionBar().setTitle("Post recientes");
            getSupportActionBar().setSubtitle("");
            fab.hide();
        }
    }

    private void getBoardList(){
        Menu menu = navigationView.getMenu();
        final SubMenu sub = menu.addSubMenu("Lista de Boards");
        Ion.with(getApplicationContext())
                .load("http://bienvenidoainternet.org/cgi/api/boards")
                .asString()
                .setCallback(new FutureCallback<String>() {
                    @Override
                    public void onCompleted(Exception e, String result) {
                        if (e != null) {
                            e.printStackTrace();
                            Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                        }else {
                            try {
                                JSONArray boards = new JSONObject(result).getJSONArray("boards");
                                for (int i = 0; i < boards.length(); i++) {
                                    JSONObject board = boards.getJSONObject(i);
                                    Board parsedBoard = new Board(board.getString("name"), board.getString("dir"), board.getInt("board_type"), board.getInt("allow_image_replies") == 1 ? true : false);
                                    sub.add(parsedBoard.getBoardName());
                                    boardList.add(parsedBoard);
                                }
                            }catch (JSONException e1) {
                                Toast.makeText(getApplicationContext(), e1.getMessage(), Toast.LENGTH_LONG).show();
                                e1.printStackTrace();
                            }
                        }
                    }
                });

        Board parsedBoard = new Board("Testing Field", "polka", 1, true);
        sub.add(parsedBoard.getBoardName());
        boardList.add(parsedBoard);
        refreshNavigator();
    }

    public void refreshNavigator(){
        for (int i = 0, count = navigationView.getChildCount(); i < count; i++) {
            final View child = navigationView.getChildAt(i);
            if (child != null && child instanceof ListView) {
                final ListView menuView = (ListView) child;
                final HeaderViewListAdapter adapter = (HeaderViewListAdapter) menuView.getAdapter();
                final BaseAdapter wrapped = (BaseAdapter) adapter.getWrappedAdapter();
                wrapped.notifyDataSetChanged();
            }
        }
    }
    
    /*
            Crea una secuencia de caracteres de 8 digitos aleatorios (incluye mayusculas, minisculas y numeros).
    */
    public String makePassword(){
        Random r = new Random();
        String rnd = "";
        for (int i = 0; i < 8; i++){
            int a = r.nextInt(3);
            char b;
            if (a == 0){
                b = (char)(66 + r.nextInt(25));
            }else if (a == 1){
                b = (char)(97 + r.nextInt(25));
            }else{
                b = (char) (48 + r.nextInt(9));
            }
            rnd = rnd + b;
        }
        return rnd;
    }
}