package com.jens.automation2.receivers; import android.annotation.SuppressLint; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.telephony.TelephonyManager; import android.util.Log; import com.jens.automation2.ActivityPermissions; import com.jens.automation2.AutomationService; import com.jens.automation2.Miscellaneous; import com.jens.automation2.Rule; import com.jens.automation2.Trigger.Trigger_Enum; import com.jens.automation2.location.WifiBroadcastReceiver; import java.util.ArrayList; public class ConnectivityReceiver extends BroadcastReceiver implements AutomationListenerInterface { protected static boolean connectivityReceiverActive = false; private static ConnectivityReceiver connectivityReceiverInstance = null; private static IntentFilter connectivityIntentFilter = null; private static AutomationService automationServiceRef = null; protected static boolean dataConnectionLastState = false; protected static boolean roamingLastState = false; public static boolean isConnectivityReceiverActive() { return connectivityReceiverActive; } public static void startConnectivityReceiver(AutomationService ref) { automationServiceRef = ref; if(connectivityReceiverInstance == null) connectivityReceiverInstance = new ConnectivityReceiver(); if(connectivityIntentFilter == null) { connectivityIntentFilter = new IntentFilter(); connectivityIntentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); connectivityIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); } try { if(!connectivityReceiverActive) { Miscellaneous.logEvent("i", "Wifi Listener", "Starting connectivityReceiver", 4); connectivityReceiverActive = true; automationServiceRef.registerReceiver(connectivityReceiverInstance, connectivityIntentFilter); } } catch(Exception ex) { Miscellaneous.logEvent("e", "Wifi Listener", "Error starting connectivityReceiver: " + Log.getStackTraceString(ex), 3); } } public static void stopConnectivityReceiver() { try { if(connectivityReceiverActive) { Miscellaneous.logEvent("i", "Wifi Listener", "Stopping connectivityReceiver", 4); connectivityReceiverActive = false; automationServiceRef.unregisterReceiver(connectivityReceiverInstance); } } catch(Exception ex) { Miscellaneous.logEvent("e", "Wifi Listener", "Error stopping connectivityReceiver: " + Log.getStackTraceString(ex), 3); } } // Get roaming state from telephony manager public static Boolean isRoaming(Context context) { TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return telephonyManager.isNetworkRoaming(); } public static void setDataConnectionLastState(boolean newState) { if(dataConnectionLastState != newState) { dataConnectionLastState = newState; // Run rules if I decide to create such a trigger // automationServiceRef.getLocationProvider().handleDataConnectionChange(newState); } } public static Boolean isDataConnectionAvailable(Context context) { ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = connManager.getActiveNetworkInfo(); return ni != null && ni.isConnected(); } // Get airplane mode state from system settings @SuppressLint("NewApi") public static boolean isAirplaneMode(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { int value = android.provider.Settings.System.getInt(context.getContentResolver(), android.provider.Settings.System.AIRPLANE_MODE_ON, 0); return value != 0; } else { return android.provider.Settings.Global.getInt(context.getContentResolver(), android.provider.Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } } @Override public void onReceive(Context context, Intent intent) { try { if (context == null) return; if(intent.getAction().equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) { // Airplane mode status has changed. Miscellaneous.logEvent("i", "Connectivity", "Airplane mode changed.", 2); boolean isAirplaneMode = isAirplaneMode(context); automationServiceRef.getLocationProvider().handleAirplaneMode(isAirplaneMode); ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.airplaneMode); // ArrayList ruleCandidates = Rule.findRuleCandidatesByAirplaneMode(isAirplaneMode); for(int i=0; i ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.roaming); // ArrayList ruleCandidates = Rule.findRuleCandidatesByRoaming(isRoaming); for(int i=0; i ruleCandidates = Rule.findRuleCandidatesByRoaming(isRoaming); // for(int i=0; ionReceive(): " + Log.getStackTraceString(e), 3); } } @Override public void startListener(AutomationService automationService) { ConnectivityReceiver.startConnectivityReceiver(automationService); } @Override public void stopListener(AutomationService automationService) { ConnectivityReceiver.stopConnectivityReceiver(); } public static boolean haveAllPermission() { return ActivityPermissions.havePermission("android.permission.ACCESS_NETWORK_STATE", Miscellaneous.getAnyContext()) && ActivityPermissions.havePermission("android.permission.ACCESS_WIFI_STATE", Miscellaneous.getAnyContext()) && ActivityPermissions.havePermission("android.permission.ACCESS_NETWORK_STATE", Miscellaneous.getAnyContext()); } @Override public boolean isListenerRunning() { return ConnectivityReceiver.isConnectivityReceiverActive(); } @Override public Trigger_Enum[] getMonitoredTrigger() { return new Trigger_Enum[] { Trigger_Enum.airplaneMode, Trigger_Enum.roaming, Trigger_Enum.wifiConnection }; } }