/*
* 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.ActionBar;
import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Intent;
import android.content.Loader;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.LayoutAnimationController;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.common.base.Strings;
import org.kegbot.app.config.AppConfiguration;
import org.kegbot.app.util.ImageDownloader;
import org.kegbot.app.util.Utils;
import org.kegbot.core.KegbotCore;
import org.kegbot.proto.Models.User;
import java.util.List;
import java.util.concurrent.TimeUnit;
import butterknife.ButterKnife;
/**
* Shows a list of available drinkers, returning the select username (using {@link #setResult(int,
* Intent)}) when one is selected.
*
* @author mike wakerly (opensource@hoho.com)
*/
public class DrinkerSelectActivity extends CoreActivity implements LoaderCallbacks<List<User>> {
private static final String TAG = DrinkerSelectActivity.class.getSimpleName();
/** Activity will auto-finish after this timeout. */
private static final long TIMEOUT_MILLIS = TimeUnit.MINUTES.toMillis(2);
private static final int REQUEST_CREATE_DRINKER = 1001;
private GridView mGridView;
private ArrayAdapter<User> mAdapter;
private Button mNewAccountButton;
private Button mPourAsGuestButton;
private final Handler mHandler = new Handler(Looper.getMainLooper());
private final Runnable mTimeoutRunnable = new Runnable() {
@Override
public void run() {
Log.d(TAG, "Timeout, finishing.");
finish();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "onCreate");
setContentView(R.layout.drinker_select_activity_layout);
final AppConfiguration config = KegbotApplication.get(this).getConfig();
final ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.hide();
}
mNewAccountButton = ButterKnife.findById(this, R.id.newAccountButton);
mNewAccountButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final Intent intent = KegtabCommon.getCreateDrinkerActivityIntent(
DrinkerSelectActivity.this);
startActivityForResult(intent, REQUEST_CREATE_DRINKER);
}
});
if (!config.getAllowRegistration()) {
findViewById(R.id.newAccountGroup).setVisibility(View.GONE);
}
mPourAsGuestButton = ButterKnife.findById(this, R.id.pourAnonymouslyButton);
mPourAsGuestButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finishAndReturnUsername("");
}
});
mGridView = (GridView) findViewById(R.id.drinkerGridView);
mAdapter = new ArrayAdapter<User>(this, R.layout.selectable_drinker,
R.id.drinkerName) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final User userDetail = getItem(position);
final View view = super.getView(position, convertView, parent);
try {
applyUser(userDetail, view);
} catch (Throwable e) {
Log.wtf(TAG, "UNCAUGHT EXCEPTION", e);
}
return view;
}
private void applyUser(User userDetail, View view) {
final ImageView icon = (ImageView) view.findViewById(R.id.drinkerIcon);
icon.setImageBitmap(null);
Utils.setBackground(icon, null);
final String imageUrl;
if (userDetail.hasImage()) {
imageUrl = userDetail.getImage().getThumbnailUrl();
} else {
imageUrl = "";
}
final ImageDownloader downloader =
KegbotCore.getInstance(DrinkerSelectActivity.this).getImageDownloader();
if (!Strings.isNullOrEmpty(imageUrl)) {
downloader.download(imageUrl, icon);
} else {
downloader.cancelDownloadForView(icon);
icon.setBackgroundResource(R.drawable.unknown_drinker);
icon.setAlpha(1.0f);
}
final TextView usernameText = (TextView) view.findViewById(R.id.drinkerName);
final String displayName = userDetail.getDisplayName();
final String username = userDetail.getUsername();
final String name = Strings.isNullOrEmpty(displayName) ? username : displayName;
usernameText.setText(name);
}
};
AnimationSet set = new AnimationSet(true);
Animation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(100);
set.addAnimation(animation);
animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
animation.setDuration(300);
set.addAnimation(animation);
LayoutAnimationController controller = new LayoutAnimationController(set, 0.1f);
mGridView.setAdapter(mAdapter);
mGridView.setLayoutAnimation(controller);
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
final User user = (User) mGridView.getItemAtPosition(position);
if (user == null) {
Log.wtf(TAG, "Null user selected.");
return;
}
Log.d(TAG, "Clicked on user: " + user);
finishAndReturnUsername(user.getUsername());
}
});
getLoaderManager().initLoader(0, null, this);
}
@Override
protected void onResume() {
super.onResume();
mHandler.postDelayed(mTimeoutRunnable, TIMEOUT_MILLIS);
}
@Override
protected void onPause() {
super.onPause();
mHandler.removeCallbacks(mTimeoutRunnable);
}
private void finishAndReturnUsername(String username) {
Intent resultData = new Intent();
resultData.putExtras(getIntent());
resultData.putExtra(KegtabCommon.ACTIVITY_AUTH_DRINKER_RESULT_EXTRA_USERNAME, username);
setResult(RESULT_OK, resultData);
finish();
}
@Override
public Loader<List<User>> onCreateLoader(int id, Bundle args) {
return new UserDetailListLoader(this);
}
@Override
public void onLoadFinished(Loader<List<User>> loader, List<User> userList) {
for (final User user : userList) {
mAdapter.add(user);
}
}
@Override
public void onLoaderReset(Loader<List<User>> loader) {
mAdapter.clear();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult: " + requestCode + " : " + resultCode);
switch (requestCode) {
case REQUEST_CREATE_DRINKER:
Log.d(TAG, "Got registration result.");
if (resultCode == Activity.RESULT_OK && data != null) {
final String username =
data.getStringExtra(KegtabCommon.ACTIVITY_CREATE_DRINKER_RESULT_EXTRA_USERNAME);
if (!Strings.isNullOrEmpty(username)) {
Log.d(TAG, "Authenticating newly-created user.");
AuthenticatingActivity.startAndAuthenticate(this, username);
}
}
break;
default:
break;
}
finish();
}
}