diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
index c23aaba9..3ec016f8 100644
--- a/.idea/deploymentTargetDropDown.xml
+++ b/.idea/deploymentTargetDropDown.xml
@@ -7,11 +7,11 @@
-
+
-
+
\ No newline at end of file
diff --git a/app/src/apkFlavor/java/com/jens/automation2/Rule.java b/app/src/apkFlavor/java/com/jens/automation2/Rule.java
index 23bba173..249a5370 100644
--- a/app/src/apkFlavor/java/com/jens/automation2/Rule.java
+++ b/app/src/apkFlavor/java/com/jens/automation2/Rule.java
@@ -349,6 +349,8 @@ public class Rule implements Comparable
return true;
case setWifiTethering:
return true;
+ case setBluetoothTethering:
+ return true;
default:
break;
}
diff --git a/app/src/main/java/com/jens/automation2/Action.java b/app/src/main/java/com/jens/automation2/Action.java
index 215a085d..57a92efb 100644
--- a/app/src/main/java/com/jens/automation2/Action.java
+++ b/app/src/main/java/com/jens/automation2/Action.java
@@ -24,6 +24,7 @@ public class Action
setBluetooth,
setUsbTethering,
setWifiTethering,
+ setBluetoothTethering,
setDisplayRotation,
turnWifiOn,turnWifiOff,
turnBluetoothOn,turnBluetoothOff,
@@ -31,7 +32,7 @@ public class Action
changeSoundProfile,
turnUsbTetheringOn,turnUsbTetheringOff,
turnWifiTetheringOn,turnWifiTetheringOff,
- enableScreenRotation, disableScreenRotation,
+ enableScreenRotation,disableScreenRotation,
startOtherActivity,
waitBeforeNextAction,
wakeupDevice,
@@ -54,6 +55,8 @@ public class Action
return context.getResources().getString(R.string.actionSetBluetooth);
case setWifiTethering:
return context.getResources().getString(R.string.actionSetWifiTethering);
+ case setBluetoothTethering:
+ return context.getResources().getString(R.string.actionSetBluetoothTethering);
case setUsbTethering:
return context.getResources().getString(R.string.actionSetUsbTethering);
case setDisplayRotation:
@@ -178,6 +181,13 @@ public class Action
else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.actionTurnWifiTetheringOff));
}
+ else if(this.getAction().equals(Action_Enum.setBluetoothTethering))
+ {
+ if(this.getParameter1())
+ returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.actionTurnBluetoothTetheringOn));
+ else
+ returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.actionTurnBluetoothTetheringOff));
+ }
else if(this.getAction().equals(Action_Enum.setDisplayRotation))
{
if(this.getParameter1())
@@ -382,6 +392,9 @@ public class Action
case setWifiTethering:
Actions.setWifiTethering(context, getParameter1(), toggleActionIfPossible);
break;
+ case setBluetoothTethering:
+ Actions.BluetoothTetheringClass.setBluetoothTethering(context, getParameter1(), toggleActionIfPossible);
+ break;
case setDisplayRotation:
Actions.setDisplayRotation(context, getParameter1(), toggleActionIfPossible);
break;
diff --git a/app/src/main/java/com/jens/automation2/Actions.java b/app/src/main/java/com/jens/automation2/Actions.java
index f25a1f61..2437d707 100644
--- a/app/src/main/java/com/jens/automation2/Actions.java
+++ b/app/src/main/java/com/jens/automation2/Actions.java
@@ -321,39 +321,47 @@ public class Actions
{
Miscellaneous.logEvent("i", "Bluetooth Tethering", "Changing Bluetooth Tethering to " + String.valueOf(desiredState), 4);
- boolean state = Actions.isWifiApEnabled(context);
+// boolean state = isTetheringOn(context);
- if (toggleActionIfPossible)
+// if (toggleActionIfPossible)
+// {
+// Miscellaneous.logEvent("i", "Bluetooth Tethering", context.getResources().getString(R.string.toggling), 2);
+// desiredState = !state;
+// }
+
+// if (((state && !desiredState) || (!state && desiredState)))
+// {
+ BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ Class> classBluetoothPan = null;
+ Constructor> BTPanCtor = null;
+ Object BTSrvInstance = null;
+ Method mBTPanConnect = null;
+
+ String sClassName = "android.bluetooth.BluetoothPan";
+ try
{
- Miscellaneous.logEvent("i", "Bluetooth Tethering", context.getResources().getString(R.string.toggling), 2);
- desiredState = !state;
- }
+ classBluetoothPan = Class.forName(sClassName);
+ Constructor> ctor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
- if (((state && !desiredState) || (!state && desiredState)))
- {
- BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- Class> classBluetoothPan = null;
- Constructor> BTPanCtor = null;
- Object BTSrvInstance = null;
- Method mBTPanConnect = null;
+ ctor.setAccessible(true);
+ // Set Tethering ON
- try
+ Class[] paramSet = new Class[1];
+ paramSet[0] = boolean.class;
+
+ synchronized (mutex)
{
- classBluetoothPan = Class.forName("android.bluetooth.BluetoothPan");
- mBTPanConnect = classBluetoothPan.getDeclaredMethod("connect", BluetoothDevice.class);
- BTPanCtor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
- BTPanCtor.setAccessible(true);
- BTSrvInstance = BTPanCtor.newInstance(context, new BTPanServiceListener(context));
- }
- catch (ClassNotFoundException e)
- {
- Miscellaneous.logEvent("e", "Bluetooth Tethering", Log.getStackTraceString(e), 1);
- }
- catch (Exception e)
- {
- Miscellaneous.logEvent("e", "Bluetooth Tethering", Log.getStackTraceString(e), 1);
+ setTetheringOn = classBluetoothPan.getDeclaredMethod("setBluetoothTethering", paramSet);
+ isTetheringOn = classBluetoothPan.getDeclaredMethod("isTetheringOn", null);
+ instance = ctor.newInstance(context, new BTPanServiceListener(context));
}
+ classBluetoothPan = Class.forName("android.bluetooth.BluetoothPan");
+ mBTPanConnect = classBluetoothPan.getDeclaredMethod("connect", BluetoothDevice.class);
+ BTPanCtor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
+ BTPanCtor.setAccessible(true);
+ BTSrvInstance = BTPanCtor.newInstance(context, new BTPanServiceListener(context));
+
Set pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
@@ -372,8 +380,31 @@ public class Actions
}
}
}
+ return true;
}
- return true;
+ catch (NoSuchMethodException e)
+ {
+ Miscellaneous.logEvent("e", "Bluetooth Tethering", Log.getStackTraceString(e), 1);
+ }
+ catch (ClassNotFoundException e)
+ {
+ Miscellaneous.logEvent("e", "Bluetooth Tethering", Log.getStackTraceString(e), 1);
+ }
+ catch(InvocationTargetException e)
+ {
+ /*
+ Exact error message: "Bluetooth binder is null"
+ This means this device doesn't have bluetooth.
+ */
+ Miscellaneous.logEvent("e", "Bluetooth Tethering", "Device probably doesn't have bluetooth. " + Log.getStackTraceString(e), 1);
+ Toast.makeText(context, context.getResources().getString(R.string.deviceDoesNotHaveBluetooth), Toast.LENGTH_SHORT).show();
+ }
+ catch (Exception e)
+ {
+ Miscellaneous.logEvent("e", "Bluetooth Tethering", Log.getStackTraceString(e), 1);
+ }
+
+ return false;
}
public static class BTPanServiceListener implements BluetoothProfile.ServiceListener
diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java
index c69d9e8c..0f6d0d88 100644
--- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java
+++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java
@@ -1361,6 +1361,8 @@ public class ActivityManageRule extends Activity
items.add(new Item(typesLong[i].toString(), R.drawable.router));
else if(types[i].toString().equals(Action_Enum.setWifiTethering.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.router));
+ else if(types[i].toString().equals(Action_Enum.setBluetoothTethering.toString()))
+ items.add(new Item(typesLong[i].toString(), R.drawable.router));
else if(types[i].toString().equals(Action_Enum.setDisplayRotation.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.displayrotation));
else if(types[i].toString().equals(Action_Enum.waitBeforeNextAction.toString()))
@@ -1461,6 +1463,11 @@ public class ActivityManageRule extends Activity
newAction.setAction(Action_Enum.setWifiTethering);
getActionParameter1Dialog(ActivityManageRule.this).show();
}
+ else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setBluetoothTethering.toString()))
+ {
+ newAction.setAction(Action_Enum.setBluetoothTethering);
+ getActionParameter1Dialog(ActivityManageRule.this).show();
+ }
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setDisplayRotation.toString()))
{
newAction.setAction(Action_Enum.setDisplayRotation);
diff --git a/app/src/main/java/com/jens/automation2/ActivityPermissions.java b/app/src/main/java/com/jens/automation2/ActivityPermissions.java
index 76738cbe..90a529fb 100644
--- a/app/src/main/java/com/jens/automation2/ActivityPermissions.java
+++ b/app/src/main/java/com/jens/automation2/ActivityPermissions.java
@@ -531,6 +531,12 @@ public class ActivityPermissions extends Activity
// https://stackoverflow.com/questions/32185628/connectivitymanager-requestnetwork-in-android-6-0
// addToArrayListUnique(Manifest.permission.CHANGE_NETWORK_STATE, requiredPermissions);
break;
+ case setBluetoothTethering:
+ //addToArrayListUnique(Manifest.permission.CHANGE_NETWORK_STATE, requiredPermissions);
+ addToArrayListUnique(Manifest.permission.BLUETOOTH, requiredPermissions);
+ addToArrayListUnique(Manifest.permission.BLUETOOTH_ADMIN, requiredPermissions);
+ addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
+ break;
case setWifi:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
// https://stackoverflow.com/questions/32185628/connectivitymanager-requestnetwork-in-android-6-0
diff --git a/app/src/main/java/com/jens/automation2/XmlFileInterface.java b/app/src/main/java/com/jens/automation2/XmlFileInterface.java
index 303633f3..cf33719b 100644
--- a/app/src/main/java/com/jens/automation2/XmlFileInterface.java
+++ b/app/src/main/java/com/jens/automation2/XmlFileInterface.java
@@ -838,7 +838,6 @@ public class XmlFileInterface
return (triggerCollection);
}
-
private static Trigger readTrigger(XmlPullParser parser) throws IOException, XmlPullParserException
{
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index eabf5800..8e13c599 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -158,6 +158,7 @@
Bluetooth
USB Tethering
Wifi Tethering
+ Bluetooth Tethering
Display rotation
turn Wifi on
turn Wifi off
@@ -169,6 +170,8 @@
turn USB Tethering off
turn Wifi Tethering on
turn Wifi Tethering off
+ turn Bluetooth Tethering on
+ turn Bluetooth Tethering off
turn airplane mode on
turn airplane mode off
enable screen rotation