From 87e8d6d5d8d33cf2a251a12000347c057262f8b1 Mon Sep 17 00:00:00 2001 From: athirai-s <58971257+athirai-s@users.noreply.github.com> Date: Thu, 21 Sep 2023 20:10:35 +0530 Subject: [PATCH 01/17] Placement to Promotion --- .../tutorengine/util/PromotionMechanism.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/PromotionMechanism.java b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/PromotionMechanism.java index 88b8f7f27..e642435b1 100644 --- a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/PromotionMechanism.java +++ b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/PromotionMechanism.java @@ -286,8 +286,8 @@ private String getNextPlacementTutor(String activeTutorId, boolean useMathPlacem // student has made it to the end CPlacementTest_Tutor lastPlacementTest = _matrix.mathPlacement[mathPlacementIndex]; // off-by-one??? they'll never reach it :) // update our preferences to exit PLACEMENT mode - _studentModel.updateMathPlacement(false, false); - _studentModel.updateMathPlacementIndex(null, false); + _studentModel.updateMathPlacement(true, true); //reached end -> jump to promotion + _studentModel.updateMathPlacementIndex(null, true); _studentModel.saveAll(); @@ -317,8 +317,8 @@ private String getNextPlacementTutor(String activeTutorId, boolean useMathPlacem CPlacementTest_Tutor lastPlacementTest = _matrix.writePlacement[writingPlacementIndex]; // off-by-one??? they'll never reach it :) // update our preferences to exit PLACEMENT mode - _studentModel.updateWritingPlacement(false, false); - _studentModel.updateWritingPlacementIndex(null, false); //editor.remove("WRITING_PLACEMENT_INDEX"); + _studentModel.updateWritingPlacement(true, true); // once they reach index lenght, jump to promotion + _studentModel.updateWritingPlacementIndex(null, true); //editor.remove("WRITING_PLACEMENT_INDEX"); _studentModel.saveAll(); return lastPlacementTest.fail; // go to beginning of last level @@ -353,15 +353,15 @@ private String getNextPlacementTutor(String activeTutorId, boolean useMathPlacem // set prefs.usesThingy to false if(useMathPlacement) { lastPlacementTest = _matrix.mathPlacement[placementIndex]; - _studentModel.updateMathPlacement(false, false); // editor.putBoolean(placementKey, false); // no more placement - _studentModel.updateMathPlacementIndex(null, false); + _studentModel.updateMathPlacement(true, true); // editor.putBoolean(placementKey, false); // no more placement + _studentModel.updateMathPlacementIndex(null, true); } // useWritePlacement only other option else { lastPlacementTest = _matrix.writePlacement[placementIndex]; - _studentModel.updateWritingPlacement(false, false); // editor.putBoolean(placementKey, false); // no more placement - _studentModel.updateWritingPlacementIndex(null, false); // editor.remove(placementIndexKey); + _studentModel.updateWritingPlacement(true, true); //jump to promotion + _studentModel.updateWritingPlacementIndex(null, true); // editor.remove(placementIndexKey); } _studentModel.saveAll(); From 45c35dcc56bac0120b98b4583f2a70f7e1d8874b Mon Sep 17 00:00:00 2001 From: R I T E S H <81812754+ritessshhh@users.noreply.github.com> Date: Fri, 27 Dec 2024 12:24:22 -0500 Subject: [PATCH 02/17] Update build.gradle --- build.gradle | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 40e6d4a32..787ead8c7 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,6 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.3' // NOTE: Do not place your application dependencies here; they belong @@ -23,9 +22,15 @@ allprojects { google() } + dependencies { + modules { + module("com.google.android:flexbox") { + replacedBy("com.google.android.flexbox:flexbox") + } + } + } + // Global variables common to all modules - // see: http://tools.android.com/tech-docs/new-build-system/tips - // ext { rtCompileSdkVersion=29 //Integer rtBuildToolsVersion="26.0.1" //String @@ -34,23 +39,17 @@ allprojects { // Note that using target version 22 bypasses the new run-time permissions found // in Marshmallow 23 - // rtTargetSdkVersion=22 rtVersionCode=1 // Semantic versioning description: // - - rtVersionName="3.5.0.1" //TODO: move this out of build so we don't have to rebuild to unzip assets - } } task clean(type: Delete) { delete rootProject.buildDir } - - From 846266c79c6dd109974b75a9f2908f5af0aeb795 Mon Sep 17 00:00:00 2001 From: R I T E S H <81812754+ritessshhh@users.noreply.github.com> Date: Fri, 27 Dec 2024 12:29:08 -0500 Subject: [PATCH 03/17] Update build.gradle --- comp_nd/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/comp_nd/build.gradle b/comp_nd/build.gradle index 4479194ff..96488ba41 100644 --- a/comp_nd/build.gradle +++ b/comp_nd/build.gradle @@ -34,5 +34,5 @@ dependencies { api project (':resources') implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'com.google.android:flexbox:1.0.0' + implementation 'com.google.android.flexbox:flexbox:3.0.0' } From 52c8fff40b272a71f54d4c408f6298bda5a38841 Mon Sep 17 00:00:00 2001 From: ritessshhh Date: Fri, 27 Dec 2024 12:49:10 -0500 Subject: [PATCH 04/17] updated gradle --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 86801e0ed..c76c1f067 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -138,4 +138,4 @@ task getVersionName() { project.gradle.projectsEvaluated { println "$project.android.defaultConfig.versionName" } -} +} \ No newline at end of file From b918d32291d6354d2ad22e457a30d7b9f34f6039 Mon Sep 17 00:00:00 2001 From: R I T E S H <81812754+ritessshhh@users.noreply.github.com> Date: Fri, 27 Dec 2024 13:09:07 -0500 Subject: [PATCH 05/17] Update build.gradle --- app/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c76c1f067..3ca4c2854 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -130,6 +130,7 @@ dependencies { implementation project(path: ':comp_spelling') implementation project(path: ':comp_intervention') + implementation 'com.blankj:utilcode:1.30.6' implementation 'com.github.RoboTutorLLC:ScreenRecordHelper:1.0.0' implementation 'com.github.HBiSoft:HBRecorder:2.0.3' } @@ -138,4 +139,4 @@ task getVersionName() { project.gradle.projectsEvaluated { println "$project.android.defaultConfig.versionName" } -} \ No newline at end of file +} From 3abc3f4a38aaa06690df4e066874f70d18c35aa8 Mon Sep 17 00:00:00 2001 From: R I T E S H <81812754+ritessshhh@users.noreply.github.com> Date: Fri, 27 Dec 2024 13:17:20 -0500 Subject: [PATCH 06/17] Update build.gradle --- app/build.gradle | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3ca4c2854..d570fe913 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,7 +10,6 @@ android { targetSdkVersion rootProject.ext.rtTargetSdkVersion versionCode rootProject.ext.rtVersionCode versionName rootProject.ext.rtVersionName - // default is signed by the Android default key multiDexEnabled true } @@ -19,13 +18,8 @@ android { unitTests.returnDefaultValues = true } - // Create a variable called keystorePropertiesFile, and initialize it to your - // keystore.properties file, in the sample_config_files folder, inside app/src. def keystorePropertiesFile = rootProject.file("app/src/sample_config_files/sample_keystore.properties") - // Initialize a new Properties() object called keystoreProperties def keystoreProperties = new Properties() - - // Load your keystore.properties file into the keystoreProperties object. keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) signingConfigs { @@ -38,7 +32,6 @@ android { } buildTypes { - release { signingConfig signingConfigs.android minifyEnabled false @@ -47,18 +40,12 @@ android { debug { debuggable true } - - // This release includes the DEBUG selector and other various debug support features. - // release_dbg { debuggable true signingConfig signingConfigs.android } - } - // define apk naming behavior - // define apk naming behavior applicationVariants.all { variant -> variant.outputs.each { output -> def project = "robotutor" @@ -67,22 +54,18 @@ android { def version = variant.versionName def newApkName = project + SEP + buildType + SEP + version + ".apk" -// new File(output.outputFile.parent, newApkName) output.outputFileName = new File("./../../../../../build/", newApkName) } } lintOptions { - // set to true to turn off analysis progress reporting by lint quiet false - // if true, stop the gradle build if errors are found abortOnError false - // if true, only report errors ignoreWarnings true } apply from: "checkstyle.gradle" - afterEvaluate{ + afterEvaluate { preBuild.dependsOn('checkstyle') check.dependsOn 'checkstyle' } @@ -90,7 +73,12 @@ android { } repositories { + google() mavenCentral() + maven { + // Added the custom Maven repository + url 'http://maven.xdja.com:8081/nexus3/repository/aliyun/' + } } dependencies { @@ -130,7 +118,8 @@ dependencies { implementation project(path: ':comp_spelling') implementation project(path: ':comp_intervention') - implementation 'com.blankj:utilcode:1.30.6' + // Updated dependency to use the exact version from the custom repository + implementation 'com.blankj:utilcode:1.24.4' implementation 'com.github.RoboTutorLLC:ScreenRecordHelper:1.0.0' implementation 'com.github.HBiSoft:HBRecorder:2.0.3' } From 2582b5518744711fb9d459dbf8837da9961ce2a7 Mon Sep 17 00:00:00 2001 From: R I T E S H <81812754+ritessshhh@users.noreply.github.com> Date: Fri, 27 Dec 2024 13:25:36 -0500 Subject: [PATCH 07/17] Update build.gradle --- app/build.gradle | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d570fe913..0e07c31d3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,18 +11,22 @@ android { versionCode rootProject.ext.rtVersionCode versionName rootProject.ext.rtVersionName + // Enable multidex support multiDexEnabled true } testOptions { + // Ensure unit tests return default values for easier testing unitTests.returnDefaultValues = true } + // Load keystore properties for signing def keystorePropertiesFile = rootProject.file("app/src/sample_config_files/sample_keystore.properties") def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) signingConfigs { + // Signing configuration for release builds android { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] @@ -32,20 +36,24 @@ android { } buildTypes { + // Configuration for release builds release { signingConfig signingConfigs.android minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } + // Configuration for debug builds debug { debuggable true } + // Custom debug build type with signing release_dbg { debuggable true signingConfig signingConfigs.android } } + // Define APK naming behavior applicationVariants.all { variant -> variant.outputs.each { output -> def project = "robotutor" @@ -53,36 +61,43 @@ android { def buildType = variant.buildType.name def version = variant.versionName + // Set a custom APK name def newApkName = project + SEP + buildType + SEP + version + ".apk" output.outputFileName = new File("./../../../../../build/", newApkName) } } lintOptions { + // Set to true to turn off analysis progress reporting by lint quiet false + // If true, stop the gradle build if errors are found abortOnError false + // If true, only report errors ignoreWarnings true } + // Apply checkstyle for code quality checks apply from: "checkstyle.gradle" afterEvaluate { preBuild.dependsOn('checkstyle') check.dependsOn 'checkstyle' } - } repositories { google() mavenCentral() + // Added the custom Maven repository for utilcode maven { - // Added the custom Maven repository url 'http://maven.xdja.com:8081/nexus3/repository/aliyun/' } } dependencies { + // Unit testing dependency testImplementation 'junit:junit:4.12' + + // Core dependencies implementation 'com.writingminds:FFmpegAndroid:0.3.2' implementation 'com.google.guava:guava:25.0-android' implementation 'androidx.appcompat:appcompat:1.0.0' @@ -90,6 +105,8 @@ dependencies { implementation 'com.google.code.gson:gson:2.8.7' implementation 'org.mp4parser:isoparser:1.9.41' implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' + + // Project-specific dependencies implementation project(':comp_banner') implementation project(':comp_ltkplus') implementation project(':util') @@ -116,14 +133,17 @@ dependencies { implementation project(path: ':comp_picmatch') implementation project(path: ':comp_bigmath') implementation project(path: ':comp_spelling') - implementation project(path: ':comp_intervention') - // Updated dependency to use the exact version from the custom repository + + // Dependency resolved from custom Maven repository implementation 'com.blankj:utilcode:1.24.4' + + // External libraries implementation 'com.github.RoboTutorLLC:ScreenRecordHelper:1.0.0' implementation 'com.github.HBiSoft:HBRecorder:2.0.3' } +// Task to retrieve version name task getVersionName() { project.gradle.projectsEvaluated { println "$project.android.defaultConfig.versionName" From a2357b7c14e159cd72d3196f702c7d1a998478e1 Mon Sep 17 00:00:00 2001 From: ritessshhh Date: Tue, 18 Feb 2025 06:48:13 -0500 Subject: [PATCH 08/17] recompiling the exe --- .../tutorengine/util/StudentChooseMatrixActivityMenu.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java index 30363927d..21352631c 100644 --- a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java +++ b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java @@ -15,7 +15,6 @@ /** * StudentChooseMatrixActivityMenu - * * An Activity Menu style where the student chooses which matrix they'll play in. *

* Created by kevindeland on 9/25/18. From 96c4bc80b92c2b1599cfcb748daa80580f82aaab Mon Sep 17 00:00:00 2001 From: R I T E S H <81812754+ritessshhh@users.noreply.github.com> Date: Tue, 18 Feb 2025 06:55:59 -0500 Subject: [PATCH 09/17] Update build-workflow.yml --- .github/workflows/build-workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-workflow.yml b/.github/workflows/build-workflow.yml index be07597af..225e38a21 100644 --- a/.github/workflows/build-workflow.yml +++ b/.github/workflows/build-workflow.yml @@ -44,7 +44,7 @@ jobs: run: mv build/robotutor.debug.${{ steps.fetch_version_name.outputs.VERSION_NAME }}.apk build/${{ steps.fetch_apk_name.outputs.APK_NAME }}.apk - name: Upload APK - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ steps.fetch_apk_name.outputs.APK_NAME }}.apk - path: build/${{ steps.fetch_apk_name.outputs.APK_NAME }}.apk \ No newline at end of file + path: build/${{ steps.fetch_apk_name.outputs.APK_NAME }}.apk From 7474b777404f6c33f5eb0bed5aea9e87e335b1f7 Mon Sep 17 00:00:00 2001 From: R I T E S H <81812754+ritessshhh@users.noreply.github.com> Date: Tue, 18 Feb 2025 07:04:05 -0500 Subject: [PATCH 10/17] Update gradle.properties --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index df730a970..09408db4c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ # Default value: -Xmx10248m -XX:MaxPermSize=256m android.enableJetifier=true android.useAndroidX=true -org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx3072m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit @@ -21,4 +21,4 @@ org.gradle.parallel=true #android.useAndroidX=true # -#android.enableJetifier=true \ No newline at end of file +#android.enableJetifier=true From 166412a04e93b443ba4706c3d35708e26bbecf9d Mon Sep 17 00:00:00 2001 From: R I T E S H <81812754+ritessshhh@users.noreply.github.com> Date: Tue, 18 Feb 2025 07:10:47 -0500 Subject: [PATCH 11/17] Update gradle.properties --- gradle.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 09408db4c..941fc6cea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,8 +12,7 @@ # Default value: -Xmx10248m -XX:MaxPermSize=256m android.enableJetifier=true android.useAndroidX=true -org.gradle.jvmargs=-Xmx3072m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - +org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects From 205f1179f71f5e2f937a216aaf60b8b0992f64ed Mon Sep 17 00:00:00 2001 From: R I T E S H <81812754+ritessshhh@users.noreply.github.com> Date: Tue, 18 Feb 2025 07:12:58 -0500 Subject: [PATCH 12/17] Update build-workflow.yml --- .github/workflows/build-workflow.yml | 37 ++++++++++++++++++---------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-workflow.yml b/.github/workflows/build-workflow.yml index 225e38a21..e11733c16 100644 --- a/.github/workflows/build-workflow.yml +++ b/.github/workflows/build-workflow.yml @@ -5,46 +5,57 @@ name: Pre Merge Checks on: push: branches: - - '*' - + - '*' # This means the workflow will run on push events for all branches. # Jobs to be run on this workflow jobs: build: - runs-on: 'ubuntu-latest' + runs-on: 'ubuntu-latest' # Specifies the runner environment (Ubuntu latest version). + steps: - name: Checkout Repo - uses: actions/checkout@v3 + uses: actions/checkout@v3 # This step checks out the repository so that workflow can access the code. + + - name: Set up JDK 11 # 👈 We are explicitly setting Java version to 11 to ensure compatibility with Gradle 6.5. + uses: actions/setup-java@v3 # GitHub-provided action to set up Java. + with: + distribution: 'temurin' # We are using the Temurin (Adoptium) distribution. + java-version: '11' # Setting Java to version 11 because Gradle 6.5 does not support Java 17. - name: Build project - run: ./gradlew assembleDebug + run: ./gradlew assembleDebug # This command builds the project and generates the APK. - name: Fetch current datetime id: fetch_current_datetime run: echo "DATE_TIME=$(date +%Y%m%d_%H%M%S.%N | cut -b1-19)" >> $GITHUB_OUTPUT - # steps.fetch_current_datetime.outputs.DATE_TIME - # cut -b1-19 : example- 20230316_125512.123 - 19 characters + # Fetches the current date and time in the format YYYYMMDD_HHMMSS.milliseconds. + # Example output: 20230316_125512.123 + # `cut -b1-19` ensures that we get only the first 19 characters of the timestamp. - name: Fetch current branch name id: fetch_current_branch run: echo "BRANCH_NAME=${{ github.head_ref || github.ref_name }}" >> $GITHUB_OUTPUT - # steps.fetch_current_branch.outputs.BRANCH_NAME + # Extracts the name of the branch that triggered the workflow. + # If it's a pull request, it uses `github.head_ref`, otherwise `github.ref_name`. - name: Fetch app version name id: fetch_version_name run: echo "VERSION_NAME=$(./gradlew -q getVersionName --warning-mode=none)" >> $GITHUB_OUTPUT - # steps.fetch_version_name.outputs.VERSION_NAME + # Uses Gradle to extract the app version name from the project's build settings. + # `-q` ensures that only the version name is printed without unnecessary logs. - name: Fetch APK Name id: fetch_apk_name run: echo "APK_NAME=RoboTutor2020-${{ steps.fetch_current_branch.outputs.BRANCH_NAME }}-${{ steps.fetch_version_name.outputs.VERSION_NAME }}-${{ steps.fetch_current_datetime.outputs.DATE_TIME }}" >> $GITHUB_OUTPUT - # steps.fetch_apk_name.outputs.APK_NAME + # Constructs a unique APK filename using the branch name, app version, and timestamp. + # Example filename: RoboTutor2020-main-1.2.3-20230316_125512.123.apk - name: Rename APK run: mv build/robotutor.debug.${{ steps.fetch_version_name.outputs.VERSION_NAME }}.apk build/${{ steps.fetch_apk_name.outputs.APK_NAME }}.apk + # Renames the APK file generated during the build process to match the formatted name. - name: Upload APK - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v4 # Uploads the generated APK as an artifact for later use. with: - name: ${{ steps.fetch_apk_name.outputs.APK_NAME }}.apk - path: build/${{ steps.fetch_apk_name.outputs.APK_NAME }}.apk + name: ${{ steps.fetch_apk_name.outputs.APK_NAME }}.apk # Uses the generated APK name. + path: build/${{ steps.fetch_apk_name.outputs.APK_NAME }}.apk # Specifies the path of the APK file to upload. From d4ed33f133208bca39c2f5eb7066b1e1a917c82e Mon Sep 17 00:00:00 2001 From: ritessshhh Date: Tue, 18 Feb 2025 09:27:38 -0500 Subject: [PATCH 13/17] added placement feature for student matrix again --- .../tutorengine/util/PromotionMechanism.java | 10 ++- .../util/StudentChooseMatrixActivityMenu.java | 76 +++++++++++++--- .../ask_activity_selector_2x2_elevate.xml | 68 ++++++++++++++ .../ask_activity_selector_2x3_elevate.xml | 90 +++++++++++++++++++ .../cmu/xprize/comp_session/AS_CONST.java | 2 +- 5 files changed, 232 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/layout/ask_activity_selector_2x2_elevate.xml create mode 100644 app/src/main/res/layout/ask_activity_selector_2x3_elevate.xml diff --git a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/PromotionMechanism.java b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/PromotionMechanism.java index e642435b1..08908be0b 100644 --- a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/PromotionMechanism.java +++ b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/PromotionMechanism.java @@ -29,6 +29,13 @@ public class PromotionMechanism { private IStudentDataModel _studentModel; // holds the StudentDataModel private TransitionMatrixModel _matrix; // now holds the transition map things... + public static final PerformanceData performance; // `final` ensures it can't be changed + + // Static block to initialize `performance` if it needs to be done in a specific way + static { + performance = new PerformanceData(); // Initialize here, can be any valid initialization + } + public PromotionMechanism(IStudentDataModel studentModel, TransitionMatrixModel matrix) { this._studentModel = studentModel; this._matrix = matrix; @@ -156,7 +163,6 @@ private String selectNextTutor(CTutor lastTutorPlayed, String lastSkillPlayed, b rules = new PerformancePromotionRules(); } - PerformanceData performance = new PerformanceData(); performance.setActivityType(activeTutorId); // look up activeSkill every time? performance.setActiveSkill(lastSkillPlayed); @@ -372,4 +378,4 @@ private String getNextPlacementTutor(String activeTutorId, boolean useMathPlacem } } -} +} \ No newline at end of file diff --git a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java index 21352631c..75aa63521 100644 --- a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java +++ b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java @@ -15,6 +15,7 @@ /** * StudentChooseMatrixActivityMenu + * * An Activity Menu style where the student chooses which matrix they'll play in. *

* Created by kevindeland on 9/25/18. @@ -24,15 +25,27 @@ public class StudentChooseMatrixActivityMenu implements IActivityMenu { TransitionMatrixModel _matrix; IStudentDataModel _student; - + PromotionMechanism _promotionMechanism; + private static final int MIN_NUM_ATTEMPTS = 3; + public StudentChooseMatrixActivityMenu(TransitionMatrixModel matrix, IStudentDataModel student) { this._matrix = matrix; this._student = student; + this._promotionMechanism = new PromotionMechanism(this._student, this._matrix); } @Override public String getLayoutName() { - return "ask_activity_selector_2x3"; + if(this._promotionMechanism.performance.getNumberAttempts() >= MIN_NUM_ATTEMPTS + && + this._promotionMechanism.performance.getTotalNumberQuestions() >= 3 + && + this._promotionMechanism.performance.getNumberCorrect() /this._promotionMechanism.performance.getNumberAttempts() > PlacementPromotionRules.HIGH_PERFORMANCE_THRESHOLD + + ) + return "ask_activity_selector_2x3_elevate"; + else + return "ask_activity_selector_2x3"; } @Override @@ -69,11 +82,23 @@ public CAsk_Data initializeActiveLayout() { activeLayout.items[2].help = "numbers and math"; - activeLayout.items[3] = new CAskElement(); - activeLayout.items[3].componentID = "SbuttonRepeat"; - activeLayout.items[3].behavior = AS_CONST.SELECT_REPEAT; - activeLayout.items[3].prompt = "lets do it again"; - activeLayout.items[3].help = "lets do it again"; + activeLayout.items[3] = new CAskElement(); + if(this._promotionMechanism.performance.getNumberAttempts() >= MIN_NUM_ATTEMPTS + && + this._promotionMechanism.performance.getTotalNumberQuestions() >= 3 + && + this._promotionMechanism.performance.getNumberCorrect() / this._promotionMechanism.performance.getNumberAttempts() > PlacementPromotionRules.HIGH_PERFORMANCE_THRESHOLD){ + activeLayout.items[3].componentID = "Sbutton1"; + activeLayout.items[3].behavior = AS_CONST.ELEVATE; + activeLayout.items[3].prompt = "escape to placement"; + activeLayout.items[3].help = "escape to placement"; + } + else{ + activeLayout.items[3].componentID = "SbuttonRepeat"; + activeLayout.items[3].behavior = AS_CONST.SELECT_REPEAT; + activeLayout.items[3].prompt = "lets do it again"; + activeLayout.items[3].help = "lets do it again"; + } activeLayout.items[4] = new CAskElement(); activeLayout.items[4].componentID = "SbuttonExit"; @@ -91,7 +116,16 @@ public Map getButtonBehaviorMap() { map.put(AS_CONST.BEHAVIOR_KEYS.SELECT_WRITING, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); map.put(AS_CONST.BEHAVIOR_KEYS.SELECT_STORIES, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); map.put(AS_CONST.BEHAVIOR_KEYS.SELECT_MATH, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); - map.put(AS_CONST.SELECT_REPEAT, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); + if(this._promotionMechanism.performance.getNumberAttempts() >= MIN_NUM_ATTEMPTS + && + this._promotionMechanism.performance.getTotalNumberQuestions() >= 3 + && + this._promotionMechanism.performance.getNumberCorrect() / this._promotionMechanism.performance.getNumberAttempts() > PlacementPromotionRules.HIGH_PERFORMANCE_THRESHOLD){ + map.put(AS_CONST.ELEVATE, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); + } + else{ + map.put(AS_CONST.SELECT_REPEAT, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); + } map.put(AS_CONST.SELECT_EXIT, AS_CONST.QUEUEMAP_KEYS.EXIT_BUTTON_BEHAVIOR); return map; } @@ -102,11 +136,31 @@ public CAt_Data getTutorToLaunch(String buttonBehavior) { String activeTutorId = null; HashMap transitionMap = null; String rootTutor = null; - String activeSkill = null; - + // this could seriously be cleaned up... switch (buttonBehavior.toUpperCase()) { + case AS_CONST.ELEVATE: + + activeSkill = _student.getLastSkill(); + transitionMap = _matrix.getTransitionMapByContentArea(activeSkill); + activeTutorId = _student.getLastTutor(); + + if(activeSkill != null){ + // If the last activity is not null then go to that activity but update the placement index by 1 + if(activeSkill.equals(SELECT_MATH)) { + rootTutor = _matrix.getRootSkillByContentArea(SELECT_MATH); + CAt_Data transitionData = (CAt_Data) transitionMap.get(activeTutorId); + activeTutorId = transitionData.harder; + } + if(activeSkill.equals(SELECT_WRITING)) { + rootTutor = _matrix.getRootSkillByContentArea(SELECT_WRITING); + CAt_Data transitionData = (CAt_Data) transitionMap.get(activeTutorId); + activeTutorId = transitionData.harder; + } + } + + break; case AS_CONST.SELECT_REPEAT: @@ -167,4 +221,4 @@ public CAt_Data getTutorToLaunch(String buttonBehavior) { public String getDebugMenuSkill() { return _student.getActiveSkill(); } -} +} \ No newline at end of file diff --git a/app/src/main/res/layout/ask_activity_selector_2x2_elevate.xml b/app/src/main/res/layout/ask_activity_selector_2x2_elevate.xml new file mode 100644 index 000000000..82a783520 --- /dev/null +++ b/app/src/main/res/layout/ask_activity_selector_2x2_elevate.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/ask_activity_selector_2x3_elevate.xml b/app/src/main/res/layout/ask_activity_selector_2x3_elevate.xml new file mode 100644 index 000000000..a8dda6d6d --- /dev/null +++ b/app/src/main/res/layout/ask_activity_selector_2x3_elevate.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/comp_session/src/main/java/cmu/xprize/comp_session/AS_CONST.java b/comp_session/src/main/java/cmu/xprize/comp_session/AS_CONST.java index f01122388..0f0304737 100644 --- a/comp_session/src/main/java/cmu/xprize/comp_session/AS_CONST.java +++ b/comp_session/src/main/java/cmu/xprize/comp_session/AS_CONST.java @@ -52,7 +52,7 @@ public static final class BEHAVIOR_KEYS { public static final String SELECT_AUTO_DIFFICULTY = "SELECT_AUTO_DIFFICULTY"; // get rid of me public static final String SELECT_REPEAT = "SELECT_REPEAT"; public static final String SELECT_EXIT = "SELECT_EXIT"; - + public static final String ELEVATE = "ELEVATE_TO_PLACEMENT"; public static final String SELECT_NONE = "SELECT_NONE"; public static final String VAR_BUTTONID = ".buttonid"; From 164493fd095aa6648d8ac6d2993b73940196a699 Mon Sep 17 00:00:00 2001 From: JackMostow Date: Fri, 27 Dec 2024 12:13:33 -0600 Subject: [PATCH 14/17] Update build.gradle to add a comment just to force a build Build has been failing on a newer branch (escape to placement) even after reverting all its changes, so see if development branch still builds. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 787ead8c7..1505c61a0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. - +// 12/27/2024 add this comment to force a build to see if it still works buildscript { repositories { jcenter() From 0eb3f904cda739dce3889bd75a0dd6f1bfd3a48e Mon Sep 17 00:00:00 2001 From: ritessshhh Date: Wed, 26 Mar 2025 14:04:03 -0400 Subject: [PATCH 15/17] testing cycle matrix --- .../util/CycleMatrixActivityMenu.java | 224 ++++++++++++++++-- 1 file changed, 206 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/CycleMatrixActivityMenu.java b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/CycleMatrixActivityMenu.java index 944cf22ec..52626b719 100644 --- a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/CycleMatrixActivityMenu.java +++ b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/CycleMatrixActivityMenu.java @@ -35,15 +35,26 @@ public class CycleMatrixActivityMenu implements IActivityMenu { TransitionMatrixModel _matrix; IStudentDataModel _student; + PromotionMechanism _promotionMechanism; + private static final int MIN_NUM_ATTEMPTS = 3; public CycleMatrixActivityMenu(TransitionMatrixModel matrix, IStudentDataModel student) { this._matrix = matrix; this._student = student; + this._promotionMechanism = new PromotionMechanism(this._student, this._matrix); } @Override public String getLayoutName() { - return "ask_activity_selector_2x2"; + if(this._promotionMechanism.performance.getNumberAttempts() >= MIN_NUM_ATTEMPTS + && + this._promotionMechanism.performance.getTotalNumberQuestions() >= 3 + && + this._promotionMechanism.performance.getNumberCorrect() / this._promotionMechanism.performance.getNumberAttempts() > PlacementPromotionRules.HIGH_PERFORMANCE_THRESHOLD + ) + return "ask_activity_selector_2x2_elevate"; + else + return "ask_activity_selector_2x2"; } @Override @@ -99,9 +110,62 @@ public CAt_Data[] getTutorsToShow() { Log.e("SUPER_PLACEMENT", "not ready yet"); nextTutors[0] = (CAt_Data) transitionMap.get(tutorId); nextTutors[1] = nextTutors[0]; + + // Add null check for nextTutors[0] + if (nextTutors[0] == null) { + Log.e(MENU_BUG_TAG, "Could not find tutor with ID: " + tutorId + " in placement mode"); + // Try to get root tutor as fallback + String rootTutor = ""; + switch(_student.getActiveSkill()) { + case SELECT_WRITING: + rootTutor = _matrix.getRootSkillByContentArea(SELECT_WRITING); + break; + case SELECT_STORIES: + rootTutor = _matrix.getRootSkillByContentArea(SELECT_STORIES); + break; + case SELECT_MATH: + rootTutor = _matrix.getRootSkillByContentArea(SELECT_MATH); + break; + } + nextTutors[0] = (CAt_Data) transitionMap.get(rootTutor); + nextTutors[1] = nextTutors[0]; + } } else { nextTutors[0] = (CAt_Data) transitionMap.get(tutorId); // N - nextTutors[1] = isPlacementMode ? nextTutors[0] : (CAt_Data) transitionMap.get(nextTutors[0].next); // N or N + 1 + + // Add null checking here + if (nextTutors[0] != null && nextTutors[0].next != null) { + CAt_Data nextTutor = (CAt_Data) transitionMap.get(nextTutors[0].next); + nextTutors[1] = isPlacementMode ? nextTutors[0] : nextTutor; + + // Add null check for nextTutors[1] + if (nextTutors[1] == null) { + nextTutors[1] = nextTutors[0]; // Use the same tutor if next is null + Log.e(MENU_BUG_TAG, "Next tutor is null, using same tutor twice: " + tutorId); + } + } else { + // If there's no valid next tutor, use the same tutor twice + if (nextTutors[0] == null) { + Log.e(MENU_BUG_TAG, "Current tutor is null for ID: " + tutorId); + // Try to get root tutor as fallback + String rootTutor = ""; + switch(_student.getActiveSkill()) { + case SELECT_WRITING: + rootTutor = _matrix.getRootSkillByContentArea(SELECT_WRITING); + break; + case SELECT_STORIES: + rootTutor = _matrix.getRootSkillByContentArea(SELECT_STORIES); + break; + case SELECT_MATH: + rootTutor = _matrix.getRootSkillByContentArea(SELECT_MATH); + break; + } + nextTutors[0] = (CAt_Data) transitionMap.get(rootTutor); + } + + nextTutors[1] = nextTutors[0]; + Log.d(MENU_BUG_TAG, "No next tutor available, using the same tutor twice"); + } } return nextTutors; @@ -142,10 +206,22 @@ public CAsk_Data initializeActiveLayout() { activeLayout.items[1].help = "something different"; activeLayout.items[2] = new CAskElement(); - activeLayout.items[2].componentID = "SbuttonRepeat"; - activeLayout.items[2].behavior = AS_CONST.SELECT_REPEAT; - activeLayout.items[2].prompt = "lets do it again"; - activeLayout.items[2].help = "lets do it again"; + if(this._promotionMechanism.performance.getNumberAttempts() >= MIN_NUM_ATTEMPTS + && + this._promotionMechanism.performance.getTotalNumberQuestions() >= 3 + && + this._promotionMechanism.performance.getNumberCorrect() / this._promotionMechanism.performance.getNumberAttempts() > PlacementPromotionRules.HIGH_PERFORMANCE_THRESHOLD){ + activeLayout.items[2].componentID = "Sbutton1"; + activeLayout.items[2].behavior = AS_CONST.ELEVATE; + activeLayout.items[2].prompt = "escape to placement"; + activeLayout.items[2].help = "escape to placement"; + } + else{ + activeLayout.items[2].componentID = "SbuttonRepeat"; + activeLayout.items[2].behavior = AS_CONST.SELECT_REPEAT; + activeLayout.items[2].prompt = "lets do it again"; + activeLayout.items[2].help = "lets do it again"; + } activeLayout.items[3] = new CAskElement(); activeLayout.items[3].componentID = "SbuttonExit"; @@ -162,7 +238,18 @@ public Map getButtonBehaviorMap() { map.put(SELECT_OPTION_0, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); map.put(SELECT_OPTION_1, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); - map.put(AS_CONST.SELECT_REPEAT, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); + + if(this._promotionMechanism.performance.getNumberAttempts() >= MIN_NUM_ATTEMPTS + && + this._promotionMechanism.performance.getTotalNumberQuestions() >= 3 + && + this._promotionMechanism.performance.getNumberCorrect() / this._promotionMechanism.performance.getNumberAttempts() > PlacementPromotionRules.HIGH_PERFORMANCE_THRESHOLD){ + map.put(AS_CONST.ELEVATE, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); + } + else{ + map.put(AS_CONST.SELECT_REPEAT, AS_CONST.QUEUEMAP_KEYS.BUTTON_BEHAVIOR); + } + map.put(AS_CONST.SELECT_EXIT, AS_CONST.QUEUEMAP_KEYS.EXIT_BUTTON_BEHAVIOR); return map; } @@ -176,7 +263,7 @@ public CAt_Data getTutorToLaunch(String buttonBehavior) { String rootTutor = ""; String activeSkill = null; - String chosenTutorId; + String chosenTutorId = null; Log.d("OH_BEHAVE", "some behavior here should be different..."); @@ -188,12 +275,49 @@ public CAt_Data getTutorToLaunch(String buttonBehavior) { transitionMap = _matrix.getTransitionMapByContentArea(activeSkill); rootTutor = _matrix.getRootSkillByContentArea(activeSkill); RoboTutor.logManager.postEvent_I(REPEAT_DEBUG_TAG, String.format("activeSkill=%s;chosenTutorId=%s;transitionMap=%s;rootTutor=%s", activeSkill, chosenTutorId, activeSkill, rootTutor)); + } + else if (buttonBehavior.equals(AS_CONST.ELEVATE)) { + activeSkill = _student.getLastSkill(); + transitionMap = _matrix.getTransitionMapByContentArea(activeSkill); + chosenTutorId = _student.getLastTutor(); + if(activeSkill != null) { + // If the last activity is not null then go to that activity but update the placement index by 1 + if(activeSkill.equals(SELECT_MATH)) { + rootTutor = _matrix.getRootSkillByContentArea(SELECT_MATH); + CAt_Data transitionData = (CAt_Data) transitionMap.get(chosenTutorId); + if (transitionData != null && transitionData.harder != null) { + chosenTutorId = transitionData.harder; + } else { + // If no harder level available, stay at current level + Log.e(MENU_BUG_TAG, "No harder math level available for " + chosenTutorId); + } + } + else if(activeSkill.equals(SELECT_WRITING)) { + rootTutor = _matrix.getRootSkillByContentArea(SELECT_WRITING); + CAt_Data transitionData = (CAt_Data) transitionMap.get(chosenTutorId); + if (transitionData != null && transitionData.harder != null) { + chosenTutorId = transitionData.harder; + } else { + // If no harder level available, stay at current level + Log.e(MENU_BUG_TAG, "No harder writing level available for " + chosenTutorId); + } + } + else if(activeSkill.equals(SELECT_STORIES)) { + rootTutor = _matrix.getRootSkillByContentArea(SELECT_STORIES); + CAt_Data transitionData = (CAt_Data) transitionMap.get(chosenTutorId); + if (transitionData != null && transitionData.harder != null) { + chosenTutorId = transitionData.harder; + } else { + // If no harder level available for stories, stay at current level + Log.e(MENU_BUG_TAG, "No harder stories level available for " + chosenTutorId); + } + } + } } else { - activeSkill = _student.getActiveSkill(); CAt_Data zeroIndexedTutor; - String[] nextTutors = new String[3]; + String[] nextTutorIds = new String[3]; boolean inPlacementMode = false; @@ -206,6 +330,11 @@ public CAt_Data getTutorToLaunch(String buttonBehavior) { case SELECT_STORIES: zeroIndexedTutorId = _student.getStoryTutorID(); + if (zeroIndexedTutorId == null) { + // If story tutor ID is null, get the root story tutor + zeroIndexedTutorId = _matrix.getRootSkillByContentArea(SELECT_STORIES); + Log.e(MENU_BUG_TAG, "Story tutor ID was null, falling back to root: " + zeroIndexedTutorId); + } Log.d("REPEAT_ME", "storyTutor=" + zeroIndexedTutorId); break; @@ -220,26 +349,79 @@ public CAt_Data getTutorToLaunch(String buttonBehavior) { RoboTutor.logManager.postEvent_I(MENU_BUG_TAG, "CycleMatrixActivityMenu: activeSkill=" + activeSkill + " -- activeTutorId=" + zeroIndexedTutorId); transitionMap = _matrix.getTransitionMapByContentArea(activeSkill); rootTutor = _matrix.getRootSkillByContentArea(activeSkill); + + // Additional safety for stories + if (activeSkill != null && activeSkill.equals(SELECT_STORIES) && (transitionMap == null || transitionMap.isEmpty())) { + Log.e(MENU_BUG_TAG, "Story transition map is null or empty!"); + // Create a minimal transition map if none exists + if (transitionMap == null) { + transitionMap = new HashMap(); + } + // Make sure the root tutor exists in the map + if (rootTutor != null && !transitionMap.containsKey(rootTutor)) { + Log.e(MENU_BUG_TAG, "Adding root story tutor to map as fallback: " + rootTutor); + CAt_Data rootData = new CAt_Data(); + rootData.tutor_id = rootTutor; + rootData.next = rootTutor; // Point to itself as fallback + rootData.same = rootTutor; + transitionMap.put(rootTutor, rootData); + } + } + zeroIndexedTutor = (CAt_Data) transitionMap.get(zeroIndexedTutorId); - nextTutors[0] = zeroIndexedTutor.tutor_id; - nextTutors[1] = inPlacementMode ? nextTutors[0] : ((CAt_Data) transitionMap.get(zeroIndexedTutor.next)).tutor_id; // next hardest tutor!!! (I don't know WHY this is implemented twice) + + if (zeroIndexedTutor != null) { + nextTutorIds[0] = zeroIndexedTutor.tutor_id; + + if (zeroIndexedTutor.next != null) { + CAt_Data nextTutor = (CAt_Data) transitionMap.get(zeroIndexedTutor.next); + nextTutorIds[1] = inPlacementMode ? nextTutorIds[0] : (nextTutor != null ? nextTutor.tutor_id : nextTutorIds[0]); + + // Initialize nextTutorIds[2] to prevent null when SELECT_OPTION_2 is used + if (nextTutor != null && nextTutor.next != null) { + CAt_Data nextNextTutor = (CAt_Data) transitionMap.get(nextTutor.next); + nextTutorIds[2] = nextNextTutor != null ? nextNextTutor.tutor_id : nextTutorIds[1]; + } else { + nextTutorIds[2] = nextTutorIds[1]; // Use previous tutor if no "next next" is available + } + } else { + nextTutorIds[1] = nextTutorIds[0]; + nextTutorIds[2] = nextTutorIds[0]; // Initialize index 2 as well + Log.d(MENU_BUG_TAG, "No next tutor defined, using the same tutor twice"); + } + } else { + // Handle case where zeroIndexedTutor is null + Log.e(MENU_BUG_TAG, "Could not find tutor with ID: " + zeroIndexedTutorId); + // Use root tutor as fallback + CAt_Data rootTutorData = (CAt_Data) transitionMap.get(rootTutor); + if (rootTutorData != null) { + nextTutorIds[0] = rootTutorData.tutor_id; + nextTutorIds[1] = rootTutorData.tutor_id; + } else { + // Critical error - no valid tutor found + Log.e(MENU_BUG_TAG, "Critical error: No valid tutor found in transition map"); + // Set to null and handle later + nextTutorIds[0] = null; + nextTutorIds[1] = null; + } + } switch(buttonBehavior.toUpperCase()) { case SELECT_OPTION_0: // TRACE_PROMOTION looks good... - chosenTutorId = nextTutors[0]; + chosenTutorId = nextTutorIds[0]; break; case SELECT_OPTION_1: // TRACE_PROMOTION looks good... // launch the next tutor // something like this... - chosenTutorId = nextTutors[1]; + chosenTutorId = nextTutorIds[1]; break; case SELECT_OPTION_2: // launch the next.next tutor - chosenTutorId = nextTutors[2]; + chosenTutorId = nextTutorIds[2]; break; default: @@ -249,7 +431,7 @@ public CAt_Data getTutorToLaunch(String buttonBehavior) { // If they choose the second option, update our position in thematrix // // will only be updated if SELECT_OPTION_1 or SELECT_OPTION_2 were selected // - if (!chosenTutorId.equals(zeroIndexedTutorId)) { + if (!chosenTutorId.equals(zeroIndexedTutorId) && !buttonBehavior.equals(AS_CONST.ELEVATE)) { switch (activeSkill) { case SELECT_WRITING: _student.updateWritingTutorID(chosenTutorId, true); @@ -264,12 +446,18 @@ public CAt_Data getTutorToLaunch(String buttonBehavior) { break; } } - } // TRACE_PROMOTION doesn't save tutorToLaunch when we choose the second option!!! // the next tutor to be launched + + // Final check to ensure chosenTutorId is not null + if (chosenTutorId == null) { + Log.e(MENU_BUG_TAG, "Critical error: chosenTutorId is null, using root tutor as fallback"); + chosenTutorId = rootTutor; + } + CAt_Data tutorToLaunch = (CAt_Data) transitionMap.get(chosenTutorId); Log.wtf(MENU_BUG_TAG, chosenTutorId + " " + activeSkill); @@ -286,4 +474,4 @@ public CAt_Data getTutorToLaunch(String buttonBehavior) { public String getDebugMenuSkill() { return RoboTutor.STUDENT_CHOSE_REPEAT ? _student.getLastSkill() : _student.getActiveSkill(); // DEBUG_MENU_LOGIC (x) lastSkill vs ActiveSkill... } -} +} \ No newline at end of file From 860f718b4b4656bffd22d36a84e72be5c8c4b213 Mon Sep 17 00:00:00 2001 From: ritessshhh Date: Thu, 19 Jun 2025 17:53:23 +0530 Subject: [PATCH 16/17] fixed bugs --- .../robotutor/tutorengine/util/CycleMatrixActivityMenu.java | 4 ++-- .../tutorengine/util/StudentChooseMatrixActivityMenu.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/CycleMatrixActivityMenu.java b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/CycleMatrixActivityMenu.java index 52626b719..f16999d4a 100644 --- a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/CycleMatrixActivityMenu.java +++ b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/CycleMatrixActivityMenu.java @@ -213,8 +213,8 @@ public CAsk_Data initializeActiveLayout() { this._promotionMechanism.performance.getNumberCorrect() / this._promotionMechanism.performance.getNumberAttempts() > PlacementPromotionRules.HIGH_PERFORMANCE_THRESHOLD){ activeLayout.items[2].componentID = "Sbutton1"; activeLayout.items[2].behavior = AS_CONST.ELEVATE; - activeLayout.items[2].prompt = "escape to placement"; - activeLayout.items[2].help = "escape to placement"; + activeLayout.items[2].prompt = "I want something harder"; + activeLayout.items[2].help = "something harder"; } else{ activeLayout.items[2].componentID = "SbuttonRepeat"; diff --git a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java index 75aa63521..f31ca8503 100644 --- a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java +++ b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java @@ -90,8 +90,8 @@ public CAsk_Data initializeActiveLayout() { this._promotionMechanism.performance.getNumberCorrect() / this._promotionMechanism.performance.getNumberAttempts() > PlacementPromotionRules.HIGH_PERFORMANCE_THRESHOLD){ activeLayout.items[3].componentID = "Sbutton1"; activeLayout.items[3].behavior = AS_CONST.ELEVATE; - activeLayout.items[3].prompt = "escape to placement"; - activeLayout.items[3].help = "escape to placement"; + activeLayout.items[3].prompt = "I want something harder"; + activeLayout.items[3].help = "something harder"; } else{ activeLayout.items[3].componentID = "SbuttonRepeat"; From 8a0bef1fe032d14f978cb3283ff3afea93fedb68 Mon Sep 17 00:00:00 2001 From: ritessshhh Date: Thu, 19 Jun 2025 17:59:55 +0530 Subject: [PATCH 17/17] fixed the audio issue --- .../tutorengine/util/StudentChooseMatrixActivityMenu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java index f31ca8503..b2520a5ab 100644 --- a/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java +++ b/app/src/main/java/cmu/xprize/robotutor/tutorengine/util/StudentChooseMatrixActivityMenu.java @@ -90,7 +90,7 @@ public CAsk_Data initializeActiveLayout() { this._promotionMechanism.performance.getNumberCorrect() / this._promotionMechanism.performance.getNumberAttempts() > PlacementPromotionRules.HIGH_PERFORMANCE_THRESHOLD){ activeLayout.items[3].componentID = "Sbutton1"; activeLayout.items[3].behavior = AS_CONST.ELEVATE; - activeLayout.items[3].prompt = "I want something harder"; + activeLayout.items[3].prompt = "something harder"; activeLayout.items[3].help = "something harder"; } else{