content: package im.actor.sdk.controllers.conversation.messages.content;
  
  import android.content.Context;
  import android.content.Intent;
  import android.content.pm.ApplicationInfo;
  import android.content.pm.PackageManager;
  import android.net.Uri;
  import android.os.AsyncTask;
  import android.os.Bundle;
  import android.view.View;
  import android.widget.FrameLayout;
  import android.widget.ImageView;
  import android.widget.TextView;
  
  import com.facebook.drawee.backends.pipeline.Fresco;
  import com.facebook.drawee.backends.pipeline.PipelineDraweeController;
  import com.facebook.drawee.generic.GenericDraweeHierarchy;
  import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
  import com.facebook.drawee.generic.RoundingParams;
  import com.facebook.drawee.view.SimpleDraweeView;
  import com.facebook.imagepipeline.common.ResizeOptions;
  import com.facebook.imagepipeline.request.ImageRequest;
  import com.facebook.imagepipeline.request.ImageRequestBuilder;
  
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  
  import im.actor.core.entity.Message;
  import im.actor.core.entity.Peer;
  import im.actor.core.entity.content.LocationContent;
  import im.actor.core.viewmodel.FileVM;
  import im.actor.core.viewmodel.UploadFileVM;
  import im.actor.sdk.ActorSDK;
  
  import im.actor.sdk.R;
  import im.actor.sdk.controllers.conversation.messages.MessagesAdapter;
  import im.actor.sdk.controllers.conversation.messages.content.preprocessor.PreprocessedData;
  import im.actor.sdk.util.Screen;
  import im.actor.sdk.view.TintImageView;
  
  import static im.actor.sdk.util.ActorSDKMessenger.myUid;
  
  public class LocationHolder extends MessageHolder {
  
      private final int COLOR_PENDING;
      private final int COLOR_SENT;
      private final int COLOR_RECEIVED;
      private final int COLOR_READ;
      private final int COLOR_ERROR;
  
      private Context context;
  
      // Basic bubble
      protected FrameLayout messageBubble;
  
      // Content Views
      protected SimpleDraweeView previewView;
  
      protected TextView time;
      protected TintImageView stateIcon;
  
      // Binded model
      protected FileVM downloadFileVM;
      protected UploadFileVM uploadFileVM;
      protected boolean isPhoto;
  
      public LocationHolder(MessagesAdapter adapter, View itemView, Peer peer) {
          super(adapter, itemView, false);
          this.context = adapter.getMessagesFragment().getActivity();
  
          COLOR_PENDING = ActorSDK.sharedActor().style.getConvMediaStatePendingColor();
          COLOR_SENT = ActorSDK.sharedActor().style.getConvMediaStateSentColor();
          COLOR_RECEIVED = ActorSDK.sharedActor().style.getConvMediaStateDeliveredColor();
          COLOR_READ = ActorSDK.sharedActor().style.getConvMediaStateReadColor();
          COLOR_ERROR = ActorSDK.sharedActor().style.getConvMediaStateErrorColor();
  
          messageBubble = (FrameLayout) itemView.findViewById(R.id.bubbleContainer);
  
          // Content
          previewView = (SimpleDraweeView) itemView.findViewById(R.id.image);
          GenericDraweeHierarchyBuilder builder =
                  new GenericDraweeHierarchyBuilder(context.getResources());
  
          GenericDraweeHierarchy hierarchy = builder
                  .setFadeDuration(200)
                  .setRoundingParams(new RoundingParams()
                          .setCornersRadius(Screen.dp(2))
                          .setRoundingMethod(RoundingParams.RoundingMethod.BITMAP_ONLY))
                  .build();
          previewView.setHierarchy(hierarchy);
  
          time = (TextView) itemView.findViewById(R.id.time);
  
          stateIcon = (TintImageView) itemView.findViewById(R.id.stateIcon);
          onConfigureViewHolder();
      }
  
      @Override
      protected void bindData(Message message, long readDate, long receiveDate, boolean isNewMessage, PreprocessedData preprocessedData) {
          // Update model
          LocationContent locationContent = (LocationContent) message.getContent();
  
          // Update bubble
  
          if (message.getSenderId() == myUid()) {
              messageBubble.setBackgroundResource(R.drawable.conv_bubble_media_out);
          } else {
              messageBubble.setBackgroundResource(R.drawable.conv_bubble_media_in);
          }
  
          // Update state
          if (message.getSenderId() == myUid()) {
              stateIcon.setVisibility(View.VISIBLE);
              switch (message.getMessageState()) {
                  case ERROR:
                      stateIcon.setResource(R.drawable.msg_error);
                      stateIcon.setTint(COLOR_ERROR);
                      break;
                  default:
                  case PENDING:
                      stateIcon.setResource(R.drawable.msg_clock);
                      stateIcon.setTint(COLOR_PENDING);
                      break;
                  case SENT:
                      if (message.getSortDate() <= readDate) {
                          stateIcon.setResource(R.drawable.msg_check_2);
                          stateIcon.setTint(COLOR_READ);
                      } else if (message.getSortDate() <= receiveDate) {
                          stateIcon.setResource(R.drawable.msg_check_2);
                          stateIcon.setTint(COLOR_RECEIVED);
                      } else {
                          stateIcon.setResource(R.drawable.msg_check_1);
                          stateIcon.setTint(COLOR_SENT);
                      }
                      break;
              }
          } else {
              stateIcon.setVisibility(View.GONE);
          }
  
          // Update time
          setTimeAndReactions(time);
  
          previewView.setTag(message.getRid());
          new DownloadImageTask(previewView, message.getRid())
                  .execute("https://maps.googleapis.com/maps/api/staticmap?center=" + locationContent.getLatitude() + "," + locationContent.getLongitude() + "&zoom=15&size=200x100&scale=2&maptype=roadmap&markers=color:red%7C" + locationContent.getLatitude() + "," + locationContent.getLongitude());
  
  
      }
  
      @Override
      public void onClick(final Message currentMessage) {
          try {
              ApplicationInfo app = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
              Bundle bundle = app.metaData;
  
              double latitude = ((LocationContent) currentMessage.getContent()).getLatitude();
              double longitude = ((LocationContent) currentMessage.getContent()).getLongitude();
  
              try {
                  Class.forName("com.google.android.gms.maps.GoogleMap");
                  Intent intent = new Intent("im.actor.locationPreview_" + context.getPackageName());
                  intent.putExtra("latitude", latitude);
                  intent.putExtra("longitude", longitude);
                  context.startActivity(intent);
              } catch (ClassNotFoundException e) {
                  String uri = "geo:" + latitude + ","
                          + longitude + "?q=" + latitude
                          + "," + longitude;
                  context.startActivity(new Intent(android.content.Intent.ACTION_VIEW,
                          Uri.parse(uri)));
              }
          } catch (PackageManager.NameNotFoundException e) {
              e.printStackTrace();
          } catch (NullPointerException e) {
              e.printStackTrace();
          }
  
      }
  
      @Override
      public void unbind() {
          super.unbind();
  
          previewView.setImageURI(null);
      }
  
      private class DownloadImageTask extends AsyncTask<String, Void, File> {
          ImageView bmImage;
          Long id;
          File file;
  
          public DownloadImageTask(ImageView bmImage, Long id) {
              this.bmImage = bmImage;
              this.id = id;
          }
  
          protected File doInBackground(String... params) {
              String urldisplay = params[0];
              InputStream in = null;
              try {
                  file = new File(context.getCacheDir(), id + "_map");
                  if (!file.exists()) {
                      in = new java.net.URL(urldisplay).openStream();
                      OutputStream output = new FileOutputStream(file);
                      try {
                          try {
                              byte[] buffer = new byte[4 * 1024];
                              int read;
  
                              while ((read = in.read(buffer)) != -1) {
                                  output.write(buffer, 0, read);
                              }
                              output.flush();
                          } finally {
                              output.close();
                          }
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
              } catch (Exception e) {
                  e.printStackTrace();
  
              } finally {
                  if (in != null) {
                      try {
                          in.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
              }
  
  
              return file;
          }
  
          protected void onPostExecute(File result) {
              ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.fromFile(result))
                      .setResizeOptions(new ResizeOptions(previewView.getLayoutParams().width,
                              previewView.getLayoutParams().height))
                      .build();
              PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                      .setOldController(previewView.getController())
                      .setImageRequest(request)
                      .build();
              previewView.setController(controller);
          }
      }
  
  
  }
  