HiniiPointValueActivity2.java :  » Client » hinii » com » angelo » hiniid » Android Open Source

Android Open Source » Client » hinii 
hinii » com » angelo » hiniid » HiniiPointValueActivity2.java
package com.angelo.hiniid;

import java.io.IOException;
import java.util.HashSet;
import java.util.Observable;
import java.util.Observer;

import android.app.Activity;
import android.app.Dialog;
import android.app.TabActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TabHost;
import android.widget.TextView;

import com.angelo.hiniid.rest.Hinii;
import com.angelo.hiniid.rest.types.HiniiRandomPointResult;
import com.angelo.hiniid.rest.types.PointValue;
import com.angelo.hiniid.util.MenuUtils;
import com.angelo.hiniid.util.NotificationsUtil;
import com.angelo.hiniid.util.RemoteResourceManager;
import com.angelo.hiniid.util.TabsUtil;

/**
 * @author angelo, from VenueActivity
 */
public class HiniiPointValueActivity2 extends TabActivity {
  private static final String TAG = "HiniiPointValueActivity2";

  private static final boolean DEBUG = Hinii.DEBUG;
  private boolean mIsUsersPhotoSet;

  private static final int RESULT_CODE_ACTIVITY_CHECKIN_EXECUTE = 1;

  final PointValueObservable pointValueObservable = new PointValueObservable();
  private StateHolder mStateHolder;
  private final HashSet<Object> mProgressBarTasks = new HashSet<Object>();

  private ImageView mImageViewPhoto;
  private TextView mTextViewName;
  private LinearLayout mLayoutVote;
  private LinearLayout mLayoutCost;
  private TextView mTextViewCost;
  private TextView mTextViewVoteAvg;
  private TabHost mTabHost;
  private LinearLayout mLayoutProgressBar;

  private RemoteResourceManager mRrm;
  private RemoteResourceManagerObserver mResourcesObserver;
  private boolean mCheckedInSuccessfully = false;

  private BroadcastReceiver mLoggedOutReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      if (DEBUG)
        Log.d(TAG, "onReceive: " + intent);
      finish();
    }
  };

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.hinii_point_value_activity);
    registerReceiver(mLoggedOutReceiver, new IntentFilter(
        Hiniid.INTENT_ACTION_LOGGED_OUT));
    mIsUsersPhotoSet = false;
    // initTabHost();
    Object retained = getLastNonConfigurationInstance();
    if (retained != null && retained instanceof StateHolder) {
      mStateHolder = (StateHolder) retained;
      mStateHolder.setActivityForTaskUserDetails(this);
    } else {

      mStateHolder = new StateHolder();

      String pointValueId = null;
      if (getIntent().getExtras() != null) {
        if (getIntent().getExtras().containsKey(
            Hiniid.EXTRA_RANDOM_POINT_RESULT)) {
          HiniiRandomPointResult randomPoint = getIntent()
              .getExtras().getParcelable(
                  Hiniid.EXTRA_RANDOM_POINT_RESULT);
          pointValueId = randomPoint.getId();
          mStateHolder.setRandomPoint(randomPoint);
        } else if (getIntent().getExtras().containsKey(
            Hiniid.EXTRA_POINT_ID)) {
          pointValueId = getIntent().getExtras().getString(
              Hiniid.EXTRA_POINT_ID);
        } else if (getIntent().getExtras().containsKey(
            Hiniid.EXTRA_POINT_VALUE)) {
          PointValue pointVal = (PointValue) getIntent().getExtras()
              .getParcelable(Hiniid.EXTRA_POINT_VALUE);
          pointValueId = pointVal.getPointId();
        } else {
          Log
              .e(TAG,
                  "UserDetailsActivity requires a userid in its intent extras.");
          finish();
          return;
        }

      } else {
        Log
            .e(TAG,
                "UserDetailsActivity requires a userid in its intent extras.");
        finish();
        return;
      }

      mStateHolder.startTaskPointValueDetails(this, pointValueId);
    }

    mRrm = ((Hiniid) getApplication()).getRemoteResourceManager();
    mResourcesObserver = new RemoteResourceManagerObserver();
    mRrm.addObserver(mResourcesObserver);

    ensureUi();
    populateUi();

    if (mStateHolder.getIsRunningPointValueDetailsTask() == false) {
      populateUiAfterFullUserObjectFetched();
    }
  }

  private void ensureUi() {
    mImageViewPhoto = (ImageView) findViewById(R.id.userDetailsActivityPhoto);
    mImageViewPhoto.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        if (mStateHolder.getRandomPoint() != null) {
          // If "_thumbs" exists, remove it to get the url of the
          // full-size image.
          String photoUrl = mStateHolder.getRandomPoint()
              .getImageOrig();

          Intent intent = new Intent();
          intent.setClass(HiniiPointValueActivity2.this,
              FetchImageForViewIntent.class);
          intent
              .putExtra(FetchImageForViewIntent.IMAGE_URL,
                  photoUrl);
          intent
              .putExtra(
                  FetchImageForViewIntent.PROGRESS_BAR_TITLE,
                  getResources()
                      .getString(
                          R.string.user_activity_fetch_full_image_title));
          intent
              .putExtra(
                  FetchImageForViewIntent.PROGRESS_BAR_MESSAGE,
                  getResources()
                      .getString(
                          R.string.user_activity_fetch_full_image_message));
          startActivity(intent);
        }
      }
    });

    mTextViewName = (TextView) findViewById(R.id.textViewRandomPointName);
    mTextViewCost = (TextView) findViewById(R.id.textViewRandomPointCostAvg);
    mTextViewVoteAvg = (TextView) findViewById(R.id.textViewRandomPointVote);

    // When the user clicks the mayorships section, then launch the
    // mayorships activity.
    mLayoutVote = (LinearLayout) findViewById(R.id.randomPointActivityVoteLayout);
    mLayoutVote.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // startMayorshipsActivity();
      }
    });
    mLayoutVote.setEnabled(false);

    // When the user clicks the badges section, then launch the badges
    // activity.
    mLayoutCost = (LinearLayout) findViewById(R.id.randomPointActivityCostLayout);
    mLayoutCost.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // startBadgesActivity();
      }
    });
    mLayoutCost.setEnabled(false);

    // At startup, we need to have at least one tab. Once we load the full
    // user object,
    // we can clear all tabs, and add our real tabs once we know what they
    // are.
    mTabHost = getTabHost();
    mTabHost.addTab(mTabHost.newTabSpec("dummy").setIndicator("")
        .setContent(R.id.userDetailsActivityTextViewTabDummy));
    mTabHost.getTabWidget().setVisibility(View.GONE);

    mLayoutProgressBar = (LinearLayout) findViewById(R.id.userDetailsActivityLayoutProgressBar);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(mLoggedOutReceiver);
  }

  @Override
  public void onResume() {
    super.onResume();

  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    MenuUtils.addPreferencesToMenu(this, menu);

    return true;
  }

  @Override
  public boolean onPrepareOptionsMenu(Menu menu) {

    return super.onPrepareOptionsMenu(menu);
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
  }

  @Override
  public Dialog onCreateDialog(int id) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    View layout;

    switch (id) {

    }
    return null;
  }

  @Override
  public void onPrepareDialog(int id, Dialog dialog) {
    // If the tip add was a success we must have set mStateHolder.tip. If
    // that is the case, then
    // we clear the dialog because clearly they're looking to add a new tip
    // and not post the
    // same one again.

  }

  @Override
  public Object onRetainNonConfigurationInstance() {
    return mStateHolder;
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case RESULT_CODE_ACTIVITY_CHECKIN_EXECUTE:
      if (resultCode == Activity.RESULT_OK) {
        mCheckedInSuccessfully = true;
      }
      break;
    }
  }

  public void startProgressBar(String taskId) {
    boolean added = mProgressBarTasks.add(taskId);
    if (!added) {
      if (DEBUG)
        Log.d(TAG, "Received start for already tracked task. Ignoring");
    }
    setProgressBarIndeterminateVisibility(true);
  }

  public void stopProgressBar(String taskId) {
    boolean removed = mProgressBarTasks.remove(taskId);
    if (!removed) {
      if (DEBUG)
        Log.d(TAG, "Received stop for untracked task. Ignoring");
    } else if (mProgressBarTasks.isEmpty()) {
      setProgressBarIndeterminateVisibility(false);
    }
  }

  /*
   * private void initTabHost() { //final TabHost tabHost = this.getTabHost();
   * String tag; Intent intent;
   * 
   * tag = (String) this.getText(R.string.pointvalue_details_tab); intent =
   * new Intent(this, HiniiPointValueTabActivity.class);
   * TabsUtil.addNativeLookingTab(this, mTabHost, "t2", tag,
   * R.drawable.places_tab, intent);
   * 
   * tag = (String) this.getText(R.string.pointvalue_map_tab); intent = new
   * Intent(this, HiniiPointValueMapActivity.class);
   * TabsUtil.addNativeLookingTab(this, mTabHost, "t1", tag,
   * R.drawable.map_tab, intent); }
   */

  private void onRandomPointSet() {
    HiniiRandomPointResult randomPoint = mStateHolder.randomPoint;
    if (DEBUG)
      Log.d(TAG, "onPointValueSet:" + randomPoint.getName());
    setTitle(randomPoint.getName() + " - Hinii");

  }

  private void setRandomPointValue(HiniiRandomPointResult randomPoint) {
    mStateHolder.randomPoint = randomPoint;
    mStateHolder.pointValueId = randomPoint.getId();
    pointValueObservable.notifyObservers(randomPoint);
    onRandomPointSet();
  }

  class PointValueObservable extends Observable {
    @Override
    public void notifyObservers(Object data) {
      setChanged();
      super.notifyObservers(data);
    }

    public HiniiRandomPointResult getPointValue() {
      return mStateHolder.randomPoint;
    }
  }

  private void onUserDetailsTaskComplete(HiniiRandomPointResult pointResult,
      Exception ex) {
    setProgressBarIndeterminateVisibility(false);
    mStateHolder.setFetchedPointValueDetails(true);
    mStateHolder.setIsRunningPointValueDetailsTask(false);
    if (pointResult != null) {
      mStateHolder.setRandomPoint(pointResult);
      populateUiAfterFullUserObjectFetched();
    } else {
      NotificationsUtil.ToastReasonForFailure(this, ex);
    }
  }

  private void populateUiAfterFullUserObjectFetched() {
    populateUi();

    // User object may still be unavailable.
    HiniiRandomPointResult randomPoint = mStateHolder.getRandomPoint();
    if (randomPoint == null) {
      return;
    }

    mLayoutProgressBar.setVisibility(View.GONE);

    mTabHost.clearAllTabs();
    mTabHost.getTabWidget().setVisibility(View.VISIBLE);

    TabHost.TabSpec specTab1 = mTabHost.newTabSpec("tab1");
    // ----------------
    String tag;
    Intent intent;

    tag = (String) this.getText(R.string.pointvalue_details_tab);
    intent = new Intent(this, HiniiPointValueTabActivity.class);
    intent.putExtra(Hiniid.EXTRA_RANDOM_POINT_RESULT, randomPoint);
    TabsUtil.addNativeLookingTab(this, mTabHost, "t2", tag,
        R.drawable.places_tab, intent);

    tag = (String) this.getText(R.string.pointvalue_map_tab);
    intent = new Intent(this, HiniiPointValueMapActivity.class);
    TabsUtil.addNativeLookingTab(this, mTabHost, "t1", tag,
        R.drawable.map_tab, intent);

    // User can also now click on the badges / mayorships layouts.
    mLayoutCost.setEnabled(true);
    mLayoutVote.setEnabled(true);
  }



  private void populateUi() {
    HiniiRandomPointResult randomPoint = mStateHolder.getRandomPoint();

    // User photo.
    if (randomPoint != null && mIsUsersPhotoSet == false) {
      mImageViewPhoto.setImageResource(R.drawable.blank_girl);
      if (randomPoint != null) {
        Uri uriPhoto = Uri.parse(randomPoint.getImage());
        if (mRrm.exists(uriPhoto)) {
          try {
            Bitmap bitmap = BitmapFactory.decodeStream(mRrm
                .getInputStream(Uri.parse(randomPoint
                    .getImage())));
            mImageViewPhoto.setImageBitmap(bitmap);
            mIsUsersPhotoSet = true;
          } catch (IOException e) {
          }
        } else {
          mRrm.request(uriPhoto);
        }
      }
    }

    // User name.
    if (randomPoint != null) {
      mTextViewName.setText(randomPoint.getName());
    } else {
      mTextViewName.setText("");
    }

    // Cost average.
    if (randomPoint != null) {
      if (mStateHolder.getFetchedPointValueDetails()) {
        String cost = randomPoint.getCost();
        if ((cost != null) & (!cost.equals("0"))) {
          mTextViewCost.setText(randomPoint.getCost());
        } else {
          mTextViewCost.setText("-");
        }
      } else {

      }
    } else {
      mTextViewCost.setText("-");
    }

    // Vote Avg
    if (randomPoint != null) {
      String voteNum = randomPoint.getVoteNum();
      if (Integer.parseInt(voteNum.trim()) != 0)

        if ((mStateHolder.getFetchedPointValueDetails())
            & (randomPoint.getVoteAvg() != null)
            & (voteNum != null)
            & (Integer.parseInt(voteNum.trim()) != 0)) {

          mTextViewVoteAvg.setText(randomPoint.getVoteAvg() + "/5");
        } else {
          mTextViewVoteAvg.setText("-");
        }
    } else {
      mTextViewVoteAvg.setText("-");
    }
  }

  private static final class StateHolder {
    private HiniiRandomPointResult randomPoint = null;

    String pointValueId = null;
    private boolean mIsRunningPointValueDetailsTask;
    private UserDetailsTask mTaskUserDetails;
    private boolean mFetchedPointValueDetails;

    public void startTaskPointValueDetails(
        HiniiPointValueActivity2 activity, String userId) {
      mIsRunningPointValueDetailsTask = true;
      mTaskUserDetails = new UserDetailsTask(activity);
      mTaskUserDetails.execute(userId);
    }

    public void setIsRunningPointValueDetailsTask(boolean isRunning) {
      mIsRunningPointValueDetailsTask = isRunning;
    }

    public boolean getIsRunningPointValueDetailsTask() {
      return mIsRunningPointValueDetailsTask;
    }

    public void setFetchedPointValueDetails(boolean fetched) {
      mFetchedPointValueDetails = fetched;
    }

    public boolean getFetchedPointValueDetails() {
      return mFetchedPointValueDetails;
    }

    /**
     * @param randomPoint
     *            the randomPoint to set
     */
    public void setRandomPoint(HiniiRandomPointResult randomPoint) {
      this.randomPoint = randomPoint;
    }

    public void setActivityForTaskUserDetails(
        HiniiPointValueActivity2 activity) {
      if (mTaskUserDetails != null) {
        mTaskUserDetails.setActivity(activity);
      }
    }

    /**
     * @return the randomPoint
     */
    public HiniiRandomPointResult getRandomPoint() {
      return randomPoint;
    }

    public void cancelTasks() {
      if (mTaskUserDetails != null) {
        mTaskUserDetails.setActivity(null);
        mTaskUserDetails.cancel(true);
      }
    }

  }

  /**
   * Even if the caller supplies us with a User object parcelable, it won't
   * have all the badge etc extra info in it. As soon as the activity starts,
   * we launch this task to fetch a full user object, and merge it with
   * whatever is already supplied in mUser.
   */
  private static class UserDetailsTask extends
      AsyncTask<String, Void, HiniiRandomPointResult> {

    private HiniiPointValueActivity2 mActivity;
    private Exception mReason;

    public UserDetailsTask(HiniiPointValueActivity2 activity) {
      mActivity = activity;
    }

    @Override
    protected void onPreExecute() {
      mActivity.setProgressBarIndeterminateVisibility(true);
    }

    @Override
    protected HiniiRandomPointResult doInBackground(String... params) {
      try {
        return ((Hiniid) mActivity.getApplication()).getHinii()
            .getRandomPointResult(params[0]);
        /*
         * return ((Hiniid) mActivity.getApplication()) .getFoursquare()
         * .user( params[0], true, true, LocationUtils
         * .createFoursquareLocation(((Hiniid) mActivity
         * .getApplication()) .getLastKnownLocation()));
         */
      } catch (Exception e) {
        mReason = e;
      }
      return null;
    }

    @Override
    protected void onPostExecute(HiniiRandomPointResult randomPoint) {
      if (mActivity != null) {
        mActivity.onUserDetailsTaskComplete(randomPoint, mReason);
      }
    }

    @Override
    protected void onCancelled() {
      if (mActivity != null) {
        mActivity.onUserDetailsTaskComplete(null, mReason);
      }
    }

    public void setActivity(HiniiPointValueActivity2 activity) {
      mActivity = activity;
    }
  }

  private class RemoteResourceManagerObserver implements Observer {
    @Override
    public void update(Observable observable, Object data) {
      mImageViewPhoto.getHandler().post(new Runnable() {
        @Override
        public void run() {
          if (mStateHolder.getRandomPoint() != null) {
            Uri uriPhoto = Uri.parse(mStateHolder.getRandomPoint()
                .getImage());
            if (mRrm.exists(uriPhoto)) {
              try {
                Bitmap bitmap = BitmapFactory.decodeStream(mRrm
                    .getInputStream(uriPhoto));
                mImageViewPhoto.setImageBitmap(bitmap);
                mIsUsersPhotoSet = true;
                mImageViewPhoto.setImageBitmap(bitmap);
              } catch (IOException e) {
              }
            }
          }
        }
      });
    }
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.