All Downloads are FREE. Search and download functionalities are using the official Maven repository.

playn.android.AndroidNet Maven / Gradle / Ivy

/**
 * Copyright 2011 The PlayN Authors
 *
 * 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 playn.android;

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

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import react.RFuture;
import react.RPromise;

import playn.core.Exec;
import playn.core.Image;
import playn.core.ImageImpl;
import playn.core.Net;
import playn.core.Scale;

public class AndroidNet extends Net {

  private final AndroidPlatform plat;

  public AndroidNet (AndroidPlatform plat) {
    this.plat = plat;
  }

  @Override public WebSocket createWebSocket(String url, WebSocket.Listener listener) {
    return new AndroidWebSocket(plat.exec(), url, listener);
  }

  @Override protected RFuture execute(final Builder req) {
    final RPromise result = plat.exec().deferredPromise();
    plat.exec().invokeAsync(new Runnable() {
      @Override public void run() {
        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
        HttpProtocolParams.setHttpElementCharset(params, HTTP.UTF_8);
        HttpClient httpclient = new DefaultHttpClient(params);

        // prepare the request
        HttpRequestBase hreq = null;
        try {
          if (req.isPost()) {
            HttpPost httppost = new HttpPost(req.url);
            if (req.payloadString != null) {
              httppost.setEntity(new StringEntity(req.payloadString, HTTP.UTF_8));
            } else if (req.payloadBytes != null) {
              httppost.setEntity(new ByteArrayEntity(req.payloadBytes));
            }
            hreq = httppost;

            // override the content type
            hreq.addHeader(HTTP.CONTENT_TYPE, req.contentType());
          } else {
            hreq = new HttpGet(req.url);
          }
          for (Header header : req.headers) {
            hreq.addHeader(header.name, header.value);
          }

          // execute the request and process the response
          final HttpResponse response = httpclient.execute(hreq);
          int code = response.getStatusLine().getStatusCode();
          HttpEntity entity = response.getEntity();

          Response impl;
          if (entity == null) {
            impl = new Response(code) {
              @Override
              public String payloadString() {
                return "";
              }
              @Override
              public byte[] payload() {
                return new byte[0];
              }
              @Override
              protected Map> extractHeaders() {
                return extractResponseHeaders(response);
              }
            };

          } else {
            final byte[] data = EntityUtils.toByteArray(entity);
            String encoding = EntityUtils.getContentCharSet(entity);
            if (encoding == null) {
              encoding = HTTP.UTF_8;
            }
            impl = new Response.Binary(code, data, encoding) {
              @Override public Image payloadImage(Scale scale) {
                Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
                ImageImpl image = new AndroidImage(plat, true, 0, 0, req.url);
                image.succeed(new ImageImpl.Data(scale, bm, bm.getWidth(), bm.getHeight()));
                return image;
              }
              @Override protected Map> extractHeaders() {
                return extractResponseHeaders(response);
              }
            };
          }

          result.succeed(impl);
        } catch (Throwable t) {
          result.fail(t);
        }
      }

      @Override
      public String toString() {
        return "AndroidNet.exec(" + req.method() + ", " + req.url + ")";
      }

      private Map> extractResponseHeaders(HttpResponse response) {
        Map> hmap = new HashMap>();
        for (org.apache.http.Header header : response.getAllHeaders()) {
          String name = header.getName();
          List values = hmap.get(name);
          if (values == null) {
            hmap.put(name, values = new ArrayList());
          }
          values.add(header.getValue());
        }
        return hmap;
      }
    });
    return result;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy