package com.alexvasilkov.android.commons.utils;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.provider.Telephony;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.util.SparseArray;
public final class TelephonyHelper {
private static SparseArray<SimStateListener> sPhoneListenersMap = new SparseArray<SimStateListener>();
private static int sPhoneListenerLastId;
public static synchronized int register(Context context, OnSimStateListener listener) {
SimStateListener phoneListener = new SimStateListener(listener);
sPhoneListenersMap.put(++sPhoneListenerLastId, phoneListener);
((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).listen(phoneListener,
PhoneStateListener.LISTEN_SERVICE_STATE);
return sPhoneListenerLastId;
}
public static synchronized void unregister(Context context, int listenerId) {
SimStateListener phoneListener = sPhoneListenersMap.get(listenerId);
if (phoneListener == null) return;
((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).listen(phoneListener, PhoneStateListener.LISTEN_NONE);
}
public static boolean canPerformCall(Context context) {
boolean canPerformCall = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
if (!canPerformCall) return false;
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return TelephonyManager.SIM_STATE_READY == tm.getSimState() && (TelephonyManager.PHONE_TYPE_NONE != tm.getPhoneType());
}
public static boolean canSendSms(Context context) {
if (!canPerformCall(context)) return false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(context);
return defaultSmsPackageName != null;
} else {
return true;
}
}
private static class SimStateListener extends PhoneStateListener {
private OnSimStateListener mListener;
private ServiceState mServiceState;
private SimStateListener(OnSimStateListener listener) {
this.mListener = listener;
}
@Override
public void onServiceStateChanged(ServiceState serviceState) {
if (mServiceState == null || !mServiceState.equals(serviceState)) {
mServiceState = serviceState;
boolean connected = ServiceState.STATE_IN_SERVICE == serviceState.getState();
mListener.onSimState(connected);
}
}
}
public static interface OnSimStateListener {
void onSimState(boolean connected);
}
private TelephonyHelper() {}
}