4 |
5 | Auto Typer: Bluetooth Keyboard, will allow you to emulate a Bluetooth keyboard. The app is designed to save you time by saving scripts (strings of text) that can be automatically typed on demand.
6 |
7 | Some examples of useful scripts to save typing time include: passwords, emails, urls, crypto wallet addresses, shell scripts.
8 |
9 | The app operates by leveraging the Bluetooth HID feature available on devices running Android 9 or newer. This functionality enables the Android device to behave like a standard wireless keyboard connected through Bluetooth. As a result, it should be compatible with devices that supports Bluetooth keyboard connections, such as PCs, laptops, or phones.
10 |
11 | ## Screenshots
12 |
13 |
14 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. For more details, visit
12 | # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app's APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Kotlin code style for this project: "official" or "obsolete":
19 | kotlin.code.style=official
20 | # Enables namespacing of each library's R class so that its R class includes only the
21 | # resources declared in the library itself and none from the library's dependencies,
22 | # thereby reducing the size of the R class for that library
23 | android.nonTransitiveRClass=true
--------------------------------------------------------------------------------
/app/schemas/dev.tberghuis.btmacrokb.data.AppDatabase/1.json:
--------------------------------------------------------------------------------
1 | {
2 | "formatVersion": 1,
3 | "database": {
4 | "version": 1,
5 | "identityHash": "14bb66356ac07f4a7a2b886a9927eea2",
6 | "entities": [
7 | {
8 | "tableName": "Macro",
9 | "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `payload` TEXT NOT NULL)",
10 | "fields": [
11 | {
12 | "fieldPath": "id",
13 | "columnName": "id",
14 | "affinity": "INTEGER",
15 | "notNull": true
16 | },
17 | {
18 | "fieldPath": "title",
19 | "columnName": "title",
20 | "affinity": "TEXT",
21 | "notNull": true
22 | },
23 | {
24 | "fieldPath": "payload",
25 | "columnName": "payload",
26 | "affinity": "TEXT",
27 | "notNull": true
28 | }
29 | ],
30 | "primaryKey": {
31 | "autoGenerate": true,
32 | "columnNames": [
33 | "id"
34 | ]
35 | },
36 | "indices": [],
37 | "foreignKeys": []
38 | }
39 | ],
40 | "views": [],
41 | "setupQueries": [
42 | "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
43 | "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '14bb66356ac07f4a7a2b886a9927eea2')"
44 | ]
45 | }
46 | }
--------------------------------------------------------------------------------
/app/schemas/dev.tberghuis.btmacrokb.tmp5.AppDatabase/1.json:
--------------------------------------------------------------------------------
1 | {
2 | "formatVersion": 1,
3 | "database": {
4 | "version": 1,
5 | "identityHash": "14bb66356ac07f4a7a2b886a9927eea2",
6 | "entities": [
7 | {
8 | "tableName": "Macro",
9 | "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `payload` TEXT NOT NULL)",
10 | "fields": [
11 | {
12 | "fieldPath": "id",
13 | "columnName": "id",
14 | "affinity": "INTEGER",
15 | "notNull": true
16 | },
17 | {
18 | "fieldPath": "title",
19 | "columnName": "title",
20 | "affinity": "TEXT",
21 | "notNull": true
22 | },
23 | {
24 | "fieldPath": "payload",
25 | "columnName": "payload",
26 | "affinity": "TEXT",
27 | "notNull": true
28 | }
29 | ],
30 | "primaryKey": {
31 | "autoGenerate": true,
32 | "columnNames": [
33 | "id"
34 | ]
35 | },
36 | "indices": [],
37 | "foreignKeys": []
38 | }
39 | ],
40 | "views": [],
41 | "setupQueries": [
42 | "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
43 | "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '14bb66356ac07f4a7a2b886a9927eea2')"
44 | ]
45 | }
46 | }
--------------------------------------------------------------------------------
/app/src/main/java/dev/tberghuis/btmacrokb/screens/DeepLinkScreen.kt:
--------------------------------------------------------------------------------
1 | package dev.tberghuis.btmacrokb.screens
2 |
3 | import androidx.activity.compose.LocalActivity
4 | import androidx.compose.foundation.layout.Arrangement
5 | import androidx.compose.foundation.layout.Column
6 | import androidx.compose.foundation.layout.fillMaxSize
7 | import androidx.compose.foundation.layout.padding
8 | import androidx.compose.material3.Scaffold
9 | import androidx.compose.material3.Text
10 | import androidx.compose.runtime.Composable
11 | import androidx.compose.runtime.saveable.rememberSaveable
12 | import androidx.compose.ui.Alignment
13 | import androidx.compose.ui.Modifier
14 | import androidx.lifecycle.viewmodel.compose.viewModel
15 |
16 | @Composable
17 | fun DeepLinkScreen(
18 | vm: DeepLinkScreenVm = viewModel()
19 | ) {
20 | val activity = LocalActivity.current
21 | // hack to only run once even if configuration change
22 | rememberSaveable {
23 | activity?.intent?.data?.let {
24 | vm.processDataUri(it)
25 | }
26 | ""
27 | }
28 |
29 | Scaffold() { padding ->
30 | Column(
31 | modifier = Modifier.padding(padding).fillMaxSize(),
32 | verticalArrangement = Arrangement.Center,
33 | horizontalAlignment = Alignment.CenterHorizontally,
34 | ) {
35 | Column {
36 | Text("deeplink: ${vm.uiDeeplink}")
37 | Text("device: ${vm.uiDevice}")
38 | Text("payload: ${vm.uiPayload}")
39 | Text("result: ${vm.uiResult}")
40 | }
41 | }
42 | }
43 | }
--------------------------------------------------------------------------------
/app/src/main/java/dev/tberghuis/btmacrokb/tmp/ktor.kt:
--------------------------------------------------------------------------------
1 | package dev.tberghuis.btmacrokb.tmp
2 | //
3 | //import dev.tberghuis.btmacrokb.service.MyBtService
4 | //import io.ktor.server.application.call
5 | //import io.ktor.server.engine.embeddedServer
6 | //import io.ktor.server.netty.Netty
7 | //import io.ktor.server.response.respondText
8 | //import io.ktor.server.routing.get
9 | //import io.ktor.server.routing.routing
10 | //
11 | //fun runKtorServer(service: MyBtService) {
12 | // embeddedServer(Netty, port = 8080) {
13 | // routing {
14 | // get("/") {
15 | // call.respondText("Hello, world!\n")
16 | // }
17 | //
18 | // get("/run_test") {
19 | //// val s = "abcdefghijklmnopqrstuvwxyz"
20 | //// val s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
21 | //// val s = "Hello with Spaces"
22 | //// val s = "Hello\twith\t\ttabs"
23 | //// val s = "1234567890"
24 | //// val s = "` - ="
25 | //// val s = "[ ] \\"
26 | //// val s = "; ' , . /"
27 | //// val s = "~ ! @ # $ % ^ & * ( ) _ +"
28 | // val s = "{ } | : \" < > ?"
29 | //
30 | //// service.myBtController.getAdapter()
31 | //// service.myBtController.getDevices()
32 | //// val bd = service.myBtController.device!!
33 | //// service.myBtController.getProfileProxy2()
34 | //// service.myBtController.registerApp()
35 | //// service.myBtController.connect()
36 | //// service.myBtController.sendString(bd, s)
37 | // call.respondText("ok\n")
38 | // }
39 | // }
40 | // }.start(wait = true)
41 | //}
--------------------------------------------------------------------------------
/app/src/main/java/dev/tberghuis/btmacrokb/data/PreferencesRepository.kt:
--------------------------------------------------------------------------------
1 | package dev.tberghuis.btmacrokb.data
2 |
3 | import android.content.Context
4 | import androidx.datastore.core.DataStore
5 | import androidx.datastore.preferences.core.Preferences
6 | import androidx.datastore.preferences.core.edit
7 | import androidx.datastore.preferences.core.stringPreferencesKey
8 | import androidx.datastore.preferences.preferencesDataStore
9 | import kotlinx.coroutines.flow.Flow
10 | import kotlinx.coroutines.flow.distinctUntilChanged
11 | import kotlinx.coroutines.flow.map
12 |
13 | //val Context.dataStore: DataStore17 | This privacy policy applies to the Auto Typer: Bluetooth Keyboard app 18 | (hereby referred to as "Application") for mobile devices that was created 19 | by Thomas Berghuis (hereby referred to as "Service Provider") as an Open 20 | Source service. This service is intended for use "AS IS". 21 |
22 |24 | The Application collects information when you download and use it. This 25 | information may include information such as 26 |
27 |39 | The Application does not gather precise information about the location of 40 | your mobile device. 41 |
42 | 67 |69 | The Service Provider may use the information you provided to contact you 70 | from time to time to provide you with important information, required 71 | notices and marketing promotions. 72 |
73 |75 | For a better experience, while using the Application, the Service Provider 76 | may require you to provide us with certain personally identifiable 77 | information. The information that the Service Provider request will be 78 | retained by them and used as described in this privacy policy. 79 |
80 |82 | Only aggregated, anonymized data is periodically transmitted to external 83 | services to aid the Service Provider in improving the Application and 84 | their service. The Service Provider may share your information with third 85 | parties in the ways that are described in this privacy statement. 86 |
87 |90 | Please note that the Application utilizes third-party services that have 91 | their own Privacy Policy about handling data. Below are the links to the 92 | Privacy Policy of the third-party service providers used by the 93 | Application: 94 |
95 |109 | The Service Provider may disclose User Provided and Automatically 110 | Collected Information: 111 |
112 |131 | You can stop all collection of information by the Application easily by 132 | uninstalling it. You may use the standard uninstall processes as may be 133 | available as part of your mobile device or via the mobile application 134 | marketplace or network. 135 |
136 |138 | The Service Provider will retain User Provided data for as long as you use 139 | the Application and for a reasonable time thereafter. If you'd like them 140 | to delete User Provided Data that you have provided via the Application, 141 | please contact them at tberghuisdeveloper@gmail.com and they will respond 142 | in a reasonable time. 143 |
144 |146 | The Service Provider does not use the Application to knowingly solicit 147 | data from or market to children under the age of 13. 148 |
149 |152 | The Application does not address anyone under the age of 13. The Service 153 | Provider does not knowingly collect personally identifiable information 154 | from children under 13 years of age. In the case the Service Provider 155 | discover that a child under 13 has provided personal information, the 156 | Service Provider will immediately delete this from their servers. If you 157 | are a parent or guardian and you are aware that your child has provided 158 | us with personal information, please contact the Service Provider 159 | (tberghuisdeveloper@gmail.com) so that they will be able to take the 160 | necessary actions. 161 |
162 |165 | The Service Provider is concerned about safeguarding the confidentiality 166 | of your information. The Service Provider provides physical, electronic, 167 | and procedural safeguards to protect information the Service Provider 168 | processes and maintains. 169 |
170 |172 | This Privacy Policy may be updated from time to time for any reason. The 173 | Service Provider will notify you of any changes to the Privacy Policy by 174 | updating this page with the new Privacy Policy. You are advised to consult 175 | this Privacy Policy regularly for any changes, as continued use is deemed 176 | approval of all changes. 177 |
178 |This privacy policy is effective as of 2024-10-12
180 |182 | By using the Application, you are consenting to the processing of your 183 | information as set forth in this Privacy Policy now and as amended by us. 184 |
185 |187 | If you have any questions regarding privacy while using the Application, 188 | or have questions about the practices, please contact the Service Provider 189 | via email at tberghuisdeveloper@gmail.com. 190 |
191 |193 | This privacy policy page was generated by 194 | App Privacy Policy Generator 200 |
201 | 202 | --------------------------------------------------------------------------------