package com.steps.geosms.conversation; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.preference.PreferenceManager; import android.support.v7.app.AlertDialog; import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.ioane.sharvadze.geosms.R; import com.steps.geosms.MyApplication; import com.steps.geosms.objects.Contact; import com.steps.geosms.objects.SMS; import com.steps.geosms.utils.Utils; /** * Class ConversationCursorAdapter * (custom cursor adapter) * * Created by Ioane on 2/26/2015. */ public class ConversationCursorAdapter extends CursorAdapter{ @SuppressWarnings("unused") private static final String TAG = ConversationCursorAdapter.class.getSimpleName(); private Contact contact; private Bitmap OWNER_IMAGE; public static final int OTHER = 1; public static final int ME = 0; private MyApplication app; public ConversationCursorAdapter(Context context, Cursor c, boolean autoRequery ,Contact contact) { super(context, c, autoRequery); this.contact = contact; app = (MyApplication)context.getApplicationContext(); String ownerPhotoUri = Utils.getOwnersImage(context); if(ownerPhotoUri == null){ OWNER_IMAGE = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_no_image); // make it circle like. OWNER_IMAGE = Utils.getCircleBitmap(OWNER_IMAGE); }else{ OWNER_IMAGE = Utils.getPhotoFromURI(ownerPhotoUri,context,60); if(OWNER_IMAGE != null) OWNER_IMAGE = Utils.getCircleBitmap(OWNER_IMAGE); } //mTranslator = new GeoTranslator.load(); } private class ViewHolder { TextView messageView; //TextView nameView; TextView deliveryStatusView; TextView timeView; ImageView photo; ImageButton failed; ProgressBar sending; } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { switch (getItemViewType(cursor)){ case ME: return LayoutInflater.from(context).inflate(R.layout.message_item_me,parent,false); case OTHER: return LayoutInflater.from(context).inflate(R.layout.message_item_other,parent,false); default: return null; } } @Override public void bindView(View view, Context context, Cursor cursor) { SMS message = new SMS(cursor); ViewHolder holder = (ViewHolder)view.getTag(); if (holder == null) { holder = new ViewHolder(); //holder.nameView = (TextView)view.findViewById(R.id.name_view); holder.messageView = (TextView)view.findViewById(R.id.message_text_view); holder.deliveryStatusView = (TextView)view.findViewById(R.id.delivery_status_view); holder.timeView = (TextView)view.findViewById(R.id.time_view); holder.photo = (ImageView)view.findViewById(R.id.message_contact_photo); holder.failed = (ImageButton)view.findViewById(R.id.failed_button); holder.sending = (ProgressBar)view.findViewById(R.id.sending_progress); view.setTag(holder); }else{ holder = (ViewHolder)view.getTag(); } SMS.MsgType type = message.getMsgType(); if(type.equals(SMS.MsgType.PENDING)){ long curr = System.currentTimeMillis(); if(curr > message.getDate().getTime() + Utils.minuteToMillis(7)) type = SMS.MsgType.FAILED; // long pending messages are also failed } SMS nextSms = null; if(cursor.moveToPrevious()){ nextSms = new SMS(cursor); } holder.photo.setVisibility(View.INVISIBLE); if (holder.deliveryStatusView.length() > 0) { holder.deliveryStatusView.setText(""); } /* if this sms is first , or is received from contact let's show header. like photo and name... */ if(type != SMS.MsgType.RECEIVED && (nextSms == null || nextSms.getMsgType() == SMS.MsgType.RECEIVED)){ holder.photo.setImageBitmap(OWNER_IMAGE); holder.photo.setVisibility(View.VISIBLE); } holder.failed.setVisibility(View.GONE); holder.sending.setVisibility(View.GONE); holder.deliveryStatusView.setVisibility(View.GONE); switch (type){ case SENT: break; case PENDING: holder.sending.setVisibility(View.VISIBLE); break; case DRAFT: holder.deliveryStatusView.setVisibility(View.VISIBLE); holder.deliveryStatusView.setText(R.string.sms_draft); break; case FAILED: holder.failed.setVisibility(View.VISIBLE); holder.failed.setTag(message); break; case RECEIVED: /* If this is sms from sender or is first, let's show header... */ if(nextSms == null || nextSms.getMsgType() != SMS.MsgType.RECEIVED){ holder.photo.setImageBitmap(contact.getPhoto()); holder.photo.setVisibility(View.VISIBLE); break; } } if(message.isDelivered()){ holder.deliveryStatusView.setVisibility(View.VISIBLE); holder.deliveryStatusView.setText(R.string.sms_delivered); } String text = message.getText(); // if(mNeedTranslate){ // text = app.translateSMS(text); // } holder.messageView.setText(text); CharSequence formattedTime = DateUtils.getRelativeTimeSpanString(message.getDate().getTime(), System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_ALL); holder.timeView.setText(formattedTime); } @Override public int getItemViewType(int position) { return getItemViewType((Cursor)getItem(position)); } private int getItemViewType(Cursor c) { if(c == null) return ME; SMS message = new SMS(c); if(message.getMsgType() == SMS.MsgType.RECEIVED) return OTHER; return ME; } @Override public int getViewTypeCount() { return 2; } }