diff --git a/.gitmodules b/.gitmodules index 2e7f12732..e225f97e7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "geeksville-androidlib"] path = geeksville-androidlib url = https://github.com/meshtastic/geeksville-androidlib.git +[submodule "design"] + path = design + url = https://github.com/meshtastic/meshtastic-design.git diff --git a/app/build.gradle b/app/build.gradle index 76523230f..ecc0c98b4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,9 +31,12 @@ android { applicationId "com.geeksville.mesh" minSdkVersion 21 // The oldest emulator image I have tried is 22 (though 21 probably works) targetSdkVersion 29 - versionCode 20136 // format is Mmmss (where M is 1+the numeric major number - versionName "1.1.36" + versionCode 20137 // format is Mmmss (where M is 1+the numeric major number + versionName "1.1.37" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + // per https://developer.android.com/studio/write/vector-asset-studio + vectorDrawables.useSupportLibrary = true } buildTypes { release { @@ -165,7 +168,7 @@ dependencies { implementation 'com.google.android.gms:play-services-auth:19.0.0' // Add the Firebase SDK for Crashlytics. - implementation 'com.google.firebase:firebase-crashlytics:17.3.0' + implementation 'com.google.firebase:firebase-crashlytics:17.3.1' // alas implementation bug deep in the bowels when I tried it for my SyncBluetoothDevice class // implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3" @@ -178,7 +181,7 @@ dependencies { implementation('com.journeyapps:zxing-android-embedded:4.1.0') { transitive = false } implementation 'com.google.zxing:core:3.4.1' - def work_version = '2.4.0' + def work_version = '2.5.0' // Work Request - used to delay boot event handling // implementation "androidx.work:work-runtime:$work_version" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8bee48f88..bcdf0ae0b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,9 +75,9 @@ tools:replace="android:icon" android:name="com.geeksville.mesh.MeshUtilApplication" android:allowBackup="true" - android:icon="@mipmap/ic_launcher_new" + android:icon="@mipmap/ic_launcher2" android:label="@string/app_name" - android:roundIcon="@mipmap/ic_launcher_new_round" + android:roundIcon="@mipmap/ic_launcher2_round" android:supportsRtl="true" android:hardwareAccelerated="true" android:theme="@style/AppTheme"> @@ -99,13 +99,13 @@ android:name="com.geeksville.mesh.service.SoftwareUpdateService" android:enabled="true" android:exported="false" - android:permission="android.permission.BIND_JOB_SERVICE"> + android:permission="android.permission.BIND_JOB_SERVICE" /> + android:exported="true" tools:ignore="ExportedActivity"> diff --git a/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl b/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl index b07374ca7..fcb44874a 100644 --- a/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl +++ b/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl @@ -23,7 +23,13 @@ The intent you use to reach the service should look like this: Once you have bound to the service you should register your broadcast receivers per https://developer.android.com/guide/components/broadcasts#context-registered-receivers // com.geeksville.mesh.x broadcast intents, where x is: - // RECEIVED_DATA for data received from other nodes. payload will contain a DataPacket + + // RECEIVED_DATA for data received from other nodes. payload will contain a DataPacket, this action is DEPRECATED (because it sends all received data) + // far better to instead use RECEIVED. + + // RECEIVED. - will **only** deliver packets for the specified port number. If a wellknown portnums.proto name for portnum is known it will be used + // (i.e. com.geeksville.mesh.RECEIVED.TEXT_MESSAGE_APP) else the numeric portnum will be included as a base 10 integer (com.geeksville.mesh.RECEIVED.4403 etc...) + // NODE_CHANGE for new IDs appearing or disappearing // CONNECTION_CHANGED for losing/gaining connection to the packet radio // MESSAGE_STATUS_CHANGED for any message status changes (for sent messages only, other messages come via RECEIVED_DATA. payload will contain a message ID and a MessageStatus) diff --git a/app/src/main/ic_launcher2-playstore.png b/app/src/main/ic_launcher2-playstore.png new file mode 100644 index 000000000..5e8f9939e Binary files /dev/null and b/app/src/main/ic_launcher2-playstore.png differ diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index f34846ff8..ebd378a05 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -569,7 +569,7 @@ class MainActivity : AppCompatActivity(), Logging, val filter = IntentFilter() filter.addAction(MeshService.ACTION_MESH_CONNECTED) filter.addAction(MeshService.ACTION_NODE_CHANGE) - filter.addAction(MeshService.ACTION_RECEIVED_DATA) + filter.addAction(MeshService.actionReceived(Portnums.PortNum.TEXT_MESSAGE_APP_VALUE)) filter.addAction((MeshService.ACTION_MESSAGE_STATUS)) registerReceiver(meshServiceReceiver, filter) receiverRegistered = true; @@ -641,8 +641,7 @@ class MainActivity : AppCompatActivity(), Logging, model.isConnected.value = oldConnection } } - } - else { + } else { // For other connection states, just slam them in model.isConnected.value = connected } @@ -717,18 +716,12 @@ class MainActivity : AppCompatActivity(), Logging, } } - MeshService.ACTION_RECEIVED_DATA -> { - debug("received new data from service") + MeshService.actionReceived(Portnums.PortNum.TEXT_MESSAGE_APP_VALUE) -> { + debug("received new message from service") val payload = intent.getParcelableExtra(EXTRA_PAYLOAD)!! - when (payload.dataType) { - Portnums.PortNum.TEXT_MESSAGE_APP_VALUE -> { - model.messagesState.addMessage(payload) - } - else -> - debug("activity only cares about text messages, ignoring dataType ${payload.dataType}") - } + model.messagesState.addMessage(payload) } MeshService.ACTION_MESSAGE_STATUS -> { diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt index d8ef31baf..c8ba1f98c 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -53,7 +53,20 @@ class MeshService : Service(), Logging { const val NODENUM_BROADCAST = (0xffffffff).toInt() /// Intents broadcast by MeshService + + @Deprecated(message = "Does not filter by port number. For legacy reasons only broadcast for UNKNOWN_APP, switch to ACTION_RECEIVED") const val ACTION_RECEIVED_DATA = "$prefix.RECEIVED_DATA" + + fun actionReceived(portNum: String) = "$prefix.RECEIVED.$portNum" + + /// generate a RECEIVED action filter string that includes either the portnumber as an int, or preferably a symbolic name from portnums.proto + fun actionReceived(portNum: Int): String { + val portType = Portnums.PortNum.forNumber(portNum) + val portStr = portType?.toString() ?: portNum.toString() + + return actionReceived(portStr) + } + const val ACTION_NODE_CHANGE = "$prefix.NODE_CHANGE" const val ACTION_MESH_CONNECTED = "$prefix.MESH_CONNECTED" const val ACTION_MESSAGE_STATUS = "$prefix.MESSAGE_STATUS" diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshServiceBroadcasts.kt b/app/src/main/java/com/geeksville/mesh/service/MeshServiceBroadcasts.kt index eca04d91b..831ab1bd2 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshServiceBroadcasts.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshServiceBroadcasts.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.os.Parcelable import com.geeksville.mesh.DataPacket import com.geeksville.mesh.NodeInfo +import com.geeksville.mesh.Portnums class MeshServiceBroadcasts( private val context: Context, @@ -12,12 +13,17 @@ class MeshServiceBroadcasts( private val getConnectionState: () -> MeshService.ConnectionState ) { /** - * The RECEIVED_OPAQUE: + * Broadcast some received data * Payload will be a DataPacket */ fun broadcastReceivedData(payload: DataPacket) { - val intent = Intent(MeshService.ACTION_RECEIVED_DATA).putExtra(EXTRA_PAYLOAD, payload) - explicitBroadcast(intent) + + explicitBroadcast(Intent(MeshService.actionReceived(payload.dataType)).putExtra(EXTRA_PAYLOAD, payload)) + + // For the time being we ALSO broadcast using old ACTION_RECEIVED_DATA field for any oldschool opaque packets + // newer packets (that have a non zero portnum) are only broadcast using the standard mechanism. + if(payload.dataType == Portnums.PortNum.UNKNOWN_APP_VALUE) + explicitBroadcast(Intent(MeshService.ACTION_RECEIVED_DATA).putExtra(EXTRA_PAYLOAD, payload)) } fun broadcastNodeChange(info: NodeInfo) { diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt b/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt index 70a2b7d12..ddf55a306 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt @@ -73,7 +73,7 @@ class MeshServiceNotifications( val builder = NotificationCompat.Builder(context, channelId).setOngoing(true) .setPriority(NotificationCompat.PRIORITY_MIN) .setCategory(category) - .setSmallIcon(android.R.drawable.stat_sys_data_bluetooth) + .setSmallIcon(R.drawable.app_icon) .setContentTitle(summaryString) // leave this off for now so our notification looks smaller .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setContentIntent(openAppIntent) diff --git a/app/src/main/res/drawable-anydpi/app_icon.xml b/app/src/main/res/drawable-anydpi/app_icon.xml new file mode 100644 index 000000000..3b5436367 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/app_icon.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-hdpi/app_icon.png b/app/src/main/res/drawable-hdpi/app_icon.png new file mode 100644 index 000000000..8f86071ee Binary files /dev/null and b/app/src/main/res/drawable-hdpi/app_icon.png differ diff --git a/app/src/main/res/drawable-mdpi/app_icon.png b/app/src/main/res/drawable-mdpi/app_icon.png new file mode 100644 index 000000000..f432e8db3 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/app_icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/app_icon.png b/app/src/main/res/drawable-xhdpi/app_icon.png new file mode 100644 index 000000000..f295a5a22 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/app_icon.png differ diff --git a/app/src/main/res/drawable-xxhdpi/app_icon.png b/app/src/main/res/drawable-xxhdpi/app_icon.png new file mode 100644 index 000000000..ee1231857 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/app_icon.png differ diff --git a/app/src/main/res/drawable/app_icon2.xml b/app/src/main/res/drawable/app_icon2.xml deleted file mode 100644 index ef8c94b55..000000000 --- a/app/src/main/res/drawable/app_icon2.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_launcher2_background.xml b/app/src/main/res/drawable/ic_launcher2_background.xml new file mode 100644 index 000000000..8bd903402 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher2_background.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher2_foreground.xml b/app/src/main/res/drawable/ic_launcher2_foreground.xml new file mode 100644 index 000000000..c115779cb --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher2_foreground.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_new_background.xml b/app/src/main/res/drawable/ic_launcher_new_background.xml deleted file mode 100644 index ca3826a46..000000000 --- a/app/src/main/res/drawable/ic_launcher_new_background.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_launcher_new_foreground.xml b/app/src/main/res/drawable/ic_launcher_new_foreground.xml deleted file mode 100644 index 5d4c3136d..000000000 --- a/app/src/main/res/drawable/ic_launcher_new_foreground.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 55c6134bc..cf7de3c07 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -37,12 +37,13 @@ android:id="@+id/imageView5" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="16dp" android:contentDescription="@string/application_icon" android:scaleType="center" android:scaleX="1.5" android:scaleY="1.5" - app:srcCompat="@drawable/ic_baseline_settings_input_antenna_24" /> + app:srcCompat="@drawable/app_icon" + tools:layout_editor_absoluteX="16dp" + tools:layout_editor_absoluteY="18dp" /> + android:contentDescription="@string/message_delivery_status"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> @@ -58,7 +62,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" + android:layout_marginBottom="8dp" + android:contentDescription="@string/message_reception_time" android:text="3 minutes ago" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/messageStatusIcon" app:layout_constraintTop_toBottomOf="@id/messageText" /> diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher2.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher2.xml new file mode 100644 index 000000000..b3cebe224 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher2_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher2_round.xml new file mode 100644 index 000000000..b3cebe224 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher2_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_new.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_new.xml deleted file mode 100644 index 4d3ddb1c9..000000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_new.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_new_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_new_round.xml deleted file mode 100644 index 4d3ddb1c9..000000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_new_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher2.png b/app/src/main/res/mipmap-hdpi/ic_launcher2.png new file mode 100644 index 000000000..b64d9280b Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher2.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher2_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher2_round.png new file mode 100644 index 000000000..56c520a9c Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher2_round.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_new.png b/app/src/main/res/mipmap-hdpi/ic_launcher_new.png deleted file mode 100644 index 7775fe6af..000000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_new.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_new_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_new_round.png deleted file mode 100644 index dcb457c57..000000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_new_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher2.png b/app/src/main/res/mipmap-mdpi/ic_launcher2.png new file mode 100644 index 000000000..2b79c00fa Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher2.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher2_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher2_round.png new file mode 100644 index 000000000..85fb0a2e2 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher2_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_new.png b/app/src/main/res/mipmap-mdpi/ic_launcher_new.png deleted file mode 100644 index 24ba1e0e2..000000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_new.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_new_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_new_round.png deleted file mode 100644 index 4ee7a542f..000000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_new_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher2.png b/app/src/main/res/mipmap-xhdpi/ic_launcher2.png new file mode 100644 index 000000000..2de915abc Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher2.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher2_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher2_round.png new file mode 100644 index 000000000..341130c04 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher2_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_new.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_new.png deleted file mode 100644 index 1e8fc236b..000000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_new.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_new_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_new_round.png deleted file mode 100644 index 2e8c86568..000000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_new_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher2.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher2.png new file mode 100644 index 000000000..a4dca3aa8 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher2.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher2_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher2_round.png new file mode 100644 index 000000000..1a1f6ba53 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher2_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_new.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_new.png deleted file mode 100644 index e7d3091d3..000000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_new.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_new_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_new_round.png deleted file mode 100644 index 0cb845ddb..000000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_new_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher2.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher2.png new file mode 100644 index 000000000..6b068589d Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher2.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher2_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher2_round.png new file mode 100644 index 000000000..2daa1eeed Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher2_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_new.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_new.png deleted file mode 100644 index ab174c1cd..000000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_new.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_new_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_new_round.png deleted file mode 100644 index 77abfd253..000000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_new_round.png and /dev/null differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 427e2efb9..3c3b111cb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -80,4 +80,7 @@ Updating firmware, wait up to eight minutes... Update successful Update failed + message reception time + message reception state + Message delivery status diff --git a/build.gradle b/build.gradle index e0bb43c82..5c61f9d69 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.1' + classpath 'com.android.tools.build:gradle:4.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" diff --git a/app/src/main/ic_launcher_new-playstore.png b/deprecated/ic_launcher_new-playstore.png similarity index 100% rename from app/src/main/ic_launcher_new-playstore.png rename to deprecated/ic_launcher_new-playstore.png diff --git a/design b/design new file mode 160000 index 000000000..9f340a534 --- /dev/null +++ b/design @@ -0,0 +1 @@ +Subproject commit 9f340a53463ad38516c372adac80e966ccf7a21a diff --git a/geeksville-androidlib b/geeksville-androidlib index eeeab6556..f3812d848 160000 --- a/geeksville-androidlib +++ b/geeksville-androidlib @@ -1 +1 @@ -Subproject commit eeeab655618ea3e978caa1ed5fdfb9b68a503d38 +Subproject commit f3812d8484c571f62c72d1509a1e02357fda5b8e