package co.smartreceipts.android.fragments; import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.astuetz.PagerSlidingTabStrip; import com.google.common.base.Preconditions; import java.util.List; import javax.inject.Inject; import co.smartreceipts.android.R; import co.smartreceipts.android.activities.NavigationHandler; import co.smartreceipts.android.adapters.TripFragmentPagerAdapter; import co.smartreceipts.android.config.ConfigurationManager; import co.smartreceipts.android.model.Trip; import co.smartreceipts.android.persistence.LastTripController; import co.smartreceipts.android.persistence.database.controllers.impl.StubTableEventsListener; import co.smartreceipts.android.persistence.database.controllers.impl.TripTableController; import co.smartreceipts.android.persistence.database.operations.DatabaseOperationMetadata; import co.smartreceipts.android.sync.widget.errors.SyncErrorFragment; import co.smartreceipts.android.utils.cache.FragmentStateCache; import co.smartreceipts.android.utils.log.Logger; import dagger.android.support.AndroidSupportInjection; public class ReportInfoFragment extends WBFragment { public static final String TAG = ReportInfoFragment.class.getSimpleName(); private static final String KEY_OUT_TRIP = "key_out_trip"; @Inject ConfigurationManager configurationManager; @Inject TripTableController tripTableController; @Inject NavigationHandler navigationHandler; @Inject FragmentStateCache fragmentStateCache; private LastTripController mLastTripController; private TripFragmentPagerAdapter mFragmentPagerAdapter; private Trip mTrip; private ActionBarTitleUpdatesListener mActionBarTitleUpdatesListener; private ViewPager mViewPager; private PagerSlidingTabStrip mPagerSlidingTabStrip; @NonNull public static ReportInfoFragment newInstance() { return new ReportInfoFragment(); } @Override public void onAttach(Context context) { AndroidSupportInjection.inject(this); super.onAttach(context); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Logger.debug(this, "onCreate"); setHasOptionsMenu(true); if (savedInstanceState == null) { mTrip = getArguments().getParcelable(Trip.PARCEL_KEY); } else { mTrip = savedInstanceState.getParcelable(KEY_OUT_TRIP); } Preconditions.checkNotNull(mTrip, "A valid trip is required"); mLastTripController = new LastTripController(getActivity()); mFragmentPagerAdapter = new TripFragmentPagerAdapter(getResources(), getChildFragmentManager(), configurationManager); mActionBarTitleUpdatesListener = new ActionBarTitleUpdatesListener(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.report_info_view_pager, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (savedInstanceState == null) { new ChildFragmentNavigationHandler(this).addChild(new SyncErrorFragment(), R.id.top_tooltip); } mViewPager = (ViewPager) view.findViewById(R.id.pager); mPagerSlidingTabStrip = (PagerSlidingTabStrip) view.findViewById(R.id.tabs); mViewPager.setAdapter(mFragmentPagerAdapter); mPagerSlidingTabStrip.setViewPager(mViewPager); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); final Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { navigationHandler.navigateUpToTripsFragment(); return true; } else { return super.onOptionsItemSelected(item); } } @Override public void onResume() { super.onResume(); final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { if (!navigationHandler.isDualPane()) { actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); } else { actionBar.setHomeButtonEnabled(false); actionBar.setDisplayHomeAsUpEnabled(false); } } updateActionBarTitlePrice(); tripTableController.subscribe(mActionBarTitleUpdatesListener); } @Override public void onPause() { tripTableController.unsubscribe(mActionBarTitleUpdatesListener); mLastTripController.setLastTrip(mTrip); super.onPause(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Logger.debug(this, "onSaveInstanceState"); outState.putParcelable(KEY_OUT_TRIP, mTrip); } @Override public void onDestroy() { fragmentStateCache.onDestroy(this); super.onDestroy(); } @NonNull public Trip getTrip() { return mTrip; } private class ActionBarTitleUpdatesListener extends StubTableEventsListener<Trip> { @Override public void onGetSuccess(@NonNull List<Trip> list) { if (isAdded()) { if (list.contains(mTrip)) { updateActionBarTitlePrice(); } } } @Override public void onUpdateSuccess(@NonNull Trip oldTrip, @NonNull Trip newTrip, @NonNull DatabaseOperationMetadata databaseOperationMetadata) { if (isAdded()) { if (mTrip.equals(oldTrip)) { mTrip = newTrip; mFragmentPagerAdapter.notifyDataSetChanged(); } } } } private void updateActionBarTitlePrice() { final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setTitle(mTrip.getPrice().getCurrencyFormattedPrice() + " - " + mTrip.getName()); } } }