package com.fastaccess.ui.modules.repos.code.files; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.view.MenuInflater; import android.view.MotionEvent; import android.view.View; import android.widget.PopupMenu; import com.fastaccess.R; import com.fastaccess.data.dao.model.RepoFile; import com.fastaccess.data.dao.types.FilesType; import com.fastaccess.helper.ActivityHelper; import com.fastaccess.helper.AppHelper; import com.fastaccess.helper.BundleConstant; import com.fastaccess.helper.Bundler; import com.fastaccess.helper.FileHelper; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.Logger; import com.fastaccess.helper.PrefGetter; import com.fastaccess.helper.ViewHelper; import com.fastaccess.provider.markdown.MarkDownProvider; import com.fastaccess.provider.rest.RestProvider; import com.fastaccess.ui.adapter.RepoFilesAdapter; import com.fastaccess.ui.base.BaseFragment; import com.fastaccess.ui.modules.code.CodeViewerActivity; import com.fastaccess.ui.modules.repos.RepoPagerActivity; import com.fastaccess.ui.modules.repos.code.files.paths.RepoFilePathFragment; import com.fastaccess.ui.widgets.AppbarRefreshLayout; import com.fastaccess.ui.widgets.StateLayout; import com.fastaccess.ui.widgets.dialog.MessageDialogView; import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView; import butterknife.BindView; import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt; /** * Created by Kosh on 18 Feb 2017, 2:10 AM */ public class RepoFilesFragment extends BaseFragment<RepoFilesMvp.View, RepoFilesPresenter> implements RepoFilesMvp.View { @BindView(R.id.recycler) DynamicRecyclerView recycler; @BindView(R.id.refresh) AppbarRefreshLayout refresh; @BindView(R.id.stateLayout) StateLayout stateLayout; private RepoFilesAdapter adapter; private RepoFilePathFragment parentFragment; @Override public void onNotifyAdapter() { hideProgress(); adapter.notifyDataSetChanged(); } @Override public void onItemClicked(@NonNull RepoFile model) { if (refresh.isRefreshing()) return; if (model.getType() == FilesType.dir) { if (getParent() != null) { getParent().onAppendPath(model); } } else { String url = InputHelper.isEmpty(model.getDownloadUrl()) ? model.getUrl() : model.getDownloadUrl(); if (InputHelper.isEmpty(url)) return; if (model.getSize() > FileHelper.ONE_MB && !MarkDownProvider.isImage(url)) { MessageDialogView.newInstance(getString(R.string.big_file), getString(R.string.big_file_description), Bundler.start().put(BundleConstant.EXTRA, model.getDownloadUrl()) .put(BundleConstant.YES_NO_EXTRA, true) .end()) .show(getChildFragmentManager(), "MessageDialogView"); } else { CodeViewerActivity.startActivity(getContext(), url, model.getHtmlUrl()); } } } @Override public void onMenuClicked(@NonNull RepoFile item, View v) { if (refresh.isRefreshing()) return; PopupMenu popup = new PopupMenu(getContext(), v); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.download_share_menu, popup.getMenu()); popup.getMenu().findItem(R.id.download).setVisible(item.getType() == FilesType.file); popup.setOnMenuItemClickListener(item1 -> { switch (item1.getItemId()) { case R.id.share: ActivityHelper.shareUrl(v.getContext(), item.getHtmlUrl()); break; case R.id.download: if (ActivityHelper.checkAndRequestReadWritePermission(getActivity())) { RestProvider.downloadFile(getContext(), item.getDownloadUrl()); } break; case R.id.copy: AppHelper.copyToClipboard(v.getContext(), !InputHelper.isEmpty(item.getHtmlUrl()) ? item.getHtmlUrl() : item.getUrl()); break; } return true; }); popup.show(); } @Override public void onSetData(@NonNull String login, @NonNull String repoId, @NonNull String path, @NonNull String ref, boolean clear, @Nullable RepoFile toAppend) { getPresenter().onInitDataAndRequest(login, repoId, path, ref, clear, toAppend); } @Override public boolean isRefreshing() { return refresh.isRefreshing(); } @Override public void onUpdateTab(@Nullable RepoFile toAppend) { getParent().onAppenedtab(toAppend); } @Override protected int fragmentLayout() { return R.layout.vertical_refresh_list; } @Override protected void onFragmentCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { stateLayout.setEmptyText(R.string.no_files); refresh.setOnRefreshListener(this); stateLayout.setOnReloadListener(v -> onRefresh()); recycler.setEmptyView(stateLayout, refresh); recycler.addKeyLineDivider(); adapter = new RepoFilesAdapter(getPresenter().getFiles()); adapter.setListener(getPresenter()); recycler.setAdapter(adapter); } @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); Logger.e(hidden); if (!hidden && adapter != null && isSafe()) { if (!PrefGetter.isFileOptionHintShow()) { ActivityHelper.showDismissHints(getContext(), () -> {}); adapter.setGuideListener((itemView, model) -> new MaterialTapTargetPrompt.Builder(getActivity()) .setTarget(itemView.findViewById(R.id.menu)) .setPrimaryText(R.string.options) .setSecondaryText(R.string.click_file_option_hint) .setCaptureTouchEventOutsidePrompt(true) .setBackgroundColourAlpha(244) .setBackgroundColour(ViewHelper.getAccentColor(getContext())) .setOnHidePromptListener(new MaterialTapTargetPrompt.OnHidePromptListener() { @Override public void onHidePrompt(MotionEvent motionEvent, boolean b) { ActivityHelper.hideDismissHints(RepoFilesFragment.this.getContext()); } @Override public void onHidePromptComplete() { } }) .show()); adapter.notifyDataSetChanged();// call it notify the adapter to show the guide immediately. } } } @Override public void showProgress(@StringRes int resId) { refresh.setRefreshing(true); stateLayout.showProgress(); } @Override public void hideProgress() { refresh.setRefreshing(false); stateLayout.hideProgress(); } @Override public void showErrorMessage(@NonNull String message) { showReload(); super.showErrorMessage(message); } @Override public void showMessage(int titleRes, int msgRes) { showReload(); super.showMessage(titleRes, msgRes); } @NonNull @Override public RepoFilesPresenter providePresenter() { return new RepoFilesPresenter(); } @Override public void onRefresh() { getPresenter().onCallApi(null); } @Override public void onMessageDialogActionClicked(boolean isOk, @Nullable Bundle bundle) { super.onMessageDialogActionClicked(isOk, bundle); if (isOk && bundle != null) { String url = bundle.getString(BundleConstant.EXTRA); if (!InputHelper.isEmpty(url)) { if (ActivityHelper.checkAndRequestReadWritePermission(getActivity())) { RestProvider.downloadFile(getContext(), url); } } } } private void showReload() { hideProgress(); stateLayout.showReload(adapter.getItemCount()); } private RepoFilePathFragment getParent() { if (parentFragment == null) { parentFragment = (RepoFilePathFragment) getParentFragment(); } return parentFragment; } }