package com.amaze.filemanager.fragments;
import android.animation.ArgbEvaluator;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
import com.amaze.filemanager.R;
import com.amaze.filemanager.activities.BaseActivity;
import com.amaze.filemanager.activities.MainActivity;
import com.amaze.filemanager.database.Tab;
import com.amaze.filemanager.database.TabHandler;
import com.amaze.filemanager.ui.ColorCircleDrawable;
import com.amaze.filemanager.ui.drawer.EntryItem;
import com.amaze.filemanager.ui.views.DisablableViewPager;
import com.amaze.filemanager.ui.views.Indicator;
import com.amaze.filemanager.utils.Logger;
import com.amaze.filemanager.utils.MainActivityHelper;
import com.amaze.filemanager.utils.OpenMode;
import com.amaze.filemanager.utils.PreferenceUtils;
import com.amaze.filemanager.utils.color.ColorUsage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import static com.amaze.filemanager.activities.MainActivity.dataUtils;
/**
* Created by Arpit on 15-12-2014.
*/
public class TabFragment extends android.support.v4.app.Fragment
implements ViewPager.OnPageChangeListener {
public List<Fragment> fragments = new ArrayList<>();
public ScreenSlidePagerAdapter mSectionsPagerAdapter;
public DisablableViewPager mViewPager;
SharedPreferences sharedPrefs;
String path;
// current visible tab, either 0 or 1
//public int currenttab;
MainActivity mainActivity;
View buttons;
View mToolBarContainer;
boolean savepaths;
FragmentManager fragmentManager;
// ink indicators for viewpager only for Lollipop+
private Indicator indicator;
// views for circlular drawables below android lollipop
private ImageView circleDrawable1, circleDrawable2;
private boolean coloredNavigation;
// color drawable for action bar background
private ColorDrawable colorDrawable = new ColorDrawable();
// colors relative to current visible tab
private String startColor, endColor;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.tabfragment, container, false);
fragmentManager = getActivity().getSupportFragmentManager();
mToolBarContainer = getActivity().findViewById(R.id.lin);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
indicator = (Indicator) getActivity().findViewById(R.id.indicator);
} else {
circleDrawable1 = (ImageView) getActivity().findViewById(R.id.tab_indicator1);
circleDrawable2 = (ImageView) getActivity().findViewById(R.id.tab_indicator2);
}
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
savepaths = sharedPrefs.getBoolean("savepaths", true);
coloredNavigation = sharedPrefs.getBoolean("colorednavigation", true);
mViewPager = (DisablableViewPager) rootView.findViewById(R.id.pager);
if (getArguments() != null) {
path = getArguments().getString("path");
}
buttons = getActivity().findViewById(R.id.buttons);
mainActivity = ((MainActivity) getActivity());
mainActivity.supportInvalidateOptionsMenu();
mViewPager.addOnPageChangeListener(this);
mSectionsPagerAdapter = new ScreenSlidePagerAdapter(getActivity().getSupportFragmentManager());
if (savedInstanceState == null) {
int l = sharedPrefs.getInt(PreferenceUtils.KEY_CURRENT_TAB, PreferenceUtils.DEFAULT_CURRENT_TAB);
MainActivity.currentTab = l;
TabHandler tabHandler = new TabHandler(getActivity());
List<Tab> tabs1 = tabHandler.getAllTabs();
int i = tabs1.size();
if (i == 0) {
// creating tabs in db for the first time, probably the first launch of app
if (mainActivity.storage_count > 1)
addTab(new Tab(1, "", ((EntryItem) dataUtils.getList().get(1)).getPath(), "/"), 1, "");
else
addTab(new Tab(1, "", "/", "/"), 1, "");
if (!dataUtils.getList().get(0).isSection()) {
String pa = ((EntryItem) dataUtils.getList().get(0)).getPath();
addTab(new Tab(2, "", pa, pa), 2, "");
} else
addTab(new Tab(2, "", ((EntryItem) dataUtils.getList().get(1)).getPath(), "/"), 2, "");
} else {
if (path != null && path.length() != 0) {
if (l == 1)
addTab(tabHandler.findTab(1), 1, "");
addTab(tabHandler.findTab(l + 1), l + 1, path);
if (l == 0)
addTab(tabHandler.findTab(2), 2, "");
} else {
addTab(tabHandler.findTab(1), 1, "");
addTab(tabHandler.findTab(2), 2, "");
}
}
mViewPager.setAdapter(mSectionsPagerAdapter);
try {
mViewPager.setCurrentItem(l, true);
if (circleDrawable1 != null && circleDrawable2 != null) {
updateIndicator(mViewPager.getCurrentItem());
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
fragments.clear();
try {
if (fragmentManager == null)
fragmentManager = getActivity().getSupportFragmentManager();
fragments.add(0, fragmentManager.getFragment(savedInstanceState, "tab" + 0));
fragments.add(1, fragmentManager.getFragment(savedInstanceState, "tab" + 1));
} catch (Exception e) {
e.printStackTrace();
}
mSectionsPagerAdapter = new ScreenSlidePagerAdapter(
getActivity().getSupportFragmentManager());
mViewPager.setAdapter(mSectionsPagerAdapter);
int pos1 = savedInstanceState.getInt("pos", 0);
MainActivity.currentTab = pos1;
mViewPager.setCurrentItem(pos1);
mSectionsPagerAdapter.notifyDataSetChanged();
}
if (indicator != null) indicator.setViewPager(mViewPager);
// color of viewpager when current tab is 0
startColor = mainActivity.getColorPreference().getColorAsString(ColorUsage.PRIMARY);
// color of viewpager when current tab is 1
endColor = mainActivity.getColorPreference().getColorAsString(ColorUsage.PRIMARY_TWO);
// update the views as there is any change in {@link MainActivity#currentTab}
// probably due to config change
/*colorDrawable.setColor(Color.parseColor(MainActivity.currentTab==1 ?
BaseActivity.skinTwo : BaseActivity.skin));
mainActivity.updateViews(colorDrawable);*/
mainActivity.mainFragment = (MainFragment) getTab();
return rootView;
}
@Override
public void onDestroyView() {
sharedPrefs.edit().putInt(PreferenceUtils.KEY_CURRENT_TAB, MainActivity.currentTab).apply();
super.onDestroyView();
try {
if (tabHandler != null)
tabHandler.close();
} catch (Exception e) {
e.printStackTrace();
}
}
TabHandler tabHandler;
public void updatepaths(int pos) {
if (tabHandler == null)
tabHandler = new TabHandler(getActivity());
int i = 1;
ArrayList<String> items = new ArrayList<>();
// Getting old path from database before clearing
tabHandler.clear();
for (Fragment fragment : fragments) {
if (fragment.getClass().getName().contains("Main")) {
MainFragment m = (MainFragment) fragment;
items.add(parsePathForName(m.CURRENT_PATH, m.openMode));
if (i - 1 == MainActivity.currentTab && i == pos) {
mainActivity.updatePath(m.CURRENT_PATH, m.results, m.openMode, m
.folder_count, m.file_count);
mainActivity.updateDrawer(m.CURRENT_PATH);
}
if (m.openMode == OpenMode.FILE) {
tabHandler.addTab(new Tab(i, m.CURRENT_PATH, m.CURRENT_PATH, m.home));
} else
tabHandler.addTab(new Tab(i, m.home, m.home, m.home));
i++;
}
}
}
String parseSmbPath(String a) {
if (a.contains("@"))
return "smb://" + a.substring(a.indexOf("@") + 1, a.length());
else return a;
}
String parsePathForName(String path, OpenMode openmode) {
Resources resources = getActivity().getResources();
if ("/".equals(path))
return resources.getString(R.string.rootdirectory);
else if (openmode == OpenMode.SMB && path.startsWith("smb:/"))
return (new File(parseSmbPath(path)).getName());
else if ("/storage/emulated/0".equals(path))
return resources.getString(R.string.storage);
else if (openmode == OpenMode.CUSTOM)
return new MainActivityHelper(mainActivity).getIntegralNames(path);
else
return new File(path).getName();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
try {
int i = 0;
if (sharedPrefs != null)
sharedPrefs.edit().putInt(PreferenceUtils.KEY_CURRENT_TAB, MainActivity.currentTab).commit();
if (fragments != null && fragments.size() != 0) {
if (fragmentManager == null) return;
for (Fragment fragment : fragments) {
fragmentManager.putFragment(outState, "tab" + i, fragment);
i++;
}
outState.putInt("pos", mViewPager.getCurrentItem());
}
} catch (Exception e) {
Logger.log(e, "puttingtosavedinstance", getActivity());
e.printStackTrace();
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
ArgbEvaluator evaluator = new ArgbEvaluator();
int color = (int) evaluator.evaluate(position + positionOffset, Color.parseColor(startColor),
Color.parseColor(endColor));
colorDrawable.setColor(color);
if (mainActivity.mainFragment != null & !mainActivity.mainFragment.selection) {
// we do not want to update toolbar colors when action mode is activated
// during the config change
mainActivity.updateViews(colorDrawable);
}
}
@Override
public void onPageSelected(int p1) {
mToolBarContainer.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();
MainActivity.currentTab = p1;
if (sharedPrefs != null)
sharedPrefs.edit().putInt(PreferenceUtils.KEY_CURRENT_TAB, MainActivity.currentTab).commit();
Log.d(getClass().getSimpleName(), "Page Selected: " + MainActivity.currentTab);
Fragment fragment = fragments.get(p1);
if (fragment != null) {
String name = fragments.get(p1).getClass().getName();
if (name != null && name.contains("Main")) {
MainFragment ma = ((MainFragment) fragments.get(p1));
if (ma.CURRENT_PATH != null) {
try {
mainActivity.updateDrawer(ma.CURRENT_PATH);
mainActivity.updatePath(ma.CURRENT_PATH, ma.results, ma.openMode,
ma.folder_count, ma.file_count);
if (buttons.getVisibility() == View.VISIBLE) {
mainActivity.bbar(ma);
}
} catch (Exception e) {
// e.printStackTrace();5
}
}
}
}
if (circleDrawable1 != null && circleDrawable2 != null) updateIndicator(p1);
}
@Override
public void onPageScrollStateChanged(int state) {
// nothing to do
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
@Override
public int getItemPosition(Object object) {
int index = fragments.indexOf((Fragment) object);
if (index == -1)
return POSITION_NONE;
else
return index;
}
public int getCount() {
// TODO: Implement this method
return fragments.size();
}
public ScreenSlidePagerAdapter(android.support.v4.app.FragmentManager fm) {
super(fm);
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
android.support.v4.app.Fragment f;
f = fragments.get(position);
return f;
}
}
public void addTab(Tab tab, int pos, String path) {
if (tab == null) return;
android.support.v4.app.Fragment main = new MainFragment();
Bundle b = new Bundle();
if (path != null && path.length() != 0)
b.putString("lastpath", path);
else
b.putString("lastpath", tab.getOriginalPath(savepaths));
b.putString("home", tab.getHome());
b.putInt("no", pos);
main.setArguments(b);
fragments.add(main);
mSectionsPagerAdapter.notifyDataSetChanged();
mViewPager.setOffscreenPageLimit(4);
}
public Fragment getTab() {
if (fragments.size() == 2)
return fragments.get(mViewPager.getCurrentItem());
else return null;
}
public Fragment getTab(int pos) {
if (fragments.size() == 2 && pos < 2)
return fragments.get(pos);
else return null;
}
// updating indicator color as per the current viewpager tab
void updateIndicator(int index) {
if (index != 0 && index != 1) return;
if (index == 0) {
circleDrawable1.setImageDrawable(new ColorCircleDrawable(Color.parseColor(BaseActivity.accentSkin)));
circleDrawable2.setImageDrawable(new ColorCircleDrawable(Color.GRAY));
} else {
circleDrawable1.setImageDrawable(new ColorCircleDrawable(Color.parseColor(BaseActivity.accentSkin)));
circleDrawable2.setImageDrawable(new ColorCircleDrawable(Color.GRAY));
}
}
}