/* * 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.Activity; import android.app.Fragment; import android.content.Intent; import android.os.Bundle; import android.text.format.DateUtils; import android.util.Log; import android.util.Pair; import android.view.GestureDetector; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.ViewFlipper; import com.google.common.base.Strings; import com.squareup.otto.Subscribe; import org.kegbot.app.alert.AlertCore; import org.kegbot.app.config.AppConfiguration; import org.kegbot.app.event.VisibleTapsChangedEvent; import org.kegbot.app.util.ImageDownloader; import org.kegbot.app.util.Units; import org.kegbot.app.view.BadgeView; import org.kegbot.core.KegbotCore; import org.kegbot.proto.Models.Image; import org.kegbot.proto.Models.Keg; import org.kegbot.proto.Models.KegTap; import butterknife.ButterKnife; public class TapStatusFragment extends Fragment { private static final String TAG = TapStatusFragment.class.getSimpleName(); private static final String ARG_TAP_ID = "tap_id"; private static final int CHILD_INACTIVE = 1; private static final int CHILD_ACTIVE = 2; private static final int REQUEST_AUTHENTICATE = 1000; private KegbotCore mCore; private ImageDownloader mImageDownloader; private View mView; private GestureDetector mGestureDetector; private GestureDetector.OnGestureListener mOnGestureListener; private View.OnTouchListener mOnTouchListener; public static TapStatusFragment forTap(final KegTap tap) { final TapStatusFragment frag = new TapStatusFragment(); final Bundle args = new Bundle(); args.putInt(ARG_TAP_ID, tap.getId()); frag.setArguments(args); return frag; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mCore = KegbotCore.getInstance(getActivity()); mImageDownloader = mCore.getImageDownloader(); updateTapDetails(); } @Override public void onStart() { super.onStart(); mCore.getBus().register(this); } @Override public void onStop() { mCore.getBus().unregister(this); super.onStop(); } @Subscribe public void onTapListChange(VisibleTapsChangedEvent event) { updateTapDetails(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mView = inflater.inflate(R.layout.tap_detail, container, false); mOnGestureListener = new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { handleTapClicked(); return true; } @Override public boolean onDown(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { TapListActivity.startActivity(getActivity()); } }; mGestureDetector = new GestureDetector(getActivity(), mOnGestureListener); mOnTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return mGestureDetector.onTouchEvent(motionEvent); } }; mView.setOnTouchListener(mOnTouchListener); updateTapDetails(); return mView; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_AUTHENTICATE: Log.d(TAG, "Got authentication result."); if (resultCode == Activity.RESULT_OK && data != null) { final String username = data.getStringExtra(KegtabCommon.ACTIVITY_AUTH_DRINKER_RESULT_EXTRA_USERNAME); if (username != null) { AuthenticatingActivity.startAndAuthenticate(getActivity(), username, getTap()); } } break; default: super.onActivityResult(requestCode, resultCode, data); } } private void handleTapClicked() { final AppConfiguration config = KegbotApplication.get(getActivity()).getConfig(); if (!config.getAllowManualLogin()) { Log.d(TAG, "Manual login is disabled."); return; } if (!getTap().hasCurrentKeg()) { Log.d(TAG, "Tap is offline"); return; } if (!getTap().hasMeter()) { mCore.getAlertCore().postAlert( AlertCore.newBuilder("Tap Disconnected") .setDescription("This tap is not connected to a meter right now.") .severityError() .build()); return; } if (config.useAccounts()) { final Intent intent = KegtabCommon.getAuthDrinkerActivityIntent(getActivity()); startActivityForResult(intent, REQUEST_AUTHENTICATE); } else { mCore.getFlowManager().activateUserAtTap(getTap(), ""); } } private void updateTapDetails() { if (mView == null) { return; } final Activity activity = getActivity(); if (activity == null) { return; } final KegTap tap = getTap(); final TextView title = ButterKnife.findById(mView, R.id.tapTitle); final TextView subtitle = ButterKnife.findById(mView, R.id.tapSubtitle); final TextView tapNotes = ButterKnife.findById(mView, R.id.tapNotes); final ViewFlipper flipper = ButterKnife.findById(mView, R.id.tapStatusFlipper); title.setOnTouchListener(mOnTouchListener); subtitle.setOnTouchListener(mOnTouchListener); tapNotes.setOnTouchListener(mOnTouchListener); flipper.setOnTouchListener(mOnTouchListener); final Button button = ButterKnife.findById(mView, R.id.tapKegButton); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final Intent intent = NewKegActivity.getStartIntent(getActivity(), tap); startActivity(intent); } }); tapNotes.setText("Last synced: " + DateUtils.formatDateTime(activity, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME)); if (tap == null) { Log.w(TAG, "Called with empty tap detail."); flipper.setDisplayedChild(CHILD_INACTIVE); return; } else if (!tap.hasCurrentKeg()) { Log.d(TAG, "Tap inactive"); flipper.setDisplayedChild(CHILD_INACTIVE); title.setText(tap.getName()); return; } else { flipper.setDisplayedChild(CHILD_ACTIVE); } final String tapName = tap.getName(); if (!Strings.isNullOrEmpty(tapName)) { subtitle.setText(tapName); } if (!tap.hasCurrentKeg()) { return; } final Keg keg = tap.getCurrentKeg(); title.setText(keg.getBeverage().getName()); // Find a description to show. String description = keg.getDescription(); if (Strings.isNullOrEmpty(description)) { description = keg.getBeverage().getDescription(); } if (Strings.isNullOrEmpty(description)) { description = tap.getDescription(); } final ImageView tapImage = (ImageView) mView.findViewById(R.id.tapImage); // Show tap image, or notes if none available. tapImage.setVisibility(View.VISIBLE); tapNotes.setVisibility(View.GONE); tapImage.setImageResource(R.drawable.kegbot_unknown_square_2); if (keg.getBeverage().hasPicture()) { final Image image = keg.getBeverage().getPicture(); final String imageUrl = image.getUrl(); mImageDownloader.download(imageUrl, tapImage); } else if (!Strings.isNullOrEmpty(description)) { tapImage.setVisibility(View.GONE); tapNotes.setVisibility(View.VISIBLE); tapNotes.setText(description); } // TODO(mikey): proper units support // Badge 1: Pints Poured final BadgeView badge1 = (BadgeView) mView.findViewById(R.id.tapStatsBadge1); double mlPoured = keg.getServedVolumeMl(); Pair<String, String> qtyPoured = Units.localize(mCore.getConfiguration(), mlPoured); badge1.setBadgeValue(qtyPoured.first); badge1.setBadgeCaption(Units.capitalizeUnits(qtyPoured.second) + " Poured"); // Badge 2: Pints Remain final BadgeView badge2 = (BadgeView) mView.findViewById(R.id.tapStatsBadge2); Pair<String, String> qtyRemain = Units.localize(mCore.getConfiguration(), keg.getRemainingVolumeMl()); badge2.setBadgeValue(qtyRemain.first); badge2.setBadgeCaption(Units.capitalizeUnits(qtyRemain.second) + " Left"); // Badge 3: Temperature // TODO(mikey): Preference for C/F final BadgeView badge3 = (BadgeView) mView.findViewById(R.id.tapStatsBadge3); if (tap.hasLastTemperature()) { double lastTemperature = tap.getLastTemperature().getTemperatureC(); String units = "C"; if (!mCore.getConfiguration().getTemperaturesCelsius()) { lastTemperature = Units.temperatureCToF(lastTemperature); units = "F"; } final String tempValue = String.format("%.1f\u00B0", Double.valueOf(lastTemperature)); badge3.setBadgeValue(tempValue); badge3.setBadgeCaption(String.format("Temperature (%s)", units)); badge3.setVisibility(View.VISIBLE); } else { badge3.setVisibility(View.GONE); } } int getTapId() { return getArguments().getInt(ARG_TAP_ID, -1); } private KegTap getTap() { final int tapId = getTapId(); return mCore.getTapManager().getTap(tapId); } }