package com.steps.geosms.utils;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.Telephony;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialog;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.QuickContactBadge;
import android.widget.TextView;
import android.widget.Toast;
import com.ioane.sharvadze.geosms.R;
import com.steps.geosms.GeoSmsManager;
import com.steps.geosms.MyPreferencesManager;
import com.steps.geosms.conversation.ContactsArrayAdapter;
import com.steps.geosms.objects.Contact;
import com.steps.geosms.objects.Conversation;
import com.steps.geosms.objects.SMS;
import com.steps.geosms.websms.WebSms;
import com.steps.translator.GeoTranslator;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* Class Utils
*
* Created by Ioane on 2/25/2015.
*/
@SuppressLint("NewApi")
public class Utils {
private static final String TAG = Utils.class.getSimpleName();
private static final String CONTACT_LIST_FILE = "file_contact_list";
public static void showBalanceDialog(final Activity context, final GeoSmsManager smsManager){
new Thread(new Runnable() {
@Override
public void run() {
final WebSms webSms = smsManager.getWebSmsManager();
final boolean updated = webSms.updateBalance();
final int errorColor = context.getResources().getColor(R.color.darkred);
context.runOnUiThread(new Runnable() {
@Override
public void run() {
String balanceTitle = context.getString(R.string.balance);
String balance;
if(updated){
balance = webSms.getBalance();
}else {
balance = MyPreferencesManager.getWebSmsBalance(context);
}
Toast.makeText(context,balanceTitle + " : "+ balance,Toast.LENGTH_LONG).show();
}
});
}
}).start();
}
public static AppCompatDialog buildContactsDialog(final Context context, final ArrayList<Contact> contacts){
AppCompatDialog dialog = new AppCompatDialog(context);
dialog.setContentView(R.layout.activity_conversation_people);
dialog.setTitle(R.string.people_in_this_conversation);
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
}
});
final ContactsArrayAdapter contactsAdapter = new ContactsArrayAdapter(context,R.layout.contact_item_dialog);
contactsAdapter.addAll(contacts);
ListView listView = (ListView)dialog.findViewById(R.id.people_list);
listView.setAdapter(contactsAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Contact contact = contacts.get(position);
// show contact badge if person was clicked.
if (contact.getId() > 0) {
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contact.getId()));
ContactsContract.QuickContact.showQuickContact(context,
((Activity)context).findViewById(R.id.quick_contact), uri,
ContactsContract.QuickContact.MODE_MEDIUM, null);
} else {
QuickContactBadge badge = (QuickContactBadge) ((Activity)context).findViewById(R.id.quick_contact);
badge.assignContactFromPhone(contact.getAddress(), true);
badge.setMode(ContactsContract.QuickContact.MODE_MEDIUM);
badge.performClick();
}
}
});
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
}
});
return dialog;
}
/**
* Saves Conversation list asynchronously
*
* @param context necessary to save list.
* @param conversations to cache conversation
*/
public static void cacheConversations(Context context, ArrayList<Conversation> conversations){
new Thread(new AsyncConversationCacher(context,conversations)).start();
}
public static GeoTranslator getTranslator(Context context) throws IOException {
File words = new File(Constants.TranslatorData.words);
File shis = new File(Constants.TranslatorData.shis);
File chis = new File(Constants.TranslatorData.chis);
File dzis = new File(Constants.TranslatorData.dzis);
File exceptions = new File(Constants.TranslatorData.exceptions);
if(words.exists() && shis.exists() && chis.exists() && dzis.exists() && exceptions.exists()){
return GeoTranslator.load(words,shis,chis,dzis,exceptions);
}else{
copyAssets(context);
return GeoTranslator.load(context.openFileInput(Constants.TranslatorData.words),
context.openFileInput(Constants.TranslatorData.shis),
context.openFileInput(Constants.TranslatorData.chis),
context.openFileInput(Constants.TranslatorData.dzis),
context.openFileInput(Constants.TranslatorData.exceptions));
}
}
private static void copyAssets(Context context) {
AssetManager assetManager = context.getAssets();
String[] files = new String[]{Constants.TranslatorData.words,
Constants.TranslatorData.shis,
Constants.TranslatorData.chis,
Constants.TranslatorData.dzis,
Constants.TranslatorData.exceptions};
for(String filename : files) {
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(filename);
out = context.openFileOutput(filename,Context.MODE_PRIVATE);
copyFile(in, out);
} catch(IOException e) {
Log.e("tag", "Failed to copy asset file: " + filename, e);
}
finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
private static void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}
private static class AsyncConversationCacher implements Runnable{
private Context ctx;
private ArrayList<Conversation> contactList;
public AsyncConversationCacher(Context ctx , ArrayList<Conversation> contactList){
this.ctx = ctx;
this.contactList = contactList;
}
@Override
public void run() {
FileOutputStream fos;
try {
fos = ctx.openFileOutput(CONTACT_LIST_FILE, Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(contactList);
os.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@SuppressWarnings("unchecked cast")
public static ArrayList<Conversation> loadConversationsFromCache(Context context){
FileInputStream fis;
ArrayList<Conversation> obj = null;
try {
fis = context.openFileInput(CONTACT_LIST_FILE);
ObjectInputStream is = new ObjectInputStream(fis);
obj = (ArrayList<Conversation>) is.readObject();
is.close();
fis.close();
} catch (Exception e){
e.printStackTrace();
Log.w(TAG,"serialisation exception");
}
return obj;
}
public static Bitmap createTextBitmap(String txt,int size,Context context){
if(txt.length() > 2){
txt = txt.substring(0,2);
}
Bitmap output = Bitmap.createBitmap(size , size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int pixels = Constants.IMAGE_SIZE;
final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
final Rect rect = new Rect(0, 0, size, size);
final RectF rectF = new RectF(rect);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(context.getResources().getColor(R.color.themeAccent));
Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
Rect textBounds = new Rect();
textPaint.setTextSize((int)(size/2.5));
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setStyle(Paint.Style.FILL);
textPaint.getTextBounds(txt, 0, txt.length(), textBounds);
textPaint.setColor(Color.WHITE);
canvas.drawRoundRect(rectF, pixels, pixels, paint);
canvas.drawText(txt, canvas.getWidth()/2,
((canvas.getHeight() / 2) - ((textPaint.descent() + textPaint.ascent()) / 2))
, textPaint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
public static Bitmap getCircleBitmap(Bitmap bitmap){
// create as circle.
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int pixels = Constants.IMAGE_SIZE;
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, pixels, pixels, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
public static boolean isDefaultSmsApp(Context context){
final String myPackageName = context.getPackageName();
if(Build.VERSION.SDK_INT >= Constants.KITKAT_API_LEVEL){
if(!Telephony.Sms.getDefaultSmsPackage(context).equals(myPackageName))
return false;
}
return true;
}
public static String getOwnersImage(Context context){
Cursor cursor = context.getContentResolver().query(ContactsContract.Profile.CONTENT_URI,
new String[]{ContactsContract.Profile.PHOTO_URI}, null, null, null);
if(cursor != null){
String uri = null;
if(cursor.moveToFirst()){
uri = cursor.getString(0);
}
cursor.close();
return uri;
}
return null;
}
public static Bitmap getPhotoFromURI(String photoURI,Context context,int size) {
if(photoURI == null) return null;
try {
// get image from filesystem
InputStream input = context.getContentResolver().openInputStream(Uri.parse(photoURI));
Bitmap bitmap = BitmapFactory.decodeStream(input, null, null);
Bitmap scaled = Bitmap.createScaledBitmap(bitmap,size,size,true);
bitmap.recycle();
System.gc();
return scaled;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String removeWhitespaces(String address) {
return address.replaceAll("\\s+", "");
}
/**
* Returns header from contacts.
*
* @param contacts list from which header is cereated.
* @return header
*/
public static String getChatHeader(ArrayList<Contact> contacts){
StringBuilder header = new StringBuilder();
for(int i=0;i<contacts.size();i++){
Contact c = contacts.get(i);
header.append(c.getName() != null ? c.getName() : c.getAddress());
if(i != contacts.size() -1)
header.append(", ");
}
return header.toString();
}
public static void deleteSmsList(Context context,List<SMS> smsList) {
for(SMS sms:smsList){
Log.i(TAG,"m " + sms.getId());
context.getContentResolver().delete(Constants.URIS.SMS,"_id=?",
new String[]{""+sms.getId()});
}
}
public static void dumpIntent(Intent i){
Bundle bundle = i.getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
Iterator<String> it = keys.iterator();
Log.e(TAG,"Dumping Intent start");
while (it.hasNext()) {
String key = it.next();
Log.e(TAG,"[" + key + "=" + bundle.get(key)+"]");
}
Log.e(TAG,"Dumping Intent end");
}
}
public static long minuteToMillis(int mins){
return mins * 60000;
}
}