/** Copyright 2012 Fahad Al-Khameesi, Madeleine Appert, Niklas Logren, Arild Matsson and Jonathan Orr�. This file is part of Bibbla. Bibbla is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Bibbla is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Bibbla. If not, see <http://www.gnu.org/licenses/>. **/ package dat255.grupp06.bibbla.fragments; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragment; import dat255.grupp06.bibbla.MainActivity; import dat255.grupp06.bibbla.R; import dat255.grupp06.bibbla.backend.BackendFactory; import dat255.grupp06.bibbla.backend.IBackend; import dat255.grupp06.bibbla.frontend.LoginCallbackHandler; import dat255.grupp06.bibbla.model.Book; import dat255.grupp06.bibbla.model.CredentialsMissingException; import dat255.grupp06.bibbla.utils.Callback; import dat255.grupp06.bibbla.utils.Message; /** * Main fragment for the profile or "me" tab. You must give a reference to the * Backend object before using the fragment. * @author arla */ public class ProfileFragment extends SherlockFragment { public final static String BOOK = "dat255.grupp06.bibbla.BOOK"; private BookListFragment reservationsList; private BookListFragment loansList; private boolean dontLogin; private boolean dontGetCachedBooks; /** * Reference to the class that can produce a login form. Is set on attach. */ private LoginCallbackHandler loginCallbackHandler; private boolean namePending; private boolean debtPending; private boolean loansPending; private boolean reservationsPending; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); if(reservationsList == null) { reservationsList = new BookListFragment(); reservationsList.setReservedListStatus(true); fragmentTransaction.add(R.id.reservations_list, reservationsList); } else { fragmentTransaction.attach(reservationsList); } if(loansList == null) { loansList = new BookListFragment(); loansList.setLoanedListStatus(true); fragmentTransaction.add(R.id.loans_list, loansList); } else { fragmentTransaction.attach(loansList); } fragmentTransaction.commit(); return inflater.inflate(R.layout.profile_fragment, container, false); } @Override public void onDestroyView() { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.detach(reservationsList); fragmentTransaction.detach(loansList); fragmentTransaction.commit(); super.onDestroyView(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { loginCallbackHandler = (LoginCallbackHandler) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + "must implement LoginCallbackHandler"); } } @Override public void onStart() { super.onStart(); updateFromBackend(); } /** * Update the contents of GUI elements with information from Backend, such * as name, current debt, books on loan and pending reservations. * @throws IllegalStateException if the backend is not set. * @see setBackend(Backend) */ public void updateFromBackend() throws IllegalStateException { IBackend backend = BackendFactory.getBackend(); // These backend calls need user credentials. try { // The lists take some time so let's use Callback. // Name header backend.getUserName(new Callback() { @Override public void handleMessage(Message msg) { getUserNameDone(msg); }}); namePending = true; // Current debt backend.fetchUserDebt(new Callback() { @Override public void handleMessage(Message msg) { ProfileFragment.this.fetchDebtDone(msg); }}); debtPending = true; // Current loans backend.fetchLoans(new Callback() { @Override public void handleMessage(Message msg) { ProfileFragment.this.loansUpdateDone(msg); }}); loansPending = true; // Current reservations backend.fetchReservations(new Callback() { @Override public void handleMessage(Message msg) { ProfileFragment.this.reservationsUpdateDone(msg); }}, true); reservationsPending = true; //updateSpinnerState(); } catch (CredentialsMissingException e) { if(!dontLogin) { loginCallbackHandler.showCredentialsDialog(new Callback() { @Override public void handleMessage(Message msg) { updateFromBackend(); }}); } else { Handler handler = new Handler(); handler.post(new Runnable() { @Override public void run() { ((MainActivity)getSherlockActivity()).selectSearchTab(); } }); } } } /** * The method is called from a callback object when the backend is done * fetching the username. * @param msg - Message object containing the username and error messages. */ private void getUserNameDone(Message msg) { Activity activity = getSherlockActivity(); String name = (String) msg.obj; TextView nameHeading = (TextView) activity.findViewById(R.id.name_heading); if (nameHeading != null) nameHeading.setText(name); namePending = false; //updateSpinnerState(); } /** * Update the debt TextView. * @param msg Backend response, */ private void fetchDebtDone(Message msg) { Activity activity = getSherlockActivity(); int debt = (Integer) msg.obj; TextView debtView = (TextView) activity.findViewById(R.id.debt_view); if (debtView != null) debtView.setText(String. format(getString(R.string.debt_view_text), debt)); debtPending = false; //updateSpinnerState(); } /** * Update ListView of loans with results. * @param msg Backend response */ private void loansUpdateDone(Message msg) { Activity activity = getSherlockActivity(); try { @SuppressWarnings("unchecked") ArrayList<Book> loans = (ArrayList<Book>) msg.obj; loansList.updateList(loans); } catch (ClassCastException e) { Toast.makeText(activity, R.string.loans_list_error, Toast.LENGTH_SHORT).show(); } loansPending = false; //updateSpinnerState(); } /** * Update ListView of reservations with results. * @param msg Backend response */ private void reservationsUpdateDone(Message msg) { Activity activity = getSherlockActivity(); try { @SuppressWarnings("unchecked") ArrayList<Book> reservations = (ArrayList<Book>) msg.obj; reservationsList.updateList(reservations); } catch (ClassCastException e) { Toast.makeText(activity, R.string.reservations_list_error, Toast.LENGTH_SHORT).show(); } reservationsPending = false; //updateSpinnerState(); } /** Hide loading spinner if all fetching is done. */ private void updateSpinnerState() { getSherlockActivity().setSupportProgressBarIndeterminateVisibility( namePending||debtPending||loansPending||reservationsPending); } public void cancelUpdate() { namePending = debtPending = loansPending = reservationsPending = false; updateSpinnerState(); } public void toggleLoans() { FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); ft.detach(reservationsList); } public void setDontLogin(boolean choice) { dontLogin = choice; } public void setDontGetCachedBooks(boolean choice) { dontGetCachedBooks = choice; } }