io.appium.settings 4.2.0 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/apks/settings_apk-debug.apk +0 -0
  2. package/package.json +2 -8
  3. package/app/build.gradle +0 -38
  4. package/app/src/main/AndroidManifest.xml +0 -149
  5. package/app/src/main/java/io/appium/settings/AppiumIME.java +0 -153
  6. package/app/src/main/java/io/appium/settings/ForegroundService.java +0 -70
  7. package/app/src/main/java/io/appium/settings/LocationService.java +0 -215
  8. package/app/src/main/java/io/appium/settings/LocationTracker.java +0 -313
  9. package/app/src/main/java/io/appium/settings/NLService.java +0 -134
  10. package/app/src/main/java/io/appium/settings/Settings.java +0 -260
  11. package/app/src/main/java/io/appium/settings/UnicodeIME.java +0 -187
  12. package/app/src/main/java/io/appium/settings/Unlock.java +0 -75
  13. package/app/src/main/java/io/appium/settings/handlers/AbstractSettingHandler.java +0 -64
  14. package/app/src/main/java/io/appium/settings/handlers/AnimationSettingHandler.java +0 -66
  15. package/app/src/main/java/io/appium/settings/handlers/BluetoothConnectionSettingHandler.java +0 -42
  16. package/app/src/main/java/io/appium/settings/handlers/DataConnectionSettingHandler.java +0 -134
  17. package/app/src/main/java/io/appium/settings/handlers/LocaleSettingHandler.java +0 -86
  18. package/app/src/main/java/io/appium/settings/handlers/WiFiConnectionSettingHandler.java +0 -40
  19. package/app/src/main/java/io/appium/settings/helpers/NotificationHelpers.java +0 -67
  20. package/app/src/main/java/io/appium/settings/helpers/PlayServicesHelpers.java +0 -30
  21. package/app/src/main/java/io/appium/settings/helpers/Utils.java +0 -29
  22. package/app/src/main/java/io/appium/settings/location/FusedLocationProvider.java +0 -99
  23. package/app/src/main/java/io/appium/settings/location/LocationBuilder.java +0 -80
  24. package/app/src/main/java/io/appium/settings/location/LocationManagerProvider.java +0 -97
  25. package/app/src/main/java/io/appium/settings/location/MockLocationProvider.java +0 -31
  26. package/app/src/main/java/io/appium/settings/notifications/StoredNotification.java +0 -103
  27. package/app/src/main/java/io/appium/settings/notifications/StoredNotifications.java +0 -50
  28. package/app/src/main/java/io/appium/settings/receivers/AbstractSettingReceiver.java +0 -62
  29. package/app/src/main/java/io/appium/settings/receivers/AnimationSettingReceiver.java +0 -40
  30. package/app/src/main/java/io/appium/settings/receivers/BluetoothConnectionSettingReceiver.java +0 -49
  31. package/app/src/main/java/io/appium/settings/receivers/ClipboardReceiver.java +0 -91
  32. package/app/src/main/java/io/appium/settings/receivers/DataConnectionSettingReceiver.java +0 -40
  33. package/app/src/main/java/io/appium/settings/receivers/HasAction.java +0 -21
  34. package/app/src/main/java/io/appium/settings/receivers/LocaleSettingReceiver.java +0 -127
  35. package/app/src/main/java/io/appium/settings/receivers/LocationInfoReceiver.java +0 -67
  36. package/app/src/main/java/io/appium/settings/receivers/MediaScannerReceiver.java +0 -91
  37. package/app/src/main/java/io/appium/settings/receivers/NotificationsReceiver.java +0 -100
  38. package/app/src/main/java/io/appium/settings/receivers/SmsReader.java +0 -113
  39. package/app/src/main/java/io/appium/settings/receivers/UnpairBluetoothDevicesReceiver.java +0 -84
  40. package/app/src/main/java/io/appium/settings/receivers/WiFiConnectionSettingReceiver.java +0 -39
  41. package/app/src/main/java/io/appium/settings/recorder/RecorderConstant.java +0 -94
  42. package/app/src/main/java/io/appium/settings/recorder/RecorderService.java +0 -202
  43. package/app/src/main/java/io/appium/settings/recorder/RecorderThread.java +0 -459
  44. package/app/src/main/java/io/appium/settings/recorder/RecorderUtil.java +0 -298
  45. package/app/src/main/res/drawable-hdpi/ic_launcher.png +0 -0
  46. package/app/src/main/res/drawable-ldpi/ic_launcher.png +0 -0
  47. package/app/src/main/res/drawable-mdpi/ic_launcher.png +0 -0
  48. package/app/src/main/res/drawable-xhdpi/ic_launcher.png +0 -0
  49. package/app/src/main/res/drawable-xxhdpi/ic_launcher.png +0 -0
  50. package/app/src/main/res/drawable-xxxhdpi/ic_launcher.png +0 -0
  51. package/app/src/main/res/layout/main.xml +0 -29
  52. package/app/src/main/res/values/dimens.xml +0 -7
  53. package/app/src/main/res/values/strings.xml +0 -9
  54. package/app/src/main/res/xml/method.xml +0 -3
  55. package/build.gradle +0 -17
  56. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  57. package/gradle/wrapper/gradle-wrapper.properties +0 -6
  58. package/gradle.properties +0 -15
  59. package/gradlew +0 -160
  60. package/gradlew.bat +0 -90
  61. package/settings.gradle +0 -1
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "io.appium.settings",
3
- "version": "4.2.0",
3
+ "version": "4.2.1",
4
4
  "description": "App for dealing with Android settings",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -29,13 +29,7 @@
29
29
  ],
30
30
  "files": [
31
31
  "index.js",
32
- "gradle*",
33
- "build.gradle",
34
- "settings.gradle",
35
- "apks/",
36
- "app/build.gradle",
37
- "app/src/",
38
- "gradle/",
32
+ "apks",
39
33
  "!.DS_Store",
40
34
  "NOTICE.txt"
41
35
  ],
package/app/build.gradle DELETED
@@ -1,38 +0,0 @@
1
- apply plugin: 'com.android.application'
2
-
3
- android {
4
- compileSdkVersion 30
5
-
6
- defaultConfig {
7
- minSdkVersion 18
8
- targetSdkVersion 30
9
- versionCode 47
10
- versionName "4.2.0"
11
- applicationId "io.appium.settings"
12
- }
13
-
14
- buildTypes {
15
- release {
16
- minifyEnabled false
17
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
18
- }
19
-
20
- debug {
21
- debuggable true
22
- applicationVariants.all { variant ->
23
- renameAPK(variant)
24
- }
25
- }
26
- }
27
- }
28
-
29
- dependencies {
30
- implementation 'com.google.android.gms:play-services-location:19.0.1'
31
- implementation 'org.apache.commons:commons-lang3:3.12.0'
32
- }
33
-
34
- static def renameAPK(variant) {
35
- variant.outputs.all {
36
- outputFileName = "settings_apk-debug.apk"
37
- }
38
- }
@@ -1,149 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
- xmlns:tools="http://schemas.android.com/tools"
4
- package="io.appium.settings">
5
-
6
- <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
7
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
8
- <uses-permission android:name="android.permission.WAKE_LOCK"/>
9
- <uses-permission android:name="android.permission.INTERNET" />
10
- <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
11
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
12
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
13
- <uses-permission android:name="android.permission.WRITE_SETTINGS"
14
- tools:ignore="ProtectedPermissions" />
15
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
16
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
17
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
18
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
19
- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
20
- <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
21
- tools:ignore="MockLocation,ProtectedPermissions" />
22
- <uses-permission android:name="android.permission.SET_ANIMATION_SCALE"
23
- tools:ignore="ProtectedPermissions" />
24
- <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"
25
- tools:ignore="ProtectedPermissions" />
26
- <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
27
- <uses-permission android:name="android.permission.BLUETOOTH" />
28
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
29
- <uses-permission android:name="android.permission.READ_SMS" />
30
-
31
- <uses-permission android:name="android.permission.RECORD_AUDIO"/>
32
-
33
- <uses-feature android:name="android.hardware.wifi" />
34
-
35
- <application
36
- android:icon="@drawable/ic_launcher"
37
- android:label="@string/app_name"
38
- android:allowBackup="false"
39
- tools:ignore="GoogleAppIndexingWarning">
40
- <activity
41
- android:name=".Settings"
42
- android:excludeFromRecents="true"
43
- android:exported="true"
44
- android:finishOnTaskLaunch="true"
45
- android:label="@string/app_name"
46
- android:launchMode="singleInstance"
47
- android:noHistory="false"
48
- android:stateNotNeeded="true">
49
- <intent-filter>
50
- <action android:name="android.intent.action.MAIN" />
51
- <category android:name="android.intent.category.LAUNCHER" />
52
- </intent-filter>
53
- </activity>
54
-
55
- <activity
56
- android:name=".Unlock"
57
- android:label="Unlock"
58
- android:exported="true"
59
- android:launchMode="singleInstance"
60
- android:finishOnTaskLaunch="true"
61
- android:stateNotNeeded="true"
62
- android:noHistory="true"
63
- android:excludeFromRecents="true">
64
- </activity>
65
-
66
- <service
67
- android:name=".LocationService"
68
- android:exported="true">
69
- </service>
70
-
71
- <service
72
- android:foregroundServiceType="mediaProjection"
73
- android:name=".recorder.RecorderService"
74
- android:exported="true">
75
- </service>
76
-
77
- <service
78
- android:name=".AppiumIME"
79
- android:label="Appium IME"
80
- android:enabled="true"
81
- android:permission="android.permission.BIND_INPUT_METHOD" >
82
- <intent-filter>
83
- <action android:name="android.view.InputMethod" />
84
- </intent-filter>
85
-
86
- <meta-data
87
- android:name="android.view.im"
88
- android:resource="@xml/method" />
89
- </service>
90
-
91
- <service
92
- android:name=".UnicodeIME"
93
- android:label="Unicode IME"
94
- android:enabled="true"
95
- android:permission="android.permission.BIND_INPUT_METHOD" >
96
- <intent-filter>
97
- <action android:name="android.view.InputMethod" />
98
- </intent-filter>
99
-
100
- <meta-data
101
- android:name="android.view.im"
102
- android:resource="@xml/method" />
103
- </service>
104
-
105
- <service
106
- android:label="@string/app_name"
107
- android:name=".NLService"
108
- android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
109
- <intent-filter>
110
- <action android:name="android.service.notification.NotificationListenerService"/>
111
- </intent-filter>
112
- </service>
113
-
114
- <service android:name=".ForegroundService"
115
- android:enabled="true"
116
- android:exported="true" />
117
-
118
- <receiver android:name=".receivers.WiFiConnectionSettingReceiver"
119
- android:exported="true"
120
- tools:ignore="ExportedReceiver" />
121
- <receiver android:name=".receivers.DataConnectionSettingReceiver"
122
- android:exported="true"
123
- tools:ignore="ExportedReceiver" />
124
- <receiver android:name=".receivers.AnimationSettingReceiver"
125
- android:exported="true"
126
- tools:ignore="ExportedReceiver" />
127
- <receiver android:name=".receivers.LocaleSettingReceiver"
128
- android:exported="true"
129
- tools:ignore="ExportedReceiver" />
130
- <receiver android:name=".receivers.ClipboardReceiver"
131
- android:exported="true"
132
- tools:ignore="ExportedReceiver" />
133
- <receiver android:name=".receivers.LocationInfoReceiver"
134
- android:exported="true"
135
- tools:ignore="ExportedReceiver" />
136
- <receiver android:name=".receivers.BluetoothConnectionSettingReceiver"
137
- android:exported="true"
138
- tools:ignore="ExportedReceiver" />
139
- <receiver android:name=".receivers.UnpairBluetoothDevicesReceiver"
140
- android:exported="true"
141
- tools:ignore="ExportedReceiver" />
142
- <receiver android:name=".receivers.SmsReader"
143
- android:exported="true"
144
- tools:ignore="ExportedReceiver" />
145
- <receiver android:name=".receivers.MediaScannerReceiver"
146
- android:exported="true"
147
- tools:ignore="ExportedReceiver" />
148
- </application>
149
- </manifest>
@@ -1,153 +0,0 @@
1
- /*
2
- Copyright 2012-present Appium Committers
3
- <p>
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
- <p>
8
- http://www.apache.org/licenses/LICENSE-2.0
9
- <p>
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
- */
16
-
17
- package io.appium.settings;
18
-
19
- import android.annotation.SuppressLint;
20
- import android.inputmethodservice.InputMethodService;
21
- import android.text.method.MetaKeyKeyListener;
22
- import android.util.Log;
23
- import android.view.KeyEvent;
24
- import android.view.inputmethod.EditorInfo;
25
-
26
- import java.util.HashMap;
27
- import java.util.Map;
28
-
29
- public class AppiumIME extends InputMethodService {
30
- private static final String TAG = AppiumIME.class.getSimpleName();
31
- private static final int MAX_ACTION_NAME_LENGTH = 20;
32
- private static final int ACTION_FLAG_KEY = "/".codePointAt(0);
33
-
34
- private static final Map<String, Integer> ACTION_CODES_MAP = new HashMap<>();
35
- static {
36
- ACTION_CODES_MAP.put("normal", 0);
37
- ACTION_CODES_MAP.put("unspecified", 0);
38
- ACTION_CODES_MAP.put("none", 1);
39
- ACTION_CODES_MAP.put("go", 2);
40
- ACTION_CODES_MAP.put("search", 3);
41
- ACTION_CODES_MAP.put("send", 4);
42
- ACTION_CODES_MAP.put("next", 5);
43
- ACTION_CODES_MAP.put("done", 6);
44
- ACTION_CODES_MAP.put("previous", 7);
45
- }
46
-
47
- private boolean isEnteringActionName = false;
48
- private StringBuilder actionName = new StringBuilder();
49
- private long metaState = 0;
50
-
51
- @Override
52
- public void onStartInput(EditorInfo attribute, boolean restarting) {
53
- Log.i(TAG, "onStartInput");
54
- super.onStartInput(attribute, restarting);
55
-
56
- if (!restarting) {
57
- metaState = 0;
58
- isEnteringActionName = false;
59
- }
60
- actionName = new StringBuilder();
61
- }
62
-
63
- @Override
64
- public void onFinishInput() {
65
- Log.i(TAG, "onFinishInput");
66
- super.onFinishInput();
67
- actionName = new StringBuilder();
68
- }
69
-
70
- @Override
71
- public boolean onEvaluateFullscreenMode() {
72
- return false;
73
- }
74
-
75
- @SuppressLint("MissingSuperCall")
76
- @Override
77
- public boolean onEvaluateInputViewShown() {
78
- return false;
79
- }
80
-
81
- @Override
82
- public boolean onKeyDown(int keyCode, KeyEvent event) {
83
- Log.i(TAG, String.format("onKeyDown (keyCode='%s', event.keyCode='%s', metaState='%s')",
84
- keyCode, event.getKeyCode(), event.getMetaState()));
85
- final int c = getUnicodeChar(keyCode, event);
86
-
87
- if (c == 0) {
88
- return super.onKeyDown(keyCode, event);
89
- }
90
-
91
- if (isEnteringActionName) {
92
- if (c == ACTION_FLAG_KEY || actionName.toString().length() >= MAX_ACTION_NAME_LENGTH) {
93
- unshift();
94
- } else {
95
- appendChar(c);
96
- }
97
- return true;
98
- }
99
-
100
- if (c == ACTION_FLAG_KEY) {
101
- shift();
102
- return true;
103
- }
104
- return super.onKeyDown(keyCode, event);
105
- }
106
-
107
- @Override
108
- public boolean onKeyUp(int keyCode, KeyEvent event) {
109
- Log.i(TAG, String.format("onKeyUp (keyCode='%s', event.keyCode='%s', metaState='%s')",
110
- keyCode, event.getKeyCode(), event.getMetaState()));
111
- metaState = MetaKeyKeyListener.handleKeyUp(metaState, keyCode, event);
112
- return super.onKeyUp(keyCode, event);
113
- }
114
-
115
- private void shift() {
116
- isEnteringActionName = true;
117
- actionName = new StringBuilder();
118
- }
119
-
120
- private void unshift() {
121
- isEnteringActionName = false;
122
- Integer editorAction;
123
- try {
124
- editorAction = Integer.parseInt(actionName.toString());
125
- } catch (Exception e) {
126
- editorAction = ACTION_CODES_MAP.get(actionName.toString().toLowerCase());
127
- }
128
- if (editorAction == null) {
129
- Log.i(TAG, String.format("There is no known action code for '%s'. " +
130
- "Available action names: %s", actionName.toString(), ACTION_CODES_MAP.keySet()));
131
- getCurrentInputConnection().commitText(actionName.toString(), 1);
132
- } else {
133
- Log.i(TAG, String.format("Matched '%s' to editor action code %s", actionName.toString(),
134
- editorAction));
135
- if (!getCurrentInputConnection().performEditorAction(editorAction)) {
136
- Log.w(TAG, String.format("Cannot perform editor action %s on the focused element",
137
- editorAction));
138
- }
139
- }
140
- actionName = new StringBuilder();
141
- }
142
-
143
- private int getUnicodeChar(int keyCode, KeyEvent event) {
144
- metaState = MetaKeyKeyListener.handleKeyDown(metaState, keyCode, event);
145
- int c = event.getUnicodeChar(event.getMetaState());
146
- metaState = MetaKeyKeyListener.adjustMetaAfterKeypress(metaState);
147
- return c;
148
- }
149
-
150
- private void appendChar(int c) {
151
- actionName.append((char) c);
152
- }
153
- }
@@ -1,70 +0,0 @@
1
- /*
2
- Copyright 2012-present Appium Committers
3
- <p>
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
- <p>
8
- http://www.apache.org/licenses/LICENSE-2.0
9
- <p>
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
- */
16
-
17
- package io.appium.settings;
18
-
19
- import android.app.Service;
20
- import android.content.Context;
21
- import android.content.Intent;
22
- import android.os.IBinder;
23
- import android.util.Log;
24
-
25
- import io.appium.settings.helpers.NotificationHelpers;
26
-
27
- public class ForegroundService extends Service {
28
- private static final String TAG = "APPIUM SERVICE";
29
- public static final String ACTION_START = "start";
30
- public static final String ACTION_STOP = "stop";
31
-
32
- @Override
33
- public IBinder onBind(Intent intent) {
34
- return null;
35
- }
36
-
37
- @Override
38
- public int onStartCommand(Intent intent, int flags, int startId) {
39
- if (intent != null && intent.getAction() != null) {
40
- switch (intent.getAction()) {
41
- case ACTION_START:
42
- startForegroundService();
43
- break;
44
- case ACTION_STOP:
45
- stopForegroundService();
46
- break;
47
- }
48
- }
49
- return super.onStartCommand(intent, flags, startId);
50
- }
51
-
52
- private void startForegroundService() {
53
- startForeground(NotificationHelpers.APPIUM_NOTIFICATION_IDENTIFIER,
54
- NotificationHelpers.getNotification(this));
55
- LocationTracker.getInstance().start(this);
56
- }
57
-
58
- private void stopForegroundService() {
59
- LocationTracker.getInstance().stop();
60
- stopForeground(true);
61
- stopSelf();
62
- }
63
-
64
- public static Intent getForegroundServiceIntent(Context context) {
65
- Log.d(TAG, "Initializing the foreground service");
66
- Intent intent = new Intent(context, ForegroundService.class);
67
- intent.setAction(ForegroundService.ACTION_START);
68
- return intent;
69
- }
70
- }
@@ -1,215 +0,0 @@
1
- /*
2
- Copyright 2012-present Appium Committers
3
- <p>
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
- <p>
8
- http://www.apache.org/licenses/LICENSE-2.0
9
- <p>
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
- */
16
-
17
- package io.appium.settings;
18
-
19
- import android.app.Service;
20
- import android.content.Context;
21
- import android.content.Intent;
22
- import android.content.pm.PackageManager;
23
- import android.location.Location;
24
- import android.location.LocationManager;
25
- import android.location.LocationProvider;
26
- import android.os.Build;
27
- import android.os.IBinder;
28
- import android.util.Log;
29
-
30
- import androidx.annotation.Nullable;
31
-
32
- import com.google.android.gms.location.FusedLocationProviderClient;
33
- import com.google.android.gms.location.LocationServices;
34
-
35
- import java.util.LinkedList;
36
- import java.util.List;
37
- import java.util.Timer;
38
- import java.util.TimerTask;
39
-
40
- import io.appium.settings.helpers.NotificationHelpers;
41
- import io.appium.settings.helpers.PlayServicesHelpers;
42
- import io.appium.settings.location.FusedLocationProvider;
43
- import io.appium.settings.location.LocationBuilder;
44
- import io.appium.settings.location.LocationManagerProvider;
45
- import io.appium.settings.location.MockLocationProvider;
46
-
47
- public class LocationService extends Service {
48
- private static final String TAG = "MOCKED LOCATION SERVICE";
49
-
50
- private static final long UPDATE_INTERVAL_MS = 2000L;
51
-
52
- private final List<MockLocationProvider> mockLocationProviders = new LinkedList<>();
53
- private final Timer locationUpdatesTimer = new Timer();
54
- private TimerTask locationUpdateTask;
55
-
56
- @Override
57
- public IBinder onBind(Intent intent) {
58
- return null;
59
- }
60
-
61
- @Override
62
- public void onCreate() {
63
- super.onCreate();
64
- initializeLocationProviders();
65
- enableLocationProviders();
66
- }
67
-
68
- @Override
69
- public int onStartCommand(Intent intent, int flags, int startId) {
70
- for (String p : new String[]{"android.permission.ACCESS_FINE_LOCATION"}) {
71
- if (getApplicationContext().checkCallingOrSelfPermission(p)
72
- != PackageManager.PERMISSION_GRANTED) {
73
- Log.e(TAG, String.format("Cannot mock location due to missing permission '%s'", p));
74
- return START_NOT_STICKY;
75
- }
76
- }
77
-
78
- // https://stackoverflow.com/a/45047542
79
- // https://developer.android.com/about/versions/oreo/android-8.0-changes.html
80
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
81
- finishForegroundSetup();
82
- }
83
-
84
- handleIntent(intent);
85
-
86
- return START_STICKY;
87
- }
88
-
89
- @Override
90
- public void onDestroy() {
91
- Log.i(TAG, "Shutting down MockLocationService");
92
- locationUpdatesTimer.cancel();
93
- disableLocationProviders();
94
- super.onDestroy();
95
- }
96
-
97
- private void handleIntent(Intent intent) {
98
- if (intent == null) {
99
- return;
100
- }
101
- Log.i(TAG, "INTENT " + intent.getExtras());
102
-
103
- scheduleLocationUpdate(intent);
104
- }
105
-
106
- private void enableLocationProviders() {
107
- for (MockLocationProvider mockLocationProvider : mockLocationProviders) {
108
- try {
109
- mockLocationProvider.enable();
110
- } catch (Exception e) {
111
- Log.e(TAG, String.format("Couldn't enable location provider: '%s'",
112
- mockLocationProvider.getProviderName()));
113
- }
114
- }
115
- }
116
-
117
- private void disableLocationProviders() {
118
- for (MockLocationProvider mockLocationProvider : mockLocationProviders) {
119
- try {
120
- mockLocationProvider.disable();
121
- } catch (Exception e) {
122
- Log.e(TAG, String.format("Could not disable location provider: '%s'",
123
- mockLocationProvider.getProviderName()));
124
- }
125
- }
126
- }
127
-
128
- private void initializeLocationProviders() {
129
- LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
130
-
131
- mockLocationProviders.clear();
132
- mockLocationProviders.addAll(createMockProviders(locationManager));
133
- if (PlayServicesHelpers.isAvailable(this)) {
134
- Log.d(TAG, "Adding FusedLocationProvider");
135
- mockLocationProviders.add(createFusedLocationProvider());
136
- }
137
- Log.d(TAG, String.format("Created mock providers: %s", mockLocationProviders.toString()));
138
- }
139
-
140
- private void scheduleLocationUpdate(final Intent intent) {
141
- Log.i(TAG, "Scheduling mock location updates");
142
-
143
- // If we run 'startservice' again we should schedule an update right away to avoid a delay
144
- if (locationUpdateTask != null) {
145
- locationUpdateTask.cancel();
146
- }
147
-
148
- locationUpdateTask = new TimerTask() {
149
- @Override
150
- public void run() {
151
- for (MockLocationProvider mockLocationProvider : mockLocationProviders) {
152
- Location location = LocationBuilder.buildFromIntent(intent, mockLocationProvider.getProviderName());
153
- Log.d(TAG, String.format("Setting location of '%s' to '%s'", mockLocationProvider.getProviderName(), location));
154
- try {
155
- mockLocationProvider.setLocation(location);
156
- } catch (Exception e) {
157
- Log.e(TAG, String.format("Could not set location for '%s'",
158
- mockLocationProvider.getProviderName()), e);
159
- }
160
- }
161
- }
162
- };
163
-
164
- locationUpdatesTimer.schedule(locationUpdateTask, 0, UPDATE_INTERVAL_MS);
165
- }
166
-
167
- private List<MockLocationProvider> createMockProviders(LocationManager locationManager) {
168
- List<String> providers = locationManager.getAllProviders();
169
- List<MockLocationProvider> mockProviders = new LinkedList<>();
170
- for (String providerName : providers) {
171
- // The passive provider is not required to be mocked.
172
- if (providerName.equals(LocationManager.PASSIVE_PROVIDER)) {
173
- continue;
174
- }
175
- MockLocationProvider mockProvider = createLocationManagerMockProvider(locationManager, providerName);
176
- if (mockProvider == null) {
177
- Log.e(TAG, String.format("Could not create mock provider for '%s'", providerName));
178
- continue;
179
- }
180
- mockProviders.add(mockProvider);
181
- }
182
- return mockProviders;
183
- }
184
-
185
- @Nullable
186
- private MockLocationProvider createLocationManagerMockProvider(LocationManager locationManager, String providerName) {
187
- LocationProvider provider = locationManager.getProvider(providerName);
188
- return provider == null ? null : createLocationManagerMockProvider(locationManager, provider);
189
- }
190
-
191
- private MockLocationProvider createLocationManagerMockProvider(LocationManager locationManager, LocationProvider locationProvider) {
192
- return new LocationManagerProvider(locationManager,
193
- locationProvider.getName(),
194
- locationProvider.requiresNetwork(),
195
- locationProvider.requiresSatellite(),
196
- locationProvider.requiresCell(),
197
- locationProvider.hasMonetaryCost(),
198
- locationProvider.supportsAltitude(),
199
- locationProvider.supportsSpeed(),
200
- locationProvider.supportsBearing(),
201
- locationProvider.getPowerRequirement(),
202
- locationProvider.getAccuracy());
203
- }
204
-
205
- private FusedLocationProvider createFusedLocationProvider() {
206
- FusedLocationProviderClient locationProviderClient = LocationServices.getFusedLocationProviderClient(this);
207
- return new FusedLocationProvider(locationProviderClient, this);
208
- }
209
-
210
- private void finishForegroundSetup() {
211
- startForeground(NotificationHelpers.APPIUM_NOTIFICATION_IDENTIFIER,
212
- NotificationHelpers.getNotification(this));
213
- Log.d(TAG, "After start foreground");
214
- }
215
- }