package cri.sanity.util;
import java.lang.reflect.Method;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.provider.Settings.System;
import android.telephony.TelephonyManager;
import android.view.KeyEvent;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.location.LocationManager;
import android.app.KeyguardManager.KeyguardLock;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.net.Uri;
import com.android.internal.telephony.ITelephony;
import cri.sanity.A;
import cri.sanity.K;
import cri.sanity.ghost.*;
public final class Dev
{
private static ITelephony iTel;
private static WifiMan gWifi;
private static ConnMan gConn;
private static KeyguardLock keyguardLock;
private static WakeLock wakeScreenLock;
//private static WakeLock wakeCpuLock;
//---- getting devices
/*
public static final Sensor sensorOrient() { return sensor(Sensor.TYPE_ORIENTATION ); }
public static final Sensor sensorAccel () { return sensor(Sensor.TYPE_ACCELEROMETER ); }
public static final Sensor sensorLight () { return sensor(Sensor.TYPE_LIGHT ); }
public static final Sensor sensorMagnet() { return sensor(Sensor.TYPE_MAGNETIC_FIELD); }
public static final Sensor sensorTemper() { return sensor(Sensor.TYPE_TEMPERATURE ); }
public static final Sensor sensorPress () { return sensor(Sensor.TYPE_PRESSURE ); }
public static final Sensor sensorGyro () { return sensor(Sensor.TYPE_GYROSCOPE ); }
*/
//public static final boolean allowMobData() { return Settings.Secure.getInt(A.ctxRes(), "mobile_data", 1) == 1; }
//---- ghost manager
public static final ITelephony iTel() { if(iTel == null) iTel = getITelephony(); return iTel; }
public static final WifiMan gWifi() { if(gWifi == null) gWifi = new WifiMan(); return gWifi; }
public static final ConnMan gConn() { if(gConn == null) gConn = new ConnMan(); return gConn; }
//---- check on/off device state
//public static final boolean isHeadsetOn() {
// final AudioManager am = A.audioMan();
// return am.isWiredHeadsetOn() || am.isBluetoothA2dpOn() || am.isBluetoothScoOn();
//}
public static final boolean isMobDataOn() {
if(iTel()==null || Settings.Secure.getInt(A.resolver(),"mobile_data",1)!=1) return false;
final int ds = A.telMan().getDataState();
return ds==TelephonyManager.DATA_CONNECTED || ds==TelephonyManager.DATA_CONNECTING;
}
public static final boolean isBtOn() {
final BluetoothAdapter ba = A.btAdapter();
if(ba == null) return false;
final int state = ba.getState();
return state==BluetoothAdapter.STATE_ON || state==BluetoothAdapter.STATE_TURNING_ON;
}
public static final boolean isGpsOn() {
final LocationManager lm = A.locMan();
return lm!=null && lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
public static final boolean isFlightModeOn() { return getSysInt(System.AIRPLANE_MODE_ON) == 1; }
public static final boolean isHotspotOn() { return gWifi().isHotspotOn(); }
public static final boolean isHotspotSupported() { return gWifi().callable("getWifiApState"); }
public static final boolean isTetheringOn() { return gConn().isTetheringOn(); }
public static final boolean isTetheringSupported() { return gConn().callable("getTetheredIfaces", "getTetherableUsbRegexs"); }
public static final boolean isRinging() { return A.telMan().getCallState() == TelephonyManager.CALL_STATE_RINGING; }
public static final boolean isOffhook() { return A.telMan().getCallState() == TelephonyManager.CALL_STATE_OFFHOOK; }
public static final boolean isIdle () { return A.telMan().getCallState() == TelephonyManager.CALL_STATE_IDLE; }
//---- enable/disable devices
public static final void dial(String num) {
Intent i = new Intent(Intent.ACTION_CALL);
i.setData(Uri.parse("tel:"+num));
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
A.app().startActivity(i);
}
public static final void answerCall() {
try {
if(A.is(K.ANSWER_ALT)) throw new Exception();
iTel().answerRingingCall();
} catch(Exception e) {
Intent i1 = new Intent(Intent.ACTION_MEDIA_BUTTON);
i1.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
A.app().sendOrderedBroadcast(i1, "android.permission.CALL_PRIVILEGED");
Intent i2 = new Intent(Intent.ACTION_MEDIA_BUTTON);
i2.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
A.app().sendOrderedBroadcast(i2, "android.permission.CALL_PRIVILEGED");
}
}
public static final boolean endCall() {
try {
iTel().endCall();
return true;
} catch(Exception e) { try {
enableFlightMode(true );
enableFlightMode(false);
return true;
} catch(Exception e2) {
return false;
}}
}
public static final boolean enableBt(boolean enable) {
final BluetoothAdapter bt = A.btAdapter();
if(bt == null) return false;
return enable ? bt.enable() : bt.disable();
}
public static final boolean enableFlightMode(boolean enable) {
if(!System.putInt(A.resolver(), System.AIRPLANE_MODE_ON, enable? 1 : 0)) return false;
Intent i = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
i.putExtra("state", enable);
A.app().sendBroadcast(i);
return true;
}
public static final void toggleGps() {
// use undocumented android broadcast
Intent i = new Intent();
i.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
i.addCategory("android.intent.category.ALTERNATIVE");
i.setData(Uri.parse("3"));
A.app().sendBroadcast(i);
}
//---- managing system
public static final int getSysInt(String key) {
try {
return System.getInt(A.resolver(), key);
} catch(SettingNotFoundException e) {
return -1;
}
}
public static final void lock()
{
if(A.SDK < 8) return;
try { A.devpolMan().lockNow(); } catch(Exception e) {}
}
public static final WakeLock newCpuWakeLock() {
return A.powerMan().newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE|PowerManager.ACQUIRE_CAUSES_WAKEUP, A.name());
}
//public static final boolean isWakeCpu() { return wakeCpuLock!=null && wakeCpuLock.isHeld(); }
/*public static final void wakeCpu() {
if(wakeCpuLock == null) wakeCpuLock = newCpuWakeLock();
wakeCpuLock.acquire();
}
public static final void unwakeCpu() {
if(wakeCpuLock==null || !wakeCpuLock.isHeld()) return;
wakeCpuLock.release();
}
*/
//public static final boolean isWakeScreen() { return wakeScreenLock!=null && wakeScreenLock.isHeld(); }
public static final void wakeScreen() { wakeScreen(true); }
public static final void wakeScreen(boolean release) {
if(wakeScreenLock == null) {
wakeScreenLock = A.powerMan().newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE|PowerManager.ACQUIRE_CAUSES_WAKEUP, A.name());
wakeScreenLock.setReferenceCounted(false);
}
wakeScreenLock.acquire();
if(release) wakeScreenLock.release();
}
//public static final void unwakeScreen() {
// if(wakeScreenLock==null || !wakeScreenLock.isHeld()) return;
// wakeScreenLock.release();
//}
public static final void enableLock(boolean enable) {
if(keyguardLock == null) keyguardLock = A.keyguardMan().newKeyguardLock(A.name());
if(enable) keyguardLock.reenableKeyguard();
else keyguardLock.disableKeyguard();
}
private static ITelephony getITelephony() {
try {
final TelephonyManager tm = A.telMan();
final Method m = tm.getClass().getDeclaredMethod("getITelephony");
m.setAccessible(true);
return (ITelephony)m.invoke(tm);
} catch(Exception e) {
return null;
}
}
}