package com.fastaccess.ui.modules.apps.device;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.Loader;
import android.support.v4.widget.NestedScrollView;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.view.ActionMode;
import android.view.View;
import com.fastaccess.R;
import com.fastaccess.data.dao.AppsModel;
import com.fastaccess.data.dao.events.DeviceAppsEventModel;
import com.fastaccess.data.dao.events.ThemePackEventModel;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.ui.adapter.DeviceAppsAdapter;
import com.fastaccess.ui.base.BaseFragment;
import com.fastaccess.ui.modules.main.MainMvp;
import com.fastaccess.ui.widgets.FontTextView;
import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView;
import com.mikhaellopez.circularfillableloaders.CircularFillableLoaders;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import butterknife.BindView;
import icepick.State;
/**
* Created by Kosh on 10 Oct 2016, 11:47 PM
*/
public class DeviceAppsView extends BaseFragment<DeviceAppsMvp.View, DeviceAppsPresenter> implements DeviceAppsMvp.View {
public static final String TAG = "DeviceAppsView";
@BindView(R.id.recycler) DynamicRecyclerView recycler;
@BindView(R.id.empty_text) FontTextView emptyText;
@BindView(R.id.empty) NestedScrollView empty;
@BindView(R.id.progressBar) CircularFillableLoaders progressBar;
@State HashMap<String, AppsModel> selection = new LinkedHashMap<>();
private DeviceAppsPresenter presenter;
private DeviceAppsAdapter adapter;
private ActionMode actionMode;
private Loader loader;
private MainMvp.View mainCallback;
public static DeviceAppsView newInstance() {
return new DeviceAppsView();
}
@Override public void onAttach(Context context) {
super.onAttach(context);
if (!(context instanceof MainMvp.View)) {
throw new RuntimeException(context.getClass().getSimpleName() + " is not implementing MainMvp.View");
}
mainCallback = (MainMvp.View) context;
EventBus.getDefault().register(this);
}
@Override public void onDetach() {
super.onDetach();
EventBus.getDefault().unregister(this);
mainCallback = null;
}
@Override protected int fragmentLayout() {
return R.layout.grid_list;
}
@NonNull @Override protected DeviceAppsPresenter getPresenter() {
if (presenter == null) {
presenter = DeviceAppsPresenter.with(this);
}
return presenter;
}
@Override protected void onFragmentCreated(View view, @Nullable Bundle savedInstanceState) {
recycler.setEmptyView(empty);
adapter = new DeviceAppsAdapter(new ArrayList<AppsModel>(), getPresenter(), selection);
recycler.setAdapter(adapter);
loader = getLoaderManager().initLoader(0, null, getPresenter());
if (!selection.isEmpty()) {
actionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(getPresenter());
actionMode.setTitle(getString(R.string.selected) + " ( " + adapter.selectionSize() + " )");
}
}
@Override public void onStartLoading() {
recycler.showProgress(progressBar);
}
@Override public void onAppsLoaded(@Nullable List<AppsModel> data) {
recycler.hideProgress(progressBar);
if (data != null) adapter.insertItems(data);
else adapter.clear();
}
@Override public void onLoaderReset() {
recycler.hideProgress(progressBar);
adapter.clear();
}
@Override public void setSelection(@NonNull String packageName, int position) {
adapter.select(packageName, position, !adapter.isSelected(packageName));
if (hasSelection()) {
if (actionMode == null) {
actionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(getPresenter());
}
actionMode.setTitle(getString(R.string.selected) + " ( " + adapter.selectionSize() + " )");
} else {
actionMode.finish();
}
}
@Override public boolean hasSelection() {
return adapter.hasSelection();
}
@Override public void onActionModeDestroyed() {
adapter.clearSelection();
actionMode = null;
}
@Override public void onOpenAppDetails(@NonNull View view, @NonNull AppsModel appsModel) {
}
@Override public void onAddSelectedApps() {
getPresenter().onAddSelectedApps(adapter.getSelections());
if (actionMode != null) actionMode.finish();
if (mainCallback != null) mainCallback.onShowBadge(R.id.selectedApps);
}
@Override public void onFilter(@Nullable String text) {
if (progressBar.isShown()) {
return;
}
if (InputHelper.isEmpty(text)) {
loader.onContentChanged();
} else {
adapter.getFilter().filter(text);
}
}
@Override public void onSelectAll() {
adapter.clearSelection();
for (int i = 0; i < adapter.getData().size(); i++) {
AppsModel model = adapter.getItem(i);
setSelection(model.getComponentName().toShortString(), i);
}
}
@Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(DeviceAppsEventModel model) {
if (loader != null) loader.onContentChanged();
}
@Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(ThemePackEventModel model) {
if (loader != null) loader.forceLoad();
}
}