diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 45126ce3..c5e7e483 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -13,10 +13,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: set up JDK 11 + - name: set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'temurin' cache: gradle diff --git a/README.md b/README.md new file mode 100644 index 00000000..2b594fc1 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# Activity #2 Homework + +Создайте в модуле **sender** класс **SenderActivity**. Добавьте в него три кнопки: **“To Google Maps”**, **“Send Email”** и **“Open Receiver”**. Добавьте пустые обработчики нажатий на эти кнопки. + +1. По клику на кнопку **“To Google Maps”**, используя явный `Intent` вызовите `Activity` приложения Google Maps. После того как Google Maps поймает ваш Intent, в нем должны отобразиться ближайшие к текущей геолокации места по тэгу “*Рестораны”* + + + +2. По клику на кнопку **“Send Email”** отправьте неявный `Intent` в метод `startActivity()` Этот `Intent` должны уметь обработать любые почтовые клиенты(если они реализовали `intent-filter` согласно контракту). + В качестве адресата используйте ящик *android@otus.ru*, тему и содержание письма придумайте сами. + + + +3. По клику на кнопку **“Open Receiver”** отправьте неявный `Intent` со следующими параметрами: + + - `action = Action.SEND` + - `type = “text/plain”` + - `category = Category.DEFAULT` + + В качестве extras отправьте три объекта String. В качестве значений extras используйте любой набор данных из файла *payload.txt*, который лежит в корне проекта **sender**. + + В модуле **receiver** зарегистрируйте `intent-filter`, таким образом, чтобы он поймал отправленный выше `Intent` и открыл **ReceiverActivity**. Полученные из `Intent` extras отобразите в соответсвующих полях: + + - title → `titleTextView` + - year → `yearTextView` + - description → `descriptionTextView` + - В зависимости от названия фильма отобразите картинку которая лежит в ресурсах(*res/drawable*) в `posterImageView` + +> 💡 Чтобы достать ресурс, используйте метод [Context.getDrawable()](https://developer.android.com/reference/android/content/Context#getDrawable(int)), а чтобы поменять картинку в ImageView используйте метод [setImageDrawable()](https://developer.android.com/reference/android/widget/ImageView#setImageDrawable(android.graphics.drawable.Drawable)) + + + +4. Оба приложения установлены + ./gradlew :sender:installDebug + ./gradlew :receiver:installDebug \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml deleted file mode 100644 index 811aafa1..00000000 --- a/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml deleted file mode 100644 index 08ea3c61..00000000 --- a/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Activities - \ No newline at end of file diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml deleted file mode 100644 index fa0f996d..00000000 --- a/app/src/main/res/xml/backup_rules.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml deleted file mode 100644 index 9ee9997b..00000000 --- a/app/src/main/res/xml/data_extraction_rules.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/art/Untitled 1.png b/art/Untitled 1.png new file mode 100644 index 00000000..1aaa83a5 Binary files /dev/null and b/art/Untitled 1.png differ diff --git a/art/Untitled 2.png b/art/Untitled 2.png new file mode 100644 index 00000000..73978454 Binary files /dev/null and b/art/Untitled 2.png differ diff --git a/art/Untitled.png b/art/Untitled.png new file mode 100644 index 00000000..bc696335 Binary files /dev/null and b/art/Untitled.png differ diff --git a/build.gradle b/build.gradle index 8ec48d7a..8368207b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.4.0' apply false - id 'com.android.library' version '8.4.0' apply false + id 'com.android.application' version '8.2.2' apply false + id 'com.android.library' version '8.2.2' apply false id 'org.jetbrains.kotlin.android' version '1.9.23' apply false id "io.gitlab.arturbosch.detekt" version "1.21.0" } diff --git a/app/.gitignore b/receiver/.gitignore similarity index 100% rename from app/.gitignore rename to receiver/.gitignore diff --git a/receiver/build.gradle b/receiver/build.gradle new file mode 100644 index 00000000..243c0925 --- /dev/null +++ b/receiver/build.gradle @@ -0,0 +1,60 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' + id("io.gitlab.arturbosch.detekt") +} + +android { + compileSdk 34 + + defaultConfig { + applicationId "otus.gpb.homework.activities.receiver" + minSdk 23 + targetSdk 34 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } + namespace 'otus.gpb.homework.activities.receiver' + buildFeatures { + viewBinding true + } +} + +detekt { + source = files("src/main/java", "src/main/kotlin") + config = files("$rootDir/config/detekt/detekt.yml") +} + +tasks.named("detekt").configure { + reports { + txt.required.set(true) + html.required.set(false) + md.required.set(false) + xml.required.set(false) + sarif.required.set(false) + html.outputLocation.set(file("build/reports/detekt/detekt.html")) + } +} + +dependencies { + implementation 'androidx.core:core-ktx:1.13.1' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.12.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/receiver/proguard-rules.pro similarity index 100% rename from app/proguard-rules.pro rename to receiver/proguard-rules.pro diff --git a/receiver/src/main/AndroidManifest.xml b/receiver/src/main/AndroidManifest.xml new file mode 100644 index 00000000..148f47a5 --- /dev/null +++ b/receiver/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/receiver/src/main/java/otus/gpb/homework/activities/receiver/ReceiverActivity.kt b/receiver/src/main/java/otus/gpb/homework/activities/receiver/ReceiverActivity.kt new file mode 100644 index 00000000..d9887ede --- /dev/null +++ b/receiver/src/main/java/otus/gpb/homework/activities/receiver/ReceiverActivity.kt @@ -0,0 +1,53 @@ +package otus.gpb.homework.activities.receiver + +import android.content.Intent +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import otus.gpb.homework.activities.receiver.databinding.ActivityReceiverBinding +import java.util.Locale + +class ReceiverActivity : AppCompatActivity() { + + private lateinit var binding: ActivityReceiverBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityReceiverBinding.inflate(layoutInflater) + setContentView(binding.root) + + android.util.Log.d("RECEIVER_DEBUG", "ReceiverActivity created") + android.util.Log.d("RECEIVER_DEBUG", "Intent action: ${intent.action}") + android.util.Log.d("RECEIVER_DEBUG", "Intent type: ${intent.type}") + + handleIntent(intent) + } + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + intent?.let { handleIntent(it) } + } + + private fun handleIntent(intent: Intent) { + val title = intent.getStringExtra("title") ?: "No title" + val year = intent.getStringExtra("year") ?: "No year" + val description = intent.getStringExtra("description") ?: "No description" + + binding.titleTextView.text = title + binding.yearTextView.text = year + binding.descriptionTextView.text = description + + setPosterImage(title) + } + + private fun setPosterImage(movieTitle: String) { + val drawableResId = when (movieTitle.lowercase(Locale.ROOT)) { + "interstellar" -> R.drawable.interstellar + "inception" -> R.drawable.inception + "niceguys" -> R.drawable.niceguys + else -> R.drawable.interstellar + } + + val drawable = getDrawable(drawableResId) + binding.posterImageView.setImageDrawable(drawable) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/receiver/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to receiver/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/receiver/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from app/src/main/res/drawable/ic_launcher_background.xml rename to receiver/src/main/res/drawable/ic_launcher_background.xml diff --git a/receiver/src/main/res/drawable/inception.png b/receiver/src/main/res/drawable/inception.png new file mode 100644 index 00000000..6bdc6b91 Binary files /dev/null and b/receiver/src/main/res/drawable/inception.png differ diff --git a/receiver/src/main/res/drawable/inters_tellar.png b/receiver/src/main/res/drawable/inters_tellar.png new file mode 100644 index 00000000..6bdc6b91 Binary files /dev/null and b/receiver/src/main/res/drawable/inters_tellar.png differ diff --git a/receiver/src/main/res/drawable/interstellar.webp b/receiver/src/main/res/drawable/interstellar.webp new file mode 100644 index 00000000..9038385b Binary files /dev/null and b/receiver/src/main/res/drawable/interstellar.webp differ diff --git a/receiver/src/main/res/drawable/nic_guys.png b/receiver/src/main/res/drawable/nic_guys.png new file mode 100644 index 00000000..9616054c Binary files /dev/null and b/receiver/src/main/res/drawable/nic_guys.png differ diff --git a/receiver/src/main/res/drawable/niceguys.webp b/receiver/src/main/res/drawable/niceguys.webp new file mode 100644 index 00000000..b66234f3 Binary files /dev/null and b/receiver/src/main/res/drawable/niceguys.webp differ diff --git a/receiver/src/main/res/layout/activity_receiver.xml b/receiver/src/main/res/layout/activity_receiver.xml new file mode 100644 index 00000000..6e89c012 --- /dev/null +++ b/receiver/src/main/res/layout/activity_receiver.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/receiver/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to receiver/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/receiver/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to receiver/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/receiver/src/main/res/mipmap-hdpi/ic_launcher.webp similarity index 100% rename from app/src/main/res/mipmap-hdpi/ic_launcher.webp rename to receiver/src/main/res/mipmap-hdpi/ic_launcher.webp diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/receiver/src/main/res/mipmap-hdpi/ic_launcher_round.webp similarity index 100% rename from app/src/main/res/mipmap-hdpi/ic_launcher_round.webp rename to receiver/src/main/res/mipmap-hdpi/ic_launcher_round.webp diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/receiver/src/main/res/mipmap-mdpi/ic_launcher.webp similarity index 100% rename from app/src/main/res/mipmap-mdpi/ic_launcher.webp rename to receiver/src/main/res/mipmap-mdpi/ic_launcher.webp diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/receiver/src/main/res/mipmap-mdpi/ic_launcher_round.webp similarity index 100% rename from app/src/main/res/mipmap-mdpi/ic_launcher_round.webp rename to receiver/src/main/res/mipmap-mdpi/ic_launcher_round.webp diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/receiver/src/main/res/mipmap-xhdpi/ic_launcher.webp similarity index 100% rename from app/src/main/res/mipmap-xhdpi/ic_launcher.webp rename to receiver/src/main/res/mipmap-xhdpi/ic_launcher.webp diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/receiver/src/main/res/mipmap-xhdpi/ic_launcher_round.webp similarity index 100% rename from app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp rename to receiver/src/main/res/mipmap-xhdpi/ic_launcher_round.webp diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/receiver/src/main/res/mipmap-xxhdpi/ic_launcher.webp similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/ic_launcher.webp rename to receiver/src/main/res/mipmap-xxhdpi/ic_launcher.webp diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/receiver/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp rename to receiver/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/receiver/src/main/res/mipmap-xxxhdpi/ic_launcher.webp similarity index 100% rename from app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp rename to receiver/src/main/res/mipmap-xxxhdpi/ic_launcher.webp diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/receiver/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp similarity index 100% rename from app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp rename to receiver/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp diff --git a/app/src/main/res/values-night/themes.xml b/receiver/src/main/res/values-night/themes.xml similarity index 100% rename from app/src/main/res/values-night/themes.xml rename to receiver/src/main/res/values-night/themes.xml diff --git a/app/src/main/res/values/colors.xml b/receiver/src/main/res/values/colors.xml similarity index 100% rename from app/src/main/res/values/colors.xml rename to receiver/src/main/res/values/colors.xml diff --git a/receiver/src/main/res/values/strings.xml b/receiver/src/main/res/values/strings.xml new file mode 100644 index 00000000..47a1c9b0 --- /dev/null +++ b/receiver/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Receiver + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/receiver/src/main/res/values/themes.xml similarity index 100% rename from app/src/main/res/values/themes.xml rename to receiver/src/main/res/values/themes.xml diff --git a/sender/.gitignore b/sender/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/sender/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/sender/build.gradle similarity index 88% rename from app/build.gradle rename to sender/build.gradle index 07e82a52..905a4bc3 100644 --- a/app/build.gradle +++ b/sender/build.gradle @@ -8,7 +8,7 @@ android { compileSdk 34 defaultConfig { - applicationId "otus.gpb.homework.activities" + applicationId "otus.gpb.homework.activities.sender" minSdk 23 targetSdk 34 versionCode 1 @@ -30,7 +30,7 @@ android { kotlinOptions { jvmTarget = '1.8' } - namespace 'otus.gpb.homework.activities' + namespace 'otus.gpb.homework.activities.sender' buildFeatures { viewBinding true } @@ -56,4 +56,5 @@ dependencies { implementation 'androidx.core:core-ktx:1.13.1' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.12.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' } \ No newline at end of file diff --git a/sender/payload.txt b/sender/payload.txt new file mode 100644 index 00000000..9ed9d009 --- /dev/null +++ b/sender/payload.txt @@ -0,0 +1,7 @@ +title: Славные парни +year: 2016 +description: Что бывает, когда напарником брутального костолома становится субтильный лопух? Наемный охранник Джексон Хили и частный детектив Холланд Марч вынуждены работать в паре, чтобы распутать плевое дело о пропавшей девушке, которое оборачивается преступлением века. Смогут ли парни разгадать сложный ребус, если у каждого из них – свои, весьма индивидуальные методы. + +title: Интерстеллар +year: 2014 +description: Когда засуха, пыльные бури и вымирание растений приводят человечество к продовольственному кризису, коллектив исследователей и учёных отправляется сквозь червоточину (которая предположительно соединяет области пространства-времени через большое расстояние) в путешествие, чтобы превзойти прежние ограничения для космических путешествий человека и найти планету с подходящими для человечества условиями. \ No newline at end of file diff --git a/sender/proguard-rules.pro b/sender/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/sender/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/sender/src/main/AndroidManifest.xml b/sender/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8bc8598d --- /dev/null +++ b/sender/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sender/src/main/java/otus/gpb/homework/activities/sender/Payload.kt b/sender/src/main/java/otus/gpb/homework/activities/sender/Payload.kt new file mode 100644 index 00000000..5a0b139e --- /dev/null +++ b/sender/src/main/java/otus/gpb/homework/activities/sender/Payload.kt @@ -0,0 +1,7 @@ +package otus.gpb.homework.activities.sender + +data class Payload( + val title: String, + val year: String, + val description: String +) \ No newline at end of file diff --git a/sender/src/main/java/otus/gpb/homework/activities/sender/SenderActivity.kt b/sender/src/main/java/otus/gpb/homework/activities/sender/SenderActivity.kt new file mode 100644 index 00000000..139fdeaf --- /dev/null +++ b/sender/src/main/java/otus/gpb/homework/activities/sender/SenderActivity.kt @@ -0,0 +1,94 @@ +package otus.gpb.homework.activities.sender + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import otus.gpb.homework.activities.sender.databinding.ActivitySenderBinding + +class SenderActivity : AppCompatActivity() { + + private lateinit var binding: ActivitySenderBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySenderBinding.inflate(layoutInflater) + setContentView(binding.root) + + setupClickListeners() + } + + private fun setupClickListeners() { + binding.toGoogleMapsButton.setOnClickListener { + openGoogleMaps() + } + + binding.sendEmailButton.setOnClickListener { + sendEmail() + } + + binding.openReceiverButton.setOnClickListener { + openReceiver() + } + + binding.toGoogleMapsButton.isEnabled = true + binding.sendEmailButton.isEnabled = true + binding.openReceiverButton.isEnabled = true + } + + private fun openGoogleMaps() { + try { + val intent = Intent(Intent.ACTION_VIEW).apply { + data = Uri.parse("geo:0,0?q=restaurants") + setPackage("com.google.android.apps.maps") + } + + if (intent.resolveActivity(packageManager) != null) { + startActivity(intent) + } else { + val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com/maps/search/restaurants")) + startActivity(webIntent) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun sendEmail() { + try { + val intent = Intent(Intent.ACTION_SENDTO).apply { + data = Uri.parse("mailto:android@otus.ru") + putExtra(Intent.EXTRA_SUBJECT, "Homework Activity #2") + putExtra(Intent.EXTRA_TEXT, "Hello from OTUS Android Developer course!") + } + + val chooser = Intent.createChooser(intent, "Send Email") + startActivity(chooser) + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun openReceiver() { + try { + val intent = Intent().apply { + action = Intent.ACTION_SEND + type = "text/plain" + addCategory(Intent.CATEGORY_DEFAULT) + + putExtra("title", "Interstellar") + putExtra("year", "2014") + putExtra("description", "Когда засуха, пыльные бури и вымирание растений приводят человечество к продовольственному кризису, коллектив исследователей и учёных отправляется сквозь червоточину в путешествие, чтобы превзойти прежние ограничения для космических путешествий человека и найти планету с подходящими для человечества условиями.") + } + + if (intent.resolveActivity(packageManager) != null) { + startActivity(intent) + } else { + android.widget.Toast.makeText(this, "No app found to handle this intent", android.widget.Toast.LENGTH_SHORT).show() + } + } catch (e: Exception) { + e.printStackTrace() + android.widget.Toast.makeText(this, "Error: ${e.message}", android.widget.Toast.LENGTH_SHORT).show() + } + } +} \ No newline at end of file diff --git a/sender/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sender/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/sender/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sender/src/main/res/drawable/ic_launcher_background.xml b/sender/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/sender/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sender/src/main/res/layout/activity_sender.xml b/sender/src/main/res/layout/activity_sender.xml new file mode 100644 index 00000000..2e606ea5 --- /dev/null +++ b/sender/src/main/res/layout/activity_sender.xml @@ -0,0 +1,34 @@ + + + +