package com.mercandalli.android.apps.files.file.local.fab;
import android.support.annotation.DrawableRes;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
/**
* Manage the {@link FloatingActionButton}s visibility, images, clicks...
*/
public abstract class FileLocalFabManager {
/**
* The number of {@link FloatingActionButton} maximum.
*/
@SuppressWarnings("UnnecessaryInterfaceModifier")
public static final int NUMBER_MAX_OF_FAB = 2;
@Nullable
private static FileLocalFabManager sInstance;
@NonNull
public static FileLocalFabManager getInstance() {
if (sInstance == null) {
sInstance = new FileLocalFabManagerImpl();
}
return sInstance;
}
/**
* The {@link android.support.v4.view.ViewPager.OnPageChangeListener#onPageSelected(int)} call
* this method to notify a scroll.
*
* @param viewPagerPosition The new {@link android.support.v4.view.ViewPager} current page position.
*/
public abstract void onCurrentViewPagerPageChange(final int viewPagerPosition);
/**
* Update the {@link FloatingActionButton}s in the current page.
*/
public abstract void updateFabButtons();
/**
* Set the {@link FabContainer}. Build to be the {@link android.support.v4.view.ViewPager}
* container.
*
* @param fabContainer The {@link FabContainer}.
*/
public abstract void setFabContainer(final FabContainer fabContainer);
/**
* Add a {@link FabController}.
*
* @param positionInViewPager The position in the {@link android.support.v4.view.ViewPager}.
* @param fabController The {@link FabController} to add.
* @return <code>true</code> if the {@link FabController} is added.
*/
public abstract boolean addFabController(final int positionInViewPager, final FabController fabController);
/**
* Remove a {@link FabController}.
*
* @param positionInViewPager The position in the {@link android.support.v4.view.ViewPager}.
* @return <code>true</code> if the {@link FabController} is removed.
*/
public abstract boolean removeFabController(final int positionInViewPager);
/**
* The {@link FabContainer} call this method when a {@link FloatingActionButton} is clicked to
* notify the current {@link FabController}.
*
* @param fabPosition The {@link FloatingActionButton} position.
* @param fab THe {@link android.view.View} clicked.
*/
public abstract void onFabClick(
final @IntRange(from = 0, to = NUMBER_MAX_OF_FAB - 1) int fabPosition,
final @NonNull FloatingActionButton fab);
/**
* The {@link FloatingActionButton} container. If you follow the google guidelines, the
* {@link FloatingActionButton} container and the {@link android.support.v4.view.ViewPager}
* container are the same.
*/
public interface FabContainer {
/**
* Update the current {@link FabController} with the {@link FloatingActionButton} properties
* include in the {@link FabState} object.
*
* @param fabStates The new {@link FabState}. The id the the array is the {@link FloatingActionButton}
* position
*/
void updateFabs(final FabState[] fabStates);
}
/**
* Control the {@link FloatingActionButton}. It is often a {@link android.support.v7.widget.RecyclerView}
* container.
*/
public interface FabController {
/**
* Notify the current {@link FabController} that a {@link FloatingActionButton} has been clicked.
*
* @param fabPosition The {@link FloatingActionButton} position, between 0 and
* {@link FileLocalFabManager#NUMBER_MAX_OF_FAB}.
* @param floatingActionButton The {@link FloatingActionButton} {@link android.view.View}.
*/
void onFabClick(
final @IntRange(from = 0, to = NUMBER_MAX_OF_FAB - 1) int fabPosition,
final @NonNull FloatingActionButton floatingActionButton);
/**
* Is the {@link FloatingActionButton} of this controller visible.
*
* @param fabPosition The {@link FloatingActionButton} position.
* @return <code>true</code> if visible, <code>false</code> otherwise.
*/
boolean isFabVisible(
final @IntRange(from = 0, to = NUMBER_MAX_OF_FAB - 1) int fabPosition);
/**
* Get the {@link FloatingActionButton} image resource of this controller.
*
* @param fabPosition The {@link FloatingActionButton} position.
* @return The resource.
*/
@DrawableRes
int getFabImageResource(
final @IntRange(from = 0, to = NUMBER_MAX_OF_FAB - 1) int fabPosition);
}
/**
* All the {@link FloatingActionButton} data.
*/
public final class FabState {
/**
* Is the {@link FloatingActionButton} visible.
*/
public boolean fabVisible;
/**
* The image resource. Example <code>R.drawable.arrow_up</code>.
*/
@DrawableRes
public int fabImageResource;
}
}