com.entertailion.android.shapeways.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.entertailion.android.shapeways.MainActivity.java

Source

/*
 * Copyright (C) 2013 ENTERTAILION LLC
 *
 * 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
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * 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.
 */
package com.entertailion.android.shapeways;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import oauth.signpost.OAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.entertailion.android.shapeways.api.Base;
import com.entertailion.android.shapeways.api.Base.Result;
import com.entertailion.android.shapeways.api.Materials;
import com.entertailion.android.shapeways.api.Materials.Material;
import com.entertailion.android.shapeways.api.Model;
import com.entertailion.android.shapeways.api.Models;
import com.entertailion.android.shapeways.api.Orders;
import com.entertailion.android.shapeways.api.Prices;
import com.entertailion.android.shapeways.api.Printers;
import com.entertailion.android.shapeways.api.ShapewaysClient;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.MappingJsonFactory;
import com.fasterxml.jackson.databind.ObjectMapper;

public class MainActivity extends Activity {
    private static final String LOG_TAG = "MainActivity";

    private SharedPreferences preferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        preferences = PreferenceManager.getDefaultSharedPreferences(this);

        if (((ShapewaysApplication) getApplicationContext()).getShapewaysClient().getOauthToken() == null) {
            // Get the OAuth token; launch activity to show webview for user
            // authorization
            new Thread(new Runnable() {
                public void run() {
                    try {
                        Intent intent = new Intent(MainActivity.this, ShapewaysActivity.class);
                        startActivity(intent);
                    } catch (Exception e) {
                        Log.e(LOG_TAG, "run", e);
                    }
                }
            }).start();
        }

        ((Button) findViewById(R.id.button_api)).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                new Thread(new Runnable() {
                    public void run() {
                        getApi();
                        // getOrders();
                        // getPrinters();
                        // getMaterials();
                        // postOrder();
                        // getModels();
                        // getModel();
                        // deleteModel();
                        // postPrices();
                    }
                }).start();
            }
        });
    }

    private void getApi() {
        Log.d(LOG_TAG, "getApi");
        try {
            HttpResponse httpResponse = ((ShapewaysApplication) getApplicationContext()).getShapewaysClient()
                    .getResponse(ShapewaysClient.API_URL_BASE + ShapewaysClient.API_PATH);
            String response = EntityUtils.toString(httpResponse.getEntity());
            Log.i(LOG_TAG, "response=" + response);

            // http://wiki.fasterxml.com/JacksonInFiveMinutes
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map = mapper.readValue(response, Map.class);
            Log.i(LOG_TAG, "map=" + map);

            Base base = mapper.readValue(response, Base.class);
            base.setStatusCode(httpResponse.getStatusLine().getStatusCode());
            Log.i(LOG_TAG, "result=" + base.getResult());
            Log.i(LOG_TAG, "rateLimit.getRemaining=" + base.getRateLimit().getRemaining());
        } catch (Exception e) {
            Log.e(LOG_TAG, "getApi", e);
        }
    }

    private void getOrders() {
        Log.d(LOG_TAG, "getOrders");
        try {
            HttpResponse httpResponse = ((ShapewaysApplication) getApplicationContext()).getShapewaysClient()
                    .getResponse(ShapewaysClient.API_URL_BASE + ShapewaysClient.ORDERS_PATH);
            String response = EntityUtils.toString(httpResponse.getEntity());
            Log.i(LOG_TAG, "response=" + response);

            // http://wiki.fasterxml.com/JacksonInFiveMinutes
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map = mapper.readValue(response, Map.class);
            Log.i(LOG_TAG, "map=" + map);

            Orders orders = mapper.readValue(response, Orders.class);
            orders.setStatusCode(httpResponse.getStatusLine().getStatusCode());
            Log.i(LOG_TAG, "result=" + orders.getResult());
            Log.i(LOG_TAG, "getItemCount=" + orders.getItemCount());
            if (orders.getItemCount() > 0) {
                Log.i(LOG_TAG, "item: materialId=" + orders.getItems().get(0).getMaterialId());
                Log.i(LOG_TAG, "item: modelId=" + orders.getItems().get(0).getModelId());
                Log.i(LOG_TAG, "item: quantity=" + orders.getItems().get(0).getQuantity());
            }
        } catch (Exception e) {
            Log.e(LOG_TAG, "getOrders", e);
        }
    }

    private void postOrder() {
        Log.d(LOG_TAG, "postOrder");
        try {
            HttpResponse httpResponse = ((ShapewaysApplication) getApplicationContext()).getShapewaysClient()
                    .postResponse(ShapewaysClient.API_URL_BASE + ShapewaysClient.ORDERS_PATH,
                            "{\"modelId\":1002632,\"materialId\":6,\"quantity\":1}");
            String response = EntityUtils.toString(httpResponse.getEntity());
            Log.i(LOG_TAG, "response=" + response);

            // http://wiki.fasterxml.com/JacksonInFiveMinutes
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map = mapper.readValue(response, Map.class);
            Log.i(LOG_TAG, "map=" + map);

            Orders orders = mapper.readValue(response, Orders.class);
            orders.setStatusCode(httpResponse.getStatusLine().getStatusCode());
            // Log.i(LOG_TAG, "result=" + orders.getResult());
            Log.i(LOG_TAG, "reason=" + orders.getReason());
            // Log.i(LOG_TAG, "getItemCount=" + orders.getItemCount());
        } catch (Exception e) {
            Log.e(LOG_TAG, "postOrder", e);
        }
    }

    private void getPrinters() {
        Log.d(LOG_TAG, "getPrinters");
        try {
            HttpResponse httpResponse = ((ShapewaysApplication) getApplicationContext()).getShapewaysClient()
                    .getResponse(ShapewaysClient.API_URL_BASE + ShapewaysClient.PRINTERS_PATH);
            String response = EntityUtils.toString(httpResponse.getEntity());
            Log.i(LOG_TAG, "response=" + response);

            // http://wiki.fasterxml.com/JacksonInFiveMinutes
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map = mapper.readValue(response, Map.class);
            Log.i(LOG_TAG, "map=" + map);

            Printers printers = mapper.readValue(response, Printers.class);
            printers.setStatusCode(httpResponse.getStatusLine().getStatusCode());
            Log.i(LOG_TAG, "result=" + printers.getResult());
            Log.i(LOG_TAG, "printers=" + printers.getPrinters().size());
        } catch (Exception e) {
            Log.e(LOG_TAG, "getPrinters", e);
        }
    }

    private void getMaterials() {
        Log.d(LOG_TAG, "getMaterials");
        try {
            HttpResponse httpResponse = ((ShapewaysApplication) getApplicationContext()).getShapewaysClient()
                    .getResponse(ShapewaysClient.API_URL_BASE + ShapewaysClient.MATERIALS_PATH);
            String response = EntityUtils.toString(httpResponse.getEntity());
            Log.i(LOG_TAG, "response=" + response);

            // http://wiki.fasterxml.com/JacksonInFiveMinutes
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map = mapper.readValue(response, Map.class);
            Log.i(LOG_TAG, "map=" + map);

            // The response does not use array[] notation for the list of
            // materials.
            // So, have to manually parse the JSON to get the list data.
            MappingJsonFactory f = new MappingJsonFactory();
            JsonParser jp = f.createJsonParser(response);
            Materials materials = new Materials();
            materials.setStatusCode(httpResponse.getStatusLine().getStatusCode());
            jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)
            while (jp.nextToken() != JsonToken.END_OBJECT) {
                String fieldname = jp.getCurrentName();
                Log.d(LOG_TAG, "fieldname=" + fieldname);
                jp.nextToken(); // move to value
                if ("materials".equals(fieldname)) { // contains an object
                    // Material material = jp.readValueAs(Material.class);
                    boolean end = false;
                    do {
                        Material material = new Material();
                        while (jp.nextToken() != JsonToken.END_OBJECT) {
                            String namefield = jp.getCurrentName();
                            Log.d(LOG_TAG, "namefield=" + namefield);
                            jp.nextToken(); // move to value
                            if ("materialId".equals(namefield)) {
                                material.setMaterialId(Integer.parseInt(jp.getText()));
                            } else if ("title".equals(namefield)) {
                                material.setTitle(jp.getText());
                            } else if ("supportsColorFiles".equals(namefield)) {
                                material.setSupportsColorFiles(Integer.parseInt(jp.getText()));
                            } else if ("printerId".equals(namefield)) {
                                material.setPrinterId(jp.getText());
                            } else if ("swatch".equals(namefield)) {
                                material.setSwatch(jp.getText());
                            } else {
                                Log.w(LOG_TAG, "Unrecognized material field: " + namefield);
                            }
                        }
                        materials.getMaterials().add(material);
                        JsonToken token = jp.nextToken();
                        Log.d(LOG_TAG, "token=" + token);
                        if (token == JsonToken.FIELD_NAME) {
                            try {
                                Integer.parseInt(jp.getCurrentName());
                                jp.nextToken();
                            } catch (Exception ex) {
                                end = true;
                            }
                        } else if (token == JsonToken.END_OBJECT) {
                            end = true;
                        }
                    } while (!end);

                } else if ("result".equals(fieldname)) {
                    if (jp.getText().equals(Result.success.name())) {
                        materials.setResult(Result.success);
                    } else if (jp.getText().equals(Result.failure.name())) {
                        materials.setResult(Result.failure);
                    }
                } else {
                    Log.w(LOG_TAG, "Unrecognized materials field: " + fieldname);
                }
            }
            jp.close(); // ensure resources get cleaned up timely and properly

            Log.i(LOG_TAG, "materials=" + materials.getMaterials().size());
            Log.i(LOG_TAG, "material: id=" + materials.getMaterials().get(0).getMaterialId());
            Log.i(LOG_TAG, "material: title=" + materials.getMaterials().get(0).getTitle());
            Log.i(LOG_TAG, "material: swatch=" + materials.getMaterials().get(0).getSwatch());
        } catch (Exception e) {
            Log.e(LOG_TAG, "getMaterials", e);
        }
    }

    private void getModels() {
        Log.d(LOG_TAG, "getModels");
        try {
            HttpResponse httpResponse = ((ShapewaysApplication) getApplicationContext()).getShapewaysClient()
                    .getResponse(ShapewaysClient.API_URL_BASE + ShapewaysClient.MODELS_PATH);
            String response = EntityUtils.toString(httpResponse.getEntity());
            Log.i(LOG_TAG, "response=" + response);

            // http://wiki.fasterxml.com/JacksonInFiveMinutes
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map = mapper.readValue(response, Map.class);
            Log.i(LOG_TAG, "map=" + map);

            Models models = mapper.readValue(response, Models.class);
            models.setStatusCode(httpResponse.getStatusLine().getStatusCode());
            Log.i(LOG_TAG, "result=" + models.getResult());
            Log.i(LOG_TAG, "models=" + models.getModels().size());
        } catch (Exception e) {
            Log.e(LOG_TAG, "getModels", e);
        }
    }

    private void getModel() {
        Log.d(LOG_TAG, "getModel");
        try {
            String path = String.format(ShapewaysClient.MODEL_INFO_PATH, "1002632");
            HttpResponse httpResponse = ((ShapewaysApplication) getApplicationContext()).getShapewaysClient()
                    .getResponse(ShapewaysClient.API_URL_BASE + path);
            String response = EntityUtils.toString(httpResponse.getEntity());
            Log.i(LOG_TAG, "response=" + response);

            // http://wiki.fasterxml.com/JacksonInFiveMinutes
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map = mapper.readValue(response, Map.class);
            Log.i(LOG_TAG, "map=" + map);

            Model model = mapper.readValue(response, Model.class);
            model.setStatusCode(httpResponse.getStatusLine().getStatusCode());
            Log.i(LOG_TAG, "result=" + model.getResult());
            Log.i(LOG_TAG, "title=" + model.getTitle());
        } catch (Exception e) {
            Log.e(LOG_TAG, "getModels", e);
        }
    }

    private void deleteModel() {
        Log.d(LOG_TAG, "deleteModel");
        try {
            String path = String.format(ShapewaysClient.MODEL_INFO_PATH, "1005240");
            HttpResponse httpResponse = ((ShapewaysApplication) getApplicationContext()).getShapewaysClient()
                    .deleteResponse(ShapewaysClient.API_URL_BASE + path);
            String response = EntityUtils.toString(httpResponse.getEntity());
            Log.i(LOG_TAG, "response=" + response);

            // http://wiki.fasterxml.com/JacksonInFiveMinutes
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map = mapper.readValue(response, Map.class);
            Log.i(LOG_TAG, "map=" + map);

            Model model = mapper.readValue(response, Model.class);
            model.setStatusCode(httpResponse.getStatusLine().getStatusCode());
            Log.i(LOG_TAG, "result=" + model.getResult());
            Log.i(LOG_TAG, "title=" + model.getTitle());
        } catch (Exception e) {
            Log.e(LOG_TAG, "deleteModel", e);
        }
    }

    private void postPrices() {
        Log.d(LOG_TAG, "postPrices");
        try {
            HttpResponse httpResponse = ((ShapewaysApplication) getApplicationContext()).getShapewaysClient()
                    .postResponse(ShapewaysClient.API_URL_BASE + ShapewaysClient.PRICES_PATH, "");
            String response = EntityUtils.toString(httpResponse.getEntity());
            Log.i(LOG_TAG, "response=" + response);

            // http://wiki.fasterxml.com/JacksonInFiveMinutes
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map = mapper.readValue(response, Map.class);
            Log.i(LOG_TAG, "map=" + map);

            Prices prices = mapper.readValue(response, Prices.class);
            prices.setStatusCode(httpResponse.getStatusLine().getStatusCode());
            Log.i(LOG_TAG, "result=" + prices.getResult());
            Log.i(LOG_TAG, "prices=" + prices.getPrices().size());
        } catch (Exception e) {
            Log.e(LOG_TAG, "postPrices", e);
        }
    }

    // ///////////////// Testing

    public void doOAuth() {
        try {
            OAuthConsumer consumer = new CommonsHttpOAuthConsumer(ShapewaysApplication.CONSUMER_KEY,
                    ShapewaysApplication.CONSUMER_SECRET);

            consumer.setTokenWithSecret(
                    ((ShapewaysApplication) getApplicationContext()).getShapewaysClient().getOauthToken(),
                    ((ShapewaysApplication) getApplicationContext()).getShapewaysClient().getOauthTokenSecret());

            // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e68
            HttpGet request = new HttpGet(ShapewaysClient.API_URL_BASE + ShapewaysClient.API_PATH);

            consumer.sign(request);

            HttpClient httpClient = new DefaultHttpClient();
            HttpResponse response = httpClient.execute(request);
            Log.d(LOG_TAG, "response=" + response.getStatusLine());
            Log.d(LOG_TAG, "response=" + EntityUtils.toString(response.getEntity()));
        } catch (Exception e) {
            Log.e(LOG_TAG, "doOAuth", e);
        }
    }

    public void doOAuth1() {
        try {
            OAuthConsumer consumer = new CommonsHttpOAuthConsumer(ShapewaysApplication.CONSUMER_KEY,
                    ShapewaysApplication.CONSUMER_SECRET);

            consumer.setTokenWithSecret(
                    ((ShapewaysApplication) getApplicationContext()).getShapewaysClient().getOauthToken(),
                    ((ShapewaysApplication) getApplicationContext()).getShapewaysClient().getOauthTokenSecret());

            // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e68
            HttpPost request = new HttpPost(ShapewaysClient.API_URL_BASE + ShapewaysClient.ORDERS_PATH);

            final List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair(ShapewaysClient.MODEL_ID_PARAMETER, "1002632"));
            nameValuePairs.add(new BasicNameValuePair(ShapewaysClient.MATERIAL_ID_PARAMETER, "6"));
            nameValuePairs.add(new BasicNameValuePair(ShapewaysClient.QUANTITY_ID_PARAMETER, "1"));

            // request.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            StringEntity se = new StringEntity("{\"modelId\":1002632,\"materialId\":6,\"quantity\":1}");
            request.setEntity(se);
            request.setHeader("Content-Type", "application/json");

            consumer.sign(request);

            HttpClient httpClient = new DefaultHttpClient();
            HttpResponse response = httpClient.execute(request);

            Log.d(LOG_TAG, "response=" + response.getStatusLine());
            Log.d(LOG_TAG, "response=" + EntityUtils.toString(response.getEntity()));
        } catch (Exception e) {
            Log.e(LOG_TAG, "doOAuth", e);
        }
    }

}