package bf.io.openshop.ux.fragments; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; 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.User; import bf.io.openshop.entities.delivery.Shipping; import bf.io.openshop.interfaces.LoginDialogInterface; import bf.io.openshop.interfaces.ShippingDialogInterface; import bf.io.openshop.listeners.OnSingleClickListener; import bf.io.openshop.utils.MsgUtils; import bf.io.openshop.utils.Utils; import bf.io.openshop.ux.MainActivity; import bf.io.openshop.ux.dialogs.LoginDialogFragment; import bf.io.openshop.ux.dialogs.ShippingDialogFragment; import timber.log.Timber; /** * Fragment provides the account screen with options such as logging, editing and more. */ public class AccountFragment extends Fragment { private ProgressDialog pDialog; /** * Indicates if user data should be loaded from server or from memory. */ private boolean mAlreadyLoaded = false; // User information private LinearLayout userInfoLayout; private TextView tvUserName; private TextView tvAddress; private TextView tvPhone; private TextView tvEmail; // Actions private Button loginLogoutBtn; private Button updateUserBtn; private Button myOrdersBtn; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Timber.d("%s - OnCreateView", this.getClass().getSimpleName()); MainActivity.setActionBarTitle(getString(R.string.Profile)); View view = inflater.inflate(R.layout.fragment_account, container, false); pDialog = Utils.generateProgressDialog(getActivity(), false); userInfoLayout = (LinearLayout) view.findViewById(R.id.account_user_info); tvUserName = (TextView) view.findViewById(R.id.account_name); tvAddress = (TextView) view.findViewById(R.id.account_address); tvEmail = (TextView) view.findViewById(R.id.account_email); tvPhone = (TextView) view.findViewById(R.id.account_phone); updateUserBtn = (Button) view.findViewById(R.id.account_update); updateUserBtn.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { if (getActivity() instanceof MainActivity) ((MainActivity) getActivity()).onAccountEditSelected(); } }); myOrdersBtn = (Button) view.findViewById(R.id.account_my_orders); myOrdersBtn.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { if (getActivity() instanceof MainActivity) ((MainActivity) getActivity()).onOrdersHistory(); } }); Button settingsBtn = (Button) view.findViewById(R.id.account_settings); settingsBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Activity activity = getActivity(); if (activity != null && activity instanceof MainActivity) ((MainActivity) getActivity()).startSettingsFragment(); } }); Button dispensingPlaces = (Button) view.findViewById(R.id.account_dispensing_places); dispensingPlaces.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ShippingDialogFragment shippingDialogFragment = ShippingDialogFragment.newInstance(new ShippingDialogInterface() { @Override public void onShippingSelected(Shipping shipping) { } }); shippingDialogFragment.show(getFragmentManager(), "shippingDialogFragment"); } }); loginLogoutBtn = (Button) view.findViewById(R.id.account_login_logout_btn); loginLogoutBtn.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { if (SettingsMy.getActiveUser() != null) { LoginDialogFragment.logoutUser(); refreshScreen(null); } else { LoginDialogFragment loginDialogFragment = LoginDialogFragment.newInstance(new LoginDialogInterface() { @Override public void successfulLoginOrRegistration(User user) { refreshScreen(user); MainActivity.updateCartCountNotification(); } }); loginDialogFragment.show(getFragmentManager(), LoginDialogFragment.class.getSimpleName()); } } }); User user = SettingsMy.getActiveUser(); if (user != null) { Timber.d("user: %s", user.toString()); // Sync user data if fragment created (not reuse from backstack) if (savedInstanceState == null && !mAlreadyLoaded) { mAlreadyLoaded = true; syncUserData(user); } else { refreshScreen(user); } } else { refreshScreen(null); } return view; } private void syncUserData(@NonNull User user) { String url = String.format(EndPoints.USER_SINGLE, SettingsMy.getActualNonNullShop(getActivity()).getId(), user.getId()); pDialog.show(); GsonRequest<User> getUser = new GsonRequest<>(Request.Method.GET, url, null, User.class, new Response.Listener<User>() { @Override public void onResponse(@NonNull User response) { Timber.d("response: %s", response.toString()); SettingsMy.setActiveUser(response); refreshScreen(SettingsMy.getActiveUser()); if (pDialog != null) pDialog.cancel(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (pDialog != null) pDialog.cancel(); MsgUtils.logAndShowErrorMessage(getActivity(), error); } }, getFragmentManager(), user.getAccessToken()); getUser.setRetryPolicy(MyApplication.getDefaultRetryPolice()); getUser.setShouldCache(false); MyApplication.getInstance().addToRequestQueue(getUser, CONST.ACCOUNT_REQUESTS_TAG); } private void refreshScreen(User user) { if (user == null) { loginLogoutBtn.setText(getString(R.string.Log_in)); userInfoLayout.setVisibility(View.GONE); updateUserBtn.setVisibility(View.GONE); myOrdersBtn.setVisibility(View.GONE); } else { loginLogoutBtn.setText(getString(R.string.Log_out)); userInfoLayout.setVisibility(View.VISIBLE); updateUserBtn.setVisibility(View.VISIBLE); myOrdersBtn.setVisibility(View.VISIBLE); tvUserName.setText(user.getName()); String address = user.getStreet(); address = appendCommaText(address, user.getHouseNumber(), false); address = appendCommaText(address, user.getCity(), true); address = appendCommaText(address, user.getZip(), true); tvAddress.setText(address); tvEmail.setText(user.getEmail()); tvPhone.setText(user.getPhone()); } } /** * The method combines two strings. As the string separator is used space or comma. * * @param result first part of final string. * @param append second part of final string. * @param addComma true if comma with space should be used as separator. Otherwise is used space. * @return concatenated string. */ private String appendCommaText(String result, String append, boolean addComma) { if (result != null && !result.isEmpty()) { if (append != null && !append.isEmpty()) { if (addComma) result += getString(R.string.format_comma_prefix, append); else result += getString(R.string.format_space_prefix, append); } return result; } else { return append; } } @Override public void onStop() { MyApplication.getInstance().getRequestQueue().cancelAll(CONST.ACCOUNT_REQUESTS_TAG); super.onStop(); } }