package bf.io.openshop.ux.dialogs;
import android.app.Dialog;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import java.util.ArrayList;
import java.util.List;
import bf.io.openshop.CONST;
import bf.io.openshop.MyApplication;
import bf.io.openshop.R;
import bf.io.openshop.SettingsMy;
import bf.io.openshop.api.EndPoints;
import bf.io.openshop.api.GsonRequest;
import bf.io.openshop.entities.delivery.Branch;
import bf.io.openshop.entities.delivery.BranchesRequest;
import bf.io.openshop.entities.delivery.Delivery;
import bf.io.openshop.entities.delivery.DeliveryType;
import bf.io.openshop.entities.delivery.Shipping;
import bf.io.openshop.interfaces.ShippingDialogInterface;
import bf.io.openshop.listeners.OnSingleClickListener;
import bf.io.openshop.utils.MsgUtils;
import bf.io.openshop.ux.adapters.BranchesAdapter;
import bf.io.openshop.ux.adapters.ShippingSpinnerAdapter;
import timber.log.Timber;
/**
* Dialog offers a shipping type selection or display all available shop branches with details and an interactive map.
*/
public class ShippingDialogFragment extends DialogFragment {
private ProgressBar progressBar;
private ShippingDialogInterface shippingDialogInterface;
private Delivery delivery;
private Fragment thisFragment;
private View shippingEmpty;
private ListView shippingList;
private Shipping selectedShippingType;
/**
* Creates dialog which handles the shipping type selection.
*
* @param delivery object with list of all possible shipping types.
* @param selectedShipping shipping which should be highlighted.
* @param shippingDialogInterface listener indicating events that occurred.
* @return new instance of dialog.
*/
public static ShippingDialogFragment newInstance(Delivery delivery, Shipping selectedShipping, ShippingDialogInterface shippingDialogInterface) {
ShippingDialogFragment frag = new ShippingDialogFragment();
frag.delivery = delivery;
frag.selectedShippingType = selectedShipping;
frag.shippingDialogInterface = shippingDialogInterface;
return frag;
}
/**
* Creates dialog which show only existing branches.
*
* @param shippingDialogInterface listener indicating events that occurred.
* @return new instance of dialog.
*/
public static ShippingDialogFragment newInstance(ShippingDialogInterface shippingDialogInterface) {
ShippingDialogFragment frag = new ShippingDialogFragment();
frag.delivery = null;
frag.shippingDialogInterface = shippingDialogInterface;
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
thisFragment = this;
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.dialogFullscreen);
}
@Override
public void onStart() {
super.onStart();
Dialog d = getDialog();
if (d != null) {
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
Window window = d.getWindow();
window.setLayout(width, height);
window.setWindowAnimations(R.style.alertDialogAnimation);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Timber.d("%s - OnCreateView", this.getClass().getSimpleName());
View view = inflater.inflate(R.layout.shipping_delivery, container, false);
shippingList = (ListView) view.findViewById(R.id.shipping_dialog_list);
progressBar = (ProgressBar) view.findViewById(R.id.shipping_dialog_progressBar);
shippingEmpty = view.findViewById(R.id.shipping_dialog_empty);
TextView dialogTitle = (TextView) view.findViewById(R.id.shipping_dialog_title);
View closeBtn = view.findViewById(R.id.shipping_dialog_close);
closeBtn.setOnClickListener(new OnSingleClickListener() {
@Override
public void onSingleClick(View view) {
dismiss();
}
});
if (delivery == null) {
dialogTitle.setText(R.string.Personal_pickup);
getOnlyBranches();
} else {
setContentVisible(true);
if (delivery != null) {
final List<DeliveryType> deliveryTypes = new ArrayList<>();
if (delivery.getShipping() != null && !delivery.getShipping().isEmpty()) {
DeliveryType deliveryType = new DeliveryType(CONST.DEFAULT_EMPTY_ID, getString(R.string.Shipping));
deliveryType.setShippingList(delivery.getShipping());
deliveryTypes.add(deliveryType);
}
if (delivery.getPersonalPickup() != null && !delivery.getPersonalPickup().isEmpty()) {
DeliveryType deliveryType = new DeliveryType(1, getString(R.string.Personal_pickup));
deliveryType.setShippingList(delivery.getPersonalPickup());
deliveryTypes.add(deliveryType);
}
final ShippingSpinnerAdapter deliverySpinnerAdapter = new ShippingSpinnerAdapter(getActivity(), this);
deliverySpinnerAdapter.setData(deliveryTypes);
deliverySpinnerAdapter.preselectShipping(selectedShippingType);
shippingList.setAdapter(deliverySpinnerAdapter);
shippingList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Shipping selectedShipping = deliverySpinnerAdapter.getItem(position);
onShippingSelected(selectedShipping);
}
});
}
}
return view;
}
public void onShippingSelected(Shipping selectedShipping) {
if (shippingDialogInterface != null)
shippingDialogInterface.onShippingSelected(selectedShipping);
Timber.d("Shipping click: %s", selectedShipping.toString());
dismiss();
}
private void getOnlyBranches() {
String url = String.format(EndPoints.BRANCHES, SettingsMy.getActualNonNullShop(getActivity()).getId());
GsonRequest<BranchesRequest> getCart = new GsonRequest<>(Request.Method.GET, url, null, BranchesRequest.class,
new Response.Listener<BranchesRequest>() {
@Override
public void onResponse(@NonNull BranchesRequest response) {
Timber.d("GetBranches response: %s", response.toString());
setContentVisible(true);
if (response.getBranches() != null && response.getBranches().size() >= 0) {
shippingEmpty.setVisibility(View.GONE);
shippingList.setVisibility(View.VISIBLE);
final BranchesAdapter branchesAdapter = new BranchesAdapter(getActivity(), response.getBranches());
shippingList.setAdapter(branchesAdapter);
shippingList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
private long mLastClickTime = 0;
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (SystemClock.elapsedRealtime() - mLastClickTime < 1000)
return;
mLastClickTime = SystemClock.elapsedRealtime();
Branch branch = (Branch) shippingList.getItemAtPosition(position);
if (branch != null) {
FragmentManager fm = thisFragment.getFragmentManager();
MapDialogFragment mapDialog = MapDialogFragment.newInstance(branch);
mapDialog.setRetainInstance(true);
mapDialog.show(fm, MapDialogFragment.class.getSimpleName());
}
}
});
} else {
shippingEmpty.setVisibility(View.VISIBLE);
shippingList.setVisibility(View.GONE);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Timber.e("Get branches error: %s", error.getMessage());
setContentVisible(true);
MsgUtils.logAndShowErrorMessage(getActivity(), error);
}
});
getCart.setRetryPolicy(MyApplication.getDefaultRetryPolice());
getCart.setShouldCache(false);
MyApplication.getInstance().addToRequestQueue(getCart, CONST.DELIVERY_DIALOG_REQUESTS_TAG);
}
private void setContentVisible(boolean visible) {
if (visible) {
progressBar.setVisibility(View.GONE);
shippingList.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.VISIBLE);
shippingList.setVisibility(View.GONE);
}
}
@Override
public void onStop() {
MyApplication.getInstance().cancelPendingRequests(CONST.DELIVERY_DIALOG_REQUESTS_TAG);
super.onStop();
}
}