diff --git a/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/dialog/OrientationDialogTest.java b/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/dialog/OrientationDialogTest.java deleted file mode 100644 index b5aef4cb2f0..00000000000 --- a/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/dialog/OrientationDialogTest.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Catroid: An on-device visual programming system for Android devices - * Copyright (C) 2010-2022 The Catrobat Team - * () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * An additional term exception under section 7 of the GNU Affero - * General Public License, version 3, is available at - * http://developer.catrobat.org/license_additional_term - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.catrobat.catroid.uiespresso.ui.dialog; - -import android.content.SharedPreferences; -import android.preference.PreferenceManager; - -import org.catrobat.catroid.R; -import org.catrobat.catroid.common.Constants; -import org.catrobat.catroid.testsuites.annotations.Cat; -import org.catrobat.catroid.testsuites.annotations.Level; -import org.catrobat.catroid.ui.MainMenuActivity; -import org.catrobat.catroid.ui.ProjectActivity; -import org.catrobat.catroid.uiespresso.util.rules.DontGenerateDefaultProjectActivityTestRule; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; - -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import static org.catrobat.catroid.common.SharedPreferenceKeys.AGREED_TO_PRIVACY_POLICY_VERSION; -import static org.catrobat.catroid.ui.settingsfragments.SettingsFragment.SETTINGS_CAST_GLOBALLY_ENABLED; -import static org.catrobat.catroid.uiespresso.util.UiTestUtils.assertCurrentActivityIsInstanceOf; -import static org.hamcrest.Matchers.allOf; - -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard; -import static androidx.test.espresso.action.ViewActions.replaceText; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.isEnabled; -import static androidx.test.espresso.matcher.ViewMatchers.isNotChecked; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; - -@RunWith(AndroidJUnit4.class) -public class OrientationDialogTest { - - @Rule - public DontGenerateDefaultProjectActivityTestRule baseActivityTestRule = new - DontGenerateDefaultProjectActivityTestRule<>(MainMenuActivity.class, true, false); - - private boolean bufferedChromeCastSetting; - private int bufferedPrivacyPolicyPreferenceSetting; - - @Before - public void setUp() throws Exception { - SharedPreferences sharedPreferences = PreferenceManager - .getDefaultSharedPreferences(ApplicationProvider.getApplicationContext()); - - bufferedChromeCastSetting = sharedPreferences - .getBoolean(SETTINGS_CAST_GLOBALLY_ENABLED, false); - - bufferedPrivacyPolicyPreferenceSetting = sharedPreferences - .getInt(AGREED_TO_PRIVACY_POLICY_VERSION, 0); - - PreferenceManager.getDefaultSharedPreferences(ApplicationProvider.getApplicationContext()) - .edit() - .putBoolean(SETTINGS_CAST_GLOBALLY_ENABLED, true) - .putInt(AGREED_TO_PRIVACY_POLICY_VERSION, Constants.CATROBAT_TERMS_OF_USE_ACCEPTED) - .commit(); - - baseActivityTestRule.launchActivity(null); - } - - @After - public void tearDown() { - PreferenceManager.getDefaultSharedPreferences(ApplicationProvider.getApplicationContext()) - .edit() - .putBoolean(SETTINGS_CAST_GLOBALLY_ENABLED, bufferedChromeCastSetting) - .putInt(AGREED_TO_PRIVACY_POLICY_VERSION, - bufferedPrivacyPolicyPreferenceSetting) - .commit(); - } - - @Test - @Category({Level.Smoke.class, Cat.AppUi.class, Cat.Gadgets.class}) - public void testCreateNewCastProject() { - onView(withId(R.id.newProjectFloatingActionButton)) - .perform(click()); - onView(withId(R.id.input_edit_text)) - .check(matches(isDisplayed())); - - onView(allOf(withId(android.R.id.button1), withText(R.string.ok))) - .check(matches(allOf(isDisplayed(), isEnabled()))); - - onView(allOf(withId(R.id.input_edit_text), isDisplayed())) - .perform(replaceText("TestCastProject"), closeSoftKeyboard()); - - onView(withId(R.id.cast_radio_button)) - .perform(click()); - - onView(withId(R.id.example_project_switch)) - .check(matches(allOf(isDisplayed(), isNotChecked()))); - - onView(withText(R.string.ok)) - .perform(click()); - - assertCurrentActivityIsInstanceOf(ProjectActivity.class); - } -} diff --git a/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/fragment/CreateProjectTest.kt b/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/fragment/CreateProjectTest.kt index cfcb4a7ffab..1d2683c747f 100644 --- a/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/fragment/CreateProjectTest.kt +++ b/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/fragment/CreateProjectTest.kt @@ -23,103 +23,234 @@ package org.catrobat.catroid.uiespresso.ui.fragment -import android.content.Context -import android.preference.PreferenceManager -import androidx.test.core.app.ApplicationProvider +import android.content.SharedPreferences +import android.preference.PreferenceManager.getDefaultSharedPreferences +import androidx.test.core.app.ApplicationProvider.getApplicationContext +import androidx.test.espresso.Espresso.closeSoftKeyboard import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.pressBack -import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.replaceText import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.espresso.matcher.ViewMatchers.isChecked import androidx.test.espresso.matcher.ViewMatchers.isDisplayed -import android.widget.EditText +import androidx.test.espresso.matcher.ViewMatchers.isEnabled +import androidx.test.espresso.matcher.ViewMatchers.isNotChecked import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 -import org.catrobat.catroid.ProjectManager import org.catrobat.catroid.R import org.catrobat.catroid.common.Constants.CATROBAT_TERMS_OF_USE_ACCEPTED import org.catrobat.catroid.common.SharedPreferenceKeys.AGREED_TO_PRIVACY_POLICY_VERSION +import org.catrobat.catroid.runner.Flaky import org.catrobat.catroid.ui.MainMenuActivity -import org.catrobat.catroid.uiespresso.util.actions.CustomActions +import org.catrobat.catroid.ui.ProjectActivity +import org.catrobat.catroid.ui.ProjectListActivity +import org.catrobat.catroid.ui.settingsfragments.SettingsFragment +import org.catrobat.catroid.uiespresso.util.UiTestUtils.Companion.assertCurrentActivityIsInstanceOf import org.catrobat.catroid.uiespresso.util.rules.BaseActivityTestRule import org.hamcrest.CoreMatchers.allOf -import org.hamcrest.CoreMatchers.instanceOf +import org.hamcrest.Matchers.not import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.koin.test.KoinTest -import org.koin.test.inject @RunWith(AndroidJUnit4::class) -class CreateProjectTest : KoinTest { - private var privacyPreferenceSetting: Int = 0 - private lateinit var applicationContext: Context - private val projectManager: ProjectManager by inject() +class CreateProjectTest { + private var bufferedChromeCastSetting = false + private var bufferedPrivacyPolicyPreferenceSetting = 0 + private lateinit var sharedPreferences: SharedPreferences + private val newProjectName = CreateProjectTest::class.simpleName @get:Rule var baseActivityTestRule = BaseActivityTestRule( - MainMenuActivity::class.java, - false, - false + MainMenuActivity::class.java, false, false ) @Before fun setUp() { - applicationContext = ApplicationProvider.getApplicationContext() - privacyPreferenceSetting = PreferenceManager - .getDefaultSharedPreferences(applicationContext) - .getInt(AGREED_TO_PRIVACY_POLICY_VERSION, 0) - - PreferenceManager.getDefaultSharedPreferences(applicationContext) - .edit().putInt( - AGREED_TO_PRIVACY_POLICY_VERSION, - CATROBAT_TERMS_OF_USE_ACCEPTED - ).commit() - - createProject() + sharedPreferences = getDefaultSharedPreferences(getApplicationContext()) + + bufferedChromeCastSetting = sharedPreferences.getBoolean(SettingsFragment.SETTINGS_CAST_GLOBALLY_ENABLED, false) + bufferedPrivacyPolicyPreferenceSetting = sharedPreferences.getInt(AGREED_TO_PRIVACY_POLICY_VERSION, 0) + + sharedPreferences + .edit() + .putBoolean(SettingsFragment.SETTINGS_CAST_GLOBALLY_ENABLED, true) + .putInt(AGREED_TO_PRIVACY_POLICY_VERSION, CATROBAT_TERMS_OF_USE_ACCEPTED) + .commit() + baseActivityTestRule.launchActivity(null) } @After fun tearDown() { - PreferenceManager.getDefaultSharedPreferences(applicationContext) + sharedPreferences .edit() - .putInt(AGREED_TO_PRIVACY_POLICY_VERSION, privacyPreferenceSetting) + .putBoolean(SettingsFragment.SETTINGS_CAST_GLOBALLY_ENABLED, bufferedChromeCastSetting) + .putInt(AGREED_TO_PRIVACY_POLICY_VERSION, bufferedPrivacyPolicyPreferenceSetting) .commit() } @Test - fun testCheckIfProjectCreated() { - val newProjectName = "newProjectTest" + fun testNewProjectDialogFragment() { onView(withId(R.id.newProjectFloatingActionButton)) + .perform(click()) + + onView(withText(R.string.new_project_title)) .check(matches(isDisplayed())) - .perform(ViewActions.click()) - waitFor() - onView(allOf(withId(R.id.input_edit_text), isDisplayed(), instanceOf(EditText::class.java))) - .perform(ViewActions.replaceText(newProjectName)) - onView(withText(R.string.ok)) + + onView(withId(R.id.confirm)) + .check(matches(allOf(isDisplayed(), isEnabled()))) + + onView(withId(R.id.input)) .check(matches(isDisplayed())) - .perform(ViewActions.click()) - pressBack() - onView(withText(R.string.main_menu_programs)) + + onView(withId(R.id.portrait_radio_button)) + .check(matches(allOf(isDisplayed(), isChecked()))) + + onView(withId(R.id.landscape_radio_button)) + .check(matches(allOf(isDisplayed(), isNotChecked()))) + + onView(withId(R.id.cast_radio_button)) + .check(matches(allOf(isDisplayed(), isNotChecked()))) + + onView(withId(R.id.example_project_switch)) + .check(matches(allOf(isDisplayed(), isNotChecked()))) + } + + @Test + fun testCastOptionNotShowed() { + sharedPreferences + .edit() + .putBoolean(SettingsFragment.SETTINGS_CAST_GLOBALLY_ENABLED, false) + .commit() + + onView(withId(R.id.newProjectFloatingActionButton)) + .perform(click()) + + onView(withId(R.id.portrait_radio_button)) + .check(matches(allOf(isDisplayed(), isChecked()))) + + onView(withId(R.id.landscape_radio_button)) + .check(matches(allOf(isDisplayed(), isNotChecked()))) + + onView(withId(R.id.cast_radio_button)) + .check(matches(not(isDisplayed()))) + } + + @Test + fun testCreateNewCastProject() { + onView(withId(R.id.newProjectFloatingActionButton)) + .perform(click()) + + closeSoftKeyboard() + + onView(withId(R.id.cast_radio_button)) + .perform(click()) + + onView(withId(R.id.confirm)) + .perform(click()) + + assertCurrentActivityIsInstanceOf(ProjectActivity::class.java) + } + + @Test + fun testCreateProjectInProjectList() { + onView(withId(R.id.myProjectsTextView)) + .perform(click()) + + onView(withId(R.id.button_add)) + .perform(click()) + + onView(withId(R.id.input_edit_text)) + .perform(replaceText(newProjectName)) + + closeSoftKeyboard() + + onView(withId(R.id.example_project_switch)) + .perform(click()) + + onView(withId(R.id.confirm)) + .perform(click()) + + onView(withText(newProjectName)) .check(matches(isDisplayed())) - .perform(ViewActions.click()) + + assertCurrentActivityIsInstanceOf(ProjectActivity::class.java) + + pressBack() + onView(withText(newProjectName)) .check(matches(isDisplayed())) + + assertCurrentActivityIsInstanceOf(ProjectListActivity::class.java) } - private fun createProject() { - projectManager.createNewEmptyProject( - javaClass.simpleName, - false, - false - ) + @Test + @Flaky + fun testCreateProjectInMainMenu() { + onView(withId(R.id.newProjectFloatingActionButton)) + .perform(click()) + + onView(withId(R.id.input_edit_text)) + .perform(replaceText(newProjectName)) + + closeSoftKeyboard() + + onView(withId(R.id.example_project_switch)) + .perform(click()) + + onView(withId(R.id.confirm)) + .perform(click()) + + onView(withText(newProjectName)) + .check(matches(isDisplayed())) + + assertCurrentActivityIsInstanceOf(ProjectActivity::class.java) + + pressBack() + + assertCurrentActivityIsInstanceOf(MainMenuActivity::class.java) + + onView(withId(R.id.projectImageView)) + .perform(click()) + + onView(withText(newProjectName)) + .check(matches(isDisplayed())) } - private fun waitFor(time: Int = 1000) { - onView(ViewMatchers.isRoot()).perform(CustomActions.wait(time)) + @Test + fun testCreateProjectWithExistingName() { + onView(withId(R.id.newProjectFloatingActionButton)) + .perform(click()) + + onView(withId(R.id.input_edit_text)) + .perform(replaceText(newProjectName)) + + closeSoftKeyboard() + + onView(withId(R.id.confirm)) + .perform(click()) + + pressBack() + + onView(withId(R.id.newProjectFloatingActionButton)) + .perform(click()) + + onView(withId(R.id.input_edit_text)) + .perform(replaceText(newProjectName)) + + onView(withText(R.string.name_already_exists)) + .check(matches(isDisplayed())) + + onView(withId(R.id.confirm)) + .check(matches(allOf(isDisplayed(), not(isEnabled())))) + + pressBack() + + assertCurrentActivityIsInstanceOf(MainMenuActivity::class.java) } } diff --git a/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/regression/activitydestroy/MainMenuFragmentActivityRecreateRegressionTest.kt b/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/regression/activitydestroy/MainMenuFragmentActivityRecreateRegressionTest.kt index 02272fd3174..15e31fb81b9 100644 --- a/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/regression/activitydestroy/MainMenuFragmentActivityRecreateRegressionTest.kt +++ b/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/regression/activitydestroy/MainMenuFragmentActivityRecreateRegressionTest.kt @@ -23,23 +23,27 @@ package org.catrobat.catroid.uiespresso.ui.regression.activitydestroy import android.content.Context -import android.preference.PreferenceManager -import androidx.test.core.app.ApplicationProvider -import androidx.test.espresso.Espresso -import androidx.test.espresso.action.ViewActions -import androidx.test.espresso.assertion.ViewAssertions -import androidx.test.espresso.matcher.RootMatchers -import androidx.test.espresso.matcher.ViewMatchers -import androidx.test.platform.app.InstrumentationRegistry +import android.preference.PreferenceManager.getDefaultSharedPreferences +import androidx.test.core.app.ApplicationProvider.getApplicationContext +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.closeSoftKeyboard +import androidx.test.espresso.action.ViewActions.replaceText +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.RootMatchers.isDialog +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation import org.catrobat.catroid.R -import org.catrobat.catroid.common.Constants -import org.catrobat.catroid.common.SharedPreferenceKeys +import org.catrobat.catroid.common.Constants.CATROBAT_TERMS_OF_USE_ACCEPTED +import org.catrobat.catroid.common.SharedPreferenceKeys.AGREED_TO_PRIVACY_POLICY_VERSION import org.catrobat.catroid.testsuites.annotations.Cat.AppUi import org.catrobat.catroid.testsuites.annotations.Cat.Quarantine import org.catrobat.catroid.testsuites.annotations.Level.Smoke import org.catrobat.catroid.ui.MainMenuActivity import org.catrobat.catroid.uiespresso.util.rules.DontGenerateDefaultProjectActivityTestRule -import org.hamcrest.Matchers import org.junit.After import org.junit.Before import org.junit.Rule @@ -48,10 +52,12 @@ import org.junit.experimental.categories.Category import org.junit.runner.RunWith import org.junit.runners.JUnit4 +@Category(AppUi::class, Smoke::class, Quarantine::class) @RunWith(JUnit4::class) class MainMenuFragmentActivityRecreateRegressionTest { var bufferedPrivacyPolicyPreferenceSetting = 0 - val applicationContext: Context = ApplicationProvider.getApplicationContext() + val applicationContext: Context = getApplicationContext() + @get:Rule var baseActivityTestRule = DontGenerateDefaultProjectActivityTestRule( MainMenuActivity::class.java, false, false @@ -59,87 +65,94 @@ class MainMenuFragmentActivityRecreateRegressionTest { @Before fun setUp() { - bufferedPrivacyPolicyPreferenceSetting = PreferenceManager - .getDefaultSharedPreferences(ApplicationProvider.getApplicationContext()) - .getInt(SharedPreferenceKeys.AGREED_TO_PRIVACY_POLICY_VERSION, 0) - PreferenceManager.getDefaultSharedPreferences(applicationContext) - .edit().putInt( - SharedPreferenceKeys.AGREED_TO_PRIVACY_POLICY_VERSION, - Constants.CATROBAT_TERMS_OF_USE_ACCEPTED - ).commit() + bufferedPrivacyPolicyPreferenceSetting = getDefaultSharedPreferences(getApplicationContext()) + .getInt(AGREED_TO_PRIVACY_POLICY_VERSION, 0) + + getDefaultSharedPreferences(applicationContext) + .edit() + .putInt(AGREED_TO_PRIVACY_POLICY_VERSION, CATROBAT_TERMS_OF_USE_ACCEPTED) + .commit() + baseActivityTestRule.launchActivity(null) } @After fun tearDown() { - PreferenceManager.getDefaultSharedPreferences(applicationContext) + getDefaultSharedPreferences(applicationContext) .edit() - .putInt( - SharedPreferenceKeys.AGREED_TO_PRIVACY_POLICY_VERSION, - bufferedPrivacyPolicyPreferenceSetting - ) + .putInt(AGREED_TO_PRIVACY_POLICY_VERSION, bufferedPrivacyPolicyPreferenceSetting) .commit() } - @Category(AppUi::class, Smoke::class, Quarantine::class) @Test fun testActivityRecreateOrientation() { - Espresso.onView(ViewMatchers.withId(R.id.newProjectFloatingActionButton)) - .perform(ViewActions.click()) - InstrumentationRegistry.getInstrumentation().waitForIdleSync() - Espresso.onView(ViewMatchers.withId(R.id.input_edit_text)) - .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) - Espresso.onView(ViewMatchers.withClassName(Matchers.`is`("com.google.android.material.textfield.TextInputEditText"))) - .perform(ViewActions.replaceText("TestProject"), ViewActions.closeSoftKeyboard()) - InstrumentationRegistry.getInstrumentation().waitForIdleSync() - Espresso.onView(ViewMatchers.withText(R.string.ok)) - .perform(ViewActions.click()) - InstrumentationRegistry.getInstrumentation().waitForIdleSync() - InstrumentationRegistry.getInstrumentation() - .runOnMainSync { baseActivityTestRule.activity.recreate() } - InstrumentationRegistry.getInstrumentation().waitForIdleSync() + onView(withId(R.id.newProjectFloatingActionButton)) + .perform(click()) + + getInstrumentation().waitForIdleSync() + + onView(withId(R.id.input_edit_text)) + .check(matches(isDisplayed())) + + onView(withId(R.id.input_edit_text)) + .perform(replaceText("TestProject"), closeSoftKeyboard()) + + getInstrumentation().waitForIdleSync() + + onView(withId(R.id.confirm)) + .perform(click()) + + getInstrumentation().waitForIdleSync() + getInstrumentation().runOnMainSync { baseActivityTestRule.activity.recreate() } + getInstrumentation().waitForIdleSync() } - @Category(AppUi::class, Smoke::class, Quarantine::class) @Test fun testActivityRecreateNewProgramDialog() { - Espresso.onView(ViewMatchers.withId(R.id.newProjectFloatingActionButton)) - .perform(ViewActions.click()) - InstrumentationRegistry.getInstrumentation().waitForIdleSync() - Espresso.onView(ViewMatchers.withId(R.id.input_edit_text)).inRoot(RootMatchers.isDialog()) - .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) - InstrumentationRegistry.getInstrumentation() - .runOnMainSync { baseActivityTestRule.activity.recreate() } - InstrumentationRegistry.getInstrumentation().waitForIdleSync() + onView(withId(R.id.newProjectFloatingActionButton)) + .perform(click()) + + getInstrumentation().waitForIdleSync() + + onView(withId(R.id.input_edit_text)) + .inRoot(isDialog()) + .check(matches(isDisplayed())) + + getInstrumentation().runOnMainSync { baseActivityTestRule.activity.recreate() } + getInstrumentation().waitForIdleSync() } - @Category(AppUi::class, Smoke::class, Quarantine::class) @Test fun testActivityRecreateTermsOfUseDialog() { - Espresso.openActionBarOverflowOrOptionsMenu(androidx.test.InstrumentationRegistry.getInstrumentation().targetContext) - Espresso.onView(ViewMatchers.withText(R.string.main_menu_terms_of_use)) - .perform(ViewActions.click()) - InstrumentationRegistry.getInstrumentation().waitForIdleSync() - Espresso.onView(ViewMatchers.withId(R.id.dialog_terms_of_use_text_view_info)) - .inRoot(RootMatchers.isDialog()) - .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) - InstrumentationRegistry.getInstrumentation() - .runOnMainSync { baseActivityTestRule.activity.recreate() } - InstrumentationRegistry.getInstrumentation().waitForIdleSync() + openActionBarOverflowOrOptionsMenu(applicationContext) + + onView(withText(R.string.main_menu_terms_of_use)) + .perform(click()) + + getInstrumentation().waitForIdleSync() + + onView(withId(R.id.dialog_terms_of_use_text_view_info)) + .inRoot(isDialog()) + .check(matches(isDisplayed())) + + getInstrumentation().runOnMainSync { baseActivityTestRule.activity.recreate() } + getInstrumentation().waitForIdleSync() } - @Category(AppUi::class, Smoke::class, Quarantine::class) @Test fun testActivityRecreateAboutDialog() { - Espresso.openActionBarOverflowOrOptionsMenu(androidx.test.InstrumentationRegistry.getInstrumentation().targetContext) - Espresso.onView(ViewMatchers.withText(R.string.main_menu_about)) - .perform(ViewActions.click()) - InstrumentationRegistry.getInstrumentation().waitForIdleSync() - Espresso.onView(ViewMatchers.withText(R.string.dialog_about_title)) - .inRoot(RootMatchers.isDialog()) - .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) - InstrumentationRegistry.getInstrumentation() - .runOnMainSync { baseActivityTestRule.activity.recreate() } - InstrumentationRegistry.getInstrumentation().waitForIdleSync() + openActionBarOverflowOrOptionsMenu(applicationContext) + + onView(withText(R.string.main_menu_about)) + .perform(click()) + + getInstrumentation().waitForIdleSync() + + onView(withText(R.string.dialog_about_title)) + .inRoot(isDialog()) + .check(matches(isDisplayed())) + + getInstrumentation().runOnMainSync { baseActivityTestRule.activity.recreate() } + getInstrumentation().waitForIdleSync() } } diff --git a/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/regression/activitydestroy/ProjectListActivityRecreateRegressionTest.java b/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/regression/activitydestroy/ProjectListActivityRecreateRegressionTest.java deleted file mode 100644 index 2fba2f218b3..00000000000 --- a/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/regression/activitydestroy/ProjectListActivityRecreateRegressionTest.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Catroid: An on-device visual programming system for Android devices - * Copyright (C) 2010-2022 The Catrobat Team - * () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * An additional term exception under section 7 of the GNU Affero - * General Public License, version 3, is available at - * http://developer.catrobat.org/license_additional_term - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package org.catrobat.catroid.uiespresso.ui.regression.activitydestroy; - -import org.catrobat.catroid.ProjectManager; -import org.catrobat.catroid.R; -import org.catrobat.catroid.common.BrickValues; -import org.catrobat.catroid.content.Project; -import org.catrobat.catroid.content.Script; -import org.catrobat.catroid.content.Sprite; -import org.catrobat.catroid.content.StartScript; -import org.catrobat.catroid.content.bricks.SetXBrick; -import org.catrobat.catroid.formulaeditor.Formula; -import org.catrobat.catroid.io.XstreamSerializer; -import org.catrobat.catroid.rules.FlakyTestRule; -import org.catrobat.catroid.runner.Flaky; -import org.catrobat.catroid.testsuites.annotations.Cat; -import org.catrobat.catroid.testsuites.annotations.Level; -import org.catrobat.catroid.ui.ProjectListActivity; -import org.catrobat.catroid.uiespresso.util.rules.BaseActivityTestRule; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; - -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; - -import static org.catrobat.catroid.uiespresso.ui.fragment.rvutils.RecyclerViewInteractionWrapper.onRecyclerView; -import static org.hamcrest.Matchers.is; - -import static androidx.test.InstrumentationRegistry.getInstrumentation; -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard; -import static androidx.test.espresso.action.ViewActions.typeText; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.RootMatchers.isDialog; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withClassName; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; - -@RunWith(AndroidJUnit4.class) -public class ProjectListActivityRecreateRegressionTest { - - @Rule - public BaseActivityTestRule baseActivityTestRule = new - BaseActivityTestRule<>(ProjectListActivity.class, true, false); - - @Rule - public FlakyTestRule flakyTestRule = new FlakyTestRule(); - - private String projectName = "testProject"; - - @Before - public void setUp() throws Exception { - createProject(); - baseActivityTestRule.launchActivity(null); - } - - @Category({Cat.AppUi.class, Level.Smoke.class, Cat.Quarantine.class}) - @Flaky - @Test - public void testActivityRecreateRenameProjectDialog() { - openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext()); - onView(withText(R.string.rename)).perform(click()); - - onView(withText(R.string.rename_project)).inRoot(isDialog()) - .check(matches(isDisplayed())); - - InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - baseActivityTestRule.getActivity().recreate(); - } - }); - - InstrumentationRegistry.getInstrumentation().waitForIdleSync(); - } - - @Category({Cat.AppUi.class, Level.Smoke.class, Cat.Quarantine.class}) - @Flaky - @Test - public void testActivityRecreateNewProjectDialog() { - onRecyclerView().atPosition(0).onChildView(R.id.title_view) - .check(matches(withText(projectName))); - onView(withId(R.id.button_add)) - .perform(click()); - onView(withClassName(is("com.google.android.material.textfield.TextInputEditText"))) - .perform(typeText("TestProject0815"), closeSoftKeyboard()); - onView(withText(R.string.ok)) - .perform(click()); - - InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { - @Override - public void run() { - baseActivityTestRule.getActivity().recreate(); - } - }); - InstrumentationRegistry.getInstrumentation().waitForIdleSync(); - } - - private void createProject() { - Project project = new Project(ApplicationProvider.getApplicationContext(), projectName); - Sprite sprite = new Sprite("firstSprite"); - Script script = new StartScript(); - script.addBrick(new SetXBrick(new Formula(BrickValues.X_POSITION))); - sprite.addScript(script); - - project.getDefaultScene().addSprite(sprite); - ProjectManager.getInstance().setCurrentProject(project); - ProjectManager.getInstance().setCurrentSprite(sprite); - - ProjectManager.getInstance().setCurrentlyEditedScene(project.getDefaultScene()); - XstreamSerializer.getInstance().saveProject(project); - } -} diff --git a/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/regression/activitydestroy/ProjectListActivityRecreateRegressionTest.kt b/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/regression/activitydestroy/ProjectListActivityRecreateRegressionTest.kt new file mode 100644 index 00000000000..89734e20204 --- /dev/null +++ b/catroid/src/androidTest/java/org/catrobat/catroid/uiespresso/ui/regression/activitydestroy/ProjectListActivityRecreateRegressionTest.kt @@ -0,0 +1,129 @@ +/* + * Catroid: An on-device visual programming system for Android devices + * Copyright (C) 2010-2022 The Catrobat Team + * () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * An additional term exception under section 7 of the GNU Affero + * General Public License, version 3, is available at + * http://developer.catrobat.org/license_additional_term + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.catrobat.catroid.uiespresso.ui.regression.activitydestroy + +import androidx.test.core.app.ApplicationProvider.getApplicationContext +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.closeSoftKeyboard +import androidx.test.espresso.action.ViewActions.typeText +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.RootMatchers.isDialog +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation +import org.catrobat.catroid.ProjectManager +import org.catrobat.catroid.R +import org.catrobat.catroid.common.BrickValues.X_POSITION +import org.catrobat.catroid.content.Project +import org.catrobat.catroid.content.Script +import org.catrobat.catroid.content.Sprite +import org.catrobat.catroid.content.StartScript +import org.catrobat.catroid.content.bricks.SetXBrick +import org.catrobat.catroid.formulaeditor.Formula +import org.catrobat.catroid.io.XstreamSerializer +import org.catrobat.catroid.rules.FlakyTestRule +import org.catrobat.catroid.runner.Flaky +import org.catrobat.catroid.testsuites.annotations.Cat.AppUi +import org.catrobat.catroid.testsuites.annotations.Cat.Quarantine +import org.catrobat.catroid.testsuites.annotations.Level.Smoke +import org.catrobat.catroid.ui.ProjectListActivity +import org.catrobat.catroid.uiespresso.ui.fragment.rvutils.RecyclerViewInteractionWrapper.onRecyclerView +import org.catrobat.catroid.uiespresso.util.rules.BaseActivityTestRule +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.experimental.categories.Category +import org.junit.runner.RunWith + +@Category(AppUi::class, Smoke::class, Quarantine::class) +@RunWith(AndroidJUnit4::class) +class ProjectListActivityRecreateRegressionTest { + @get:Rule + var baseActivityTestRule = BaseActivityTestRule( + ProjectListActivity::class.java, true, false + ) + + @get:Rule + var flakyTestRule = FlakyTestRule() + private val projectName = "testProject" + + @Before + fun setUp() { + createProject() + baseActivityTestRule.launchActivity(null) + } + + @Flaky + @Test + fun testActivityRecreateRenameProjectDialog() { + openActionBarOverflowOrOptionsMenu(getApplicationContext()) + + onView(withText(R.string.rename)).perform(click()) + + onView(withText(R.string.rename_project)) + .inRoot(isDialog()) + .check(matches(isDisplayed())) + + getInstrumentation().runOnMainSync { baseActivityTestRule.activity.recreate() } + getInstrumentation().waitForIdleSync() + } + + @Flaky + @Test + fun testActivityRecreateNewProjectDialog() { + onRecyclerView().atPosition(0).onChildView(R.id.title_view) + .check(matches(withText(projectName))) + + onView(withId(R.id.button_add)) + .perform(click()) + + onView(withId(R.id.input_edit_text)) + .perform(typeText("TestProject0815"), closeSoftKeyboard()) + + onView(withId(R.id.confirm)) + .perform(click()) + + getInstrumentation().runOnMainSync { baseActivityTestRule.activity.recreate() } + getInstrumentation().waitForIdleSync() + } + + private fun createProject() { + val project = Project(getApplicationContext(), projectName) + val sprite = Sprite("firstSprite") + val script: Script = StartScript() + + script.addBrick(SetXBrick(Formula(X_POSITION))) + sprite.addScript(script) + project.defaultScene.addSprite(sprite) + + ProjectManager.getInstance().currentProject = project + ProjectManager.getInstance().currentSprite = sprite + ProjectManager.getInstance().currentlyEditedScene = project.defaultScene + + XstreamSerializer.getInstance().saveProject(project) + } +} diff --git a/catroid/src/main/java/org/catrobat/catroid/ui/ProjectListActivity.kt b/catroid/src/main/java/org/catrobat/catroid/ui/ProjectListActivity.kt index cdcb957d4cd..931f5ed1040 100644 --- a/catroid/src/main/java/org/catrobat/catroid/ui/ProjectListActivity.kt +++ b/catroid/src/main/java/org/catrobat/catroid/ui/ProjectListActivity.kt @@ -29,7 +29,7 @@ import androidx.fragment.app.Fragment import org.catrobat.catroid.BuildConfig import org.catrobat.catroid.R import org.catrobat.catroid.databinding.ActivityRecyclerBinding -import org.catrobat.catroid.ui.recyclerview.dialog.NewProjectDialogFragment +import org.catrobat.catroid.ui.dialogs.NewProjectDialogFragment import org.catrobat.catroid.ui.recyclerview.fragment.ProjectListFragment class ProjectListActivity : BaseCastActivity() { diff --git a/catroid/src/main/java/org/catrobat/catroid/ui/dialogs/NewProjectDialogFragment.kt b/catroid/src/main/java/org/catrobat/catroid/ui/dialogs/NewProjectDialogFragment.kt new file mode 100644 index 00000000000..b37848ae2d0 --- /dev/null +++ b/catroid/src/main/java/org/catrobat/catroid/ui/dialogs/NewProjectDialogFragment.kt @@ -0,0 +1,163 @@ +/* + * Catroid: An on-device visual programming system for Android devices + * Copyright (C) 2010-2022 The Catrobat Team + * () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * An additional term exception under section 7 of the GNU Affero + * General Public License, version 3, is available at + * http://developer.catrobat.org/license_additional_term + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.catrobat.catroid.ui.dialogs + +import android.content.Intent +import android.os.Bundle +import android.text.Editable +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import android.view.View.VISIBLE +import android.view.ViewGroup +import android.view.Window +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.DialogFragment +import org.catrobat.catroid.ProjectManager +import org.catrobat.catroid.R +import org.catrobat.catroid.common.DefaultProjectHandler +import org.catrobat.catroid.common.Nameable +import org.catrobat.catroid.databinding.DialogNewProjectBinding +import org.catrobat.catroid.merge.NewProjectNameTextWatcher +import org.catrobat.catroid.ui.ProjectActivity +import org.catrobat.catroid.ui.recyclerview.dialog.ReplaceExistingProjectDialogFragment.projectExistsInDirectory +import org.catrobat.catroid.ui.recyclerview.util.UniqueNameProvider +import org.catrobat.catroid.ui.settingsfragments.SettingsFragment.isCastSharedPreferenceEnabled +import org.catrobat.catroid.utils.ToastUtil +import org.koin.android.ext.android.inject +import java.io.IOException + +class NewProjectDialogFragment : DialogFragment() { + private val projectManager: ProjectManager by inject() + private var _binding: DialogNewProjectBinding? = null + private val binding get() = _binding!! + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + _binding = DialogNewProjectBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NORMAL, Window.FEATURE_NO_TITLE) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setHasOptionsMenu(true) + + (requireActivity() as AppCompatActivity).setSupportActionBar(binding.toolbar.toolbar) + (requireActivity() as AppCompatActivity).supportActionBar?.setTitle(R.string.new_project_title) + + binding.toolbar.toolbar.setNavigationIcon(R.drawable.ic_close) + binding.toolbar.toolbar.setNavigationOnClickListener { dismiss() } + + if (isCastSharedPreferenceEnabled(activity)) { + binding.castRadioButton.visibility = VISIBLE + } + + val uniqueNameProvider: UniqueNameProvider = object : UniqueNameProvider() { + override fun isUnique(newName: String) = !projectExistsInDirectory(newName) + } + + binding.input.hint = getString(R.string.project_name_label) + binding.inputEditText.apply { + setText(uniqueNameProvider.getUniqueName(getString(R.string.default_project_name), null)) + addTextChangedListener(object : NewProjectNameTextWatcher() { + override fun afterTextChanged(s: Editable?) { + binding.input.error = validateInput(s.toString(), getContext()) + activity?.invalidateOptionsMenu() + } + }) + requestFocus() + } + } + + fun createProject() { + val projectName = binding.inputEditText.text.toString().trim() + var landscapeMode = false + var projectCreatorType = DefaultProjectHandler.ProjectCreatorType.PROJECT_CREATOR_DEFAULT + var castProject = false + + when (binding.radioGroup.checkedRadioButtonId) { + R.id.landscape_radio_button -> landscapeMode = true + R.id.cast_radio_button -> { + castProject = true + projectCreatorType = DefaultProjectHandler.ProjectCreatorType.PROJECT_CREATOR_CAST + } + } + + try { + when (binding.exampleProjectSwitch.isChecked) { + true -> projectManager.createNewExampleProject(projectName, projectCreatorType, landscapeMode) + false -> projectManager.createNewEmptyProject(projectName, landscapeMode, castProject) + } + + activity?.startActivity(Intent(activity, ProjectActivity::class.java)) + } catch (_: IOException) { + ToastUtil.showError(activity, R.string.error_new_project) + } + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.menu_confirm, menu) + return super.onCreateOptionsMenu(menu, inflater) + } + + override fun onPrepareOptionsMenu(menu: Menu) { + for (index in 0 until menu.size()) { + menu.getItem(index).isVisible = false + } + + val confirm = menu.findItem(R.id.confirm) + if (binding.input.error == null) { + confirm.setIcon(R.drawable.ic_done) + confirm.isEnabled = true + } else { + confirm.setIcon(R.drawable.ic_done_disabled) + confirm.isEnabled = false + } + + confirm.isVisible = true + + super.onPrepareOptionsMenu(menu) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.confirm -> { + dismiss() + createProject() + } + else -> return super.onOptionsItemSelected(item) + } + return true + } + + companion object { + val TAG: String = NewProjectDialogFragment::class.java.simpleName + } +} diff --git a/catroid/src/main/java/org/catrobat/catroid/ui/recyclerview/dialog/NewProjectDialogFragment.java b/catroid/src/main/java/org/catrobat/catroid/ui/recyclerview/dialog/NewProjectDialogFragment.java deleted file mode 100644 index 4217edc9018..00000000000 --- a/catroid/src/main/java/org/catrobat/catroid/ui/recyclerview/dialog/NewProjectDialogFragment.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Catroid: An on-device visual programming system for Android devices - * Copyright (C) 2010-2022 The Catrobat Team - * () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * An additional term exception under section 7 of the GNU Affero - * General Public License, version 3, is available at - * http://developer.catrobat.org/license_additional_term - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package org.catrobat.catroid.ui.recyclerview.dialog; - -import android.app.Dialog; -import android.content.Intent; -import android.os.Bundle; -import android.view.View; -import android.widget.RadioGroup; - -import com.google.android.material.switchmaterial.SwitchMaterial; - -import org.catrobat.catroid.ProjectManager; -import org.catrobat.catroid.R; -import org.catrobat.catroid.merge.NewProjectNameTextWatcher; -import org.catrobat.catroid.ui.ProjectActivity; -import org.catrobat.catroid.ui.recyclerview.util.UniqueNameProvider; -import org.catrobat.catroid.ui.settingsfragments.SettingsFragment; -import org.catrobat.catroid.utils.ToastUtil; - -import java.io.IOException; - -import androidx.fragment.app.DialogFragment; - -import static org.catrobat.catroid.common.DefaultProjectHandler.ProjectCreatorType.PROJECT_CREATOR_CAST; -import static org.catrobat.catroid.common.DefaultProjectHandler.ProjectCreatorType.PROJECT_CREATOR_DEFAULT; - -public class NewProjectDialogFragment extends DialogFragment { - - public static final String TAG = NewProjectDialogFragment.class.getSimpleName(); - - private boolean exampleProject; - private boolean castProject; - private boolean landscape; - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - View view = View.inflate(getActivity(), R.layout.dialog_new_project, null); - - final RadioGroup radioGroup = view.findViewById(R.id.radio_group); - final SwitchMaterial exampleProjectSwitch = view.findViewById(R.id.example_project_switch); - - if (SettingsFragment.isCastSharedPreferenceEnabled(getActivity())) { - view.findViewById(R.id.cast_radio_button).setVisibility(View.VISIBLE); - } - UniqueNameProvider uniqueNameProvider = new UniqueNameProvider() { - @Override - public boolean isUnique(String newName) { - return (!ReplaceExistingProjectDialogFragment.projectExistsInDirectory(newName)); - } - }; - TextInputDialog.Builder builder = new TextInputDialog.Builder(getContext()) - .setHint(getString(R.string.project_name_label)) - .setText(uniqueNameProvider.getUniqueName(getString(R.string.default_project_name), null)) - .setTextWatcher(new NewProjectNameTextWatcher<>()) - .setPositiveButton(getString(R.string.ok), (TextInputDialog.OnClickListener) (dialog, textInput) -> { - exampleProject = exampleProjectSwitch.isChecked(); - - switch (radioGroup.getCheckedRadioButtonId()) { - case R.id.portrait_radio_button: - landscape = false; - break; - case R.id.landscape_mode_radio_button: - landscape = true; - break; - case R.id.cast_radio_button: - castProject = true; - break; - default: - throw new IllegalStateException(TAG + ": No radio button id match, check layout?"); - } - - createProject(textInput, landscape, exampleProject, castProject); - }); - - return builder - .setView(view) - .setNegativeButton(R.string.cancel, null) - .create(); - } - - void createProject(String projectName, boolean landscape, boolean exampleProject, - boolean castProject) { - try { - if (exampleProject) { - if (castProject) { - ProjectManager.getInstance() - .createNewExampleProject(projectName, getContext(), PROJECT_CREATOR_CAST, false); - } else { - ProjectManager.getInstance() - .createNewExampleProject(projectName, getContext(), PROJECT_CREATOR_DEFAULT, landscape); - } - } else { - if (castProject) { - ProjectManager.getInstance() - .createNewEmptyProject(projectName, getContext(), false, true); - } else { - ProjectManager.getInstance() - .createNewEmptyProject(projectName, getContext(), landscape, false); - } - } - getActivity().startActivity(new Intent(getActivity(), ProjectActivity.class)); - } catch (IOException e) { - ToastUtil.showError(getActivity(), R.string.error_new_project); - } - } -} diff --git a/catroid/src/main/java/org/catrobat/catroid/ui/recyclerview/fragment/MainMenuFragment.kt b/catroid/src/main/java/org/catrobat/catroid/ui/recyclerview/fragment/MainMenuFragment.kt index 581630860ee..2f14b246e81 100644 --- a/catroid/src/main/java/org/catrobat/catroid/ui/recyclerview/fragment/MainMenuFragment.kt +++ b/catroid/src/main/java/org/catrobat/catroid/ui/recyclerview/fragment/MainMenuFragment.kt @@ -52,6 +52,7 @@ import org.catrobat.catroid.ui.ProjectActivity import org.catrobat.catroid.ui.ProjectListActivity import org.catrobat.catroid.ui.ProjectUploadActivity import org.catrobat.catroid.ui.WebViewActivity +import org.catrobat.catroid.ui.dialogs.NewProjectDialogFragment import org.catrobat.catroid.ui.recyclerview.CategoryTitleCallback import org.catrobat.catroid.ui.recyclerview.FeaturedProjectCallback import org.catrobat.catroid.ui.recyclerview.IndicatorDecoration @@ -59,7 +60,6 @@ import org.catrobat.catroid.ui.recyclerview.ProjectListener import org.catrobat.catroid.ui.recyclerview.adapter.CategoriesAdapter import org.catrobat.catroid.ui.recyclerview.adapter.FeaturedProjectsAdapter import org.catrobat.catroid.ui.recyclerview.adapter.HorizontalProjectsAdapter -import org.catrobat.catroid.ui.recyclerview.dialog.NewProjectDialogFragment import org.catrobat.catroid.ui.recyclerview.viewmodel.MainFragmentViewModel import org.catrobat.catroid.utils.FileMetaDataExtractor import org.catrobat.catroid.utils.ProjectDownloadUtil.setFragment @@ -302,8 +302,10 @@ class MainMenuFragment : Fragment(), .loadProjectAsync() } - R.id.newProjectFloatingActionButton -> - NewProjectDialogFragment().show(parentFragmentManager, NewProjectDialogFragment.TAG) + R.id.newProjectFloatingActionButton -> { + val dialog = NewProjectDialogFragment() + dialog.show(parentFragmentManager, NewProjectDialogFragment.TAG) + } R.id.uploadProject -> { if (Utils.isDefaultProject(projectManager.currentProject, activity)) { @@ -356,8 +358,8 @@ class MainMenuFragment : Fragment(), } companion object { + val TAG: String = MainMenuFragment::class.java.simpleName private const val CURRENT_THUMBNAIL_SIZE = 500 - val TAG = MainMenuFragment::class.java.simpleName private const val MAX_PROJECTS_NUMBER = 10 } } diff --git a/catroid/src/main/res/drawable/ic_done_disabled.xml b/catroid/src/main/res/drawable/ic_done_disabled.xml new file mode 100644 index 00000000000..ab12b6b0290 --- /dev/null +++ b/catroid/src/main/res/drawable/ic_done_disabled.xml @@ -0,0 +1,33 @@ + + + + + diff --git a/catroid/src/main/res/layout/dialog_new_project.xml b/catroid/src/main/res/layout/dialog_new_project.xml index bf2d62dd106..fd120a9b147 100644 --- a/catroid/src/main/res/layout/dialog_new_project.xml +++ b/catroid/src/main/res/layout/dialog_new_project.xml @@ -24,77 +24,89 @@ + android:layout_height="match_parent" > + android:orientation="vertical" > - + + + android:orientation="vertical" + android:divider="@drawable/divider" + android:showDividers="middle|end" > - - - - - + android:paddingTop="@dimen/dialog_content_area_padding_top" + android:paddingStart="@dimen/dialog_content_area_padding_input" + android:paddingEnd="@dimen/dialog_content_area_padding_input" + app:errorEnabled="true" + app:hintEnabled="true" > - + + - + - + - + - + + + + - \ No newline at end of file + diff --git a/catroid/src/main/res/values/strings.xml b/catroid/src/main/res/values/strings.xml index 3b4f615fbb4..cff0654380c 100644 --- a/catroid/src/main/res/values/strings.xml +++ b/catroid/src/main/res/values/strings.xml @@ -687,7 +687,11 @@ + Create project Example project + Portrait + Landscape + Cast