package com.alorma.github.ui.fragment.releases; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; import com.alorma.github.GitskariosApplication; import com.alorma.github.R; import com.alorma.github.injector.component.ApplicationComponent; import com.alorma.github.ui.fragment.BaseBottomSheetDialogFragment; import com.alorma.github.ui.view.UserAvatarView; import com.alorma.github.utils.GitskariosDownloadManager; import com.alorma.github.utils.TimeUtils; import core.repositories.releases.Asset; import core.repositories.releases.Release; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; public class ReleaseBottomSheetDialogFragment extends BaseBottomSheetDialogFragment implements ReleaseAssetsAdapter.OnReleaseAssetClicked { private static final String RELEASE = "RELEASE"; @Inject GitskariosDownloadManager gitskariosDownloadManager; @BindView(R.id.profileIcon) UserAvatarView userAvatar; @BindView(R.id.authorName) TextView authorName; @BindView(R.id.createdAt) TextView date; @BindView(R.id.releaseDescriptionLayout) View releaseDescriptionView; @BindView(R.id.releaseDescription) TextView releaseDescription; @BindView(R.id.downloadZip) View downloadZip; @BindView(R.id.downloadTar) View downloadTar; @BindView(R.id.loading) View loadingView; @BindView(R.id.recycler) RecyclerView recyclerView; @BindView(R.id.toolbar) Toolbar toolbar; public static ReleaseBottomSheetDialogFragment newInstance(Release release) { ReleaseBottomSheetDialogFragment fragment = new ReleaseBottomSheetDialogFragment(); Bundle args = new Bundle(); args.putParcelable(RELEASE, release); fragment.setArguments(args); return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); GitskariosApplication application = (GitskariosApplication) getContext().getApplicationContext(); ApplicationComponent applicationComponent = application.getApplicationComponent(); applicationComponent.inject(this); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); return inflater.inflate(R.layout.dialog_release_details, null, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.bind(this, view); if (getArguments() != null) { Release release = getArguments().getParcelable(RELEASE); fillTagDetailsView(release); } } private void fillTagDetailsView(Release release) { fillToolbar(release); releaseDescription.setText(release.getBody()); authorName.setText(release.getAuthor().getLogin()); userAvatar.setUser(release.getAuthor()); date.setText(TimeUtils.getDateToText(getContext(), release.getCreatedAt(), R.string.created_at)); fillAssets(release); configButton(downloadZip, R.string.download_zip_archive, release.getZipballUrl(), release); configButton(downloadTar, R.string.download_tar_archive, release.getTarballUrl(), release); } private void fillToolbar(Release release) { toolbar.setNavigationIcon(R.drawable.ic_close_black_24dp); toolbar.setNavigationOnClickListener(view -> dismiss()); toolbar.setTitle(TextUtils.isEmpty(release.getName()) ? release.getTagName() : release.getName()); toolbar.setSubtitle(release.getTargetCommitish() + (!TextUtils.isEmpty(release.getName()) ? " - " + release.getTagName() : "")); if (!TextUtils.isEmpty(release.getBody())) { toolbar.inflateMenu(R.menu.release_dialog_bottom); MenuItem expandItem = toolbar.getMenu().findItem(R.id.action_expand); if (expandItem != null) { expandItem.setIcon(R.drawable.ic_expand_more_black_24dp); } MenuItem collapseItem = toolbar.getMenu().findItem(R.id.action_collapse); if (collapseItem != null) { collapseItem.setIcon(R.drawable.ic_expand_less_black_24dp); collapseItem.setVisible(false); } toolbar.setOnMenuItemClickListener(item -> { if (item.getItemId() == R.id.action_expand) { if (collapseItem != null) { collapseItem.setVisible(true); } if (expandItem != null) { expandItem.setVisible(false); } releaseDescriptionView.setVisibility(View.VISIBLE); } else if (item.getItemId() == R.id.action_collapse) { if (collapseItem != null) { collapseItem.setVisible(false); } if (expandItem != null) { expandItem.setVisible(true); } releaseDescriptionView.setVisibility(View.GONE); } return super.onOptionsItemSelected(item); }); } } private void fillAssets(Release release) { if (release.getAssets() != null) { recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false)); ReleaseAssetsAdapter assetsAdapter = new ReleaseAssetsAdapter(LayoutInflater.from(getContext())); assetsAdapter.setOnReleaseAssetClicked(this); List<Asset> assets = new ArrayList<>(); for (Asset asset : release.getAssets()) { boolean isZip = release.getZipballUrl().equals(asset.getBrowserDownloadUrl()); boolean isTar = release.getTarballUrl().equals(asset.getBrowserDownloadUrl()); if (!isZip && !isTar) { assets.add(asset); } } assetsAdapter.addAll(assets); recyclerView.setAdapter(assetsAdapter); } } private void configButton(View button, int title, String url, Release tag) { button.setOnClickListener(view -> { String downloadText = getString(title) + " file for release " + tag.getName(); gitskariosDownloadManager.download(getContext(), url, downloadText, this::showSnackbar); }); } private void showSnackbar(int text) { if (getView() != null) { String title = getString(R.string.external_storage_permission_request_action); Snackbar snackbar = Snackbar.make(getView(), getContext().getString(text), Snackbar.LENGTH_LONG); snackbar.setAction(title, v -> gitskariosDownloadManager.openAppSettings(getContext())); snackbar.show(); } } @Override public void onReleaseAssetCLicked(Asset asset) { if (getView() != null) { gitskariosDownloadManager.download(getContext(), asset.getBrowserDownloadUrl(), asset.getName(), this::showSnackbar); } } }