/** * This file is part of FileSpace for Android, an app for managing your server (files, talks...). * <p> * Copyright (c) 2014-2015 FileSpace for Android contributors (http://mercandalli.com) * <p> * LICENSE: * <p> * FileSpace for Android 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 2 of the License, or (at your option) any * later version. * <p> * FileSpace for Android 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. * * @author Jonathan Mercandalli * @license http://www.gnu.org/licenses/gpl.html * @copyright 2014-2015 FileSpace for Android contributors (http://mercandalli.com) */ package com.mercandalli.android.apps.files.file.cloud; import android.content.Context; import android.os.Build; import android.os.Bundle; import android.support.annotation.IntRange; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.mercandalli.android.apps.files.R; import com.mercandalli.android.apps.files.common.fragment.BackFragment; import com.mercandalli.android.apps.files.common.listener.IListener; import com.mercandalli.android.apps.files.common.listener.SetToolbarCallback; import com.mercandalli.android.apps.files.file.FileAddDialog; import com.mercandalli.android.apps.files.file.cloud.fab.FileCloudFabManager; import com.mercandalli.android.apps.files.file.local.SearchActivity; import com.mercandalli.android.apps.files.file.local.fab.FileLocalFabManager; import com.mercandalli.android.apps.files.main.network.NetUtils; import static com.mercandalli.android.library.base.view.StatusBarUtils.setStatusBarColor; public class FileCloudPagerFragment extends BackFragment implements ViewPager.OnPageChangeListener, FileCloudFabManager.FabContainer, View.OnClickListener { private static final String BUNDLE_ARG_TITLE = "FileOnlineFragment.Args.BUNDLE_ARG_TITLE"; private static final int NB_FRAGMENT = 3; private static final int INIT_VIEW_PAGER_POSITION = 1; private ViewPager mViewPager; private FileManagerFragmentPagerAdapter mPagerAdapter; private FloatingActionButton mFab1; private FloatingActionButton mFab2; private View mCoordinatorLayoutView; private String mTitle; private SetToolbarCallback mSetToolbarCallback; private FileCloudFabManager mFileCloudFabManager; public static FileCloudPagerFragment newInstance(String title) { final FileCloudPagerFragment fragment = new FileCloudPagerFragment(); final Bundle args = new Bundle(); args.putString(BUNDLE_ARG_TITLE, title); fragment.setArguments(args); return fragment; } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof SetToolbarCallback) { mSetToolbarCallback = (SetToolbarCallback) context; } else { throw new IllegalArgumentException("Must be attached to a HomeActivity. Found: " + context); } } @Override public void onDetach() { super.onDetach(); mSetToolbarCallback = null; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Bundle args = getArguments(); if (!args.containsKey(BUNDLE_ARG_TITLE)) { throw new IllegalStateException("Missing args. Please use newInstance()"); } mTitle = args.getString(BUNDLE_ARG_TITLE); mFileCloudFabManager = FileCloudFabManager.getInstance(); mFileCloudFabManager.setFabContainer(this, INIT_VIEW_PAGER_POSITION); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.fragment_file, container, false); final Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.fragment_file_toolbar); toolbar.setTitle(mTitle); mSetToolbarCallback.setToolbar(toolbar); setStatusBarColor(getContext(), R.color.status_bar); setHasOptionsMenu(true); mCoordinatorLayoutView = rootView.findViewById(R.id.fragment_file_coordinator_layout); mPagerAdapter = new FileManagerFragmentPagerAdapter(getChildFragmentManager()); mViewPager = (ViewPager) rootView.findViewById(R.id.fragment_file_view_pager); mViewPager.setAdapter(mPagerAdapter); ((TabLayout) rootView.findViewById(R.id.fragment_file_tab_layout)).setupWithViewPager(mViewPager); mFab1 = ((FloatingActionButton) rootView.findViewById(R.id.fragment_file_fab_1)); mFab2 = ((FloatingActionButton) rootView.findViewById(R.id.fragment_file_fab_2)); mFab1.setVisibility(View.GONE); mFab2.setVisibility(View.GONE); mFab1.setOnClickListener(this); mFab2.setOnClickListener(this); if (savedInstanceState == null) { mViewPager.setCurrentItem(INIT_VIEW_PAGER_POSITION); } mViewPager.addOnPageChangeListener(this); return rootView; } @Override public boolean back() { int currentFragmentId = getCurrentFragmentIndex(); if (currentFragmentId == -1) { return false; } Fragment fabFragment = getCurrentFragment(); if (fabFragment == null) { return false; } mFileCloudFabManager.updateFabButtons(); return ((BackFragment) fabFragment).back(); } @Override public void updateFabs(final FileCloudFabManager.FabState[] fabStates) { for (int i = 0; i < fabStates.length; i++) { final FileCloudFabManager.FabState fabState = fabStates[i]; if (fabState.fabVisible) { showFab(i); } else { hideFab(i); } int imageResource = fabState.fabImageResource; if (imageResource == -1) { imageResource = android.R.drawable.ic_input_add; } if (i == 0) { mFab1.setImageResource(imageResource); } else { mFab2.setImageResource(imageResource); } } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } @Override public void onPageSelected(int position) { final Context context = getContext(); if (context instanceof AppCompatActivity) { ((AppCompatActivity) context).invalidateOptionsMenu(); } updateNoInternet(); mFileCloudFabManager.onCurrentViewPagerPageChange(position); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main, menu); } @Override public void onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.action_search).setVisible(true); menu.findItem(R.id.action_share).setVisible(false); menu.findItem(R.id.action_delete).setVisible(false); menu.findItem(R.id.action_add).setVisible(false); menu.findItem(R.id.action_home).setVisible(false); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_add: add(); return true; case R.id.action_home: goHome(); return true; case R.id.action_search: SearchActivity.start(getContext()); return true; } return super.onOptionsItemSelected(item); } @Override public void onClick(final View v) { if (v == mFab1) { mFileCloudFabManager.onFabClick(0, mFab1); } else if (v == mFab2) { mFileCloudFabManager.onFabClick(1, mFab2); } } public int getCurrentFragmentIndex() { return mViewPager.getCurrentItem(); } public Fragment getCurrentFragment() { return getChildFragmentManager().findFragmentByTag("android:switcher:" + R.id.fragment_file_view_pager + ":" + mPagerAdapter.getItemId(getCurrentFragmentIndex())); } public void refreshListServer() { Fragment fabFragment = getCurrentFragment(); if (fabFragment != null) { if (fabFragment instanceof FileCloudFragment) { FileCloudFragment fragmentFileManagerFragment = (FileCloudFragment) fabFragment; fragmentFileManagerFragment.refreshCurrentList(); } else if (fabFragment instanceof FileMyCloudFragment) { FileMyCloudFragment fragmentFileManagerFragment = (FileMyCloudFragment) fabFragment; fragmentFileManagerFragment.refreshCurrentList(); } } } public void add() { new FileAddDialog(getActivity(), -1, new IListener() { @Override public void execute() { refreshListServer(); } }, null); } private void goHome() { Fragment fabFragment = getCurrentFragment(); if (fabFragment != null) { if (fabFragment instanceof FileCloudFragment) { // TODO } else if (fabFragment instanceof FileMyCloudFragment) { // TODO } } } private void updateNoInternet() { if (!NetUtils.isInternetConnection(getContext())) { if (mCoordinatorLayoutView != null) { Snackbar snackbar = Snackbar.make(mCoordinatorLayoutView, getString(R.string.no_internet_connection), Snackbar.LENGTH_INDEFINITE) .setAction(getString(R.string.refresh), new View.OnClickListener() { @Override public void onClick(View v) { if (NetUtils.isInternetConnection(getContext())) { Fragment fabFragment = getCurrentFragment(); if (fabFragment != null) { //fabFragment.onFocus(); } } else { updateNoInternet(); } } }); snackbar.show(); } else { Toast.makeText(getContext(), R.string.no_internet_connection, Toast.LENGTH_SHORT).show(); } } } private void hideFab( final @IntRange(from = 0, to = FileLocalFabManager.NUMBER_MAX_OF_FAB - 1) int fabPosition) { switch (fabPosition) { case 0: if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) { mFab1.hide(); } else { mFab1.setVisibility(View.GONE); } break; case 1: if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) { mFab2.hide(); } else { mFab2.setVisibility(View.GONE); } break; } } private void showFab( final @IntRange(from = 0, to = FileLocalFabManager.NUMBER_MAX_OF_FAB - 1) int fabPosition) { switch (fabPosition) { case 0: mFab1.show(); break; case 1: mFab2.show(); break; } } public class FileManagerFragmentPagerAdapter extends FragmentPagerAdapter { public FileManagerFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: return FileCloudFragment.newInstance(position); case 1: return FileMyCloudFragment.newInstance(position); case 2: return FileCloudDownloadedFragment.newInstance(position); default: return FileCloudFragment.newInstance(position); } } @Override public int getCount() { return NB_FRAGMENT; } @Override public CharSequence getPageTitle(int i) { switch (i) { case 0: return getString(R.string.file_fragment_public_cloud); case 1: return getString(R.string.file_fragment_my_cloud); case 2: return "DOWNLOADED"; } return "null"; } } }