Skip to content

Instantly share code, notes, and snippets.

@NinoDLC
Created July 17, 2019 09:52
Show Gist options
  • Save NinoDLC/ccc1b8ed93223718833f7a54f3096ed9 to your computer and use it in GitHub Desktop.
Save NinoDLC/ccc1b8ed93223718833f7a54f3096ed9 to your computer and use it in GitHub Desktop.
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".controler.articles.ArticlesActivity"
>
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"
>
<androidx.appcompat.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"
/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/main_tl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
app:tabMode="scrollable"
/>
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/main_vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/main_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/fab_margin"
android:layout_gravity="bottom|right|end"
app:layout_behavior="fr.delcey.p5.view.ScrollAwareFabBehavior"
app:srcCompat="@drawable/ic_search_white_24dp"
tools:ignore="RtlHardcoded"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/main_navigation_view_menu"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/articles_activity_menu_header"
/>
</androidx.drawerlayout.widget.DrawerLayout>
package fr.delcey.p5.controler.articles;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.Fragment.SavedState;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager.widget.ViewPager.OnPageChangeListener;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.navigation.NavigationView;
import com.google.android.material.navigation.NavigationView.OnNavigationItemSelectedListener;
import com.google.android.material.tabs.TabLayout;
import fr.delcey.p5.MainApplication;
import fr.delcey.p5.R;
import fr.delcey.p5.controler.OnArticleClickedListener;
import fr.delcey.p5.controler.Section;
import fr.delcey.p5.controler.articles.mostpopular.MostPopularArticlesFragment;
import fr.delcey.p5.controler.articles.section.SectionArticlesFragment;
import fr.delcey.p5.controler.notification.NotificationActivity;
import fr.delcey.p5.controler.search.query.SearchActivity;
import fr.delcey.p5.utils.WebUtils;
import java.util.ArrayList;
import java.util.List;
public class ArticlesActivity extends AppCompatActivity implements OnNavigationItemSelectedListener,
OnArticleClickedListener,
OnPageChangeListener {
private static final String KEY_CURRENT_FRAGMENT_INDEX = "KEY_CURRENT_FRAGMENT_INDEX";
private static final String KEY_CURRENT_FRAGMENT_SAVED_STATE = "KEY_CURRENT_FRAGMENT_SAVED_STATE";
private final List<AbsArticlesFragment> mViewPagerFragments = new ArrayList<>();
private DrawerLayout mDrawer;
private NavigationView mNavigationView;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.articles_activity);
FloatingActionButton fab = findViewById(R.id.main_fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(SearchActivity.navigate(ArticlesActivity.this));
}
});
initMenuDrawer();
initViewPager(savedInstanceState);
}
private void initMenuDrawer() {
Toolbar toolbar = findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
mDrawer = findViewById(R.id.main_drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,
mDrawer,
toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
mDrawer.addDrawerListener(toggle);
toggle.syncState();
mNavigationView = findViewById(R.id.main_navigation_view_menu);
mNavigationView.setNavigationItemSelectedListener(this);
Menu navigationViewMenu = mNavigationView.getMenu();
Section[] values = Section.values();
for (int i = 0, valuesLength = values.length; i < valuesLength; i++) {
Section section = values[i];
MenuItem item = navigationViewMenu.add(0, i, Menu.NONE, section.getTitle());
item.setIcon(section.getIcon());
if (i == 0) {
item.setChecked(true);
}
}
navigationViewMenu.setGroupCheckable(0, true, true);
}
private void initViewPager(@Nullable Bundle savedInstanceState) {
initViewPagerFragments();
if (savedInstanceState != null) {
int index = savedInstanceState.getInt(KEY_CURRENT_FRAGMENT_INDEX);
SavedState fragmentSavedState = savedInstanceState.getParcelable(KEY_CURRENT_FRAGMENT_SAVED_STATE);
mViewPagerFragments.get(index).setInitialSavedState(fragmentSavedState);
}
mViewPager = findViewById(R.id.main_vp);
ArticlesViewPagerAdapter adapter = new ArticlesViewPagerAdapter(getSupportFragmentManager(),
mViewPagerFragments);
mViewPager.setAdapter(adapter);
mViewPager.addOnPageChangeListener(this);
TabLayout tabLayout = findViewById(R.id.main_tl);
tabLayout.setupWithViewPager(mViewPager);
}
private void initViewPagerFragments() {
for (Section section : Section.values()) {
if (section.isMostPopularUrl()) {
mViewPagerFragments.add(MostPopularArticlesFragment.newInstance(getString(section.getTitle()),
section.getMostPopularDuration()));
} else {
mViewPagerFragments.add(SectionArticlesFragment.newInstance(getString(section.getTitle()),
section.getSection()));
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu on the ActionBar (top right)
getMenuInflater().inflate(R.menu.articles_activity_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_action_notifications) {
startActivity(NotificationActivity.navigate(this));
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (mDrawer.isDrawerOpen(GravityCompat.START)) {
mDrawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
// MenuItem ids' are index instead of random (since we create them at runtime)
int index = item.getItemId();
mViewPager.setCurrentItem(index);
mDrawer.closeDrawer(GravityCompat.START);
return true;
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
Fragment currentFragment = mViewPagerFragments.get(mViewPager.getCurrentItem());
outState.putInt(KEY_CURRENT_FRAGMENT_INDEX, mViewPager.getCurrentItem());
outState.putParcelable(KEY_CURRENT_FRAGMENT_SAVED_STATE,
getSupportFragmentManager().saveFragmentInstanceState(currentFragment));
}
@Override
public void onArticleClicked(@NonNull String articleUrl) {
WebUtils.openUrl(this, ((MainApplication) getApplication()).getSession(), articleUrl);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
uncheckMenuItems();
mNavigationView.setCheckedItem(position);
}
private void uncheckMenuItems() {
for (int i = 0; i < mNavigationView.getMenu().size(); i++) {
MenuItem item = mNavigationView.getMenu().getItem(i);
traverseAndUncheck(item);
}
}
private void traverseAndUncheck(@NonNull MenuItem item) {
if (item.hasSubMenu()) {
for (int i = 0; i < item.getSubMenu().size(); i++) {
MenuItem subItem = item.getSubMenu().getItem(i);
traverseAndUncheck(subItem);
}
} else {
item.setChecked(false);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment