io.appium.settings 4.2.0 → 4.2.2
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.
- package/apks/settings_apk-debug.apk +0 -0
- package/package.json +2 -8
- package/app/build.gradle +0 -38
- package/app/src/main/AndroidManifest.xml +0 -149
- package/app/src/main/java/io/appium/settings/AppiumIME.java +0 -153
- package/app/src/main/java/io/appium/settings/ForegroundService.java +0 -70
- package/app/src/main/java/io/appium/settings/LocationService.java +0 -215
- package/app/src/main/java/io/appium/settings/LocationTracker.java +0 -313
- package/app/src/main/java/io/appium/settings/NLService.java +0 -134
- package/app/src/main/java/io/appium/settings/Settings.java +0 -260
- package/app/src/main/java/io/appium/settings/UnicodeIME.java +0 -187
- package/app/src/main/java/io/appium/settings/Unlock.java +0 -75
- package/app/src/main/java/io/appium/settings/handlers/AbstractSettingHandler.java +0 -64
- package/app/src/main/java/io/appium/settings/handlers/AnimationSettingHandler.java +0 -66
- package/app/src/main/java/io/appium/settings/handlers/BluetoothConnectionSettingHandler.java +0 -42
- package/app/src/main/java/io/appium/settings/handlers/DataConnectionSettingHandler.java +0 -134
- package/app/src/main/java/io/appium/settings/handlers/LocaleSettingHandler.java +0 -86
- package/app/src/main/java/io/appium/settings/handlers/WiFiConnectionSettingHandler.java +0 -40
- package/app/src/main/java/io/appium/settings/helpers/NotificationHelpers.java +0 -67
- package/app/src/main/java/io/appium/settings/helpers/PlayServicesHelpers.java +0 -30
- package/app/src/main/java/io/appium/settings/helpers/Utils.java +0 -29
- package/app/src/main/java/io/appium/settings/location/FusedLocationProvider.java +0 -99
- package/app/src/main/java/io/appium/settings/location/LocationBuilder.java +0 -80
- package/app/src/main/java/io/appium/settings/location/LocationManagerProvider.java +0 -97
- package/app/src/main/java/io/appium/settings/location/MockLocationProvider.java +0 -31
- package/app/src/main/java/io/appium/settings/notifications/StoredNotification.java +0 -103
- package/app/src/main/java/io/appium/settings/notifications/StoredNotifications.java +0 -50
- package/app/src/main/java/io/appium/settings/receivers/AbstractSettingReceiver.java +0 -62
- package/app/src/main/java/io/appium/settings/receivers/AnimationSettingReceiver.java +0 -40
- package/app/src/main/java/io/appium/settings/receivers/BluetoothConnectionSettingReceiver.java +0 -49
- package/app/src/main/java/io/appium/settings/receivers/ClipboardReceiver.java +0 -91
- package/app/src/main/java/io/appium/settings/receivers/DataConnectionSettingReceiver.java +0 -40
- package/app/src/main/java/io/appium/settings/receivers/HasAction.java +0 -21
- package/app/src/main/java/io/appium/settings/receivers/LocaleSettingReceiver.java +0 -127
- package/app/src/main/java/io/appium/settings/receivers/LocationInfoReceiver.java +0 -67
- package/app/src/main/java/io/appium/settings/receivers/MediaScannerReceiver.java +0 -91
- package/app/src/main/java/io/appium/settings/receivers/NotificationsReceiver.java +0 -100
- package/app/src/main/java/io/appium/settings/receivers/SmsReader.java +0 -113
- package/app/src/main/java/io/appium/settings/receivers/UnpairBluetoothDevicesReceiver.java +0 -84
- package/app/src/main/java/io/appium/settings/receivers/WiFiConnectionSettingReceiver.java +0 -39
- package/app/src/main/java/io/appium/settings/recorder/RecorderConstant.java +0 -94
- package/app/src/main/java/io/appium/settings/recorder/RecorderService.java +0 -202
- package/app/src/main/java/io/appium/settings/recorder/RecorderThread.java +0 -459
- package/app/src/main/java/io/appium/settings/recorder/RecorderUtil.java +0 -298
- package/app/src/main/res/drawable-hdpi/ic_launcher.png +0 -0
- package/app/src/main/res/drawable-ldpi/ic_launcher.png +0 -0
- package/app/src/main/res/drawable-mdpi/ic_launcher.png +0 -0
- package/app/src/main/res/drawable-xhdpi/ic_launcher.png +0 -0
- package/app/src/main/res/drawable-xxhdpi/ic_launcher.png +0 -0
- package/app/src/main/res/drawable-xxxhdpi/ic_launcher.png +0 -0
- package/app/src/main/res/layout/main.xml +0 -29
- package/app/src/main/res/values/dimens.xml +0 -7
- package/app/src/main/res/values/strings.xml +0 -9
- package/app/src/main/res/xml/method.xml +0 -3
- package/build.gradle +0 -17
- package/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/gradle/wrapper/gradle-wrapper.properties +0 -6
- package/gradle.properties +0 -15
- package/gradlew +0 -160
- package/gradlew.bat +0 -90
- 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.
|
|
3
|
+
"version": "4.2.2",
|
|
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
|
-
"
|
|
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
|
-
}
|