[android] Add Full UI pages and functional UDP

-Added functional UDP protocol for communication with arduino with a
linux-compliant protocol.

-Added a settings and main menu pannel

-Expanded Controller UI with further support for shoulder buttons

-Fixed Scaling Issue on Controller Pannel
main
Joaquin 3 years ago
parent 2ae98c8ab1
commit f275cc8f0b
Signed by: puly
GPG Key ID: 9E9299CD96C65EC6
  1. 0
      .idea/.gitignore
  2. 0
      .idea/.name
  3. 0
      .idea/android.iml
  4. 0
      .idea/misc.xml
  5. 0
      .idea/modules.xml
  6. 0
      .idea/vcs.xml
  7. 6
      android/UDPtest000/.idea/kotlinc.xml
  8. 2
      android/UDPtest000/.idea/misc.xml
  9. 40
      android/UDPtest000/app/build.gradle
  10. 18
      android/UDPtest000/app/src/main/AndroidManifest.xml
  11. 271
      android/UDPtest000/app/src/main/java/com/example/udptest000/MainActivity.java
  12. 87
      android/UDPtest000/app/src/main/java/com/example/udptest000/MainScreen.java
  13. 37
      android/UDPtest000/app/src/main/java/com/example/udptest000/SettingsActivity.java
  14. 291
      android/UDPtest000/app/src/main/res/layout-land/activity_main.xml
  15. 179
      android/UDPtest000/app/src/main/res/layout/activity_main.xml
  16. 65
      android/UDPtest000/app/src/main/res/layout/activity_mainscreen.xml
  17. 20
      android/UDPtest000/app/src/main/res/layout/settings_activity.xml
  18. 12
      android/UDPtest000/app/src/main/res/values/arrays.xml
  19. 4
      android/UDPtest000/app/src/main/res/values/strings.xml
  20. 53
      android/UDPtest000/app/src/main/res/xml/root_preferences.xml
  21. 1
      android/UDPtest000/build.gradle

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.7.20" />
</component>
</project>

@ -1,6 +1,6 @@
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="temurin-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

@ -1,5 +1,6 @@
plugins { plugins {
id 'com.android.application' id 'com.android.application'
id 'org.jetbrains.kotlin.android'
} }
android { android {
@ -14,6 +15,9 @@ android {
versionName "1.0" versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
} }
buildTypes { buildTypes {
@ -26,6 +30,20 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
} }
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion '1.3.2'
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
kotlinOptions {
jvmTarget = '1.8'
}
} }
dependencies { dependencies {
@ -33,7 +51,29 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0' implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3' implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'androidx.preference:preference:1.2.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
implementation 'androidx.activity:activity-compose:1.5.1'
implementation platform('androidx.compose:compose-bom:2022.10.00')
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.ui:ui-graphics'
implementation 'androidx.compose.ui:ui-tooling-preview'
implementation 'androidx.compose.material3:material3'
implementation platform('androidx.compose:compose-bom:2022.10.00')
implementation platform('androidx.compose:compose-bom:2022.10.00')
implementation platform('androidx.compose:compose-bom:2022.10.00')
implementation platform('androidx.compose:compose-bom:2022.10.00')
implementation platform('androidx.compose:compose-bom:2022.10.00')
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
debugImplementation 'androidx.compose.ui:ui-tooling'
debugImplementation 'androidx.compose.ui:ui-test-manifest'
} }

@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<application <application
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
@ -14,14 +15,27 @@
android:theme="@style/Theme.UDPtest000" android:theme="@style/Theme.UDPtest000"
tools:targetApi="31"> tools:targetApi="31">
<activity <activity
android:name=".MainActivity" android:name=".MainScreen"
android:exported="true"> android:exported="true"
android:label="@string/title_activity_main_screen"
android:theme="@style/Theme.UDPtest000">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".SettingsActivity"
android:exported="false"
android:label="@string/title_activity_settings" />
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/title_activity_main">
</activity>
</application> </application>
</manifest> </manifest>

@ -6,46 +6,61 @@ import android.os.Bundle;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.FrameLayout;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
Button button; Button select;
Button start;
Button leftb; Button leftb;
Button rightb; Button rightb;
Button upb; Button upb;
Button downb; Button downb;
Button leftb2;
Button rightb2;
Button upb2;
Button downb2;
Button l1b;
Button r1b;
Button l2b;
Button r2b;
//FrameLayout frameLayout; //FrameLayout frameLayout;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
button=findViewById(R.id.button); select=findViewById(R.id.select);
start=findViewById(R.id.start);
leftb=findViewById(R.id.leftb); leftb=findViewById(R.id.leftb);
rightb=findViewById(R.id.rightb); rightb=findViewById(R.id.rightb);
upb=findViewById(R.id.upb); upb=findViewById(R.id.upb);
downb=findViewById(R.id.downb); downb=findViewById(R.id.downb);
leftb2=findViewById(R.id.leftb2);
rightb2=findViewById(R.id.rightb2);
upb2=findViewById(R.id.upb2);
downb2=findViewById(R.id.downb2);
l1b=findViewById(R.id.l1b);
r1b=findViewById(R.id.r1b);
l2b=findViewById(R.id.l2b);
r2b=findViewById(R.id.r2b);
//frameLayout=findViewById(R.id.framelayout); //frameLayout=findViewById(R.id.framelayout);
//frameLayout.addView(new TrackpadView(getBaseContext())); //frameLayout.addView(new TrackpadView(getBaseContext()));
button.setOnClickListener(v -> {
UDP_Client Client = new UDP_Client();
Client.Message = "HW";
Client.Send();
});
leftb.setOnTouchListener(new View.OnTouchListener() { leftb.setOnTouchListener(new View.OnTouchListener() {
@Override @Override
public boolean onTouch(View v, MotionEvent event) { public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client(); UDP_Client Client = new UDP_Client();
switch(event.getAction()) { switch(event.getAction()) {
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|BTTN:1|BUPD:1|;"; Client.Message = "GG:1|BTTN:4|BUPD:1|;";
break; break;
case MotionEvent.ACTION_UP: case MotionEvent.ACTION_UP:
Client.Message = "GG:1|BTTN:1|BUPD:0|;"; Client.Message = "GG:1|BTTN:4|BUPD:0|;";
} }
if(Client.Message!=null) { if(Client.Message!=null) {
Client.Send(); Client.Send();
@ -61,10 +76,10 @@ public class MainActivity extends AppCompatActivity {
UDP_Client Client = new UDP_Client(); UDP_Client Client = new UDP_Client();
switch(event.getAction()) { switch(event.getAction()) {
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|BTTN:2|BUPD:1|;"; Client.Message = "GG:1|BTTN:1|BUPD:1|;";
break; break;
case MotionEvent.ACTION_UP: case MotionEvent.ACTION_UP:
Client.Message = "GG:1|BTTN:2|BUPD:0|;"; Client.Message = "GG:1|BTTN:1|BUPD:0|;";
} }
if(Client.Message!=null) { if(Client.Message!=null) {
Client.Send(); Client.Send();
@ -99,10 +114,10 @@ public class MainActivity extends AppCompatActivity {
UDP_Client Client = new UDP_Client(); UDP_Client Client = new UDP_Client();
switch(event.getAction()) { switch(event.getAction()) {
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|BTTN:4|BUPD:1|;"; Client.Message = "GG:1|BTTN:0|BUPD:1|;";
break; break;
case MotionEvent.ACTION_UP: case MotionEvent.ACTION_UP:
Client.Message = "GG:1|BTTN:1|BUPD:0|;"; Client.Message = "GG:1|BTTN:0|BUPD:0|;";
} }
if(Client.Message!=null) { if(Client.Message!=null) {
Client.Send(); Client.Send();
@ -111,5 +126,231 @@ public class MainActivity extends AppCompatActivity {
return false; return false;
} }
}); });
//DPAD
leftb2.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|DBTN:7|DBUD:1|;";
break;
case MotionEvent.ACTION_UP:
Client.Message = "GG:1|DBTN:7|DBUD:0|;";
}
if(Client.Message!=null) {
Client.Send();
return true;
}
return false;
}
});
rightb2.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|DBTN:3|DBUD:1|;";
break;
case MotionEvent.ACTION_UP:
Client.Message = "GG:1|DBTN:3|DBUD:0|;";
}
if(Client.Message!=null) {
Client.Send();
return true;
}
return false;
}
});
upb2.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|DBTN:1|DBUD:1|;";
break;
case MotionEvent.ACTION_UP:
Client.Message = "GG:1|DBTN:1|DBUD:0|;";
}
if(Client.Message!=null) {
Client.Send();
return true;
}
return false;
}
});
downb2.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|DBTN:5|DBUD:1|;";
break;
case MotionEvent.ACTION_UP:
Client.Message = "GG:1|DBTN:5|DBUD:0|;";
}
if(Client.Message!=null) {
Client.Send();
return true;
}
return false;
}
});
//SHOULDERS
l1b.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|BTTN:6|BUPD:1|;";
break;
case MotionEvent.ACTION_UP:
Client.Message = "GG:1|BTTN:6|BUPD:0|;";
}
if(Client.Message!=null) {
Client.Send();
return true;
}
return false;
}
});
r1b.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|BTTN:7|BUPD:1|;";
break;
case MotionEvent.ACTION_UP:
Client.Message = "GG:1|BTTN:7|BUPD:0|;";
}
if(Client.Message!=null) {
Client.Send();
return true;
}
return false;
}
});
l2b.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|BTTN:8|BUPD:1|;";
break;
case MotionEvent.ACTION_UP:
Client.Message = "GG:1|BTTN:8|BUPD:0|;";
}
if(Client.Message!=null) {
Client.Send();
return true;
}
return false;
}
});
r2b.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|BTTN:9|BUPD:1|;";
break;
case MotionEvent.ACTION_UP:
Client.Message = "GG:1|BTTN:9|BUPD:0|;";
}
if(Client.Message!=null) {
Client.Send();
return true;
}
return false;
}
});
select.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|BTTN:10|BUPD:1|;";
break;
case MotionEvent.ACTION_UP:
Client.Message = "GG:1|BTTN:10|BUPD:0|;";
}
if(Client.Message!=null) {
Client.Send();
return true;
}
return false;
}
});
start.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
UDP_Client Client = new UDP_Client();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
Client.Message = "GG:1|BTTN:11|BUPD:1|;";
break;
case MotionEvent.ACTION_UP:
Client.Message = "GG:1|BTTN:11|BUPD:0|;";
}
if(Client.Message!=null) {
Client.Send();
return true;
}
return false;
}
});
} }
} }

@ -0,0 +1,87 @@
package com.example.udptest000;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceManager;
import java.util.Random;
public class MainScreen extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mainscreen);
Button startbutt = findViewById(R.id.startbutt);
Button settbutt = findViewById(R.id.settbutt);
Button sendbutt = findViewById(R.id.sendbutt);
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
String ip = pref.getString("ip", "192.168.4.1");
String port = pref.getString("port", "9696");
boolean isHidden = pref.getBoolean("isHidden", false);
String ssid = pref.getString("ssid", "ggwifi");
String pass = pref.getString("pass", "password");
int adminToken = Integer.parseInt(pref.getString("admintoken", "1234"));
startbutt.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Intent switchActivityIntent = new Intent(MainScreen.this, MainActivity.class);
startActivity(switchActivityIntent);
return true;
}
});
settbutt.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Intent switchActivityIntent = new Intent(MainScreen.this, SettingsActivity.class);
startActivity(switchActivityIntent);
return true;
}
});
sendbutt.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
UDP_Client client = new UDP_Client();
client.Message = "GG:1|PREF:" + String.valueOf(adminToken) + "|LCIP:" + ip + "|;";
client.Send();
client.Message = "GG:1|PREF:" + String.valueOf(adminToken) + "|PORT:" + port + "|;";
client.Send();
client.Message = "GG:1|PREF:" + String.valueOf(adminToken) + "|HIDD:" + (isHidden?"1":"0") + "|;";
client.Send();
client.Message = "GG:1|PREF:" + String.valueOf(adminToken) + "|SSID:" + ssid + "|;";
client.Send();
client.Message = "GG:1|PREF:" + String.valueOf(adminToken) + "|PASS:" + pass + "|;";
client.Send();
Random rnd = new Random(System.currentTimeMillis());
int newtok = rnd.nextInt(100000);
client.Message = "GG:1|PREF:" + String.valueOf(adminToken) + "|ATOK:" + String.valueOf(newtok) + "|;";
client.Send();
pref.edit().putString("admintoken", String.valueOf(newtok)).apply();
Log.d("TEST ", String.valueOf(newtok));
return true;
}
});
}
}

@ -0,0 +1,37 @@
package com.example.udptest000;
import android.os.Bundle;
import android.widget.EditText;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.EditTextPreference;
import androidx.preference.PreferenceFragmentCompat;
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
if (savedInstanceState == null) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
.commit();
}
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
}
}
}

@ -0,0 +1,291 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/r2b"
android:layout_width="0dp"
android:layout_height="0dp"
android:text="R2"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline2"
app:layout_constraintEnd_toStartOf="@+id/guideline12"
app:layout_constraintStart_toStartOf="@+id/guideline11"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/r1b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="R1"
android:textSize="24sp"
app:layout_constraintEnd_toStartOf="@+id/guideline17"
app:layout_constraintStart_toStartOf="@+id/guideline16"
app:layout_constraintTop_toBottomOf="@+id/r2b" />
<Button
android:id="@+id/start"
android:layout_width="50dp"
android:layout_height="25dp"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="Start"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/guideline7"
app:layout_constraintEnd_toStartOf="@+id/guideline10"
app:layout_constraintTop_toTopOf="@+id/guideline6" />
<Button
android:id="@+id/leftb2"
android:layout_width="0dp"
android:layout_height="0dp"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="←"
android:textSize="34sp"
app:cornerRadius="0dp"
app:layout_constraintBottom_toTopOf="@+id/guideline14"
app:layout_constraintEnd_toStartOf="@+id/guideline4"
app:layout_constraintStart_toStartOf="@+id/guideline5"
app:layout_constraintTop_toTopOf="@+id/guideline13" />
<Button
android:id="@+id/downb2"
android:layout_width="0dp"
android:layout_height="0dp"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="↓"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textSize="34sp"
app:cornerRadius="0dp"
app:layout_constraintBottom_toTopOf="@+id/guideline7"
app:layout_constraintEnd_toStartOf="@+id/guideline3"
app:layout_constraintStart_toStartOf="@+id/guideline4"
app:layout_constraintTop_toTopOf="@+id/guideline14" />
<Button
android:id="@+id/upb2"
android:layout_width="0dp"
android:layout_height="0dp"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="↑"
android:textSize="34sp"
app:cornerRadius="0dp"
app:layout_constraintBottom_toTopOf="@+id/guideline13"
app:layout_constraintEnd_toStartOf="@+id/guideline3"
app:layout_constraintStart_toStartOf="@+id/guideline4"
app:layout_constraintTop_toTopOf="@+id/guideline6" />
<Button
android:id="@+id/rightb2"
android:layout_width="0dp"
android:layout_height="0dp"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="→"
android:textSize="34sp"
app:cornerRadius="0dp"
app:layout_constraintBottom_toTopOf="@+id/guideline14"
app:layout_constraintEnd_toStartOf="@+id/guideline8"
app:layout_constraintStart_toStartOf="@+id/guideline3"
app:layout_constraintTop_toTopOf="@+id/guideline13" />
<Button
android:id="@+id/leftb"
android:layout_width="0dp"
android:layout_height="0dp"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="X"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline14"
app:layout_constraintEnd_toStartOf="@+id/guideline16"
app:layout_constraintStart_toStartOf="@+id/guideline11"
app:layout_constraintTop_toTopOf="@+id/guideline13" />
<Button
android:id="@+id/upb"
android:layout_width="0dp"
android:layout_height="0dp"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="Y"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline13"
app:layout_constraintEnd_toStartOf="@+id/guideline17"
app:layout_constraintStart_toStartOf="@+id/guideline16"
app:layout_constraintTop_toTopOf="@+id/guideline6" />
<Button
android:id="@+id/select"
android:layout_width="50dp"
android:layout_height="25dp"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="Start"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/guideline7"
app:layout_constraintStart_toStartOf="@+id/guideline9"
app:layout_constraintTop_toTopOf="@+id/guideline6" />
<Button
android:id="@+id/downb"
android:layout_width="0dp"
android:layout_height="0dp"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="A"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline7"
app:layout_constraintEnd_toStartOf="@+id/guideline17"
app:layout_constraintStart_toStartOf="@+id/guideline16"
app:layout_constraintTop_toTopOf="@+id/guideline14" />
<Button
android:id="@+id/rightb"
android:layout_width="0dp"
android:layout_height="0dp"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="B"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline14"
app:layout_constraintEnd_toStartOf="@+id/guideline12"
app:layout_constraintStart_toStartOf="@+id/guideline17"
app:layout_constraintTop_toTopOf="@+id/guideline13" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.045143638" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.38" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.93" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.3515732" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.4" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.6" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.6497948" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.96" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.18" />
<Button
android:id="@+id/l2b"
android:layout_width="0dp"
android:layout_height="0dp"
android:text="L2"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline2"
app:layout_constraintEnd_toStartOf="@+id/guideline8"
app:layout_constraintHorizontal_bias="0.455"
app:layout_constraintStart_toStartOf="@+id/guideline5"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/l1b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="L1"
android:textSize="24sp"
app:layout_constraintEnd_toStartOf="@+id/guideline3"
app:layout_constraintStart_toStartOf="@+id/guideline4"
app:layout_constraintTop_toTopOf="@+id/guideline2" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.25" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.15" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline13"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.56" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline14"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.75" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline16"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.75" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline17"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.85499316" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -7,121 +7,159 @@
tools:context=".MainActivity"> tools:context=".MainActivity">
<Button <Button
android:id="@+id/button2" android:id="@+id/r2b"
android:layout_width="0dp"
android:layout_height="0dp"
android:text="R2"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline2"
app:layout_constraintEnd_toStartOf="@+id/guideline12"
app:layout_constraintStart_toStartOf="@+id/guideline11"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/r1b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="R1"
android:textSize="24sp"
app:layout_constraintEnd_toStartOf="@+id/guideline17"
app:layout_constraintStart_toStartOf="@+id/guideline16"
app:layout_constraintTop_toBottomOf="@+id/r2b" />
<Button
android:id="@+id/start"
android:layout_width="50dp" android:layout_width="50dp"
android:layout_height="25dp" android:layout_height="25dp"
android:insetTop="0dp" android:insetTop="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
android:text="Start" android:text="Start"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/guideline7" app:layout_constraintBottom_toTopOf="@+id/guideline7"
app:layout_constraintEnd_toStartOf="@+id/guideline10" app:layout_constraintEnd_toStartOf="@+id/guideline10"
app:layout_constraintTop_toTopOf="@+id/guideline6" /> app:layout_constraintTop_toTopOf="@+id/guideline6" />
<Button <Button
android:id="@+id/leftb2" android:id="@+id/leftb2"
android:layout_width="75dp" android:layout_width="0dp"
android:layout_height="75dp" android:layout_height="0dp"
android:insetTop="0dp" android:insetTop="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
android:text="←" android:text="←"
android:textSize="34sp"
app:cornerRadius="0dp" app:cornerRadius="0dp"
app:layout_constraintBottom_toTopOf="@+id/guideline7" app:layout_constraintBottom_toTopOf="@+id/guideline14"
app:layout_constraintEnd_toStartOf="@+id/guideline4"
app:layout_constraintStart_toStartOf="@+id/guideline5" app:layout_constraintStart_toStartOf="@+id/guideline5"
app:layout_constraintTop_toTopOf="@+id/guideline6" /> app:layout_constraintTop_toTopOf="@+id/guideline13" />
<Button <Button
android:id="@+id/downb2" android:id="@+id/downb2"
android:layout_width="75dp" android:layout_width="0dp"
android:layout_height="75dp" android:layout_height="0dp"
android:insetTop="0dp" android:insetTop="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
android:text="↓" android:text="↓"
android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textSize="34sp"
app:cornerRadius="0dp" app:cornerRadius="0dp"
app:layout_constraintBottom_toTopOf="@+id/guideline7" app:layout_constraintBottom_toTopOf="@+id/guideline7"
app:layout_constraintEnd_toStartOf="@+id/rightb2" app:layout_constraintEnd_toStartOf="@+id/guideline3"
app:layout_constraintStart_toEndOf="@+id/leftb2" /> app:layout_constraintStart_toStartOf="@+id/guideline4"
app:layout_constraintTop_toTopOf="@+id/guideline14" />
<Button <Button
android:id="@+id/upb2" android:id="@+id/upb2"
android:layout_width="75dp" android:layout_width="0dp"
android:layout_height="75dp" android:layout_height="0dp"
android:insetTop="0dp" android:insetTop="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
android:text="↑" android:text="↑"
android:textSize="34sp"
app:cornerRadius="0dp" app:cornerRadius="0dp"
app:layout_constraintEnd_toStartOf="@+id/rightb2" app:layout_constraintBottom_toTopOf="@+id/guideline13"
app:layout_constraintStart_toEndOf="@+id/leftb2" app:layout_constraintEnd_toStartOf="@+id/guideline3"
app:layout_constraintStart_toStartOf="@+id/guideline4"
app:layout_constraintTop_toTopOf="@+id/guideline6" /> app:layout_constraintTop_toTopOf="@+id/guideline6" />
<Button <Button
android:id="@+id/rightb2" android:id="@+id/rightb2"
android:layout_width="75dp" android:layout_width="0dp"
android:layout_height="75dp" android:layout_height="0dp"
android:insetTop="0dp" android:insetTop="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
android:text="→" android:text="→"
android:textSize="34sp"
app:cornerRadius="0dp" app:cornerRadius="0dp"
app:layout_constraintBottom_toTopOf="@+id/guideline7" app:layout_constraintBottom_toTopOf="@+id/guideline14"
app:layout_constraintEnd_toStartOf="@+id/guideline8" app:layout_constraintEnd_toStartOf="@+id/guideline8"
app:layout_constraintTop_toTopOf="@+id/guideline6" /> app:layout_constraintStart_toStartOf="@+id/guideline3"
app:layout_constraintTop_toTopOf="@+id/guideline13" />
<Button <Button
android:id="@+id/leftb" android:id="@+id/leftb"
android:layout_width="75dp" android:layout_width="0dp"
android:layout_height="75dp" android:layout_height="0dp"
android:insetTop="0dp" android:insetTop="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
android:text="X" android:text="X"
app:layout_constraintBottom_toTopOf="@+id/guideline7" android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline14"
app:layout_constraintEnd_toStartOf="@+id/guideline16"
app:layout_constraintStart_toStartOf="@+id/guideline11" app:layout_constraintStart_toStartOf="@+id/guideline11"
app:layout_constraintTop_toTopOf="@+id/guideline6" /> app:layout_constraintTop_toTopOf="@+id/guideline13" />
<Button <Button
android:id="@+id/upb" android:id="@+id/upb"
android:layout_width="75dp" android:layout_width="0dp"
android:layout_height="75dp" android:layout_height="0dp"
android:insetTop="0dp" android:insetTop="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
android:text="Y" android:text="Y"
app:layout_constraintEnd_toStartOf="@+id/guideline12" android:textSize="24sp"
app:layout_constraintStart_toStartOf="@+id/guideline11" app:layout_constraintBottom_toTopOf="@+id/guideline13"
app:layout_constraintEnd_toStartOf="@+id/guideline17"
app:layout_constraintStart_toStartOf="@+id/guideline16"
app:layout_constraintTop_toTopOf="@+id/guideline6" /> app:layout_constraintTop_toTopOf="@+id/guideline6" />
<Button <Button
android:id="@+id/button" android:id="@+id/select"
android:layout_width="50dp" android:layout_width="50dp"
android:layout_height="25dp" android:layout_height="25dp"
android:insetTop="0dp" android:insetTop="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
android:text="Start" android:text="Start"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/guideline7" app:layout_constraintBottom_toTopOf="@+id/guideline7"
app:layout_constraintStart_toStartOf="@+id/guideline9" app:layout_constraintStart_toStartOf="@+id/guideline9"
app:layout_constraintTop_toTopOf="@+id/guideline6" /> app:layout_constraintTop_toTopOf="@+id/guideline6" />
<Button <Button
android:id="@+id/downb" android:id="@+id/downb"
android:layout_width="75dp" android:layout_width="0dp"
android:layout_height="75dp" android:layout_height="0dp"
android:insetTop="0dp" android:insetTop="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
android:text="A" android:text="A"
android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline7" app:layout_constraintBottom_toTopOf="@+id/guideline7"
app:layout_constraintEnd_toStartOf="@+id/guideline12" app:layout_constraintEnd_toStartOf="@+id/guideline17"
app:layout_constraintStart_toStartOf="@+id/guideline11" /> app:layout_constraintStart_toStartOf="@+id/guideline16"
app:layout_constraintTop_toTopOf="@+id/guideline14" />
<Button <Button
android:id="@+id/rightb" android:id="@+id/rightb"
android:layout_width="75dp" android:layout_width="0dp"
android:layout_height="75dp" android:layout_height="0dp"
android:insetTop="0dp" android:insetTop="0dp"
android:insetBottom="0dp" android:insetBottom="0dp"
android:text="B" android:text="B"
app:layout_constraintBottom_toTopOf="@+id/guideline7" android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline14"
app:layout_constraintEnd_toStartOf="@+id/guideline12" app:layout_constraintEnd_toStartOf="@+id/guideline12"
app:layout_constraintTop_toTopOf="@+id/guideline6" app:layout_constraintStart_toStartOf="@+id/guideline17"
app:layout_constraintVertical_bias="0.503" /> app:layout_constraintTop_toTopOf="@+id/guideline13" />
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline5" android:id="@+id/guideline5"
@ -179,4 +217,75 @@
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintGuide_percent="0.96" /> app:layout_constraintGuide_percent="0.96" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.18" />
<Button
android:id="@+id/l2b"
android:layout_width="0dp"
android:layout_height="0dp"
android:text="L2"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline2"
app:layout_constraintEnd_toStartOf="@+id/guideline8"
app:layout_constraintHorizontal_bias="0.455"
app:layout_constraintStart_toStartOf="@+id/guideline5"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/l1b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="L1"
android:textSize="24sp"
app:layout_constraintEnd_toStartOf="@+id/guideline3"
app:layout_constraintStart_toStartOf="@+id/guideline4"
app:layout_constraintTop_toTopOf="@+id/guideline2" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.25" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.15" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline13"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.56" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline14"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.75" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline16"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.75" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline17"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.85499316" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/startbutt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start"
app:layout_constraintBottom_toTopOf="@+id/guideline19"
app:layout_constraintEnd_toStartOf="@+id/guideline18"
app:layout_constraintStart_toStartOf="@+id/guideline15" />
<Button
android:id="@+id/settbutt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="settings"
app:layout_constraintBottom_toTopOf="@+id/guideline20"
app:layout_constraintEnd_toStartOf="@+id/guideline18"
app:layout_constraintHorizontal_bias="0.478"
app:layout_constraintStart_toStartOf="@+id/guideline15"
app:layout_constraintTop_toTopOf="@+id/guideline19" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline15"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.35" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline18"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.65" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline19"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.65" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.9" />
<Button
android:id="@+id/sendbutt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Config"
app:layout_constraintBottom_toTopOf="@+id/guideline20"
app:layout_constraintEnd_toStartOf="@+id/guideline18"
app:layout_constraintStart_toStartOf="@+id/guideline15" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,20 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/settings"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
</FrameLayout>
</LinearLayout>

@ -0,0 +1,12 @@
<resources>
<!-- Reply Preference -->
<string-array name="reply_entries">
<item>Reply</item>
<item>Reply to all</item>
</string-array>
<string-array name="reply_values">
<item>reply</item>
<item>reply_all</item>
</string-array>
</resources>

@ -1,3 +1,7 @@
<resources> <resources>
<string name="app_name">UDPtest000</string> <string name="app_name">UDPtest000</string>
<string name="title_activity_settings">SettingsActivity</string>
<string name="title_activity_main">MainActivity</string>
<string name="title_activity_main_screen">MainScreen</string>
<string name="title_activity_main2">MainActivity2</string>
</resources> </resources>

@ -0,0 +1,53 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory app:title="Network">
<EditTextPreference
app:defaultValue="192.168.4.1"
app:key="ip"
app:title="IP address of microcontroller"
app:useSimpleSummaryProvider="true" />
</PreferenceCategory>
<EditTextPreference
android:defaultValue="9696"
android:key="port"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Port number"
app:summary="Port"
app:useSimpleSummaryProvider="true" />
<SwitchPreference
android:defaultValue="false"
android:key="isHidden"
android:title="Hidden SSID?" />
<PreferenceCategory android:title="WIFI setup">
</PreferenceCategory>
<EditTextPreference
android:defaultValue="ggwifi"
android:key="ssid"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Set SSID"
app:useSimpleSummaryProvider="false" />
<EditTextPreference
android:defaultValue="password"
android:key="pass"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Set password"
app:useSimpleSummaryProvider="false" />
<PreferenceCategory android:title="Advanced">
</PreferenceCategory>
<EditTextPreference
android:defaultValue="1234"
android:key="admintoken"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Admin token"
app:summary="HIDDEN" />
</PreferenceScreen>

@ -2,4 +2,5 @@
plugins { plugins {
id 'com.android.application' version '8.0.2' apply false id 'com.android.application' version '8.0.2' apply false
id 'com.android.library' version '8.0.2' apply false id 'com.android.library' version '8.0.2' apply false
id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
} }
Loading…
Cancel
Save