com.cloudbees.gasp.activity.PlacesDetailActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.cloudbees.gasp.activity.PlacesDetailActivity.java

Source

package com.cloudbees.gasp.activity;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.NavUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import com.cloudbees.gasp.R;
import com.cloudbees.gasp.fragment.GaspDatabaseFragment;
import com.cloudbees.gasp.fragment.GaspRestaurantFragment;
import com.cloudbees.gasp.fragment.GaspReviewFragment;
import com.cloudbees.gasp.model.PlaceDetail;
import com.cloudbees.gasp.model.PlaceEvent;
import com.cloudbees.gasp.model.Restaurant;
import com.cloudbees.gasp.model.Review;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * Copyright (c) 2013 Mark Prichard, CloudBees
 * <p/>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p/>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p/>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

public class PlacesDetailActivity extends Activity {
    private final static String TAG = PlacesDetailActivity.class.getName();

    public static final String PLACES_DETAIL_SERIALIZED = "PlacesDetail";
    public static final String PLACES_DETAIL_REFERENCE = "Reference";

    // Layout views
    private TextView mName;
    private TextView mWebsite;
    private TextView mAddress;
    private TextView mPhone;
    private TextView mId;
    private TextView mLatitude;
    private TextView mLongitude;

    // Google Places API events for this location
    private ListView mEventsView;
    private ArrayAdapter<String> mEventAdapter;
    private final ArrayList<String> mEventList = new ArrayList<String>();

    // Gasp reviews for this location
    private ListView mReviewsView;
    private ArrayAdapter<String> mReviewAdapter;
    private final ArrayList<String> mReviewList = new ArrayList<String>();

    private int mGaspRestaurantId; // The Gasp restaurant id
    private String mPlacesReference; // The Google Places reference

    // Google Places API details
    private PlaceDetail mPlaceDetail;

    // Is restaurant in Gasp server database?
    private boolean mGaspRestaurant = false;

    // Headless fragments for calling Gasp server API
    private GaspDatabaseFragment mGaspDatabaseFragment;
    private GaspRestaurantFragment mGaspRestaurantFragment;
    private GaspReviewFragment mGaspReviewFragment;

    private void addItemClickListener() {
        mEventsView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d(TAG, "Selected: Event #" + id);
            }
        });
    }

    private void setButtons() {
        Button reviewButton = (Button) findViewById(R.id.detail_review_button);
        Button restaurantButton = (Button) findViewById(R.id.detail_restaurant_button);

        if (mGaspRestaurant) {
            restaurantButton.setEnabled(false);
            reviewButton.setEnabled(true);
        } else {
            restaurantButton.setEnabled(true);
            reviewButton.setEnabled(false);
        }
    }

    private void addGaspReview() {
        try {
            Intent intent = new Intent();
            intent.setClass(this, ReviewActivity.class);
            intent.putExtra(ReviewActivity.REVIEW_RESTAURANT_NAME, mPlaceDetail.getName());
            intent.putExtra(ReviewActivity.REVIEW_RESTAURANT_ID, mGaspRestaurantId);
            intent.putExtra(ReviewActivity.REVIEW_REFERENCE, mPlacesReference);
            startActivityForResult(intent, 0);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void addReviewButtonListener() {
        Button reviewButton = (Button) findViewById(R.id.detail_review_button);
        reviewButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addGaspReview();
                finish();
            }
        });
    }

    private void addGaspRestaurant() {
        try {
            SharedPreferences gaspSharedPreferences = PreferenceManager
                    .getDefaultSharedPreferences(getApplicationContext());
            URL gaspUrl = new URL(
                    gaspSharedPreferences.getString(getString(R.string.gasp_server_uri_preferences), "")
                            + getString(R.string.gasp_restaurants_location));

            Restaurant restaurant = new Restaurant();
            restaurant.setName(mPlaceDetail.getName());
            restaurant.setPlacesId(mPlaceDetail.getId());
            restaurant.setWebsite(mPlaceDetail.getWebsite());

            mGaspRestaurantFragment.addRestaurant(restaurant, gaspUrl);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void addRestaurantButtonListener() {
        Button restaurantButton = (Button) findViewById(R.id.detail_restaurant_button);
        restaurantButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addGaspRestaurant();
                finish();
            }
        });
    }

    private void setViews() {
        setContentView(R.layout.gasp_place_detail_layout);
        mName = (TextView) findViewById(R.id.detail_name);
        mAddress = (TextView) findViewById(R.id.detail_address);
        mPhone = (TextView) findViewById(R.id.detail_phone);
        mWebsite = (TextView) findViewById(R.id.detail_website);
        mId = (TextView) findViewById(R.id.detail_id);
        mLatitude = (TextView) findViewById(R.id.detail_latitude);
        mLongitude = (TextView) findViewById(R.id.detail_longitude);
        mEventsView = (ListView) findViewById(R.id.detail_events);
        mReviewsView = (ListView) findViewById(R.id.detail_reviews);
    }

    private void addGaspFragments() {
        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        mGaspDatabaseFragment = new GaspDatabaseFragment();
        mGaspRestaurantFragment = new GaspRestaurantFragment() {
            @Override
            public void onSuccess(String location) {
                Log.d(TAG, "Gasp! restaurant added: " + location);
                mGaspRestaurantId = Integer.valueOf(location.substring(location.lastIndexOf("/") + 1));
                mGaspRestaurant = true;
                setButtons();
            }

            @Override
            public void onFailure() {
                Log.e(TAG, "Error adding Gasp! review");
            }
        };
        mGaspReviewFragment = new GaspReviewFragment() {
            @Override
            public void onSuccess(String location) {
                Log.d(TAG, "Gasp! review added: " + location);
            }

            @Override
            public void onFailure() {
                Log.e(TAG, "Error adding Gasp! review");
            }
        };

        ft.add(mGaspDatabaseFragment, getString(R.string.fragment_gasp_database));
        ft.add(mGaspRestaurantFragment, getString(R.string.fragment_gasp_restaurant));
        ft.add(mGaspReviewFragment, getString(R.string.fragment_gasp_review));

        ft.commit();
    }

    private void showLocationDetails(PlaceDetail place) {
        mName.setText(place.getName());
        mAddress.setText(place.getFormatted_address());
        mPhone.setText(place.getFormatted_phone_number());
        mWebsite.setText(place.getWebsite());
        mId.setText(getString(R.string.places_google_id) + place.getId());
        mLatitude.setText(
                getString(R.string.places_latitude) + place.getGeometry().getLocation().getLat().toString());
        mLongitude.setText(
                getString(R.string.places_longitude) + place.getGeometry().getLocation().getLng().toString());
    }

    private void showEventDetails(PlaceDetail place) {
        // Use a simple TextView layout for ArrayAdapter constructor
        mEventAdapter = new ArrayAdapter<String>(this, R.layout.gasp_generic_textview, mEventList);
        mEventsView.setAdapter(mEventAdapter);

        if (place.getEvents() != null) {
            for (PlaceEvent event : place.getEvents()) {
                Log.d(TAG, "Event Id: " + event.getEvent_id());
                Log.d(TAG, "Event Summary: " + event.getSummary());
                mEventAdapter.add(event.getSummary() + ": " + event.getUrl());
            }
        }
    }

    private void showReviewDetails(List<Review> reviews) {
        // Use a simple TextView layout for ArrayAdapter constructor
        mReviewAdapter = new ArrayAdapter<String>(this, R.layout.gasp_generic_textview, mReviewList);
        mReviewsView.setAdapter(mReviewAdapter);
        for (Review review : reviews) {
            mReviewAdapter.add(review.toString());
        }
    }

    private void getGaspData() {
        Restaurant restaurant = mGaspDatabaseFragment.getRestaurantByPlacesId(mPlaceDetail.getId());
        if (restaurant != null) {
            Log.d(TAG, "Gasp Restaurant Id: " + restaurant.getId());
            mGaspRestaurant = true;
            mGaspRestaurantId = restaurant.getId();
            showReviewDetails(mGaspDatabaseFragment.getLastNReviewsByRestaurant(restaurant.getId(), 10));
        } else {
            Log.d(TAG, "Restaurant not found in Gasp database");
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getActionBar().setDisplayHomeAsUpEnabled(true);

        try {
            mPlaceDetail = (PlaceDetail) getIntent().getSerializableExtra(PLACES_DETAIL_SERIALIZED);
            mPlacesReference = getIntent().getStringExtra(PLACES_DETAIL_REFERENCE);

            setViews();
            addGaspFragments();
            showLocationDetails(mPlaceDetail);
            showEventDetails(mPlaceDetail);
            addItemClickListener();
            addReviewButtonListener();
            addRestaurantButtonListener();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        getGaspData();
        setButtons();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu_short, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;

        case R.id.gasp_settings:
            Intent intent = new Intent();
            intent.setClass(this, SetPreferencesActivity.class);
            startActivityForResult(intent, 0);
            return true;

        case R.id.options_exit:
            finish();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}