org.bienvenidoainternet.app.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.bienvenidoainternet.app.MainActivity.java

Source

package org.bienvenidoainternet.app;

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.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.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;

import org.bienvenidoainternet.app.structure.Board;
import org.bienvenidoainternet.app.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 pgina del ViewPager, se muestra un solo hilo (selecionado del catlogo)
    FragmentBoardItemList mainFragment; // Primera pgina del ViewPager, se muestra una lista de hilos. (catlogo)
    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("Catlogo");
                        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("Catlogo");
            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();
                            }
                        }
                    }
                });
        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;
    }
}