UIHelper.java

  1package eu.siacs.conversations.utils;
  2
  3import java.text.SimpleDateFormat;
  4import java.util.Date;
  5import java.util.List;
  6
  7import eu.siacs.conversations.R;
  8import eu.siacs.conversations.entities.Account;
  9import eu.siacs.conversations.entities.Contact;
 10import eu.siacs.conversations.entities.Conversation;
 11import eu.siacs.conversations.entities.Message;
 12import eu.siacs.conversations.ui.ConversationActivity;
 13
 14import android.app.Activity;
 15import android.app.AlertDialog;
 16import android.app.Notification;
 17import android.app.PendingIntent;
 18import android.content.Context;
 19import android.content.DialogInterface;
 20import android.content.DialogInterface.OnClickListener;
 21import android.content.Intent;
 22import android.content.SharedPreferences;
 23import android.content.res.Resources;
 24import android.graphics.Bitmap;
 25import android.graphics.Canvas;
 26import android.graphics.Paint;
 27import android.graphics.Rect;
 28import android.net.Uri;
 29import android.preference.PreferenceManager;
 30import android.provider.ContactsContract.Contacts;
 31import android.support.v4.app.NotificationCompat;
 32import android.support.v4.app.TaskStackBuilder;
 33import android.view.LayoutInflater;
 34import android.view.View;
 35import android.widget.LinearLayout;
 36import android.widget.QuickContactBadge;
 37import android.widget.TextView;
 38
 39public class UIHelper {
 40	public static String readableTimeDifference(long time) {
 41		if (time == 0) {
 42			return "just now";
 43		}
 44		Date date = new Date(time);
 45		long difference = (System.currentTimeMillis() - time) / 1000;
 46		if (difference < 60) {
 47			return "just now";
 48		} else if (difference < 60 * 10) {
 49			return difference / 60 + " min ago";
 50		} else if (difference < 60 * 60 * 24) {
 51			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
 52			return sdf.format(date);
 53		} else {
 54			SimpleDateFormat sdf = new SimpleDateFormat("MM/dd");
 55			return sdf.format(date);
 56		}
 57	}
 58
 59	public static Bitmap getUnknownContactPicture(String name, int size) {
 60		String firstLetter = name.substring(0, 1).toUpperCase();
 61
 62		int holoColors[] = { 0xFF1da9da, 0xFFb368d9, 0xFF83b600, 0xFFffa713,
 63				0xFFe92727 };
 64
 65		int color = holoColors[Math.abs(name.hashCode()) % holoColors.length];
 66
 67		Bitmap bitmap = Bitmap
 68				.createBitmap(size, size, Bitmap.Config.ARGB_8888);
 69		Canvas canvas = new Canvas(bitmap);
 70
 71		bitmap.eraseColor(color);
 72
 73		Paint paint = new Paint();
 74		paint.setColor(0xffe5e5e5);
 75		paint.setTextSize((float) (size * 0.9));
 76		paint.setAntiAlias(true);
 77		Rect rect = new Rect();
 78		paint.getTextBounds(firstLetter, 0, 1, rect);
 79		float width = paint.measureText(firstLetter);
 80		canvas.drawText(firstLetter, (size / 2) - (width / 2), (size / 2)
 81				+ (rect.height() / 2), paint);
 82
 83		return bitmap;
 84	}
 85	
 86	public static Bitmap getErrorPicture(int size) {
 87		Bitmap bitmap = Bitmap
 88				.createBitmap(size, size, Bitmap.Config.ARGB_8888);
 89		Canvas canvas = new Canvas(bitmap);
 90
 91		bitmap.eraseColor(0xFFe92727);
 92
 93		Paint paint = new Paint();
 94		paint.setColor(0xffe5e5e5);
 95		paint.setTextSize((float) (size * 0.9));
 96		paint.setAntiAlias(true);
 97		Rect rect = new Rect();
 98		paint.getTextBounds("!", 0, 1, rect);
 99		float width = paint.measureText("!");
100		canvas.drawText("!", (size / 2) - (width / 2), (size / 2)
101				+ (rect.height() / 2), paint);
102
103		return bitmap;
104	}
105
106	public static Notification getUnreadMessageNotification(Context context,
107			Conversation conversation) {
108
109		SharedPreferences sharedPref = PreferenceManager
110				.getDefaultSharedPreferences(context);
111		String ringtone = sharedPref.getString("notification_ringtone", null);
112
113		Resources res = context.getResources();
114		NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
115				context);
116		mBuilder.setLargeIcon(UIHelper.getUnknownContactPicture(conversation
117				.getName(), (int) res
118				.getDimension(android.R.dimen.notification_large_icon_width)));
119		mBuilder.setContentTitle(conversation.getName());
120		mBuilder.setTicker(conversation.getLatestMessage().getBody().trim());
121		StringBuilder bigText = new StringBuilder();
122		List<Message> messages = conversation.getMessages();
123		String firstLine = "";
124		for(int i = messages.size() -1; i >= 0; --i) {
125			if (!messages.get(i).isRead()) {
126				if (i == messages.size() -1 ) {
127					firstLine = messages.get(i).getBody().trim();
128					bigText.append(firstLine);
129				} else {
130					firstLine = messages.get(i).getBody().trim();
131					bigText.insert(0, firstLine+"\n");
132				}
133			} else {
134				break;
135			}
136		}
137		mBuilder.setContentText(firstLine);
138		mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(bigText.toString()));
139		mBuilder.setSmallIcon(R.drawable.notification);
140		mBuilder.setLights(0xffffffff, 2000, 4000);
141		if (ringtone != null) {
142			mBuilder.setSound(Uri.parse(ringtone));
143		}
144
145		TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
146		stackBuilder.addParentStack(ConversationActivity.class);
147
148		Intent viewConversationIntent = new Intent(context,
149				ConversationActivity.class);
150		viewConversationIntent.setAction(Intent.ACTION_VIEW);
151		viewConversationIntent.putExtra(ConversationActivity.CONVERSATION,
152				conversation.getUuid());
153		viewConversationIntent.setType(ConversationActivity.VIEW_CONVERSATION);
154
155		stackBuilder.addNextIntent(viewConversationIntent);
156
157		PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
158				PendingIntent.FLAG_UPDATE_CURRENT);
159
160		mBuilder.setContentIntent(resultPendingIntent);
161		return mBuilder.build();
162	}
163
164	public static void prepareContactBadge(final Activity activity,
165			QuickContactBadge badge, final Contact contact) {
166		if (contact.getSystemAccount()!=null) {
167			String[] systemAccount = contact.getSystemAccount().split("#");
168			long id = Long.parseLong(systemAccount[0]);
169			badge.assignContactUri(Contacts.getLookupUri(id, systemAccount[1]));
170	
171			if (contact.getProfilePhoto() != null) {
172				badge.setImageURI(Uri.parse(contact.getProfilePhoto()));
173			} else {
174				badge.setImageBitmap(UIHelper.getUnknownContactPicture(contact.getDisplayName(), 400));
175			}
176		} else {
177			badge.setImageBitmap(UIHelper.getUnknownContactPicture(contact.getDisplayName(), 400));
178		}
179
180	}
181	
182	public static AlertDialog getVerifyFingerprintDialog(final ConversationActivity activity,final Conversation conversation, final LinearLayout msg) {
183		final Contact contact = conversation.getContact();
184		final Account account = conversation.getAccount();
185		
186		AlertDialog.Builder builder = new AlertDialog.Builder(activity);
187		builder.setTitle("Verify fingerprint");
188		LayoutInflater inflater = activity.getLayoutInflater();
189		View view = inflater.inflate(R.layout.dialog_verify_otr, null);
190		TextView jid = (TextView) view.findViewById(R.id.verify_otr_jid);
191		TextView fingerprint = (TextView) view.findViewById(R.id.verify_otr_fingerprint);
192		TextView yourprint = (TextView) view.findViewById(R.id.verify_otr_yourprint);
193		
194		jid.setText(contact.getJid());
195		fingerprint.setText(conversation.getOtrFingerprint());
196		yourprint.setText(account.getOtrFingerprint());
197		builder.setNegativeButton("Cancel", null);
198		builder.setPositiveButton("Verify", new OnClickListener() {
199			
200			@Override
201			public void onClick(DialogInterface dialog, int which) {
202				contact.addOtrFingerprint(conversation.getOtrFingerprint());
203				msg.setVisibility(View.GONE);
204				activity.xmppConnectionService.updateContact(contact);
205			}
206		});
207		builder.setView(view);
208		return builder.create();
209	}
210}