blob: e8d4cebf15ce23fbba0419d0f83f0fa41b440fae [file] [log] [blame]
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.pump.activity;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.android.pump.R;
import com.android.pump.fragment.AlbumFragment;
import com.android.pump.fragment.ArtistFragment;
import com.android.pump.fragment.AudioFragment;
import com.android.pump.fragment.GenreFragment;
import com.android.pump.fragment.HomeFragment;
import com.android.pump.fragment.MovieFragment;
import com.android.pump.fragment.OtherFragment;
import com.android.pump.fragment.PermissionFragment;
import com.android.pump.fragment.PlaylistFragment;
import com.android.pump.fragment.SeriesFragment;
import com.android.pump.util.Globals;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.bottomnavigation.BottomNavigationView.OnNavigationItemSelectedListener;
import com.google.android.material.tabs.TabLayout;
@UiThread
public class PumpActivity extends AppCompatActivity implements OnNavigationItemSelectedListener {
// TODO The following should be a non-static member
private static boolean sIsMissingPermissions = true;
private static final Pages[] PAGES_LIST = {
new Pages(R.id.menu_home, new Page[] {
new Page(HomeFragment::newInstance, "Home")
}),
new Pages(R.id.menu_video, new Page[] {
new Page(MovieFragment::newInstance, "Movies"),
new Page(SeriesFragment::newInstance, "TV Shows"),
new Page(OtherFragment::newInstance, "Personal"),
new Page(HomeFragment::newInstance, "All videos")
}),
new Pages(R.id.menu_audio, new Page[] {
new Page(AudioFragment::newInstance, "All audios"),
new Page(PlaylistFragment::newInstance, "Playlists"),
new Page(AlbumFragment::newInstance, "Albums"),
new Page(GenreFragment::newInstance, "Genres"),
new Page(ArtistFragment::newInstance, "Artists")
}),
new Pages(R.id.menu_favorite, new Page[] {
new Page(HomeFragment::newInstance, "Videos"),
new Page(HomeFragment::newInstance, "Audios")
})
};
private boolean mInitialized = false;
private ActivityPagerAdapter mActivityPagerAdapter;
private DrawerLayout mDrawerLayout;
private ViewPager mViewPager;
private TabLayout mTabLayout;
private BottomNavigationView mBottomNavigationView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// NOTE: If you are facing StrictMode violation by setContentView please disable instant run
setContentView(R.layout.activity_pump);
setSupportActionBar(findViewById(R.id.activity_pump_toolbar));
mActivityPagerAdapter = new ActivityPagerAdapter(getSupportFragmentManager());
mDrawerLayout = findViewById(R.id.activity_pump_drawer_layout);
mViewPager = findViewById(R.id.activity_pump_view_pager);
mTabLayout = findViewById(R.id.activity_pump_tab_layout);
mBottomNavigationView = findViewById(R.id.activity_pump_bottom_navigation_view);
mBottomNavigationView.setOnNavigationItemSelectedListener(this);
mBottomNavigationView.setSelectedItemId(R.id.menu_home);
mViewPager.setAdapter(mActivityPagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
}
@Override
public void onResume() {
super.onResume();
initialize();
}
@Override
public boolean onCreateOptionsMenu(@NonNull Menu menu) {
getMenuInflater().inflate(R.menu.activity_pump, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
mDrawerLayout.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
for (Pages pages : PAGES_LIST) {
if (pages.getId() == item.getItemId()) {
selectPages(item.getTitle(), pages);
return true;
}
}
return false;
}
// TODO This should not be public
public void initialize() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
if (!mInitialized) {
mInitialized = true;
sIsMissingPermissions = false;
mActivityPagerAdapter.notifyDataSetChanged();
Globals.getMediaDb(this).load();
}
}
}
private void selectPages(@NonNull CharSequence title, @NonNull Pages pages) {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setTitle(title);
}
Pages current = mActivityPagerAdapter.getPages();
if (current != null) {
current.setCurrent(mViewPager.getCurrentItem());
}
mActivityPagerAdapter.setPages(pages);
int count = mActivityPagerAdapter.getCount();
mTabLayout.setVisibility(count <= 1 ? View.GONE : View.VISIBLE);
mTabLayout.setTabMode(count <= 4 ? TabLayout.MODE_FIXED : TabLayout.MODE_SCROLLABLE);
mViewPager.setCurrentItem(pages.getCurrent());
}
private static class ActivityPagerAdapter extends FragmentPagerAdapter {
private Pages mPages;
ActivityPagerAdapter(@NonNull FragmentManager fm) {
super(fm);
}
void setPages(@NonNull Pages pages) {
mPages = pages;
notifyDataSetChanged();
}
@Nullable Pages getPages() {
return mPages;
}
@Override
public int getCount() {
return mPages.getPages().length;
}
@Override
public @NonNull Fragment getItem(int position) {
return mPages.getPages()[position].createFragment();
}
@Override
public long getItemId(int position) {
return mPages.getPages()[position].getId();
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
@Override
public @NonNull CharSequence getPageTitle(int position) {
return mPages.getPages()[position].getTitle();
}
}
private static class Page {
private static int sId = 0;
private final int mId;
private final PageCreator mPageCreator;
private final String mTitle;
Page(@NonNull PageCreator pageCreator, @NonNull String title) {
mId = sId++;
mPageCreator = pageCreator;
mTitle = title;
}
int getId() {
if (isMissingPermissions()) {
return ~mId;
}
return mId;
}
@NonNull Fragment createFragment() {
if (isMissingPermissions()) {
return PermissionFragment.newInstance();
}
return mPageCreator.newInstance();
}
@NonNull String getTitle() {
return mTitle;
}
private boolean isMissingPermissions() {
return sIsMissingPermissions;
}
}
private static class Pages {
private final int mId;
private final Page[] mPages;
private int mCurrent;
Pages(@IdRes int id, @NonNull Page[] pages) {
mId = id;
mPages = pages;
}
int getId() {
return mId;
}
@NonNull Page[] getPages() {
return mPages;
}
void setCurrent(int current) {
mCurrent = current;
}
int getCurrent() {
return mCurrent;
}
}
@FunctionalInterface
private interface PageCreator {
@NonNull Fragment newInstance();
}
}