package com.zegoggles.smssync.utils;
import android.content.Context;
import android.util.Log;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.Map;
import static com.zegoggles.smssync.App.LOCAL_LOGV;
import static com.zegoggles.smssync.App.TAG;
public class ThreadHelper {
private Class<?> telephonyThreads;
private Method getOrCreateThreadId;
private boolean threadsAvailable = true;
private static final int MAX_THREAD_CACHE_SIZE = 500;
@SuppressWarnings("serial")
private Map<String, Long> mThreadIdCache =
new LinkedHashMap<String, Long>(MAX_THREAD_CACHE_SIZE + 1, .75F, true) {
@Override
public boolean removeEldestEntry(Map.Entry<String, Long> eldest) {
return size() > MAX_THREAD_CACHE_SIZE;
}
};
public Long getThreadId(final Context context, final String recipient) {
if (recipient == null || !threadsAvailable) return null;
if (mThreadIdCache.containsKey(recipient)) {
return mThreadIdCache.get(recipient);
} else if (getOrCreateThreadId == null) {
try {
telephonyThreads = Class.forName("android.provider.Telephony$Threads");
getOrCreateThreadId = telephonyThreads.getMethod("getOrCreateThreadId",
Context.class, String.class);
} catch (NoSuchMethodException e) {
return noThreadsAvailable(e);
} catch (ClassNotFoundException e) {
return noThreadsAvailable(e);
}
}
try {
final Long id = (Long) getOrCreateThreadId.invoke(telephonyThreads,
context, recipient);
if (LOCAL_LOGV) Log.v(TAG, "threadId for " + recipient + ": " + id);
if (id != null) mThreadIdCache.put(recipient, id);
return id;
} catch (InvocationTargetException e) {
return noThreadsAvailable(e);
} catch (IllegalAccessException e) {
return noThreadsAvailable(e);
}
}
private Long noThreadsAvailable(Throwable e) {
Log.e(TAG, "threadsNotAvailable", e);
threadsAvailable = false;
return null;
}
}