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.Toolbar;
import android.view.LayoutInflater;
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.ApiComponent;
import com.alorma.github.injector.component.ApplicationComponent;
import com.alorma.github.injector.component.DaggerApiComponent;
import com.alorma.github.injector.module.ApiModule;
import com.alorma.github.injector.module.CommitDetailModule;
import com.alorma.github.presenter.CommitInfoPresenter;
import com.alorma.github.sdk.bean.info.CommitInfo;
import com.alorma.github.sdk.bean.info.RepoInfo;
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.User;
import core.repositories.Commit;
import core.repositories.releases.tags.Tag;
import javax.inject.Inject;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class TagBottomSheetDialogFragment extends BaseBottomSheetDialogFragment implements com.alorma.github.presenter.View<Commit> {
private static final String TAG = "TAG";
private static final String REPOINFO = "REPOINFO";
@Inject CommitInfoPresenter commitPresenter;
@Inject GitskariosDownloadManager gitskariosDownloadManager;
@BindView(R.id.profileIcon) UserAvatarView userAvatar;
@BindView(R.id.authorName) TextView authorName;
@BindView(R.id.createdAt) TextView date;
@BindView(R.id.downloadZip) View downloadZip;
@BindView(R.id.downloadTar) View downloadTar;
@BindView(R.id.loading) View loadingView;
@BindView(R.id.toolbar) Toolbar toolbar;
private Tag tag;
private RepoInfo repoInfo;
public static TagBottomSheetDialogFragment newInstance(RepoInfo repoInfo, Tag tag) {
TagBottomSheetDialogFragment fragment = new TagBottomSheetDialogFragment();
Bundle args = new Bundle();
args.putParcelable(REPOINFO, repoInfo);
args.putParcelable(TAG, tag);
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);
ApiComponent apiComponent = DaggerApiComponent.builder().applicationComponent(applicationComponent).apiModule(new ApiModule()).build();
apiComponent.plus(new CommitDetailModule()).inject(this);
commitPresenter.attachView(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_tag_details, null, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
if (getArguments() != null) {
tag = getArguments().getParcelable(TAG);
fillToolbar(tag);
repoInfo = getArguments().getParcelable(REPOINFO);
CommitInfo commitInfo = new CommitInfo();
commitInfo.repoInfo = repoInfo;
commitInfo.sha = tag.getSha().getSha();
commitPresenter.execute(commitInfo);
}
}
@Override
public void onDetach() {
commitPresenter.detachView();
super.onDetach();
}
@Override
public void showLoading() {
loadingView.setVisibility(View.VISIBLE);
}
@Override
public void hideLoading() {
loadingView.setVisibility(View.GONE);
}
@Override
public void onDataReceived(Commit commit, boolean isFromPaginated) {
if (tag != null && commit != null) {
fillTagDetailsView(tag, commit);
}
}
@Override
public void showError(Throwable throwable) {
}
private void fillTagDetailsView(Tag tag, Commit commit) {
User owner = commit.author;
if (owner == null) {
owner = commit.commit.author;
}
if (owner != null) {
authorName.setText(owner.getLogin() != null ? owner.getLogin() : owner.getEmail());
userAvatar.setUser(owner);
}
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
DateTime dt = formatter.parseDateTime(commit.commit.committer.date);
date.setText(TimeUtils.getDateToText(getContext(), dt.toDate(), R.string.created_at));
configButton(downloadZip, R.string.download_zip_archive, tag.getZipballUrl(), tag);
configButton(downloadTar, R.string.download_tar_archive, tag.getTarballUrl(), tag);
}
private void fillToolbar(Tag tag) {
toolbar.setNavigationIcon(R.drawable.ic_close_black_24dp);
toolbar.setNavigationOnClickListener(view -> dismiss());
toolbar.setTitle(tag.getName());
}
private void configButton(View button, int title, String url, Tag tag) {
button.setOnClickListener(view -> {
String downloadText = getString(title) + " file for tag " + 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();
}
}
}