forked from jens/Automation
264 lines
9.4 KiB
Java
264 lines
9.4 KiB
Java
|
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<Rule> ruleCandidates = Rule.findRuleCandidatesByAirplaneMode(isAirplaneMode);
|
||
|
for(int i=0; i<ruleCandidates.size(); i++)
|
||
|
{
|
||
|
if(ruleCandidates.get(i).applies(automationServiceRef))
|
||
|
ruleCandidates.get(i).activate(automationServiceRef, false);
|
||
|
}
|
||
|
}
|
||
|
else if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION))
|
||
|
{
|
||
|
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||
|
// NetworkInfo ni = connManager.getActiveNetworkInfo();
|
||
|
NetworkInfo ni = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
|
||
|
if(ni != null)
|
||
|
{
|
||
|
Miscellaneous.logEvent("i", "Connectivity", "Change of network with type " + ni.getType() + " noticed.", 4);
|
||
|
|
||
|
switch(ni.getType())
|
||
|
{
|
||
|
case ConnectivityManager.TYPE_WIFI:
|
||
|
WifiBroadcastReceiver.lastConnectedState = ni.isConnected();
|
||
|
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
||
|
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
|
||
|
WifiBroadcastReceiver.setLastWifiSsid(wifiInfo.getSSID());
|
||
|
WifiBroadcastReceiver.findRules(automationServiceRef.getLocationProvider());
|
||
|
break;
|
||
|
case ConnectivityManager.TYPE_MOBILE:
|
||
|
boolean isRoaming = isRoaming(context);
|
||
|
if(isRoaming != roamingLastState)
|
||
|
{
|
||
|
roamingLastState = isRoaming;
|
||
|
|
||
|
automationServiceRef.getLocationProvider().handleRoaming(isRoaming);
|
||
|
|
||
|
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByRoaming(isRoaming);
|
||
|
for(int i=0; i<ruleCandidates.size(); i++)
|
||
|
{
|
||
|
if(ruleCandidates.get(i).applies(automationServiceRef))
|
||
|
ruleCandidates.get(i).activate(automationServiceRef, false);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
// case ConnectivityManager.TYPE_BLUETOOTH:
|
||
|
|
||
|
|
||
|
/*
|
||
|
* BluetoothAdapter.ACTION_STATE_CHANGED ("android.bluetooth.adapter.action.STATE_CHANGED")
|
||
|
|
||
|
Broadcast Action: The state of the local Bluetooth adapter has been changed. For example, Bluetooth has been turned on or off.
|
||
|
|
||
|
and for Ringer mode changes:
|
||
|
|
||
|
AudioManager.RINGER_MODE_CHANGED_ACTION ("android.media.RINGER_MODE_CHANGED")
|
||
|
|
||
|
Sticky broadcast intent action indicating that the ringer mode has changed. Includes the new ringer mode.
|
||
|
|
||
|
Not a ringer mode change, but this can be good to have also AudioManager.VIBRATE_SETTING_CHANGED_ACTION ("android.media.VIBRATE_SETTING_CHANGED")
|
||
|
|
||
|
Broadcast intent action indicating that the vibrate setting has changed. Includes the vibrate type and its new setting.
|
||
|
*/
|
||
|
// BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
|
||
|
// if(bluetoothDevice.getBondState()
|
||
|
// if(BluetoothDevice.)
|
||
|
// ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByRoaming(isRoaming);
|
||
|
// for(int i=0; i<ruleCandidates.size(); i++)
|
||
|
// {
|
||
|
// if(ruleCandidates.get(i).applies(parentLocationProvider.getParentService()))
|
||
|
// ruleCandidates.get(i).activate(parentLocationProvider.getParentService());
|
||
|
// }
|
||
|
// break;
|
||
|
default:
|
||
|
Miscellaneous.logEvent("i", "Connectivity", "Type of changed network not specified. Doing nothing.", 4);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NetworkInfo wifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
|
||
|
if(!wifiInfo.isAvailable() && WifiBroadcastReceiver.lastConnectedState)
|
||
|
{
|
||
|
// This will serve as a disconnected event. Happens if wifi is connected, then module deactivated.
|
||
|
Miscellaneous.logEvent("i", "Connectivity", "Wifi deactivated while having been connected before.", 4);
|
||
|
WifiBroadcastReceiver.lastConnectedState = false;
|
||
|
WifiBroadcastReceiver.findRules(automationServiceRef.getLocationProvider());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
catch(Exception e)
|
||
|
{
|
||
|
Miscellaneous.logEvent("e", "Connectivity", "Error in ConnectivityReceiver->onReceive(): " + 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 };
|
||
|
}
|
||
|
}
|