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; 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.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.Random; import layout.fragmentThreadList; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, fragmentThreadList.OnFragmentInteractionListener { public static final float CURRENT_VERSION = 1.5F; 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; Toolbar toolbar = null; public int currentThemeId = 0, themeId = 0; // Id del recurso, Id del tema public ArrayList 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); if (savedInstanceState != null) { currentThemeId = savedInstanceState.getInt("currentThemeId"); boardList = savedInstanceState.getParcelableArrayList("boardList"); } SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); themeId = Integer.valueOf(settings.getString("pref_theme", "1")); if (settings.getString("pref_password", "").isEmpty()){ SharedPreferences.Editor edit = settings.edit(); edit.putString("pref_password", makePassword()); edit.commit(); } switch (themeId) { case 1: currentThemeId = R.style.AppTheme_NoActionBar; break; case 2: currentThemeId = R.style.AppTheme_Dark; break; case 3: currentThemeId = R.style.AppTheme_HeadLine; setTheme(R.style.AppTheme_HeadLine_Activity); break; case 4: currentThemeId = R.style.AppTheme_Black; setTheme(R.style.AppTheme_Black_Activity); break; } themeManager = new ThemeManager(this); Log.d("ThemeManager", "isDarkTheme: " + themeManager.isDarkTheme()); 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 (childFragment.currentBoard != null) { if (!childFragment.boardItems.isEmpty()) { try { Intent in = new Intent(getApplicationContext(), ResponseActivity.class); Bundle b = new Bundle(); b.putParcelable("theReply", childFragment.boardItems.get(0)); b.putParcelable("theBoard", childFragment.currentBoard); in.putExtras(b); startActivity(in); } 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 = (fragmentThreadList) getSupportFragmentManager().getFragment(savedInstanceState, "mainFragment"); childFragment = (fragmentThreadList) getSupportFragmentManager().getFragment(savedInstanceState, "childFragment"); // recentFragment = (fragmentThreadList) getSupportFragmentManager().getFragment(savedInstanceState, "recentFragment"); } else { mainFragment = fragmentThreadList.newInstance(true, null, null); childFragment = fragmentThreadList.newInstance(false, null, null); // recentFragment = fragmentThreadList.newInstance(false, null, -1); } 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() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (position == 0){ if (mainFragment.currentBoard != null) { toolbar.setTitle("Catálogo"); toolbar.setSubtitle(mainFragment.currentBoard.getBoardName()); } if (mainFragment.getMode()){ toolbar.setTitle("Post recientes"); toolbar.setSubtitle(""); } fab.setVisibility(View.INVISIBLE); }else if (position == 1){ if (childFragment.currentBoard != null) { toolbar.setTitle(childFragment.currentBoard.getBoardName()); if (!childFragment.boardItems.isEmpty()){ toolbar.setSubtitle(childFragment.boardItems.get(0).getSubject()); } fab.setVisibility(View.VISIBLE); } } } @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(); } //TODO: Aplicar tema al navigator //navigationView.setBackgroundColor(themeManager.getPrimaryDarkColor()); } @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(); } } 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") .asJsonObject() .setCallback(new FutureCallback() { @Override public void onCompleted(Exception e, JsonObject result) { if (e != null) { e.printStackTrace(); Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); } else { JsonArray boards = result.get("boards").getAsJsonArray(); for (int i = 0; i < boards.size(); i++) { try { JSONObject board = new JSONObject(boards.get(i).toString()); Board parsedBoard = new Board(board.getString("name"), board.getString("dir"), board.getInt("board_type")); sub.add(parsedBoard.getBoardName()); boardList.add(parsedBoard); } catch (JSONException e1) { e1.printStackTrace(); Toast.makeText(getApplicationContext(), "Error parsing JSON", Toast.LENGTH_LONG).show(); } } } } }); 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; } }