package fr.neamar.kiss.toggles; import android.bluetooth.BluetoothAdapter; import android.content.ContentResolver; import android.content.Context; import android.media.AudioManager; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.provider.Settings; import android.util.Log; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import fr.neamar.kiss.KissApplication; import fr.neamar.kiss.pojo.TogglesPojo; public class TogglesHandler { private final ConnectivityManager connectivityManager; private final WifiManager wifiManager; private final BluetoothAdapter bluetoothAdapter; private final AudioManager audioManager; private final ContentResolver contentResolver; /** * Initialize managers * * @param context android context */ public TogglesHandler(Context context) { this.connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); this.wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); this.audioManager = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE)); this.contentResolver = context.getContentResolver(); } /** * Return the state for the specified pojo * * @param pojo item to look for * @return item state */ public Boolean getState(TogglesPojo pojo) { try { switch (pojo.settingName) { case "wifi": return getWifiState(); case "data": return getDataState(); case "bluetooth": return getBluetoothState(); case "silent": return getSilentState(); case "torch": return getTorchState(); case "sync": return getSyncState(); case "autorotate": return getAutorotationState(); default: Log.e("wtf", "Unsupported toggle for reading: " + pojo.settingName); return false; } } catch (Exception e) { e.printStackTrace(); Log.w("log", "Unsupported toggle for device: " + pojo.settingName); return null; } } public void setState(TogglesPojo pojo, Boolean state) { try { switch (pojo.settingName) { case "wifi": setWifiState(state); break; case "data": setDataState(state); break; case "bluetooth": setBluetoothState(state); break; case "silent": setSilentState(state); break; case "torch": setTorchState(state); break; case "sync": setSyncState(state); case "autorotate": setAutorotationState(state); default: Log.e("wtf", "Unsupported toggle for update: " + pojo.settingName); break; } } catch (Exception e) { e.printStackTrace(); Log.w("log", "Unsupported toggle for device: " + pojo.settingName); } } private Boolean getWifiState() { return wifiManager.isWifiEnabled(); } private void setWifiState(Boolean state) { wifiManager.setWifiEnabled(state); } private Boolean getDataState() { Method dataMtd; try { dataMtd = ConnectivityManager.class.getDeclaredMethod("getMobileDataEnabled"); dataMtd.setAccessible(true); return (Boolean) dataMtd.invoke(connectivityManager); } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } return false; } private void setDataState(Boolean state) { Method dataMtd; try { dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class); dataMtd.setAccessible(true); dataMtd.invoke(connectivityManager, state); } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | IllegalArgumentException e) { e.printStackTrace(); } } private Boolean getBluetoothState() { return bluetoothAdapter.isEnabled(); } private void setBluetoothState(Boolean state) { if (state) bluetoothAdapter.enable(); else bluetoothAdapter.disable(); } private Boolean getTorchState() { return KissApplication.getCameraHandler().isTorchAvailable() && KissApplication.getCameraHandler().getTorchState(); } private void setTorchState(Boolean state) { if(KissApplication.getCameraHandler().isTorchAvailable()) { KissApplication.getCameraHandler().setTorchState(state); } } private Boolean getSilentState() { int state = audioManager.getRingerMode(); return state == AudioManager.RINGER_MODE_SILENT || state == AudioManager.RINGER_MODE_VIBRATE; } private void setSilentState(Boolean state) { if (!state) { audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); audioManager.setStreamVolume(AudioManager.STREAM_RING, audioManager.getStreamVolume(AudioManager.STREAM_RING), AudioManager.FLAG_PLAY_SOUND); } else { audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, AudioManager.FLAG_VIBRATE); } } private Boolean getSyncState() { return ContentResolver.getMasterSyncAutomatically(); } private void setSyncState(Boolean state) { ContentResolver.setMasterSyncAutomatically(state); } private Boolean getAutorotationState() { return android.provider.Settings.System.getInt(this.contentResolver,Settings.System.ACCELEROMETER_ROTATION, 0) == 1; } private void setAutorotationState(Boolean state) { android.provider.Settings.System.putInt(this.contentResolver,Settings.System.ACCELEROMETER_ROTATION, (state) ? 1 : 0 ); } }