/*
* Copyright(c) 2017 lizhaotailang
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.github.marktony.espresso.mvp.packagedetails;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.AppCompatEditText;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import io.github.marktony.espresso.R;
import io.github.marktony.espresso.data.Package;
import io.github.marktony.espresso.data.PackageStatus;
import io.github.marktony.espresso.data.source.PackagesRepository;
/**
* Created by lizhaotailang on 2017/2/10.
*/
public class PackageDetailsFragment extends Fragment
implements PackageDetailsContract.View {
private RecyclerView recyclerView;
private FloatingActionButton fab;
private SwipeRefreshLayout swipeRefreshLayout;
private CollapsingToolbarLayout toolbarLayout;
private PackageDetailsAdapter adapter;
private PackageDetailsContract.Presenter presenter;
public PackageDetailsFragment() {}
public static PackageDetailsFragment newInstance() {
return new PackageDetailsFragment();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_package_details, container, false);
initViews(view);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showEditNameDialog();
}
});
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
presenter.refreshPackage();
}
});
setHasOptionsMenu(true);
return view;
}
@Override
public void onResume() {
super.onResume();
presenter.subscribe();
}
@Override
public void onPause() {
super.onPause();
presenter.unsubscribe();
}
@Override
public void onDestroy() {
super.onDestroy();
PackagesRepository.destroyInstance();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.package_details, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
exit();
} else if (id == R.id.action_delete) {
showDeleteAlertDialog();
} else if (id == R.id.action_set_readable) {
presenter.setPackageUnread();
} else if (id == R.id.action_copy_code) {
presenter.copyPackageNumber();
} else if (id == R.id.action_share) {
presenter.shareTo();
}
return true;
}
/**
* Init views.
* @param view The root view of fragment.
*/
@Override
public void initViews(View view) {
PackageDetailsActivity activity = (PackageDetailsActivity) getActivity();
activity.setSupportActionBar((Toolbar) view.findViewById(R.id.toolbar));
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
fab = view.findViewById(R.id.fab);
swipeRefreshLayout = view.findViewById(R.id.swipeRefreshLayout);
swipeRefreshLayout.setColorSchemeColors(ContextCompat.getColor(getContext(), R.color.colorPrimary));
toolbarLayout = view.findViewById(R.id.toolbar_layout);
}
/**
* Bind the presenter to view.
* @param presenter The presenter. See at {@link PackageDetailsPresenter}
*/
@Override
public void setPresenter(@NonNull PackageDetailsContract.Presenter presenter) {
this.presenter = presenter;
}
/**
* Set the refresh layout as an indicator. Change the indicator's loading status.
* @param loading Whether is loading.
*/
@Override
public void setLoadingIndicator(final boolean loading) {
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(loading);
}
});
}
/**
* When the network is slow or is not connected, show this message.
*/
@Override
public void showNetworkError() {
Snackbar.make(fab, R.string.network_error, Snackbar.LENGTH_SHORT)
.setAction(R.string.go_to_settings, new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent().setAction(Settings.ACTION_SETTINGS));
}
})
.show();
}
/**
* Show the package details.
* @param p The package. See at {@link Package}
*/
@Override
public void showPackageDetails(@NonNull Package p) {
if (adapter == null) {
adapter = new PackageDetailsAdapter(getContext(), p);
recyclerView.setAdapter(adapter);
} else {
adapter.updateData(p.getData());
}
}
/**
* Set different image to toolbar layout as banner.
* @param resId The resource id of image.
*/
@Override
public void setToolbarBackground(@DrawableRes int resId) {
toolbarLayout.setBackgroundResource(resId);
}
/**
* Build the share info and call the system intent chooser to share.
* @param pack The package to share. See more at {@link Package}
*/
@Override
public void shareTo(@NonNull Package pack) {
String shareData = pack.getName()
+ "\n( "
+ pack.getNumber()
+ " "
+ pack.getCompanyChineseName()
+ " )\n"
+ getString(R.string.latest_status);
if (pack.getData() != null && !pack.getData().isEmpty()) {
for (PackageStatus ps : pack.getData()) {
shareData = new StringBuilder().append(shareData)
.append(ps.getContext())
.append(" - ")
.append(ps.getFtime())
.append("\n").toString();
}
} else {
shareData = shareData + getString(R.string.get_status_error);
}
try {
Intent intent = new Intent().setAction(Intent.ACTION_SEND).setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, shareData);
startActivity(Intent.createChooser(intent, getString(R.string.share)));
} catch (ActivityNotFoundException e) {
Snackbar.make(fab, R.string.something_wrong, Snackbar.LENGTH_SHORT).show();
}
}
/**
* Copy the package number(id) to clipboard.
* @param packageId The package number.
*/
@Override
public void copyPackageNumber(@NonNull String packageId) {
ClipboardManager manager = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData data = ClipData.newPlainText("text", packageId);
manager.setPrimaryClip(data);
Snackbar.make(fab, R.string.package_number_copied, Snackbar.LENGTH_SHORT).show();
}
/**
* Finish the activity.
*/
@Override
public void exit() {
getActivity().onBackPressed();
}
/**
* Show a dialog when user select the DELETE option menu item.
*/
private void showDeleteAlertDialog() {
AlertDialog dialog = new AlertDialog.Builder(getContext()).create();
dialog.setTitle(R.string.delete);
dialog.setMessage(getString(R.string.delete_package_massage));
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(android.R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.setButton(DialogInterface.BUTTON_POSITIVE, getString(android.R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
presenter.deletePackage();
}
});
dialog.show();
}
/**
* Show the dialog which contains an EditText.
*/
private void showEditNameDialog() {
AlertDialog dialog = new AlertDialog.Builder(getContext()).create();
dialog.setTitle(getString(R.string.edit_name));
View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_edit_package_name, null);
final AppCompatEditText editText = (AppCompatEditText) view.findViewById(R.id.editTextName);
editText.setText(presenter.getPackageName());
dialog.setView(view);
dialog.setButton(DialogInterface.BUTTON_POSITIVE, getString(android.R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String input = editText.getText().toString();
if (input.isEmpty()) {
showInputIsEmpty();
} else {
presenter.updatePackageName(input);
}
dialog.dismiss();
}
});
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(android.R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.show();
}
/**
* Show the message that the user's input is empty.
*/
private void showInputIsEmpty() {
Snackbar.make(fab, R.string.input_empty, Snackbar.LENGTH_SHORT).show();
}
}