From f85f7ef2807d3c6226d214cbb7bb889667358ebd Mon Sep 17 00:00:00 2001 From: aleh-god Date: Sun, 30 May 2021 16:13:37 +0300 Subject: [PATCH 1/4] aded: Simple comment --- .idea/runConfigurations.xml | 10 ---------- .../java/com/rsschool/android2021/FirstFragment.kt | 1 + .../java/com/rsschool/android2021/SecondFragment.kt | 2 ++ build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 5 files changed, 5 insertions(+), 12 deletions(-) delete mode 100644 .idea/runConfigurations.xml diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 797acea..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/rsschool/android2021/FirstFragment.kt b/app/src/main/java/com/rsschool/android2021/FirstFragment.kt index 2449535..cb41bb5 100644 --- a/app/src/main/java/com/rsschool/android2021/FirstFragment.kt +++ b/app/src/main/java/com/rsschool/android2021/FirstFragment.kt @@ -13,6 +13,7 @@ class FirstFragment : Fragment() { private var generateButton: Button? = null private var previousResult: TextView? = null + // Создаем фрагмент, переопределив метод и используя inflater.inflate override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, diff --git a/app/src/main/java/com/rsschool/android2021/SecondFragment.kt b/app/src/main/java/com/rsschool/android2021/SecondFragment.kt index 536fdb1..9d648df 100644 --- a/app/src/main/java/com/rsschool/android2021/SecondFragment.kt +++ b/app/src/main/java/com/rsschool/android2021/SecondFragment.kt @@ -13,6 +13,7 @@ class SecondFragment : Fragment() { private var backButton: Button? = null private var result: TextView? = null + // Создаем фрагмент, переопределив метод и используя inflater.inflate override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -41,6 +42,7 @@ class SecondFragment : Fragment() { return 0 } + // Передаем данные во фрагмент companion object { @JvmStatic diff --git a/build.gradle b/build.gradle index 7c71d04..79d3da6 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath "com.android.tools.build:gradle:4.1.3" + classpath 'com.android.tools.build:gradle:4.2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b750993..6e36d96 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip From 8c04873cd74033039b8bf837801305371e0ce008 Mon Sep 17 00:00:00 2001 From: aleh-god Date: Sun, 30 May 2021 19:49:30 +0300 Subject: [PATCH 2/4] added: Soluton task Soluton task complete without validate min and max --- .../android2021/ActionPerformedListener.kt | 6 +++ .../com/rsschool/android2021/FirstFragment.kt | 38 +++++++++++++++++-- .../rsschool/android2021/MainActivity.java | 19 +++++++++- .../rsschool/android2021/SecondFragment.kt | 22 +++++++++-- 4 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/rsschool/android2021/ActionPerformedListener.kt diff --git a/app/src/main/java/com/rsschool/android2021/ActionPerformedListener.kt b/app/src/main/java/com/rsschool/android2021/ActionPerformedListener.kt new file mode 100644 index 0000000..6645086 --- /dev/null +++ b/app/src/main/java/com/rsschool/android2021/ActionPerformedListener.kt @@ -0,0 +1,6 @@ +package com.rsschool.android2021 + +interface ActionPerformedListener { + fun onActionPerformedOne(previousNumber: Int) + fun onActionPerformedTwo(min: Int, max: Int) +} \ No newline at end of file diff --git a/app/src/main/java/com/rsschool/android2021/FirstFragment.kt b/app/src/main/java/com/rsschool/android2021/FirstFragment.kt index cb41bb5..b7488d9 100644 --- a/app/src/main/java/com/rsschool/android2021/FirstFragment.kt +++ b/app/src/main/java/com/rsschool/android2021/FirstFragment.kt @@ -1,19 +1,32 @@ package com.rsschool.android2021 +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button +import android.widget.EditText import android.widget.TextView import androidx.fragment.app.Fragment class FirstFragment : Fragment() { + private var listener: ActionPerformedListener? = null private var generateButton: Button? = null private var previousResult: TextView? = null + private var minValue: EditText? = null + private var maxValue: EditText? = null + private var min: Int? = null + private var max: Int? = null - // Создаем фрагмент, переопределив метод и используя inflater.inflate + // Добавляем слушатель через контекст + override fun onAttach(context: Context) { + super.onAttach(context) + listener = context as ActionPerformedListener + } + + // Создаем фрагмент используя inflater.inflate override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -22,22 +35,39 @@ class FirstFragment : Fragment() { return inflater.inflate(R.layout.fragment_first, container, false) } + // Создаем содержимое фрагмента override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) previousResult = view.findViewById(R.id.previous_result) generateButton = view.findViewById(R.id.generate) + minValue = view.findViewById(R.id.min_value) + maxValue = view.findViewById(R.id.max_value) val result = arguments?.getInt(PREVIOUS_RESULT_KEY) previousResult?.text = "Previous result: ${result.toString()}" - // TODO: val min = ... - // TODO: val max = ... - generateButton?.setOnClickListener { + + // TODO: val min = ... + min = minValue?.text.toString().toInt() + // TODO: val max = ... + max = maxValue?.text.toString().toInt() + +// if(minValue?.text?.isEmpty() as Boolean) { +// minValue!!.error = "Введите минимальное значение." +// } else +// if(maxValue?.text?.isEmpty() as Boolean) { +// previousResult?.text = "Введите максимальное значение." +// } else +// if (max!! < min!!) {} + // previousResult?.text = "min $min and max $max" // TODO: send min and max to the SecondFragment + listener?.onActionPerformedTwo(min as Int, max as Int) + } } + // Передаем данные в новый фрагмент, который создаст MainActivity companion object { @JvmStatic diff --git a/app/src/main/java/com/rsschool/android2021/MainActivity.java b/app/src/main/java/com/rsschool/android2021/MainActivity.java index ced8ec9..38bd034 100644 --- a/app/src/main/java/com/rsschool/android2021/MainActivity.java +++ b/app/src/main/java/com/rsschool/android2021/MainActivity.java @@ -7,12 +7,13 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; -public class MainActivity extends AppCompatActivity { +public class MainActivity extends AppCompatActivity implements ActionPerformedListener { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + openFirstFragment(0); } @@ -20,10 +21,26 @@ private void openFirstFragment(int previousNumber) { final Fragment firstFragment = FirstFragment.newInstance(previousNumber); final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.container, firstFragment); + transaction.commit(); + // TODO: invoke function which apply changes of the transaction } private void openSecondFragment(int min, int max) { // TODO: implement it + final Fragment secondFragment = SecondFragment.newInstance(min, max); + final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + transaction.replace(R.id.container, secondFragment); + transaction.commit(); + } + + @Override + public void onActionPerformedOne(int previousNumber) { + openFirstFragment(previousNumber); + } + + @Override + public void onActionPerformedTwo(int min, int max) { + openSecondFragment(min, max); } } diff --git a/app/src/main/java/com/rsschool/android2021/SecondFragment.kt b/app/src/main/java/com/rsschool/android2021/SecondFragment.kt index 9d648df..70f450c 100644 --- a/app/src/main/java/com/rsschool/android2021/SecondFragment.kt +++ b/app/src/main/java/com/rsschool/android2021/SecondFragment.kt @@ -1,5 +1,6 @@ package com.rsschool.android2021 +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -7,12 +8,20 @@ import android.view.ViewGroup import android.widget.Button import android.widget.TextView import androidx.fragment.app.Fragment +import kotlin.random.Random class SecondFragment : Fragment() { + private var listener: ActionPerformedListener? = null private var backButton: Button? = null private var result: TextView? = null + // Добавляем слушатель через контекст + override fun onAttach(context: Context) { + super.onAttach(context) + listener = context as ActionPerformedListener + } + // Создаем фрагмент, переопределив метод и используя inflater.inflate override fun onCreateView( inflater: LayoutInflater, @@ -22,6 +31,7 @@ class SecondFragment : Fragment() { return inflater.inflate(R.layout.fragment_second, container, false) } + // Создаем содержимое фрагмента override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) result = view.findViewById(R.id.result) @@ -30,19 +40,22 @@ class SecondFragment : Fragment() { val min = arguments?.getInt(MIN_VALUE_KEY) ?: 0 val max = arguments?.getInt(MAX_VALUE_KEY) ?: 0 - result?.text = generate(min, max).toString() + val resultRandom = generate(min, max) + result?.text = resultRandom.toString() backButton?.setOnClickListener { // TODO: implement back + listener?.onActionPerformedOne(resultRandom) + } } private fun generate(min: Int, max: Int): Int { // TODO: generate random number - return 0 + return Random.nextInt(from = min, until = max) } - // Передаем данные во фрагмент + // Передаем данные в новый фрагмент, который создаст MainActivity companion object { @JvmStatic @@ -51,6 +64,9 @@ class SecondFragment : Fragment() { val args = Bundle() // TODO: implement adding arguments + args.putInt(MIN_VALUE_KEY, min) + args.putInt(MAX_VALUE_KEY, max) + fragment.arguments = args return fragment } From cad5ab6046cfbc39da28f79f6344b076ba7067ce Mon Sep 17 00:00:00 2001 From: aleh-god Date: Sun, 30 May 2021 21:36:10 +0300 Subject: [PATCH 3/4] fix: Validate input numbers --- .../com/rsschool/android2021/FirstFragment.kt | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/rsschool/android2021/FirstFragment.kt b/app/src/main/java/com/rsschool/android2021/FirstFragment.kt index b7488d9..74bd6f5 100644 --- a/app/src/main/java/com/rsschool/android2021/FirstFragment.kt +++ b/app/src/main/java/com/rsschool/android2021/FirstFragment.kt @@ -17,8 +17,9 @@ class FirstFragment : Fragment() { private var previousResult: TextView? = null private var minValue: EditText? = null private var maxValue: EditText? = null - private var min: Int? = null - private var max: Int? = null + private var min: Int = 0 + private var max: Int = 0 + private var yesOrNo: Boolean = false // Добавляем слушатель через контекст override fun onAttach(context: Context) { @@ -46,24 +47,28 @@ class FirstFragment : Fragment() { val result = arguments?.getInt(PREVIOUS_RESULT_KEY) previousResult?.text = "Previous result: ${result.toString()}" - generateButton?.setOnClickListener { - - // TODO: val min = ... - min = minValue?.text.toString().toInt() - // TODO: val max = ... - max = maxValue?.text.toString().toInt() + // Переносим инициализацию min и max под нажатие кнопки -// if(minValue?.text?.isEmpty() as Boolean) { -// minValue!!.error = "Введите минимальное значение." -// } else -// if(maxValue?.text?.isEmpty() as Boolean) { -// previousResult?.text = "Введите максимальное значение." -// } else -// if (max!! < min!!) {} - // previousResult?.text = "min $min and max $max" - // TODO: send min and max to the SecondFragment - listener?.onActionPerformedTwo(min as Int, max as Int) + generateButton?.setOnClickListener { + if (minValue?.text?.isEmpty() == true) minValue!!.error = "Введите минимальное значение." + else + if (maxValue?.text?.isEmpty() == true) maxValue!!.error = "Введите максимальное значение." + else + // TODO: val min = ... + // TODO: val max = ... + if ( minValue?.text.toString().length > 9 ) minValue!!.error = "Значение должно быть меньше 999 999 999." + else + if ( maxValue?.text.toString().length > 9 ) maxValue!!.error = "Значение должно быть меньше 1 000 000 000." + else { + min = minValue?.text.toString().toInt() + max = maxValue?.text.toString().toInt() + if ( (max) <= (min) ) { + minValue!!.error = "Я должен быть меньше своего брата." + maxValue!!.error = "Я должен быть больше своего брата." + } + else listener?.onActionPerformedTwo(min as Int, max as Int) // TODO: send min and max to the SecondFragment + } } } From 93e85dd1719808736807c318b4b1d3ebd60ed6e3 Mon Sep 17 00:00:00 2001 From: aleh-god Date: Sun, 30 May 2021 21:48:29 +0300 Subject: [PATCH 4/4] aded: TODO comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Задача полностью решена, добавлены комментарии к решению. --- .../main/java/com/rsschool/android2021/FirstFragment.kt | 9 +++++---- .../main/java/com/rsschool/android2021/MainActivity.java | 5 ++--- .../main/java/com/rsschool/android2021/SecondFragment.kt | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/rsschool/android2021/FirstFragment.kt b/app/src/main/java/com/rsschool/android2021/FirstFragment.kt index 74bd6f5..9ad6e3e 100644 --- a/app/src/main/java/com/rsschool/android2021/FirstFragment.kt +++ b/app/src/main/java/com/rsschool/android2021/FirstFragment.kt @@ -47,7 +47,7 @@ class FirstFragment : Fragment() { val result = arguments?.getInt(PREVIOUS_RESULT_KEY) previousResult?.text = "Previous result: ${result.toString()}" - // Переносим инициализацию min и max под нажатие кнопки + // Переносим инициализацию min и max по нажатию кнопки под generateButton?.setOnClickListener generateButton?.setOnClickListener { @@ -55,8 +55,9 @@ class FirstFragment : Fragment() { else if (maxValue?.text?.isEmpty() == true) maxValue!!.error = "Введите максимальное значение." else - // TODO: val min = ... - // TODO: val max = ... + // Так как в условии явно не указано максимальное значение положительного целого числа, + // А смысл подгонки верхнего значения из String в Integer через Long логически не обоснован, + // Принял архитектурное решение, что верхнее ограничение будет 999 999 999 для простоты кода. if ( minValue?.text.toString().length > 9 ) minValue!!.error = "Значение должно быть меньше 999 999 999." else if ( maxValue?.text.toString().length > 9 ) maxValue!!.error = "Значение должно быть меньше 1 000 000 000." @@ -67,7 +68,7 @@ class FirstFragment : Fragment() { minValue!!.error = "Я должен быть меньше своего брата." maxValue!!.error = "Я должен быть больше своего брата." } - else listener?.onActionPerformedTwo(min as Int, max as Int) // TODO: send min and max to the SecondFragment + else listener?.onActionPerformedTwo(min as Int, max as Int) } } } diff --git a/app/src/main/java/com/rsschool/android2021/MainActivity.java b/app/src/main/java/com/rsschool/android2021/MainActivity.java index 38bd034..07f9fa4 100644 --- a/app/src/main/java/com/rsschool/android2021/MainActivity.java +++ b/app/src/main/java/com/rsschool/android2021/MainActivity.java @@ -22,12 +22,11 @@ private void openFirstFragment(int previousNumber) { final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.container, firstFragment); transaction.commit(); - - // TODO: invoke function which apply changes of the transaction + // Здесь нехватало лишь добавить коммит } private void openSecondFragment(int min, int max) { - // TODO: implement it + // Здесь добавил FragmentTransaction, добавил в него второй врагмент и закоммитил final Fragment secondFragment = SecondFragment.newInstance(min, max); final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.container, secondFragment); diff --git a/app/src/main/java/com/rsschool/android2021/SecondFragment.kt b/app/src/main/java/com/rsschool/android2021/SecondFragment.kt index 70f450c..933d536 100644 --- a/app/src/main/java/com/rsschool/android2021/SecondFragment.kt +++ b/app/src/main/java/com/rsschool/android2021/SecondFragment.kt @@ -44,14 +44,14 @@ class SecondFragment : Fragment() { result?.text = resultRandom.toString() backButton?.setOnClickListener { - // TODO: implement back + // Вызываем первый фрагмент, используя метод, который принадлежит объекту MainActivity listener?.onActionPerformedOne(resultRandom) } } private fun generate(min: Int, max: Int): Int { - // TODO: generate random number + // Для генерации случайного числа, перем готовый метод из библиотеки return Random.nextInt(from = min, until = max) } @@ -63,7 +63,7 @@ class SecondFragment : Fragment() { val fragment = SecondFragment() val args = Bundle() - // TODO: implement adding arguments + // Полученные значения связываем парой <ключ, значение> и кладем в объект хранения args.putInt(MIN_VALUE_KEY, min) args.putInt(MAX_VALUE_KEY, max) fragment.arguments = args