package me.devsaki.hentoid.dirpicker.ui; import android.content.DialogInterface; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.DialogFragment; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import java.io.File; import me.devsaki.hentoid.R; import me.devsaki.hentoid.dirpicker.events.CurrentRootDirChangedEvent; import me.devsaki.hentoid.dirpicker.events.OnDirCancelEvent; import me.devsaki.hentoid.dirpicker.events.OnDirChosenEvent; import me.devsaki.hentoid.dirpicker.events.OnSAFRequestEvent; import me.devsaki.hentoid.dirpicker.events.OnTextViewClickedEvent; import me.devsaki.hentoid.dirpicker.events.OpFailedEvent; import me.devsaki.hentoid.dirpicker.events.UpdateDirTreeEvent; import me.devsaki.hentoid.dirpicker.ops.DirListBuilder; import me.devsaki.hentoid.dirpicker.util.Bus; import me.devsaki.hentoid.util.FileHelper; import me.devsaki.hentoid.util.Helper; import me.devsaki.hentoid.util.LogHelper; /** * Created by avluis on 06/12/2016. * Directory Chooser (Picker) Fragment Dialog */ public class DirChooserFragment extends DialogFragment implements View.OnClickListener, View.OnLongClickListener { private static final String TAG = LogHelper.makeLogTag(DirChooserFragment.class); private static final String CURRENT_ROOT_DIR = "currentRootDir"; private static final String ROOT_DIR = "rootDir"; private RecyclerView recyclerView; private TextView textView; private FloatingActionButton fabCreateDir, fabRequestSD; private Button selectDirBtn; private EventBus bus; private File currentRootDir; public static DirChooserFragment newInstance(File rootDir) { DirChooserFragment dirChooserFragment = new DirChooserFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(ROOT_DIR, rootDir); dirChooserFragment.setArguments(bundle); return dirChooserFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCurrentRootDir(savedInstanceState); setStyle(DialogFragment.STYLE_NO_FRAME, R.style.ImportDialogTheme); } @Override public void onActivityCreated(Bundle savedState) { super.onActivityCreated(savedState); Bus.register(bus, getActivity()); } @Override public void onDestroy() { Bus.unregister(bus, getActivity()); super.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState) { outState.putSerializable(CURRENT_ROOT_DIR, currentRootDir); super.onSaveInstanceState(outState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { View rootView = inflater.inflate(R.layout.fragment_dir_picker, container, false); initUI(rootView); bus = new EventBus(); bus.register(this); DirListBuilder dirListBuilder = new DirListBuilder( getActivity().getApplicationContext(), bus, recyclerView); Bus.register(bus, dirListBuilder); dirListBuilder.onUpdateDirTreeEvent(new UpdateDirTreeEvent(currentRootDir)); return rootView; } private void initUI(View rootView) { recyclerView = (RecyclerView) rootView.findViewById(R.id.dir_list); textView = (TextView) rootView.findViewById(R.id.current_dir); fabCreateDir = (FloatingActionButton) rootView.findViewById(R.id.create_dir); fabRequestSD = (FloatingActionButton) rootView.findViewById(R.id.request_sd); selectDirBtn = (Button) rootView.findViewById(R.id.select_dir); textView.setOnClickListener(this); textView.setOnLongClickListener(this); fabCreateDir.setOnClickListener(this); selectDirBtn.setOnClickListener(this); if (Helper.isAtLeastAPI(Build.VERSION_CODES.KITKAT) && FileHelper.isSDPresent) { fabRequestSD.setOnClickListener(this); fabRequestSD.setVisibility(View.VISIBLE); } } @Subscribe public void onOpFailedEvent(OpFailedEvent event) { LogHelper.d(TAG, getString(R.string.op_not_allowed)); Helper.toast(getActivity(), R.string.op_not_allowed); } @Subscribe public void onCurrentRootDirChangedEvent(CurrentRootDirChangedEvent event) { currentRootDir = event.getCurrentDirectory(); textView.setText(event.getCurrentDirectory().toString()); } private void setCurrentRootDir(Bundle savedState) { if (savedState != null) { currentRootDir = (File) savedState.getSerializable(CURRENT_ROOT_DIR); } else { setCurrentDir(); } } private void setCurrentDir() { File rootDir = (File) getArguments().getSerializable(ROOT_DIR); if (rootDir == null) { currentRootDir = Environment.getExternalStorageDirectory(); } else { currentRootDir = rootDir; } } @Override public void onCancel(DialogInterface dialog) { bus.post(new OnDirCancelEvent()); super.onCancel(dialog); } @Override public void onClick(View v) { if (v.equals(textView)) { onTextViewClicked(false); } else if (v.equals(fabCreateDir)) { createDirBtnClicked(); } else if (v.equals(fabRequestSD)) { requestSDBtnClicked(); } else if (v.equals(selectDirBtn)) { selectDirBtnClicked(); } } @Override public boolean onLongClick(View v) { if (v.equals(textView)) { onTextViewClicked(true); return true; } return false; } private void onTextViewClicked(boolean longClick) { LogHelper.d(TAG, "On TextView Clicked Event"); bus.post(new OnTextViewClickedEvent(longClick)); } private void createDirBtnClicked() { new CreateDirDialog(getActivity(), bus, getActivity().getString(R.string.app_name)).dialog(currentRootDir); } private void requestSDBtnClicked() { LogHelper.d(TAG, "SAF Request Event"); bus.post(new OnSAFRequestEvent()); } private void selectDirBtnClicked() { bus.post(new OnDirChosenEvent(currentRootDir)); dismiss(); } }