/*
* Copyright 2014 Bevbot LLC <info@bevbot.com>
*
* This file is part of the Kegtab package from the Kegbot project. For
* more information on Kegtab or Kegbot, see <http://kegbot.org/>.
*
* Kegtab 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, version 2.
*
* Kegtab 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 Kegtab. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kegbot.app;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.Ordering;
import com.squareup.otto.Subscribe;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.kegbot.app.event.CurrentSessionChangedEvent;
import org.kegbot.app.util.Units;
import org.kegbot.app.view.BadgeView;
import org.kegbot.core.KegbotCore;
import org.kegbot.proto.Models.Session;
import java.io.IOException;
import java.util.Map;
public class SessionStatsFragment extends Fragment {
private static final String TAG = SessionStatsFragment.class.getSimpleName();
private KegbotCore mCore;
private View mView;
private Session mSession;
private JsonNode mStats;
private BadgeView mSessionDrinkersBadge;
private BadgeView mSessionVolumeBadge;
private BadgeView mDrinker1Badge;
private BadgeView mDrinker2Badge;
private BadgeView mDrinker3Badge;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCore = KegbotCore.getInstance(getActivity());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.session_detail_fragment_layout, container, false);
mSessionVolumeBadge = (BadgeView) mView.findViewById(R.id.sessionVolumeBadge);
mSessionDrinkersBadge = (BadgeView) mView.findViewById(R.id.numDrinkersBadge);
mDrinker1Badge = (BadgeView) mView.findViewById(R.id.sessionDrinker1Badge);
mDrinker2Badge = (BadgeView) mView.findViewById(R.id.sessionDrinker2Badge);
mDrinker3Badge = (BadgeView) mView.findViewById(R.id.sessionDrinker3Badge);
if (mSession != null) {
updateSessionView();
}
return mView;
}
@Override
public void onResume() {
mCore.getBus().register(this);
super.onResume();
updateSessionView();
}
@Override
public void onPause() {
mCore.getBus().unregister(this);
super.onPause();
}
@Subscribe
public void handleSessionChange(CurrentSessionChangedEvent event) {
final Session session = event.getSession();
if (session != mSession) {
mSession = session;
mStats = event.getSessionStats();
Log.d(TAG, "Session change: session=" + mSession);
updateSessionView();
}
}
private void updateSessionView() {
if (mView == null) {
return;
}
mView.setVisibility(View.GONE);
if (mSession == null) {
return;
}
JsonNode stats = mStats.get("volume_by_drinker");
if (stats == null || !stats.isObject()) {
Log.w(TAG, "Stats error: " + stats);
return;
}
mView.setVisibility(View.VISIBLE);
Map<String, Double> volumeMap;
try {
volumeMap = new ObjectMapper().readValue(stats,
new TypeReference<Map<String, Double>>() {
});
} catch (JsonMappingException e) {
Log.w(TAG, "Stats error", e);
return;
} catch (IOException e) {
Log.w(TAG, "Stats error", e);
return;
}
final Ordering<String> order = Ordering.natural().reverse()
.onResultOf(Functions.forMap(volumeMap))
.compound(Ordering.<String>natural());
final Map<String, Double> volumeMapSorted = ImmutableSortedMap.copyOf(volumeMap, order);
// Session name.
final String sessionName = mSession.getName();
((TextView) mView.findViewById(R.id.sessionTitle)).setText(sessionName);
// Number of drinkers.
final int numDrinkers = volumeMapSorted.size();
mSessionDrinkersBadge.setBadgeValue(Integer.valueOf(numDrinkers).toString());
mSessionDrinkersBadge.setBadgeCaption(numDrinkers == 1 ? "Drinker" : "Drinkers");
// Total volume.
final Pair<String, String> qty = Units.localize(mCore.getConfiguration(),
mSession.getVolumeMl());
mSessionVolumeBadge.setBadgeValue(qty.first);
mSessionVolumeBadge.setBadgeCaption(String.format("Total %s",
Units.capitalizeUnits(qty.second)));
final BadgeView[] badges = {
mDrinker1Badge,
mDrinker2Badge,
mDrinker3Badge
};
int i = 0;
for (Map.Entry<String, Double> entry : volumeMapSorted.entrySet()) {
if (i >= badges.length) {
break;
}
final BadgeView badge = badges[i++];
badge.setVisibility(View.VISIBLE);
String strname = entry.getKey();
if (strname.isEmpty()) {
strname = "anonymous";
}
badge.setBadgeValue(strname);
final Pair<String, String> drinkerQty = Units.localize(mCore.getConfiguration(),
entry.getValue().doubleValue());
badge.setBadgeCaption(String.format("%s %s", drinkerQty.first, drinkerQty.second));
}
for (; i < badges.length; i++) {
final BadgeView badge = badges[i];
badge.setVisibility(View.GONE);
}
}
}