package com.boardgamegeek.ui; import android.Manifest.permission; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.ProgressBar; import android.widget.TextView; import com.boardgamegeek.R; import com.boardgamegeek.events.ExportFinishedEvent; import com.boardgamegeek.events.ExportProgressEvent; import com.boardgamegeek.events.ImportFinishedEvent; import com.boardgamegeek.events.ImportProgressEvent; import com.boardgamegeek.export.ImporterExporterTask; import com.boardgamegeek.export.JsonExportTask; import com.boardgamegeek.export.JsonImportTask; import com.boardgamegeek.export.Step; import com.boardgamegeek.util.DialogUtils; import com.boardgamegeek.util.FileUtils; import com.boardgamegeek.util.TaskUtils; import com.crashlytics.android.answers.Answers; import com.crashlytics.android.answers.CustomEvent; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.Unbinder; import hugo.weaving.DebugLog; public class DataFragment extends Fragment { private static final int REQUEST_EXPORT = 0; private static final String ANSWERS_EVENT_NAME = "DataManagement"; private static final String ANSWERS_ATTRIBUTE_KEY_ACTION = "Action"; private Unbinder unbinder; @BindView(R.id.backup_location) TextView fileLocationView; @BindView(R.id.backup_types) ViewGroup fileTypesView; @BindView(R.id.progress_container) View progressContainer; @BindView(R.id.progress) ProgressBar progressBar; @BindView(R.id.progress_detail) TextView progressDetailView; private ImporterExporterTask task; @DebugLog @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_data, container, false); unbinder = ButterKnife.bind(this, root); fileLocationView.setText(FileUtils.getExportPath(false).getPath()); task = new ImporterExporterTask(getActivity(), false); for (Step step : task.getSteps()) { TextView textView = new TextView(getActivity()); textView.setText(getString(R.string.backup_description, step.getDescription(getActivity()), step.getFileName())); fileTypesView.addView(textView); } return root; } @DebugLog @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @DebugLog @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); } @DebugLog @OnClick(R.id.export_button) public void onExportClick() { DialogUtils.createConfirmationDialog(getActivity(), R.string.msg_export_confirmation, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(getActivity(), permission.WRITE_EXTERNAL_STORAGE)) { export(); Answers.getInstance().logCustom(new CustomEvent(ANSWERS_EVENT_NAME) .putCustomAttribute(ANSWERS_ATTRIBUTE_KEY_ACTION, "Export")); } else { if (shouldShowRequestPermissionRationale(permission.WRITE_EXTERNAL_STORAGE)) { View v = getView(); if (v != null) { Snackbar.make(v, R.string.msg_export_permission_rationale, Snackbar.LENGTH_INDEFINITE).show(); } } requestPermissions(new String[] { permission.WRITE_EXTERNAL_STORAGE }, REQUEST_EXPORT); } } }).show(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_EXPORT) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { export(); } else { View v = getView(); if (v != null) { Snackbar.make(v, R.string.msg_export_permission_denied, Snackbar.LENGTH_LONG).show(); } } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } @DebugLog private void export() { initProgressBar(); TaskUtils.executeAsyncTask(new JsonExportTask(getContext(), false)); } @DebugLog @OnClick(R.id.import_button) public void onImportClick() { DialogUtils.createConfirmationDialog(getActivity(), R.string.msg_import_confirmation, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { initProgressBar(); TaskUtils.executeAsyncTask(new JsonImportTask(getContext(), false)); Answers.getInstance().logCustom(new CustomEvent(ANSWERS_EVENT_NAME) .putCustomAttribute(ANSWERS_ATTRIBUTE_KEY_ACTION, "Import")); } }).show(); } @DebugLog @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(ExportFinishedEvent event) { notifyEnd(event.getMessageId()); } @DebugLog @SuppressWarnings("unused") @Subscribe public void onEvent(ImportFinishedEvent event) { notifyEnd(event.getMessageId()); } @DebugLog @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(ExportProgressEvent event) { if (progressBar != null) { progressBar.setMax(event.getTotalCount()); progressBar.setProgress(event.getCurrentCount()); } if (progressDetailView != null && task != null && event.getStepIndex() < task.getSteps().size()) { String description = task.getSteps().get(event.getStepIndex()).getDescription(getActivity()); progressDetailView.setText(description); } } @DebugLog @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void onEvent(ImportProgressEvent event) { if (progressBar != null) { progressBar.setMax(event.getTotalCount()); progressBar.setProgress(event.getCurrentCount()); } } private void initProgressBar() { if (progressContainer != null) { progressContainer.setVisibility(View.VISIBLE); } if (progressBar != null) { progressBar.setMax(1); progressBar.setProgress(0); } } private void notifyEnd(int messageId) { View v = getView(); if (v != null) { Snackbar.make(v, messageId, Snackbar.LENGTH_LONG).show(); } progressContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_out)); progressContainer.setVisibility(View.GONE); } }