From 2bfbb72302724f0a6f4e057dcf98b96cdace0f0e Mon Sep 17 00:00:00 2001 From: Anuja Shetye <55632820+shetyeanuja@users.noreply.github.com> Date: Thu, 6 Oct 2022 14:23:07 +0530 Subject: [PATCH 01/31] File external storage --- app/build.gradle | 38 ++- .../ExampleInstrumentedUnitTests.java | 4 +- .../MainActivityInstrumentedUnitTests.java | 10 +- .../PackageNameInstrumentedUnitTest.java | 8 +- ...toragePermissionInstrumentedUnitTests.java | 12 +- ...toragePermissionInstrumentedUnitTests.java | 10 +- ...eferenceActivityInstrumentedUnitTests.java | 14 +- ...iplineNameInstrumentedIntegratedTests.java | 30 +- ...chMySpaceActivityInstrumentedUnitTest.java | 40 +-- app/src/main/AndroidManifest.xml | 22 +- .../memoryassistant/disciplines/Cards.java | 127 +++++-- .../disciplines/DisciplineFragment.java | 32 +- .../memoryassistant/disciplines/Numbers.java | 109 ++++-- .../memoryassistant/main/Contribute.java | 5 +- .../main/CrashlyticsLogTree.java | 14 +- .../memoryassistant/main/CreditsActivity.java | 2 + .../main/DisciplineActivity.java | 6 +- .../memoryassistant/main/Learn.java | 6 +- .../memoryassistant/main/MainActivity.java | 30 +- .../memoryassistant/main/Practice.java | 3 + .../memoryassistant/main/RecallSelector.java | 37 +- .../memoryassistant/mySpace/MySpace.java | 34 +- .../mySpace/MySpaceFragment.java | 31 +- .../main/res/raw-b+fil/lesson_equations.txt | 18 - .../main/res/raw-b+fil/lesson_language.txt | 9 - .../res/raw-b+fil/lesson_major_system.txt | 77 ----- .../res/raw-b+fil/lesson_method_of_loci.txt | 40 --- app/src/main/res/raw-b+fil/lesson_pao.txt | 37 -- .../raw-b+fil/lesson_perfect_association.txt | 57 ---- .../main/res/raw-b+fil/lesson_wardrobes.txt | 129 ------- app/src/main/res/values-b+fil/strings.xml | 316 +++++++++--------- app/src/main/res/values-fil/strings.xml | 316 +++++++++--------- .../memoryassistant/ExampleUnitTest.java | 4 +- build.gradle | 9 +- gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 88 +++-- gradlew.bat | 30 +- 37 files changed, 863 insertions(+), 894 deletions(-) delete mode 100644 app/src/main/res/raw-b+fil/lesson_equations.txt delete mode 100644 app/src/main/res/raw-b+fil/lesson_language.txt delete mode 100644 app/src/main/res/raw-b+fil/lesson_major_system.txt delete mode 100644 app/src/main/res/raw-b+fil/lesson_method_of_loci.txt delete mode 100644 app/src/main/res/raw-b+fil/lesson_pao.txt delete mode 100644 app/src/main/res/raw-b+fil/lesson_perfect_association.txt delete mode 100644 app/src/main/res/raw-b+fil/lesson_wardrobes.txt diff --git a/app/build.gradle b/app/build.gradle index 5accc580..70f48093 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,23 +9,23 @@ buildscript { } apply plugin: 'com.android.application' apply plugin: 'com.google.firebase.firebase-perf' -apply plugin: 'io.fabric' +//apply plugin: 'io.fabric' apply plugin: 'kotlin-android' //apply plugin: 'com.jakewharton.hugo' -def keystorePropertiesFile = rootProject.file("other/.keystore.properties") -def keystoreProperties = new Properties() -keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +//def keystorePropertiesFile = rootProject.file("other/.keystore.properties") +//def keystoreProperties = new Properties() +//keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { - signingConfigs { - config { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile file(keystoreProperties['storeFile']) - storePassword keystoreProperties['storePassword'] - } - } +// signingConfigs { +// config { +// keyAlias keystoreProperties['keyAlias'] +// keyPassword keystoreProperties['keyPassword'] +// storeFile file(keystoreProperties['storeFile']) +// storePassword keystoreProperties['storePassword'] +// } +// } compileSdkVersion 29 buildToolsVersion '28.0.3' defaultConfig { @@ -45,9 +45,10 @@ android { //minifyEnabled true //shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - signingConfig signingConfigs.config + //signingConfig signingConfigs.config } } + productFlavors { } aaptOptions { @@ -75,24 +76,29 @@ dependencies { implementation 'com.firebase:firebase-jobdispatcher:0.8.5' implementation 'com.google.firebase:firebase-core:17.2.3' implementation 'com.google.firebase:firebase-perf:19.0.5' - implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' + //implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' implementation 'org.solovyev.android:checkout:1.2.2' implementation 'com.squareup.picasso:picasso:2.71828' implementation 'com.jakewharton.timber:timber:4.7.1' implementation 'com.jakewharton:butterknife:' + butterknifeVersion + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.junit.jupiter:junit-jupiter' + annotationProcessor 'com.jakewharton:butterknife-compiler:' + butterknifeVersion implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:rules:1.0.2' + //noinspection GradleCompatible + androidTestImplementation 'androidx.test:rules:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-intents:' + espressoVersion androidTestImplementation 'androidx.test.espresso:espresso-core:' + espressoVersion } repositories { mavenCentral() - maven { url 'https://maven.fabric.io/public' } + //maven { url 'https://maven.fabric.io/public' } } apply plugin: 'com.google.gms.google-services' diff --git a/app/src/androidTest/java/com/memory_athlete/memoryassistant/ExampleInstrumentedUnitTests.java b/app/src/androidTest/java/com/memory_athlete/memoryassistant/ExampleInstrumentedUnitTests.java index e21abc8a..9b3a7b9d 100644 --- a/app/src/androidTest/java/com/memory_athlete/memoryassistant/ExampleInstrumentedUnitTests.java +++ b/app/src/androidTest/java/com/memory_athlete/memoryassistant/ExampleInstrumentedUnitTests.java @@ -1,5 +1,7 @@ package com.memory_athlete.memoryassistant; +import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; + import android.content.Intent; import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; @@ -7,8 +9,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; - @RunWith(AndroidJUnit4ClassRunner.class) public class ExampleInstrumentedUnitTests { diff --git a/app/src/androidTest/java/com/memory_athlete/memoryassistant/MainActivityInstrumentedUnitTests.java b/app/src/androidTest/java/com/memory_athlete/memoryassistant/MainActivityInstrumentedUnitTests.java index 0d6e41a1..2a4ba8a3 100644 --- a/app/src/androidTest/java/com/memory_athlete/memoryassistant/MainActivityInstrumentedUnitTests.java +++ b/app/src/androidTest/java/com/memory_athlete/memoryassistant/MainActivityInstrumentedUnitTests.java @@ -1,5 +1,10 @@ package com.memory_athlete.memoryassistant; +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; +import static org.junit.Assert.assertEquals; + import android.content.SharedPreferences; import android.widget.ListView; @@ -19,11 +24,6 @@ import java.util.Random; import java.util.Scanner; -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; -import static org.junit.Assert.assertEquals; - @RunWith(AndroidJUnit4ClassRunner.class) public class MainActivityInstrumentedUnitTests { diff --git a/app/src/androidTest/java/com/memory_athlete/memoryassistant/PackageNameInstrumentedUnitTest.java b/app/src/androidTest/java/com/memory_athlete/memoryassistant/PackageNameInstrumentedUnitTest.java index 994fece2..0dd27d11 100644 --- a/app/src/androidTest/java/com/memory_athlete/memoryassistant/PackageNameInstrumentedUnitTest.java +++ b/app/src/androidTest/java/com/memory_athlete/memoryassistant/PackageNameInstrumentedUnitTest.java @@ -1,16 +1,16 @@ package com.memory_athlete.memoryassistant; +import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; +import static org.junit.Assert.assertEquals; + import android.content.Context; -import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; +import androidx.test.platform.app.InstrumentationRegistry; import org.junit.Test; import org.junit.runner.RunWith; -import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; -import static org.junit.Assert.assertEquals; - /** * Instrumentation test, which will execute on an Android device. * diff --git a/app/src/androidTest/java/com/memory_athlete/memoryassistant/WithStoragePermissionInstrumentedUnitTests.java b/app/src/androidTest/java/com/memory_athlete/memoryassistant/WithStoragePermissionInstrumentedUnitTests.java index 5c885c14..f87f6279 100644 --- a/app/src/androidTest/java/com/memory_athlete/memoryassistant/WithStoragePermissionInstrumentedUnitTests.java +++ b/app/src/androidTest/java/com/memory_athlete/memoryassistant/WithStoragePermissionInstrumentedUnitTests.java @@ -1,5 +1,11 @@ package com.memory_athlete.memoryassistant; +import static android.Manifest.permission.READ_EXTERNAL_STORAGE; +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; +import static androidx.core.content.PermissionChecker.checkSelfPermission; +import static com.memory_athlete.memoryassistant.Helper.APP_FOLDER; +import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; + import android.content.pm.PackageManager; import android.os.Build; @@ -17,12 +23,6 @@ import java.io.IOException; import java.nio.file.Files; -import static android.Manifest.permission.READ_EXTERNAL_STORAGE; -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static androidx.core.content.PermissionChecker.checkSelfPermission; -import static com.memory_athlete.memoryassistant.Helper.APP_FOLDER; -import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; - @RunWith(AndroidJUnit4ClassRunner.class) public class WithStoragePermissionInstrumentedUnitTests { @Rule diff --git a/app/src/androidTest/java/com/memory_athlete/memoryassistant/WithoutStoragePermissionInstrumentedUnitTests.java b/app/src/androidTest/java/com/memory_athlete/memoryassistant/WithoutStoragePermissionInstrumentedUnitTests.java index 9947161d..5e5396ff 100644 --- a/app/src/androidTest/java/com/memory_athlete/memoryassistant/WithoutStoragePermissionInstrumentedUnitTests.java +++ b/app/src/androidTest/java/com/memory_athlete/memoryassistant/WithoutStoragePermissionInstrumentedUnitTests.java @@ -1,5 +1,10 @@ package com.memory_athlete.memoryassistant; +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; +import static androidx.core.content.ContextCompat.checkSelfPermission; +import static com.memory_athlete.memoryassistant.Helper.APP_FOLDER; +import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; + import android.content.pm.PackageManager; import android.os.Build; @@ -17,11 +22,6 @@ import java.nio.file.AccessDeniedException; import java.nio.file.Files; -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static androidx.core.content.ContextCompat.checkSelfPermission; -import static com.memory_athlete.memoryassistant.Helper.APP_FOLDER; -import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; - @RunWith(AndroidJUnit4ClassRunner.class) public class WithoutStoragePermissionInstrumentedUnitTests { @Rule diff --git a/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/PreferenceActivityInstrumentedUnitTests.java b/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/PreferenceActivityInstrumentedUnitTests.java index 2976e99a..eb588067 100644 --- a/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/PreferenceActivityInstrumentedUnitTests.java +++ b/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/PreferenceActivityInstrumentedUnitTests.java @@ -1,6 +1,13 @@ package com.memory_athlete.memoryassistant.main; +import static androidx.test.espresso.Espresso.onData; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.anything; + import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; @@ -20,13 +27,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import static androidx.test.espresso.Espresso.onData; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; -import static org.hamcrest.Matchers.allOf; -import static org.hamcrest.Matchers.anything; - @LargeTest @RunWith(AndroidJUnit4ClassRunner.class) public class PreferenceActivityInstrumentedUnitTests { diff --git a/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/RecallDisciplineNameInstrumentedIntegratedTests.java b/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/RecallDisciplineNameInstrumentedIntegratedTests.java index b58a62ed..46523e32 100644 --- a/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/RecallDisciplineNameInstrumentedIntegratedTests.java +++ b/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/RecallDisciplineNameInstrumentedIntegratedTests.java @@ -1,6 +1,21 @@ package com.memory_athlete.memoryassistant.main; +import static androidx.test.espresso.Espresso.onData; +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.action.ViewActions.scrollTo; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom; +import static androidx.test.espresso.matcher.ViewMatchers.withClassName; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withParent; +import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.anything; +import static org.hamcrest.Matchers.is; + import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; @@ -23,21 +38,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import static androidx.test.espresso.Espresso.onData; -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.action.ViewActions.scrollTo; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom; -import static androidx.test.espresso.matcher.ViewMatchers.withClassName; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withParent; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; -import static org.hamcrest.Matchers.allOf; -import static org.hamcrest.Matchers.anything; -import static org.hamcrest.Matchers.is; - // Using BVA @LargeTest @RunWith(AndroidJUnit4ClassRunner.class) diff --git a/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/SearchMySpaceActivityInstrumentedUnitTest.java b/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/SearchMySpaceActivityInstrumentedUnitTest.java index acdeb099..222b5988 100644 --- a/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/SearchMySpaceActivityInstrumentedUnitTest.java +++ b/app/src/androidTest/java/com/memory_athlete/memoryassistant/main/SearchMySpaceActivityInstrumentedUnitTest.java @@ -1,6 +1,26 @@ package com.memory_athlete.memoryassistant.main; +import static androidx.test.espresso.Espresso.onData; +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.pressImeActionButton; +import static androidx.test.espresso.action.ViewActions.replaceText; +import static androidx.test.espresso.action.ViewActions.scrollTo; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.RootMatchers.withDecorView; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withClassName; +import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.anything; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.core.IsNot.not; + import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; @@ -24,26 +44,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import static androidx.test.espresso.Espresso.onData; -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.pressImeActionButton; -import static androidx.test.espresso.action.ViewActions.replaceText; -import static androidx.test.espresso.action.ViewActions.scrollTo; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.RootMatchers.withDecorView; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withClassName; -import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static com.memory_athlete.memoryassistant.TestHelper.waitForExecution; -import static org.hamcrest.Matchers.allOf; -import static org.hamcrest.Matchers.anything; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.core.IsNot.not; - @LargeTest @RunWith(AndroidJUnit4ClassRunner.class) public class SearchMySpaceActivityInstrumentedUnitTest { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 63c55fd2..e441730c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,12 +3,16 @@ xmlns:tools="http://schemas.android.com/tools" package="com.memory_athlete.memoryassistant"> + + + + + tools:targetApi="jelly_bean" + android:exported="true"> @@ -71,7 +76,8 @@ android:name=".main.Practice" android:launchMode="singleTask" android:parentActivityName=".main.MainActivity" - tools:targetApi="jelly_bean"> + tools:targetApi="jelly_bean" + android:exported="true"> @@ -144,9 +150,9 @@ android:name=".inAppBilling.DonateActivity" android:parentActivityName=".main.Contribute" tools:targetApi="jelly_bean"> - + + + - + + + diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/Cards.java b/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/Cards.java index a99ecdec..a9ab06a5 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/Cards.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/Cards.java @@ -1,9 +1,11 @@ package com.memory_athlete.memoryassistant.disciplines; +import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; +import android.os.Environment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -14,6 +16,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; import androidx.preference.PreferenceManager; import com.memory_athlete.memoryassistant.Helper; @@ -22,7 +25,9 @@ import com.squareup.picasso.Picasso; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -168,36 +173,108 @@ protected boolean save() { if (randomList.isEmpty()) return false; StringBuilder stringBuilder = new StringBuilder(); - //Practice Directory - String path = Helper.APP_FOLDER + File.separator - + getString(R.string.practice); - - if (Helper.makeDirectory(path, activity)) { - //Discipline Directory - path += File.separator + activity.getTitle(); - if (Helper.makeDirectory(path, activity)) { - //File Path - path += File.separator + ((new SimpleDateFormat( - "yy-MM-dd_HH:mm", Locale.getDefault())).format(new Date())) + ".txt"; - try { - FileOutputStream outputStream = new FileOutputStream(new File(path)); - - for (Integer i : randomList)// 0; i < randomList.size(); i++) - stringBuilder.append(i).append("\n"); - //\n is also a delimiter used in recall - - outputStream.write(stringBuilder.toString().getBytes()); - outputStream.close(); - Toast.makeText(activity, "Saved", Toast.LENGTH_SHORT).show(); - return true; - } catch (Exception e) { - e.printStackTrace(); - Toast.makeText(activity, "Try again", Toast.LENGTH_SHORT).show(); +// //Practice Directory +// String path = Helper.APP_FOLDER + File.separator +// + getString(R.string.practice); +// +// if (Helper.makeDirectory(path, activity)) { +// //Discipline Directory +// path += File.separator + activity.getTitle().toString(); +// if (Helper.makeDirectory(path, activity)) { +// //File Path +// path += File.separator + ((new SimpleDateFormat( +// "yy-MM-dd_HH:mm", Locale.getDefault())).format(new Date())) + ".txt"; +// try { +// FileOutputStream outputStream = new FileOutputStream(new File(path)); +// +// for (Integer i : randomList)// 0; i < randomList.size(); i++) +// stringBuilder.append(i).append("\n"); +// //\n is also a delimiter used in recall +// +// outputStream.write(stringBuilder.toString().getBytes()); +// outputStream.close(); +// Toast.makeText(activity, "Saved", Toast.LENGTH_SHORT).show(); +// return true; +// } catch (Exception e) { +// e.printStackTrace(); +// Toast.makeText(activity, "Try again", Toast.LENGTH_SHORT).show(); +// } +// } +// } else Toast.makeText(getActivity(), R.string.storage_permission_for_recall, +// Toast.LENGTH_LONG).show(); +// return false; +// + + //discipline code + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + + File folder = getActivity().getFilesDir(); + String path = folder + File.separator + getString(R.string.practice) + File.separator + activity.getTitle().toString(); + + //Directory of practice - internal storage +// String path = Helper.APP_FOLDER + File.separator +// + getString(R.string.practice) + File.separator + activity.getTitle().toString(); + + Toast.makeText(activity.getApplicationContext(),path, Toast.LENGTH_SHORT).show(); + + if (Helper.makeDirectory(path, getContext())) { + path += File.separator + ((new SimpleDateFormat("yy-MM-dd_HH:mm", + Locale.getDefault())).format(new Date())) + ".txt"; + + //Write the file + try { + + FileOutputStream outputStream = new FileOutputStream(new File(path)); + for (Integer i : randomList)// 0; i < randomList.size(); i++) + stringBuilder.append(i).append("\n"); + //\n is also a delimiter used in recall + + outputStream.write(stringBuilder.toString().getBytes()); + outputStream.close(); + Toast.makeText(activity, "Saved", Toast.LENGTH_SHORT).show(); + return true; + + } catch (FileNotFoundException e) { + Timber.e(e); + if (saveErrorCount == 0) { + Toast.makeText(activity.getApplicationContext(), R.string.fnf_try_again, Toast.LENGTH_SHORT).show(); + saveErrorCount++; + String[] blocked = {"|", "\\", "?", "*", "<", "\"", ":", ">", "+", "[", "]", "'"}; + for (CharSequence c : blocked) { + String s = path; + s = s.replace(c, ""); + if (!s.equals(path)) { + Timber.e("illegal character in path : %s", path); + path = s; + } + } + return false; } + File f = new File(path); + if (!f.exists()) throw new RuntimeException( + activity.getTitle().toString() + " directory doesn't exist", e); + throw new RuntimeException(e); + } catch (IOException e) { + Timber.e(e); + if (saveErrorCount == 0) { + Toast.makeText(activity.getApplicationContext(), R.string.io_try_again, Toast.LENGTH_SHORT).show(); + saveErrorCount++; + return false; + } + File f = new File(path); + if (!f.exists() && !f.isDirectory()) + throw new RuntimeException(path + " doesn't exist", e); + throw new RuntimeException(e); } } else Toast.makeText(getActivity(), R.string.storage_permission_for_recall, Toast.LENGTH_LONG).show(); return false; + + + } @Override diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/DisciplineFragment.java b/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/DisciplineFragment.java index 826064bd..2b7a8cb9 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/DisciplineFragment.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/DisciplineFragment.java @@ -1,14 +1,23 @@ package com.memory_athlete.memoryassistant.disciplines; +import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; +import android.app.Instrumentation; +import android.content.ContentResolver; +import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.os.CountDownTimer; +import android.os.Environment; import android.os.SystemClock; +import android.provider.MediaStore; import android.speech.tts.TextToSpeech; import android.view.LayoutInflater; import android.view.View; @@ -29,6 +38,8 @@ import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; @@ -44,7 +55,9 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Objects; import timber.log.Timber; @@ -89,7 +102,7 @@ public abstract class DisciplineFragment extends Fragment implements View.OnClic private TextToSpeech textToSpeech; protected SharedPreferences sharedPreferences; - private int saveErrorCount = 0; + int saveErrorCount = 0; //protected boolean hasAsync; public DisciplineFragment() { @@ -395,9 +408,20 @@ protected boolean save() { if (stringToSave == null || stringToSave.equals("")) return false; - //Directory of practice - String path = Helper.APP_FOLDER + File.separator - + getString(R.string.practice) + File.separator + activity.getTitle().toString(); + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + + File folder = getActivity().getFilesDir(); + String path = folder + File.separator + getString(R.string.practice) + File.separator + activity.getTitle().toString(); + + //Directory of practice - internal storage +// String path = Helper.APP_FOLDER + File.separator +// + getString(R.string.practice) + File.separator + activity.getTitle().toString(); + + Toast.makeText(activity.getApplicationContext(),"discipline is working", Toast.LENGTH_SHORT).show(); + if (Helper.makeDirectory(path, getContext())) { path += File.separator + ((new SimpleDateFormat("yy-MM-dd_HH:mm", Locale.getDefault())).format(new Date())) + ".txt"; diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/Numbers.java b/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/Numbers.java index 458d4c5a..0084c8e1 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/Numbers.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/disciplines/Numbers.java @@ -1,5 +1,6 @@ package com.memory_athlete.memoryassistant.disciplines; +import android.Manifest; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; @@ -14,6 +15,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; import androidx.preference.PreferenceManager; import com.memory_athlete.memoryassistant.Helper; @@ -22,7 +24,9 @@ import com.memory_athlete.memoryassistant.recall.RecallSimple; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.IOException; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; @@ -188,32 +192,99 @@ protected boolean save() { if (stringToSave == null || stringToSave.equals("")) return false; //Practice Directory - String path = Helper.APP_FOLDER + File.separator - + getString(R.string.practice); +// String path = Helper.APP_FOLDER + File.separator +// + getString(R.string.practice); +// +// if (Helper.makeDirectory(path, getContext())) { +// //Discipline Directory +// path += File.separator + activity.getTitle().toString(); +// if (Helper.makeDirectory(path, getContext())) { +// //FilePath +// path += File.separator +// + ((new SimpleDateFormat("yy-MM-dd_HH:mm", Locale.getDefault())) +// .format(new Date())) + ".txt"; +// try { +// FileOutputStream outputStream = new FileOutputStream(new File(path)); +// outputStream.write(stringToSave.getBytes()); +// +// outputStream.close(); +// Toast.makeText(getActivity(), R.string.saved, Toast.LENGTH_SHORT).show(); +// return true; +// } catch (Exception e) { +// Timber.e(e); +// Toast.makeText(getActivity(), R.string.try_again, Toast.LENGTH_SHORT).show(); +// } +// } +// } else Toast.makeText(getActivity(), R.string.storage_permission_for_recall, +// Toast.LENGTH_LONG).show(); +// return false; + + + //From discipline + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + + File folder = getActivity().getFilesDir(); + String path = folder + File.separator + getString(R.string.practice) + File.separator + activity.getTitle().toString(); + + //Directory of practice - internal storage +// String path = Helper.APP_FOLDER + File.separator +// + getString(R.string.practice) + File.separator + activity.getTitle().toString(); + + Toast.makeText(activity.getApplicationContext(),"discipline is working", Toast.LENGTH_SHORT).show(); if (Helper.makeDirectory(path, getContext())) { - //Discipline Directory - path += File.separator + "Digits"; - if (Helper.makeDirectory(path, getContext())) { - //FilePath - path += File.separator - + ((new SimpleDateFormat("yy-MM-dd_HH:mm", Locale.getDefault())) - .format(new Date())) + ".txt"; - try { - FileOutputStream outputStream = new FileOutputStream(new File(path)); - outputStream.write(stringToSave.getBytes()); - - outputStream.close(); - Toast.makeText(getActivity(), R.string.saved, Toast.LENGTH_SHORT).show(); - return true; - } catch (Exception e) { - Timber.e(e); - Toast.makeText(getActivity(), R.string.try_again, Toast.LENGTH_SHORT).show(); + path += File.separator + ((new SimpleDateFormat("yy-MM-dd_HH:mm", + Locale.getDefault())).format(new Date())) + ".txt"; + + //Write the file + try { + FileOutputStream outputStream = new FileOutputStream(new File(path)); + outputStream.write(stringToSave.getBytes()); + + outputStream.close(); + Toast.makeText(activity.getApplicationContext(), "Saved", Toast.LENGTH_SHORT).show(); + return true; + } catch (FileNotFoundException e) { + Timber.e(e); + if (saveErrorCount == 0) { + Toast.makeText(activity.getApplicationContext(), R.string.fnf_try_again, Toast.LENGTH_SHORT).show(); + saveErrorCount++; + String[] blocked = {"|", "\\", "?", "*", "<", "\"", ":", ">", "+", "[", "]", "'"}; + for (CharSequence c : blocked) { + String s = path; + s = s.replace(c, ""); + if (!s.equals(path)) { + Timber.e("illegal character in path : %s", path); + path = s; + } + } + return false; } + File f = new File(path); + if (!f.exists()) throw new RuntimeException( + activity.getTitle().toString() + " directory doesn't exist", e); + throw new RuntimeException(e); + } catch (IOException e) { + Timber.e(e); + if (saveErrorCount == 0) { + Toast.makeText(activity.getApplicationContext(), R.string.io_try_again, Toast.LENGTH_SHORT).show(); + saveErrorCount++; + return false; + } + File f = new File(path); + if (!f.exists() && !f.isDirectory()) + throw new RuntimeException(path + " doesn't exist", e); + throw new RuntimeException(e); } } else Toast.makeText(getActivity(), R.string.storage_permission_for_recall, Toast.LENGTH_LONG).show(); return false; + + + } //Case with more digits than 1 or Custom return super.save(); diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/Contribute.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/Contribute.java index 2b50b937..c3a849c2 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/Contribute.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/Contribute.java @@ -26,7 +26,6 @@ import timber.log.Timber; - public class Contribute extends AppCompatActivity { private FirebaseAnalytics mFirebaseAnalytics; @@ -40,6 +39,8 @@ public void onCreate(Bundle savedInstanceState) { setAdapter(); } + + // setting the adapter for displaying the list support, fund,.. public void setAdapter() { final List list = setList(); @@ -94,6 +95,7 @@ public void setAdapter() { Timber.v("Adapter set!"); } + // defining the list items private List setList() { String[] headers = getResources().getStringArray(R.array.contribute_headers); String[] bodies = getResources().getStringArray(R.array.contribute_bodies); @@ -116,6 +118,7 @@ private class Item { } } + // defining each item of adapter private class MainAdapter extends ArrayAdapter { MainAdapter(Activity context, List words) { diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/CrashlyticsLogTree.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/CrashlyticsLogTree.java index f7cff341..866dd252 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/CrashlyticsLogTree.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/CrashlyticsLogTree.java @@ -4,7 +4,7 @@ import androidx.annotation.NonNull; -import com.crashlytics.android.Crashlytics; +//import com.crashlytics.android.Crashlytics; import timber.log.Timber; @@ -18,18 +18,18 @@ protected void log(int priority, String tag, @NonNull String message, Throwable if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } else if (priority == Log.INFO) { - Crashlytics.log(priority, tag, message); + //Crashlytics.log(priority, tag, message); return; } - Crashlytics.setInt(CRASHLYTICS_KEY_PRIORITY, priority); - Crashlytics.setString(CRASHLYTICS_KEY_TAG, tag); - Crashlytics.setString(CRASHLYTICS_KEY_MESSAGE, message); +// Crashlytics.setInt(CRASHLYTICS_KEY_PRIORITY, priority); +// Crashlytics.setString(CRASHLYTICS_KEY_TAG, tag); +// Crashlytics.setString(CRASHLYTICS_KEY_MESSAGE, message); if (throwable != null) { - Crashlytics.logException(throwable); + //Crashlytics.logException(throwable); } else { - Crashlytics.logException(new Exception(message)); + //Crashlytics.logException(new Exception(message)); } } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/CreditsActivity.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/CreditsActivity.java index a8644ca9..14ddfb9b 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/CreditsActivity.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/CreditsActivity.java @@ -39,6 +39,7 @@ protected void onCreate(Bundle savedInstanceState) { }); } + // getting the names to be displayed ArrayList setList(){ ArrayList contributors = new ArrayList<>(); String[] names = getResources().getStringArray(R.array.contributor_names); @@ -56,6 +57,7 @@ private class Item { } } + // defining each item of adapter private class CreditAdapter extends ArrayAdapter { CreditAdapter(Context context, ArrayList list) { diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/DisciplineActivity.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/DisciplineActivity.java index dc0ce81e..bda7e094 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/DisciplineActivity.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/DisciplineActivity.java @@ -40,7 +40,6 @@ public class DisciplineActivity extends AppCompatActivity implements MySpaceFragment.TabTitleUpdater { boolean backPressed = false; - private static ArrayList tabTitles; static Intent intent; //Contains data sent to this activity static ViewPager viewPager; @@ -112,6 +111,7 @@ private SimpleFragmentPagerAdapter(FragmentManager fm) { super(fm); } + // it takes the content according to the discipline like numbers, words, names,.. @NonNull @Override public Fragment getItem(int position) { @@ -180,7 +180,7 @@ protected void onPause() { @Override public void onBackPressed() { int cur = viewPager.getCurrentItem(); - String tag = "android:switcher:" + R.id.viewpager + ":" + cur; + String tag = "android:switcher:" + R.id.viewpager + ":" + cur; //go back in current fragment if (cur != 0) { @@ -270,7 +270,7 @@ protected SimpleFragmentPagerAdapter doInBackground(Void... v) { if (noOfMySpaceScreens == 1) tabTitles.add(mySpace); else tabTitles.add(mySpace + " " + (i + 1)); } - Timber.v("tabTitles.size() = %s", tabTitles.size()); + Timber.v("tabTitles.size() = %s", tabTitles.size()); } return new SimpleFragmentPagerAdapter(fragManager); } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/Learn.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/Learn.java index 1320ff28..72ec4f30 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/Learn.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/Learn.java @@ -22,7 +22,6 @@ import java.util.ArrayList; - public class Learn extends AppCompatActivity { @Override @@ -34,8 +33,10 @@ public void onCreate(Bundle savedInstanceState) { setAdapter(); } + // setting the adapter public void setAdapter() { final ArrayList list = new ArrayList<>(); + setList(list); LearnAdapter adapter = new LearnAdapter(this, list); @@ -53,6 +54,7 @@ public void setAdapter() { }); } + // sets the list method of loci, the perfect association,... private void setList(ArrayList list) { list.add(new Item(R.string.method_of_loci, R.drawable.method_of_loci, Lessons.class, R.raw.lesson_method_of_loci)); list.add(new Item(R.string.associations, R.drawable.perfect_association, Lessons.class, R.raw.lesson_perfect_association)); @@ -65,6 +67,7 @@ private void setList(ArrayList list) { //list.add(new Item(R.string.checkout, Lessons.class, R.raw.Important, true)); } + // data about each item private class Item { int mItem, mFile, mImageId; Class mClass; @@ -85,6 +88,7 @@ private class Item { }*/ } + // defining the adapter which is going to take the list of items for displaying private class LearnAdapter extends ArrayAdapter { LearnAdapter(Activity context, ArrayList list) { diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java index 33094768..8da86b7d 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java @@ -21,10 +21,10 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; -import com.crashlytics.android.Crashlytics; +//import com.crashlytics.android.Crashlytics; import com.google.android.material.snackbar.Snackbar; +import com.google.firebase.BuildConfig; import com.google.firebase.analytics.FirebaseAnalytics; -import com.memory_athlete.memoryassistant.BuildConfig; import com.memory_athlete.memoryassistant.Helper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.mySpace.MySpace; @@ -37,23 +37,25 @@ import java.util.Locale; import java.util.Objects; -import io.fabric.sdk.android.Fabric; +//import io.fabric.sdk.android.Fabric; import timber.log.Timber; import static android.widget.Toast.makeText; import static com.memory_athlete.memoryassistant.Helper.REQUEST_STORAGE_ACCESS; - public class MainActivity extends AppCompatActivity { boolean backPressed = false; + // sharedPreferences object points to a file containing key-value pairs private SharedPreferences sharedPreferences; + // create a menu bar on the first page @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } + // when clicked on Privacy Policy, go to the PrivacyPolicy activity which is a menu item of menu bar @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == R.id.privacy_policy_menu) { @@ -64,6 +66,7 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) { return true; } + // close the MainActivity on back press @Override public void onBackPressed() { if (sharedPreferences.getBoolean(getString(R.string.double_back_to_exit), false) @@ -73,25 +76,27 @@ public void onBackPressed() { } else super.onBackPressed(); } + // displays the main content on the first page @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (BuildConfig.DEBUG) { Timber.plant(new Timber.DebugTree()); } else { - Fabric.with(this, new Crashlytics()); + //Fabric.with(this, new Crashlytics()); Timber.plant(new CrashlyticsLogTree()); } if (BuildConfig.DEBUG) Timber.plant(new Timber.DebugTree()); Helper.theme(this, MainActivity.this); setContentView(R.layout.activity_main); - setTitle(getString(R.string.app_name)); sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + setAdapter(); firstStart(); + Helper.mayAccessStorage(this); if (!verifyInstallerId() && !BuildConfig.DEBUG) { Toast.makeText(this, R.string.dl_from_play, Toast.LENGTH_LONG).show(); @@ -100,9 +105,9 @@ protected void onCreate(Bundle savedInstanceState) { } if (!Locale.getDefault().getLanguage().equals("en")) Toast.makeText(this, R.string.faulty_translations, Toast.LENGTH_LONG).show(); - } + // resuming the MainActivity again @Override protected void onResume() { super.onResume(); @@ -115,12 +120,14 @@ protected void onResume() { }).start(); } + // checks if the MainActivity is running void firstStart() { if (sharedPreferences.getLong("last_opened", 0) != 0) return; makeText(getApplicationContext(), R.string.confused, Toast.LENGTH_LONG).show(); Timber.d("firstStart"); } + // verifies the installer id for checking if app is installed from play store boolean verifyInstallerId() { // A list with valid installers package name List validInstallers = new ArrayList<>(Arrays.asList("com.android.vending", "com.google.android.feedback")); @@ -130,9 +137,11 @@ boolean verifyInstallerId() { return installer != null && validInstallers.contains(installer); } + // ask user's permission for phone read and write storage @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_STORAGE_ACCESS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults.length > 1 && grantResults[1] == PackageManager.PERMISSION_GRANTED) { @@ -144,9 +153,9 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis } } + // displays the list learn, practice, recall,... on the first page, when clicked on a list item, go to that Activity public void setAdapter() { final List list = setList(); - MainAdapter adapter = new MainAdapter(this, list); ListView listView = findViewById(R.id.main_list); listView.setAdapter(adapter); @@ -161,6 +170,7 @@ public void setAdapter() { Timber.v("Adapter set!"); } + // sets the list learn, practice, recall,... private List setList() { return Arrays.asList( new Item(R.string.learn, R.drawable.learn, Learn.class), @@ -170,10 +180,11 @@ private List setList() { new Item(R.string.my_space, R.drawable.my_space, MySpace.class), new Item(R.string.preferences, R.drawable.preferences, Preferences.class), new Item(R.string.get_pro, R.drawable.get_pro, Contribute.class)); - //list.add(new Item(R.string.reminders, )) + //list.add(new Item(R.string.reminders,)) //Timber.v("List set!"); } + // data about each item private class Item { int mItem, mImageId; Class mClass; @@ -185,6 +196,7 @@ private class Item { } } + // defining the adapter which is going to take the list of items for displaying private class MainAdapter extends ArrayAdapter { MainAdapter(Activity context, List words) { diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/Practice.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/Practice.java index 102bc5f4..8ce4c6c4 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/Practice.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/Practice.java @@ -67,6 +67,7 @@ public void onCreate(Bundle savedInstanceState) { } } + // sets the list numbers,words,... private void setList(ArrayList disc) { disc.add(new Discipline(R.string.numbers, R.drawable.numbers, 1, true, false, 1)); disc.add(new Discipline(R.string.words, R.drawable.vocabulary, 2, false, true)); @@ -81,6 +82,7 @@ private void setList(ArrayList disc) { //disc.add(new Discipline(R.string.j, R.drawable.colours, Colours.class, false, false)); } + // data about each item private class Discipline { private int mNameId; private int mImageId; @@ -107,6 +109,7 @@ private class Discipline { } } + // defining the adapter which is going to take the list of items for displaying private class DisciplineAdapter extends ArrayAdapter { DisciplineAdapter(Context context, ArrayList cats) { super(context, 0, cats); diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/RecallSelector.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/RecallSelector.java index 1b884bff..9770120c 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/RecallSelector.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/RecallSelector.java @@ -1,5 +1,6 @@ package com.memory_athlete.memoryassistant.main; +import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; @@ -20,6 +21,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; import com.google.android.material.snackbar.Snackbar; import com.memory_athlete.memoryassistant.Helper; @@ -165,16 +167,34 @@ private void onMyItemClick(ArrayList finalArrayList, int position, Relativ targetClass = item.mClass; mDiscipline = item.mFileName; - dir = new File(Helper.APP_FOLDER + File.separator + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + + File folder = getFilesDir(); + dir = new File(folder + File.separator + getString(R.string.practice) + File.separator + mDiscipline); + +// dir = new File(Helper.APP_FOLDER + File.separator +// + getString(R.string.practice) + File.separator + mDiscipline); Timber.v("directory path = %s", dir.getAbsolutePath()); File[] files = dir.listFiles(); if (files == null || files.length == 0) { String s = (mDiscipline.equals(getString(R.string.digits))) ? getString(R.string.numbers) : mDiscipline; - practice(Helper.APP_FOLDER + File.separator + + //Directory of practice - external storage + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + + File folder1 = getFilesDir(); + practice(folder1 + File.separator + getString(R.string.practice) + File.separator + s); + +// practice(Helper.APP_FOLDER + File.separator +// + getString(R.string.practice) + File.separator + s); return; } @@ -187,8 +207,19 @@ private void onMyItemClick(ArrayList finalArrayList, int position, Relativ } else { // selected stored file within the discipline Timber.v("listViewId = %s", listViewId); - String filePath = Helper.APP_FOLDER + File.separator + + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + + File folder = getFilesDir(); + String filePath = folder + File.separator + getString(R.string.practice) + File.separator + mDiscipline + File.separator + item.mFileName; + + +// String filePath = Helper.APP_FOLDER + File.separator +// + getString(R.string.practice) + File.separator + mDiscipline + File.separator + item.mFileName; Intent intent = new Intent(getApplicationContext(), targetClass); // file's readable name (without extension) intent.putExtra("name", item.mName); // filepath intent.putExtra("file", filePath); // discipline diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpace.java b/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpace.java index 69fdc11e..4c2ca265 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpace.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpace.java @@ -1,5 +1,6 @@ package com.memory_athlete.memoryassistant.mySpace; +import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; @@ -20,6 +21,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; import com.google.android.material.snackbar.Snackbar; import com.memory_athlete.memoryassistant.Helper; @@ -100,6 +102,7 @@ public void setAdapter() { Timber.v("setAdapter started"); ArrayList arrayList = new ArrayList<>(); if (listViewId == MIN_DYNAMIC_VIEW_ID) arrayList = setList(); + else { File[] files = dir.listFiles(); if (files == null || files.length == 0) return; @@ -135,7 +138,15 @@ public void setAdapter() { Item item = finalArrayList.get(position); Timber.v("item.mPath = %s", item.mItem); if (listViewId == MIN_DYNAMIC_VIEW_ID) { - dir = new File(Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + item.mItem); + + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + File folder = getFilesDir(); + dir = new File(folder + File.separator + getString(R.string.my_space) + File.separator + item.mItem); + + //dir = new File(Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + item.mItem); layout.findViewById(listViewId).setVisibility(View.GONE); listViewId++; setTitle(item.mName); @@ -146,7 +157,15 @@ public void setAdapter() { } Timber.v("listViewId = %s", listViewId); - String fileName = Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + getTitle(); + + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + File folder = getFilesDir(); + String fileName = folder + File.separator + "My Space" + File.separator + getTitle().toString(); + + //String fileName = Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + getTitle(); Intent intent = new Intent(getApplicationContext(), WriteFile.class); intent.putExtra("mHeader", item.mName); @@ -168,7 +187,15 @@ public void add(View view) { Intent intent = new Intent(getApplicationContext(), WriteFile.class); intent.putExtra("mHeader", getTitle()); intent.putExtra("name", false); - intent.putExtra("fileName", Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + getTitle()); + + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + File folder = getFilesDir(); + intent.putExtra("fileName", folder + File.separator + getString(R.string.my_space) + File.separator + getTitle()); + + //intent.putExtra("fileName", Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + getTitle()); startActivity(intent); overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } @@ -202,6 +229,7 @@ private class Item { } } + // define each list item of mySpace private class MySpaceAdapter extends ArrayAdapter { MySpaceAdapter(Activity context, ArrayList list) { diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpaceFragment.java b/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpaceFragment.java index 5a5c3023..98e4ada5 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpaceFragment.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpaceFragment.java @@ -1,5 +1,6 @@ package com.memory_athlete.memoryassistant.mySpace; +import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; @@ -23,6 +24,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; @@ -202,7 +204,15 @@ public void setAdapter(final View rootView) { Item item = finalArrayList.get(position); Timber.v("item.mPath = %s", item.mPath); if (fragListViewId == MIN_DYNAMIC_VIEW_ID) { // show selector - dir = new File(Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + item.mPath); + + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + File folder = getActivity().getFilesDir(); + dir = new File(folder + File.separator + getString(R.string.my_space) + File.separator + item.mPath); + + //dir = new File(Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + item.mPath); layout.findViewById(fragListViewId).setVisibility(View.GONE); fragListViewId++; title = item.mName; @@ -219,7 +229,15 @@ public void setAdapter(final View rootView) { //rootView.findViewById(R.id.back_button).bringToFront(); } else { // show editor Timber.v("listViewId = %s", fragListViewId); - fileName = Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + title; + + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + File folder = getActivity().getFilesDir(); + fileName = folder + File.separator + getString(R.string.my_space) + File.separator + title; + + //fileName = Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + title; //Intent intent = new Intent(getApplicationContext(), WriteFile.class); //intent.putExtra("mHeader", item.mName); //intent.putExtra("fileString", item.mItem); @@ -297,8 +315,15 @@ private void setButtons(final View rootView) { addClickListener = v -> { Timber.v("add button clicked"); name = false; - fileName = Helper.APP_FOLDER + MySpaceFragment.this.getString(R.string.my_space) + File.separator + title; + //Directory of practice - external storage + int EXTERNAL_STORAGE_PERMISSION_CODE = 23; + ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + EXTERNAL_STORAGE_PERMISSION_CODE); + File folder = getActivity().getFilesDir(); + fileName = folder + File.separator + MySpaceFragment.this.getString(R.string.my_space) + File.separator + title;; + + //fileName = Helper.APP_FOLDER + MySpaceFragment.this.getString(R.string.my_space) + File.separator + title; editLayout.setVisibility(VISIBLE); fab.setContentDescription(getString(R.string.search)); fab.setOnClickListener(searchClickListener); diff --git a/app/src/main/res/raw-b+fil/lesson_equations.txt b/app/src/main/res/raw-b+fil/lesson_equations.txt deleted file mode 100644 index 0ba4bf2a..00000000 --- a/app/src/main/res/raw-b+fil/lesson_equations.txt +++ /dev/null @@ -1,18 +0,0 @@ -

Ang pagsasanay ng pag-memorize ng mga equation ay isang hindi mapapatawad na kasalanan sapagkat ang mga ito ay nilalayong maunawaan. Gayunpaman, pagdating sa isport, ang mga kasalanan na ito ay pinatawad. Sa kasamaang palad, ang pagsaulo ng mga equation gamit ang mga diskarte sa memorya ay namamalagi sa teritoryong hindi ginusto. Sinubukan kong lumikha ng isang sistema ng pagsaulo ng mga equation ngunit ito ay napaka-krudo at hindi epektibo kaya kakailanganin mong i-tweak ito. Kung pinamamahalaan mo upang mapagbuti ito, mangyaring ibahagi ito sa akin.

- -

Narito kung paano ko kabisado ang mga bagay.

-

    -
  • Maaari kang magpahiwatig ng mga numero na may mga bagay. Ginagawa ko lang ito para sa maliliit na numero upang ang mga bagay ay manatiling madali. Para sa mas malaking bilang, maaari kang lumikha ng isang pare-pareho at kabisaduhin ito nang lubusan sa ibang landas.
  • -
  • Maaari ka ring lumikha ng isang landas na puno ng mga pormula na alam mo na at ginagamit mo ang mga pegs dito
  • -
  • Para sa isang pare-pareho tulad ng bilis ng ilaw (c) o ang unibersal na pagkakapareho ng gravitation (G) maaari kang gumamit ng mga hayop. Kaya ang isang giraffe para sa G at isang kamelyo para sa c.
  • -
  • Gumamit ng isang aksyon para sa isang operator. Halimbawa - suntok para sa pagpaparami. Maaari mong kabisaduhin ang mga panaklong at mga subscription bilang mga pagkilos din.
  • -
  • Para sa isang variable, ang isang tao ay tila ang pinakamahusay na pagpipilian. Si Alan mula sa The Hangover ay isang mahusay na pagpipilian para sa A. Huwag paghaluin ang kapital at maliliit na letra, italaga ang magkakaibang mga tao.
  • -
  • Para sa isang equation ng kemikal, ang mga tao ay maaaring magpahiwatig ng bagong molekula. Huwag gumamit ng anumang bagay para sa mga elemento, dapat mong malaman ang lahat o maaari mo lamang gamitin ang mga pegs mula sa ibang landas / aparador.
  • -
-

Upang kabisaduhin ang lahat ng mga simbolo na iyon, lumikha ng isang kuwento. Maaari kang mag-imbak ng isang maikling equation, sa isang solong peg ngunit kung magtatagal, marahil kakailanganin mong ipagpatuloy ito sa susunod na peg. Sa huli, tiyaking markahan ito bilang pagpapatuloy. Ang isa pang aksyon ay maaaring magamit para sa gawaing ito.

- -

Ilang tip

- -
    -
  • Subukang mapanatili ang pagkakasunud-sunod ng lahat ng mga termino at variable. Mayroon itong mga kalamangan at kahinaan. Ang pangunahing con ay ginagawang katulad ng mga kwento at paulit-ulit at pinatataas ang pagkakataong kalimutan ang equation. Ang resulta na ito ay nagreresulta sa isang pro - hinihikayat ang pag-unawa sa mga equation para sa mga nag-rote ng pag-aaral.
  • -
\ No newline at end of file diff --git a/app/src/main/res/raw-b+fil/lesson_language.txt b/app/src/main/res/raw-b+fil/lesson_language.txt deleted file mode 100644 index ff9e26a7..00000000 --- a/app/src/main/res/raw-b+fil/lesson_language.txt +++ /dev/null @@ -1,9 +0,0 @@ -

Ang pinakamahirap na bahagi ng pag-aaral ng isang bagong wika ay ang bokabularyo. Gayunpaman, isang lakad lamang ito sa parke para sa isang atleta ng memorya. Kumuha lamang ng isang landas ng elepante o isang aparador. Kabisaduhin ang isang salita sa bawat peg. Kabisaduhin ang kahulugan sa pareho o sa susunod na peg depende sa iyong kagustuhan.

- -

Upang kabisaduhin ang isang bagong salita, gumawa lamang ng isang kwento upang kabisaduhin ang pagkakasunud-sunod ng mga pantig. Gumamit ng isa pang kwento na tumutugma sa kahulugan.

- -

Upang malaman ang isang bagong script, lumikha ng isang kwento na maaaring kumatawan ng isang character at kabisaduhin ang pagbigkas. Iyon lang.

- -

Kapag natapos na, maaari mong kabisaduhin ang mga tuntunin sa gramatika at mga pagbubukod bilang mga listahan.

- -

Ang kahusayan ay maaari lamang makuha sa pamamagitan ng paggamit ng wika nang madalas nang hindi ginagamit ang iyong elepante na landas.

\ No newline at end of file diff --git a/app/src/main/res/raw-b+fil/lesson_major_system.txt b/app/src/main/res/raw-b+fil/lesson_major_system.txt deleted file mode 100644 index 29a9d058..00000000 --- a/app/src/main/res/raw-b+fil/lesson_major_system.txt +++ /dev/null @@ -1,77 +0,0 @@ -

Pinagmulan: http://memory-sports.com

- -

Ito ay isang makapangyarihang tool na ginagamit ng mayorya ng mga atleta sa kaisipan. Dahil ito ay batay sa isang phonetic system, madali mong maisaulo ang lahat ng mga imahe at magpatuloy upang magamit ito sa aksyon.

- -

Ang hamon ng mga numero

- -

Ang dahilan kung bakit napakahirap ng mga numero para sa maraming tao ay ang mga ito ay abstract. Nailalarawan nila ang isang halaga ng isang bagay, ngunit wala tayong nakikita, hawakan o maramdaman. Hindi natin mailalarawan kung ano ang ibig sabihin nito. Sigurado, maaari mong subukan ito para sa isang napakababang numero. Ngunit pagdating sa higit sa sampu magkakaroon ka ng malaking problema. Ang konklusyon para sa mga atleta ng memorya ay, upang gawing mas konkreto ang mga numero.

- -

Ang magkakaibang mga sistema ng peg

- -

Upang magpakita ng isang numero kailangan mong baguhin ito sa ibang bagay. Hindi talaga ito mahalaga sa kung ano, hangga't maaari mong isipin ito. Dahil mayroon kaming isang perpektong sistema, kailangan nating isalin ang hindi bababa sa sampung mga imahe para sa bawat bilang. Ang mga listahan na nilikha mo sa mga bagay na iyon ay malawak na tinatawag na "mga listahan ng peg". Tinutukoy ko ang mga bagay na ito bilang "mga imahe" o "mnemonics". Kapag naisaulo mo ang naturang listahan, paulit-ulit mong magamit ito at kabisaduhin ang anumang halaga ng mga numero (depende sa dami ng iyong mga lokasyon mula sa iyong Pamamaraan ng Loci).

- -

Titingnan namin ngayon ang ilang magkakaibang mga sistema ng numero na ginagamit ng mga atleta ng memorya. Ang lumalagong pagiging kumplikado ay ipinahiwatig ng salitang "Antas". Ang isang mas mataas na antas ay naglalaman ng mas maraming impormasyon sa loob ng isang imahe at samakatuwid ay mas mahusay para sa gawain ng pagsaulo. Kasabay nito ang pagsisikap ay lumalaki upang malaman ang system. Ang isang 1st-Level system ay maaaring matutunan sa loob ng limang minuto. Para sa isang sistema ng Ika-3 Antas dapat mong mas mahusay na maasahan ang ilang linggo. Ito ay nakasalalay sa iyong layunin na dapat mong gamitin. Para sa mga pag-aaral maaari kang maging maayos sa mga mas maliit na system. Kung nais mong maging isang kampeon ng memorya ay dapat kang pumunta para sa mas mataas na pagiging kumplikado.

- -

Ang pangkalahatang-ideya na ito ay halimbawa lamang ng mga pinakatanyag na system. Ang mga posibilidad ay mas malaki. Ang bawat baguhan ay pinapayuhan na tandaan na laging may isang mas mahusay na solusyon para sa pagsasalin ng mga numero sa isang bagay na mas hindi malilimutan.

- -

1st-Level: Number-Shape at Number-Rhyme System

- -

Ang isang diskarte ay sa pamamagitan ng hugis ng bawat bilang. Halimbawa: Ang "dalawa" ay mukhang isang swan lamang. Ang isa pang paraan ay ang paggamit ng mga rhymes para sa bawat bilang. Sa kasong ito ang "dalawa" ay maaaring "sapatos". Maliban kung nakikipag-usap ka lamang sa ilang maliit na numero, huwag mag-abala sa pag-aaral ng isang simpleng sistema. Ngunit bakit ganon?

- -

Noong una, hindi mo ginagamit ang kapangyarihan ng mga kumpol. Nangangahulugan ito, ang paglalagay ng maraming impormasyon sa isang imahe. Upang matandaan ang isang numero ng telepono na may walong numero, kakailanganin mo ng walong mga imahe na may tulad na isang simpleng sistema. Bagaman makakatulong pa rin ito upang matandaan ito, ang pagsisikap ay napakalaki para sa isang simpleng gawain.

- -

Pangalawa sa lahat, sampung mga imahe ay hindi sapat upang magkaroon ng isang sapat na iba't para sa iba't ibang mga kwento. Isipin na kailangan mong gumawa ng isang kuwento para sa isang numero na may apat na "twos". Kailangan mong maglagay ng apat na swans sa iyong imahe sa pag-iisip.

- -

Kung nais mong mas epektibo ang kabisaduhin ang mga numero, kakailanganin mo ng isang mas umuusbong na sistema. Kaya laktawan natin ito at magpatuloy sa 2-digit-Systems.

- -

Ika-2 -Level: Ang pangunahing System

- -

Ang pinakamaliit na kumpol para sa decimal na numero ay dalawang magkasama. Ang 10x10 ay gumagawa ng 100 mga imahe para sa bawat kumbinasyon ng dalawang numero. Maaaring magaling itong malaman, ngunit ang mnemonic na batayan ng mga sistemang ito ay makakatulong sa iyo na gawin ito sa isang napakaikling panahon. Itinuturo ng gabay na ito ang pokus sa Major System, isa sa maraming mga paraan upang magkasama ang dalawang mga numero nang magkasama. Sa huli hindi mahalaga kung anong uri ng system ang ginagamit mo kung mayroon kang parehong halaga ng impormasyon na naka-imbak bilang mga imahe.

- -

Ang Major System ay isang diskarteng phonetic upang isalin ang mga numero sa mga salita. Nagsisimula ito sa pag-convert ng mga numero sa mga tunog ng katinig. Pagkatapos nito magdagdag ka ng mga patinig bago, sa pagitan at pagkatapos ng mga titik na iyon. Ang mga patakaran ng ponetiko ay mga mnemonics at samakatuwid ay madaling matandaan. Makakatulong ito sa iyo upang mabuo muli ang mga imahe na nasa iyong ulo, kahit na hindi mo natutunan ang buong hanay ng 100 mga imahe. Matapos ang ilang pagsasanay magkakaroon ka ng malakas na samahan sa bawat numero mula 00 hanggang 99. Tila isang malaking pagsisikap na gawing mas madali ang iyong mga memorya. Ngunit hindi ito mahirap at sa huli hindi mo na kailangang isipin muli. Malalaman mo lang ang iyong mga imahe. Kung malalampasan mo ang iyong pag-aalinlangan sa kahusayan ng pagsisikap na ito, ikaw ay isang napakalaking hakbang nang una sa lahat na dumating dito ngunit tumalikod sa mga pamamaraan na ito.

- -

Ang isa pang mahusay na bagay tungkol sa Major System ay ang katotohanan, na ito ay mapapalawak. Sa pamamagitan ng pagdaragdag ng isang pangatlong numero sa iyong kumpol ay maabot mo ang ika-3 na antas. Ibig sabihin nito na kabisaduhin ang 1.000 bagay, bago mo magamit ito (o 900 kung natutunan mo na ang isang listahan ng 100). Ngunit hindi iyon ang dapat mong isipin para sa mga nagsisimula. Talagang nagagawa mong lumapit nang labis sa isang sistema ng Ika-2 Antas. Ngunit ang dami ng mga atleta ng memorya na gumagamit ng isang sistema ng Ika-3 na Antas ay lumalaki araw-araw. Hindi ako magpapansin nang detalyado tungkol sa sistema ng Ika-3 Antas sapagkat gumagana ito nang lubusan sa parehong paraan bilang isang 2nd-Level Major System ngunit may tatlong numero upang ma-encode sa halip na dalawa.

- -

Ang mga patakaran: 86 ay isang isda

- -

Ang mga sumusunod na patakaran ay ang pangunahing kaalaman ng system. Kailangan mong kabisaduhin ang mga ito upang lumikha at mabuo muli ang iyong mga imahe. Tinuro ko sila sa dose-dosenang mga bata. Nagawa nilang malaman ang mga ito sa halos sampung minuto. Kung walang paliwanag sa bibig, maaaring tumagal ng kaunti, ngunit nakukuha mo ang aking punto: Napakadaling!

- -

Ang Major Code

- -

Numeral Associated Constants

- -
    -
  • 0 s, z, malambot c
  • -
  • 1 t, d
  • -
  • 2 n
  • -
  • 3 m
  • -
  • 4 r
  • -
  • 5 l
  • -
  • 6 j, sh, malambot g, malambot na "ch"
  • -
  • 7 k, hard c, hard g, hard "ch", q, qu
  • -
  • 8 f, v
  • -
  • 9 p, b
  • -
  • Mga tunog na hindi Itinalagang-Vowel, w, h, y, x
  • -
- Ang Mnemonics - -
    -
  • Ang z ay ang unang titik ng zero. Ang iba pang mga titik ay may katulad na tunog
  • -
  • Ang t & d ay may isang pababang stroke at magkatulad na tunog (ang ilang mga variant system ay kasama ang "th")
  • -
  • Ang n ay may dalawang pababang stroke
  • -
  • huling titik ng apat, din 4 at R ay halos salamin na mga imahe ng bawat isa
  • -
  • ang isang script j ay may mas mababang loop / g ay halos isang 6 na paikutin
  • -
  • Ang kapital K "ay naglalaman ng" dalawa't pitong (ang ilang mga variant system ay kasama ang "ng")
  • -
  • Ang script f ay kahawig ng isang figure-8. Ang tunog ng V ay magkakatulad
  • -
  • Ang p ay isang salamin na imaheng 9. b katulad ng tunog at kahawig ng isang 9 na pinagsama sa paligid
  • -
  • Maaari itong magamit kahit saan nang hindi binabago ang halaga ng numero ng salita
  • -
- -

Ang bawat digit na mapa sa isang hanay ng mga magkatulad na tunog na may magkatulad na posisyon sa bibig at dila. Ang pagmamapa ay phonetic, kaya't ang mga tunog ng consonant na mahalaga, hindi ang pagbaybay. Samakatuwid ang isang salitang tulad ng "aksyon" ay makakapasok sa bilang na 762, hindi 712; at "multo" ay magiging 701, samantalang, dahil ang "gh" sa "sapat" ay binibigkas tulad ng isang "f", ang salitang "sapat" ay sumasakop sa bilang na 28.

- -

Katulad din, ang dobleng letra ay hindi pinansin. Ang salitang "misayl" ay naka-map sa 305, hindi 3005. Upang ma-encode ang 3005 ang isa ay gagamit ng isang bagay tulad ng "mossy sail".

- -

Karaniwan ang compact sa pagmamapa. "Ang Indibidwal", halimbawa, ay isinasalin nang walang talino sa 2174140, na may halagang 7 na numero na naka-encode ng 12 titik, at madaling mailarawan.

- -

Lumikha ng iyong sariling listahan

- -

Kung nananatili ka sa mga patakaran sa itaas, may ilang mga bagay na maaari kang magkamali. Maaari mo ring gamitin ang mga abstract na salita tulad ng "oras" kung mayroon kang isang malakas na samahan ng visual para dito tulad ng isang orasan. Manatiling mahigpit sa mga panuntunan sa simula. Makakatulong ito sa iyo upang maisaulo ang mga salita. Mamaya maaari kang tumalon sa paligid at gumamit ng anumang mga salita upang mapalitan ang iyong mas mahina na mga imahe. Nagbago ako ng maraming mga pegs sa aking system sa paglipas ng panahon nang hindi na ginagamit ang Major System. Ngunit upang malaman ang buong pack nang sabay-sabay, ang mga patakaran ay dapat magkaroon.

\ No newline at end of file diff --git a/app/src/main/res/raw-b+fil/lesson_method_of_loci.txt b/app/src/main/res/raw-b+fil/lesson_method_of_loci.txt deleted file mode 100644 index 5718e7cd..00000000 --- a/app/src/main/res/raw-b+fil/lesson_method_of_loci.txt +++ /dev/null @@ -1,40 +0,0 @@ -

Pinagmulan: http://memory-sports.com

- -

Ito ang unang bahagi ng iyong gabay upang makakuha ng memorya tulad ng isang elepante.

- -

Background

- -

Ang pamamaraan na ito ay kasing edad ng sinaunang demokrasya. Ginamit ito ng mga Senador ng Greek at Romano upang maisakatuparan ang memorya ng kanilang mga mahaba't talumpati kapag nagtatanghal sa harap ng senado. Ipinagbabawal na gumamit ng anumang uri ng mga tala, kaya ginagamit nila ang mahusay na pamamaraan na ito upang mapahusay ang kanilang memorya.

- -

Upang maalala ang isang talumpati, sinira nila ito ng mga piraso at lumikha ng mga simbolo para sa bawat solong bahagi. Pagkatapos ay inilagay nila ang mga simbolo na iyon sa iba't ibang mga lokal. Upang maalala ang mga ito nakita nila ang landas at pumunta mula sa isang istasyon patungo sa isa pa, kung saan naalala nila ang mga simbolo at isinalin ito pabalik sa pananalita.

- -

Bakit napakalakas ang pamamaraan ng loci? Sa isang banda ito ay gumagamit ng iyong likas na memorya para sa mga lokasyon. Kahit na wala kang magandang pakiramdam ng direksyon, maaalala mo pa rin ang iyong sariling silid sa lahat ng detalye nito. Sa kabilang banda ay nagbibigay ito ng isang lohikal na pagkakasunud-sunod. Kailangan mo lamang lakarin ang iyong silid nang sunud-sunod o hindi maikakaibilang at ang lahat ng mga bagay ay nasa isang tukoy na pagkakasunud-sunod.

- -

Tatawagin ko ang bawat ruta na nilikha namin sa pamamaraang ito ng isang "landong elepante" (o "landas" lamang). Ito ay isang track na nilikha ng mga talampakan ng hayop at kumakatawan sa pinakamadaling na-navigate na paraan sa pagitan ng isang pinagmulan at isang patutunguhan. Sa bawat oras na ginagamit ito, ito ay nagiging mas malakas at lumalaki nang mas malawak. Ang isang atleta ng memorya ay paulit-ulit na ginagamit ang kanyang mga landas. At dahil ang elepante ay isa ring simbolo para sa isang malakas na memorya, parang isang perpektong pangalan para sa pinakamadaling paraan sa isang mas mahusay na memorya.

- -

Hakbang 1 - Piliin ang iyong lokasyon

- -

Upang magamit ang diskarteng ito at maging isang atleta ng memorya, kailangan mong piliin ang iyong unang lokasyon. Maaari itong maging saanman gusto mo ngunit dapat mong piliin ang isa na pinaka-kilala mo para sa iyong unang landas ng elepante. Maaari itong maging iyong silid, iyong flat, iyong bahay o iyong lugar ng trabaho. Kung gusto mo, maaari ka ring lumikha ng isang haka-haka na landas. Ngunit mas mahirap na kabisaduhin ang simula, kaya ipinapayo ko sa iyo na pumili ng isang tunay na lokasyon sa una. Ang isang atleta ng memorya ay lumilikha ng maraming mga landas para sa mga kampeonato. Ngunit para sa mga nagsisimula ang isang landas ay dapat na maayos.

- -

Hakbang 2 - Tukuyin ang mga Way-Punto

- -

Kapag pinili mo ang iyong unang lokasyon, kailangan mong tukuyin ang lahat ng mga bagay na nais mong gamitin bilang mga point-point sa iyong elephant path. Ang mga ito ay magiging mga istasyon na kailangan mong pumasa, sa bawat oras na isinasaulo mo ang anumang uri ng impormasyon. Ang bilang ng mga paraan-point ay matukoy ang haba ng iyong ruta - at bilang isang resulta ang halaga ng impormasyon na maaari mong itago sa ito. Maaari kang magkaroon ng sampung istasyon o isang libo. Ang isang solong silid ay madaling isama ang dalawampu't mga puntos na puntos. Iminumungkahi ko na ang iyong unang landas ng elepante ay dapat magkaroon ng mga limampung istasyon. Kung manatili ka sa ilang mga patakaran, ang iyong landas ay magiging mas mahusay. Ngunit ang mga patakaran na ito ay isang gabay lamang - maaari mong sirain ang mga ito hangga't gusto mo. Yamang ang bawat tao ay may ibang kaisipan at magkakaibang mga ugnayan, marahil ay dapat mong ibaluktot ang mga patakaran upang gawing katugma ang iyong pagkatao. Sa pamamagitan ng paraan: Ito ay tumutukoy sa bawat solong aspeto sa mga diskarte sa memorya!

-
    -
  • Isipin mo ang iyong mga point-point sa bawat detalye
  • -
  • Piliin ang mga point-way na una mong naisip - ang mga ito ay sa karamihan ng mga kaso ang pinakamahusay na
  • -
  • Panatilihin ang isang tiyak na pagkakasunud-sunod ng paraan ng paglalakad mo sa iyong landas (i.e. sunud-sunod)
  • -
  • Gumamit ng mga kapansin-pansin na paraan-point bawat 10 mga hakbang upang lumikha ng tamang mga segment
  • -
  • Huwag gawing napakaliit ang iyong mga way-point (i.e. isang lapis)
  • -
  • Huwag gawing napakalaki ang iyong mga way-point (i.e. isang bahay)
  • -
  • Huwag silang gawing magkasamang
  • -
  • Huwag silang lalayo sa bawat isa
  • -
  • Huwag gumamit ng mga katulad na paraan-puntos sa parehong landas
  • -
      - -

      Hakbang 3 - Kabisaduhin ang iyong Landas

      - -

      Dahil alam mo na ang lokasyon at natapos mo na ang pagtukoy ng mga way-point, napakadali mong kabisaduhin ang iyong bagong landas na elepante. Subukan lamang na maalala ito sa iyong imahinasyon. Kung nawalan ka ng ilang mga puntos, subukang isipin ang iyong sarili na naglalakad sa iyong landas at bilangin ang bawat isa at ang bawat solong paraan-point dito. Gawin itong paulit-ulit at palalakasin mo ang iyong landas sa bawat oras. Pagkaraan ng ilang sandali, maaari mong madagdagan ang iyong bilis nang kapansin-pansing at may mahusay na sanay na landas na hindi mo kakailanganin nang mas mahaba kaysa sa isang split segundo para sa bawat way-point. Mabilis at natural ang prosesong ito.

      - -

      Hakbang 4 - Gamitin ito!

      - -

      Sa iyong bagong landas ng elepante ay nagagawa mong iugnay ang impormasyon tulad ng mga salita sa bawat way-point. Tutulungan ka nitong alalahanin ang tamang pagkakasunud-sunod at madaling magamit nang paulit-ulit para sa iba't ibang mga layunin. Ito ay dahil natural na nakakalimutan mo ang iyong mga asosasyon makalipas ang ilang sandali, at hangga't hindi mo na muling iniisip ang mga ito. Nangyayari ito sa isang maikling panahon at nakasalalay sa iyong memorya. Ang ilang mga makikinang na atleta ng memorya ay maaalala ang kanilang mga imahe hanggang sa dalawang linggo nang hindi na inuulit ito. Personal na mayroon akong mindset na hindi kailanman maalala ang aking mga asosasyon sa pangalawang pagkakataon pagkatapos ng pagsasanay o isang kampeonato. Hindi ko na kailangan ang impormasyon upang hayaan kong kalimutan ito ng utak ko. Mukhang hindi epektibo ito ngunit nakakatulong ito na magamit muli ang aking mga landas sa lalong madaling panahon (sa aking kaso tungkol sa isang araw).

      \ No newline at end of file diff --git a/app/src/main/res/raw-b+fil/lesson_pao.txt b/app/src/main/res/raw-b+fil/lesson_pao.txt deleted file mode 100644 index c81f0338..00000000 --- a/app/src/main/res/raw-b+fil/lesson_pao.txt +++ /dev/null @@ -1,37 +0,0 @@ -

      Pinagmulan: http://memory-sports.com

      - -

      Kasaysayan

      - -

      Simula sa isang 2-digit na sistema tulad ng 2nd-Level Major System ay medyo maliit na pagsisikap ng 100 mga imahe (10²). Ang isang sistemang tulad nito ay maaaring malaman sa isang napakaikling panahon, kung kaya mabilis na magagamit at madaling sanayin. Ang downside nito ay ang maliit na kumpol ng dalawang digit lamang. Para sa isang apatnapu't bilang na numero ay kailangan mong kabisaduhin ang 20 mga imahe sa 20 mga lokasyon kasama ang iyong Elephant Path sa Pamamaraan ng Loci (na inaakala mong gumamit ng isang imahe sa bawat lokasyon).

      - -

      Ang pagpapabuti ng system sa isang 3-digit na sistema ay isang napakalaking hakbang at humiling na ng 1.000 mga imahe (10³). Mayroong maraming mga pamamaraan upang gawin ito, tulad ng paggamit ng isang 3rd-Level Major System o ang Ben System. Parehong mga mahusay na paraan upang lumikha ng isang listahan ng 1.000 mga imahe. Ang pagsisikap ay sampung beses na mas maraming at mangangailangan ng maraming kasanayan bago mo ito magamit nang mabilis. Ngunit sa loob ng isang apatnapu't numero na kakailanganin mo lamang na kabisaduhin ang 13.3 na mga larawan sa 13.3 na mga lokasyon na sa wakas mapalakas ang iyong bilis at katumpakan (.3 dahil hindi mo mahati-hatiin ang 40 hanggang 6 na may buong bilang; higit pa tungkol dito sa ilalim ng "PAO sa Aksyon"). Ang anumang sistemang 3-digit ay mas sopistikado kaysa sa isang 2-digit na system.

      - -

      Tumalon ang PAO-System sa malaking puwang sa pagitan ng dalawang pamamaraan na ito at nagbibigay ng magandang alternatibo na may lamang 300 na mga imahe na kinakailangan. Technically ito ay isang 3 x 2-digit na system. Ito rin ay isang mahusay na pag-upgrade para sa iyong umiiral na 2-digit na system at isinasaulo sa hindi oras. Ngunit maaari rin itong gumana bilang iyong unang sistema.

      - -

      Paano gumagana ang PAO

      - -

      Ang ideya sa likod ng PAO-System ay napaka-simple: Kung nais nating iwasan ang pag-encode ng higit pang mga numero sa isang imahe, kailangan nating maghanap ng ibang paraan upang mapagbigay ang impormasyon. Magagawa natin iyan sa pamamagitan ng paglikha ng isang kumpol ng 2-digit na mga imahe. Nangangahulugan ito na gumagamit kami ng higit sa isang listahan ng 100 mga imahe at pinagsama ang mga ito sa isang malaking kumpol. Sa kaso ng PAO-System lumikha kami ng tatlong listahan ng 100 item bawat isa: 100 mga tao (P), 100 aksyon (A) at 100 mga bagay (O).

      - -

      Ang kagandahan ng sistemang ito bukod sa napagsasamang impormasyon ng anim na numero ay ang likas na pagkakasunud-sunod ng bawat listahan: Ito ay palaging ang Tao muna, na sinusundan ng Aksyon at Object na huling. Kabisaduhin ang 6.6 maliit na mga eksena tulad nito sa 6.6 ng iyong mga lokasyon at naka-encode ka ng isang apatnapu't digit na numero. Iyon ay mas mahusay kaysa sa isang 3-digit na sistema kung saan kailangan mong kabisaduhin ang dalawang beses nang higit pa at malaman ang 700 mga larawan nang higit pa, hindi ba?

      - -

      Ngunit ang lahat ng mahika ay may isang presyo: Kahit na magkasama ka ng tatlong mga imahe nang magkasama sa isa, kailangan pa rin nilang alalahanin ang kanilang sarili sa huli. Makikita mo na kinakailangan ng isang buong bagong pagtuon kumpara sa isang simpleng 2-digit o kahit na isang 3-digit na sistema. Mahalaga na malinaw na mailarawan ang bawat tao, kilos at bagay. Kung hindi, maaari mong kalimutan kung sino ang tumatalon sa iyong sofa na may isang malaking kandila. Ang parehong bagay ay napupunta para sa pagkilos at ang bagay ng kurso. Mangangailangan ng kasanayan upang malaman ito.

      - -

      At may isa pang downside sa system na ito: Pinuputol mo ang iyong sarili mula sa maraming pagkamalikhain. Ang kumbinasyon ng mga tatlong elemento ay nakakakuha ng isang malinaw na imahe na kailangan mo lamang ilagay sa isa sa iyong mga lokasyon. Mayroong maliit na silid para sa iyong mga ideya na kung saan ay isang malaking bahagi ng kasiyahan sa aking opinyon. Sa kabilang banda, ito ay magiging balanse sa pamamagitan ng isang mas malikhaing pangangailangan para sa pakikipag-ugnayan sa lokasyon. Malalaman mo ang higit pa tungkol dito sa ilalim ng puntong "PAO na kumikilos".

      - -

      Dahil dito at iba pang kababalaghan marami ang nagsasaalang-alang sa mga pagkakaiba-iba ng system, halimbawa ng isang PO-System na may dalawang listahan lamang ng 100 tao at 100 na mga bagay. Bibigyan ka nito ng maraming silid para sa pagkamalikhain muli ngunit bawasan ang kumpol sa 4 na numero sa halip na 6. Ang iba ay may mga problema sa 100 katao. Palaging lito ang mga ito sa bawat isa at gumagamit lamang ng isang AO-System na may 100 aksyon at 100 na mga bagay.

      - -

      Paglikha ng PAO System

      - -

      Maraming paraan upang lumikha ng iyong tatlong listahan. Personal na mas gusto ko ang sumusunod na pamamaraan: Kung nagtatayo ka ng iyong unang numero ng system, dapat mong isaalang-alang ang Major System. Makakatulong ito sa iyo na i-encode ang iyong unang listahan ng 100 mga imahe at mabilis itong matuto. Pagkatapos, o kung mayroon ka nang isang 2-digit na system, maaari mong i-upgrade ito nakakagulat na madali at mabilis: Tingnan ang lahat ng iyong 100 mga imahe. Kung ang mga ito ay mga bagay na subukan upang makahanap ng mga asosasyon sa isang tao at pagkilos para sa bawat isa. Kung ang mga ito ay mga tao ay naghahanap para sa isang angkop na bagay at kilos. Sa ganoong paraan gagawa ka ng likas na samahan na mayroon ka sa iyong ulo. Matapos tukuyin ang mga ito ay maaalala mo ang iyong mga bagong listahan nang madali sa pamamagitan ng pag-activate ng iyong mga imahe sa iyong unang listahan.

      - -

      PAO na kumikilos

      - -

      Upang kabisaduhin ang isang 40-digit na numero ay babasahin mo ito sa mga hakbang ng dalawang numero bawat isa, isinalin ang unang dalawa sa tao, ang pangalawang dalawa sa pagkilos at ang pangatlong dalawang numero sa bagay. Ipagsama ang mga ito at pagsamahin ang imaheng ito sa iyong lokasyon mula sa iyong Elephant Path. Pagkatapos ay magpatuloy sa susunod na anim na numero at ulitin ang pagkakasunud-sunod hanggang sa lumikha ka ng limang kumpol ng imahe. 6.6 na kumpol lamang at maaari mong kabisaduhin ang 8304827739410499306928301829439382904639 - hindi ba?

      - -

      Kung ginusto mong hayaan ang iyong mga imahe na makipag-ugnay sa iyong mga lokasyon, sa halip na ilagay lamang ito sa harap ng mga ito, kailangan mong makakuha ng malikhaing. Halimbawa kung ang iyong lokasyon ay isang u-shaped door knocker at ang iyong PAO ay nagbibigay sa iyo ng isang bagay tulad ng isang elepante (P) kumanta (A) sa isang bisikleta (O). Upang hayaan ang malaking elepante na makipag-ugnay sa knocker ng pinto habang ginagawa ang kanyang sing-riding maaari siyang maging maliit sa iyong imahinasyon. Marahil napakaliit, na siya at ang kanyang bisikleta ay madaling magkasya sa loob ng u-curve ng door knocker. Ito ay magiging isang cute na maliit na imahe na nagkakahalaga ng pag-alala para sa iyong utak.

      - -

      Kung nakikipagkumpitensya ka sa isang kumpetisyon ng memorya kakailanganin mong harapin ang katotohanan, na ang bawat hilera ay magiging 40 numero ang haba. Matapos ang 6 na mga larawan ng PAO (36 na numero) maabot mo ang dulo ng hilera na may natitirang apat na numero lamang. Kapag na-encode mo ang susunod na apat na mga imahe sa hilera at sa susunod na dalawang numero sa sumusunod na hilera upang lumikha ng isang buong PAO-image, maaari kang mawalan ng dalawang kumpletong hilera na may 80 na magkasama. Kung nakalimutan mo ang imaheng PAO na ito ay magkakaroon ka ng 4 na pagkakamali sa unang hilera at 2 pagkakamali sa pangalawa, na tinatakda ang pareho sa kanila sa zero (1 pagkakamali sa kalahati ng hilera, 2 pagkakamali ay nagwawasak sa hilera). Upang maiwasan ito, dapat mong isaalang-alang ang pagsasaulo lamang sa huling apat na numero ng hilera na may isang larawan na PO-halimbawa at simulan ang susunod na hilera gamit ang isang bagong PAO-imahe.

      - -

      PAO para sa mga baraha

      - -

      Maaari mong gamitin ang PAO-Sytem para sa mga kard din. Sa kaso ng mga kard ay gumagawa ng higit pang kahulugan dahil ang isang 2-card system ay nangangailangan ng 2.652 na mga imahe (52x51 cards). Ito ay mas madali upang lumikha at gumagana nang eksakto sa parehong paraan tulad ng sa mga numero. Maaari mo lamang gawin ang iyong umiiral na 1st-Level card system at i-upgrade ito sa parehong pamamaraan na ipinaliwanag ko sa itaas. Kung wala ka pang isang sistema ng card, dapat kang lumikha ng isang simple at pagkatapos ay i-upgrade ito. Talagang sulit ang pagsisikap at ang mga atleta tulad ni Andy Bell ay may kabisaduhin ang isang deck na 52 cards kasama nito sa 31.16 segundo.

      \ No newline at end of file diff --git a/app/src/main/res/raw-b+fil/lesson_perfect_association.txt b/app/src/main/res/raw-b+fil/lesson_perfect_association.txt deleted file mode 100644 index a232aaf5..00000000 --- a/app/src/main/res/raw-b+fil/lesson_perfect_association.txt +++ /dev/null @@ -1,57 +0,0 @@ -

      Pinagmulan: http://memory-sports.com

      - -

      Hakbang 1: Akalain mo ito, Pakinggan mo, Pakiramdam mo!

      - -

      Ito ang pinakamahalagang aralin sa memorya ng memorya: Isipin ang iyong mga kwento bago ang panloob na mata. Kailangan mong TINGNAN ang iyong mga kwento na maging buhay. Ito ay isang malaking pagkakamali sa mga nagsisimula na lumikha ng isang kuwentong alalahanin ngunit hindi ito nakikita. Kapag nagsimula ako sa mga diskarte sa memorya, sinasalita ko lang ang mga salita ng kwento sa aking isipan, ngunit hindi ko ito nauunawaan sa lahat ng mga detalye nito. Hindi kinakailangan ng prosesong ito ng maraming oras. Ngunit kailangan mong makasama doon kung gumawa ka ng anumang uri ng kuwento para sa mga hangarin sa memorya sa iyong isipan.

      - -

      Huwag limitahan ang iyong sarili sa mga visual. Pakinggan ito, maramdaman mo, tikman ito, amoy.

      - -

      Hakbang 2: Mag-isip ng kahon!

      - -

      Ipagpalagay na ang iyong unang istasyon sa iyong landas ay ang talahanayan ng kusina. Ang iyong layunin ay ang kabisaduhin ang mga random na salita. Ito ang isa sa mga pinakamadaling disiplina sa isang kampeon ng memorya, dahil hindi mo na kailangan ang iba kaysa sa iyong handa na Elephant Path (o Paglalakbay, kung paano tinawag ito ng karamihan sa mga atleta na nagsasalita ng Ingles) at ang iyong pagkamalikhain. Ang unang salitang dapat mong kabisaduhin ay ang salitang "saging".

      - -

      Ano ang iyong unang naisip para sa isang posibleng samahan? Tingin ko ay isipin mong ilagay ang saging sa mesa. Masisiguro ko sa iyo, na ang ideyang ito ay tiyak na ang pinakamasama na maaari mong makuha. Kung nais mong kabisaduhin ang dose-dosenang mga salita sa ganitong paraan, sa karamihan ng mga kaso ay hindi mo masyadong maaalala. Naalala mo lang, na may isang bagay na nakahiga sa mesa. Ngunit bakit ganon? Bakit hindi natin matatandaan ang kwentong iyon?

      - -

      Ang sagot ay walang kabuluhan: dahil nakakainis! Hindi kailanman ito nagawa sa pangmatagalang memorya. Dahil ang aming utak ay nakakakuha ng milyun-milyong data bawat segundo, kailangan itong i-filter ang lahat sa pamamagitan ng kaugnayan. Kung ang isang bagay ay tila hindi nauugnay, sinasadya ng aming isip ang impormasyong iyon (naniniwala ang ilang mga neuroscientist na pinapanatili namin ang bawat solong data na naranasan namin, ngunit kahit na, hindi natin ito maaalala sa kalooban). Kahit na ginawa namin ang unang hakbang at tinukoy ang lokasyon upang hanapin ang impormasyon sa maliit na uniberso sa aming ulo sa pamamagitan ng paggamit ng isang landas, hindi pa rin natin matatandaan.

      - -

      Ngunit madali itong baguhin na kakulangan ng kaugnayan: ginagamit lamang namin ang aming pagkamalikhain!

      - -

      Kaya't bumalik tayo sa saging at talahanayan: Ano ang maaari nating gawin sa halip na ilagay lamang ito sa mesa?

      - -
        -
      • Kinakain namin ang saging at inilalagay ang isang balat ng balat sa ilalim ng bawat binti. Ngayon ay maaari naming gamitin ang mesa tulad ng isang Skateboard at dumulas sa silid.
      • -
      • Isinaayos namin ang ibabaw ng mesa gamit ang mushed banana. Masarap ang pakiramdam ngayon!
      • -
      • Pinihit namin ang mesa at ginagamit ang saging tulad ng isang pistol - "Diretso kami - sa - Wild Wild West".
      • -
      • Ano ang gagawin ni Haring Louie? Siya ay magtatayo ng isang trono sa labas ng higanteng saging - kanan sa mesa. Sa ganoong paraan maaari siyang mas mataas kaysa sa kanyang kapwa apes.
      • -
      • Ngunit mag-ingat: Siguraduhin na gumagamit ka lamang ng isang saging sa iyong kwento. Kung hindi, maaalala mo ang salitang "saging" - at mali iyon sa isang kampeonato!
      • -
      - -

      Hakbang 3: Gamitin ang iyong damdamin!

      - -

      Sikaping pag-isipan ang tungkol sa iyong nakaraang buhay: Ano ang mga kaganapan na naalala mo muna? Gaano ka malinaw na maalala ang mga ito? Makikilala mo, na ang pinakamahusay na mga alaala sa iyong ulo ay palaging puno ng damdamin, tulad ng kaarawan, Pasko, ang iyong unang araw sa paaralan, ang iyong unang halik, kasal, ang kapanganakan ng iyong mga anak. Kung tatanungin mo ang sinumang tao tungkol sa kanilang ginawa noong ika-11 ng Setyembre 2001, maaari nilang sabihin sa iyo ang bawat detalye tungkol dito - ngunit hindi nila alam kung ano ang ginawa nila noong araw.

      - -

      Kaya ang dapat mong gawin ay, upang punan ang iyong mga kwento ng emosyon. Maging masaya o paumanhin para sa anumang nabubuhay na nilalang sa iyong mga likhang talento. Huwag mag-empatiya sa lahat ng nangyayari sa iyong isip hangga't naaalala mo ang data.

      - -

      Hakbang 4: Gusto kong ilipat ito, ilipat ito

      - -

      Naalala mo ba, kung ano ang ginawa namin sa mesa, pagkatapos naming ilagay ang balat ng saging sa ilalim ng mga binti? Sa palagay ko ginagawa mo - at hindi lamang dahil sa naisip namin na wala sa kahon. Ang katotohanan na mayroong isang tiyak na kilusan sa kwento, tumaas nang husto ang kaugnayan nito. Masisiguro ko sa iyo, na ang lahat ng mga imahe na nilikha ko ay may kasamang anumang uri ng animation. Lalo na ang aking mga numero ay puno ng paggalaw dahil gumagamit ako ng isang Person-Verb-Object-System. Ngunit babalik ako doon sa isa pang yugto ng Paano Maging isang Memory Champion.

      - -

      Hakbang 5: HALIMBAWA !!!!!!!!!!!!!!!!!!!!!

      - -

      Ang isa sa mga pinakadakilang tool kapag lumilikha ng isang imahe ay upang i-hyperbolse ito. Ito ay i-jack up ang iyong mga kuwento ng maraming. Ang isang bagay na ginagawa ko sa karamihan ng aking mga imahe ay upang madagdagan o bawasan ang laki nang kapansin-pansing. Bakit ko maaalala ang isang elepante sa aking sofa na may mga tunay na sukat nito? Marahil na mahirap isipin, dahil ang elepante ay napakalaki ng sopa. Ngunit kung pag-urong mo ito sa laki ng isang tuta, magiging kaibig-ibig at nakakatawa. Hindi mo na ito makalimutan.

      - -

      Hakbang 6: Gumamit ng mga sekswal na pantasya!

      - -

      Hindi ko iniisip, na kailangan kong ipaliwanag ito sa iyo, ngunit para lamang sa integridad na ginagawa ko: Walang mas malakas na salpok sa isang tao kaysa sa sex! Kahit na ang kaligtasan ng buhay ay madalas na dumating pagkatapos na ang pinakamalaking sa mga instincts. Kaya maaari at gagamitin namin ang drive na iyon upang itulak ang aming mga alaala sa isang bagong antas. Kung ikaw ay masyadong konserbatibo upang kunin ang pagkakataong mapabuti ang iyong memorya, makakaligtaan ka ng isang malaking pagkakataon. Ang payo ko: kagat ang bala. Wala kang dapat pakawalan, dahil ito ang iyong sariling isip at walang sinumang pumuna sa iyo tungkol dito.

      - -

      Siyempre ito ay malakas na nakasalalay sa edad ng mga paksa. Kung itinuturo mo ang mga pamamaraan na ito sa mga bata, dapat mong tiyak na iwanan ang bahaging ito. Dapat silang maging mga tinedyer ng hindi bababa sa bago ito ay may kahulugan sa kanila.

      - -

      Hakbang 7: Gawin itong makulay

      - -

      Buweno, ang iyong utak ay palaging nagsisigawan nang malakas, pagdating sa magagandang kulay. Ano ang naaalala mo pa: Isang kulay abo at maulap na araw sa taglagas o isang maaraw na araw sa isang bukid na bulaklak? Nagsasalita ito para sa sarili. Gamitin ito para sa iyong mga imahe. Hindi mo kailangang tinain ang bawat solong kapisanan na iyong nilikha - marahil ay labis na ito. Ngunit lalo na kung nililikha mo ang iyong mga landas at system (para sa mga numero, card, abstract na imahe), dapat kang gumamit ng maraming mga kulay upang matulungan ang iyong sarili na magtatag ng isang tamang imahe sa iyong isip. Makakatulong din ito sa iyo pagkatapos maalala ang iyong mga imahe, dahil ang isang makulay na kwento ay mas kawili-wili.

      - -

      Hakbang 8: Ulitin, ulitin, ulitin ...

      - -

      Sa totoo lang, ang huling hakbang na ito ay nahuhulog sa nakaraang payo. Ang pag-uulit ay hindi gaanong kinakailangan para sa perpektong samahan ngunit mahigpit na mahalaga para sa anumang uri ng memorya. Sa memorya ng sports, ang isang rollback ng mga imahe na nilikha mo lamang ay maaaring makapagpapatatag ng iyong mga kwento ng kapansin-pansing. Ngunit ito ay isang baluktot na tabak: Kung pupunta ka para sa isang napakalaking halaga ng data sa isang maikling panahon, malamang na mayroon kang sapat na oras upang ulitin. Sa ganoong kaso kailangan mong magtiwala sa iyong mga asosasyon na ginawa mo minsan lamang. Ngunit ang karamihan sa mga atleta ay paulit-ulit ang kanilang mga imahe kahit isang beses. Ang ilang mga atleta ng memorya tulad ng MemoryXL-Pangulong Boris Konrad ay nag-iiba sa kanilang mga imahe nang maraming oras. Nangangahulugan ito, na higit na umaasa siya sa pag-uulit, kaysa sa perpektong kapisanan (iwasto mo ako kung mali, Boris). Ang kanyang lumang mundo record ng 106 salita sa 5 minuto (kamakailan nabali sa pamamagitan ng Katie Kermode na may 109 salita) ay nagsasalita para sa pagiging epektibo ng pamamaraang ito.

      - -

      Kaya nakikita mo, maraming pagpapabuti na maaari mong gawin sa iyong mga asosasyon. Kung gumagamit ka ng mga payo na ito at pagsamahin ang mga ito sa iyong sariling kagustuhan at karanasan, sa lalong madaling panahon ikaw ay magiging isa sa amin - isang Memory Athlete!

      \ No newline at end of file diff --git a/app/src/main/res/raw-b+fil/lesson_wardrobes.txt b/app/src/main/res/raw-b+fil/lesson_wardrobes.txt deleted file mode 100644 index db6b5629..00000000 --- a/app/src/main/res/raw-b+fil/lesson_wardrobes.txt +++ /dev/null @@ -1,129 +0,0 @@ -

      Pinagmulan: http://memory-sports.com

      - -

      Ngayon ay oras na para sa isa pang napakalakas na pamamaraan na gagabay sa iyo sa iyong landas upang maging isang Memory Master: Ang Paraan ng Wardrobe.

      - -

      Ang aparador ay isang handa na pagkakasunud-sunod ng mga pegs ng memorya na maaaring ma-access sa lahat nang maayos at direkta.

      - -

      Kasaysayan

      - -

      Ang partikular na sistemang mnemonic na ito ay bumalik sa mga sinaunang Greeks. Si Simonides, isa sa pinakaunang mga teknolohiyang mnemonic, ay ginamit na ang isang pinasimple na bersyon nito. Ang aktwal na tagapagtatag ng pinabuting pamamaraan ay maaaring isang Greek na tinatawag na Theodektis ng Phaselis na naimpluwensyahan si Aristotle. Ang sikat na pilosopo ay sumulat sa kanyang mga banal na kasulatan tungkol sa paggamit ng alpabeto bilang isang aparador.

      - -

      Sa mga modernong panahon ito ang tagapagsalaysay ng aleman na si Ulrich Voigt na sumulat sa kanyang aklat na sanggunian ng mnemonic na "Esels Welt" (Donkey's World) tungkol sa kamangha-manghang pamamaraan ng mga diskarte sa memorya.

      - -

      Walong bagay na dapat isaalang-alang muna

      - -

      Upang magamit ang pamamaraang ito kailangan mong maghanda ng isa o higit pang magkakaibang wardrobes. Ang aktwal na haba ng bawat aparador ay hindi mahalaga upang gawin itong gumana. Ngunit may ilang mga bagay na dapat isaalang-alang bago lumikha ng iyong una:

      - -
        - -
      • Mag-isip nang malaki. Kung ang iyong wardrobe ay masyadong maikli ay hindi ito sapat na malakas para sa mas mahabang listahan. Ang bilang ng sampung tunog na mahusay para sa mga nagsisimula ngunit malapit nang maabot ang mga limitasyon nito.
      • - -
      • Mag-isip ka rin. Kung ang iyong wardrobe ay masyadong malaki ito ay magiging isang malaking pagsisikap upang makahanap ng sapat na mga pegs sa isang kamay. Sa kabilang banda ito rin ay magiging isang mas malaking pagsisikap na maisaulo ito bago mo masimulan ang paggamit nito. Ang isang bilang ng 1.000 ay may malaking potensyal sa katagalan. Ngunit ang paggawa nito nagkakahalaga ng paglikha ay magpapalagay ng labis na paggamit nito. Kaunti lamang ang angkop sa kategoryang iyon, tulad ng mga mapaghangad na mga atleta ng memorya halimbawa.
      • - -
      • Hanapin ang iyong perpektong laki. Ang paggamit ng isang tiyak na halaga ng mga pegs ay tutulong sa iyo na patatagin ang iyong aparador. Maaari itong maging isang bilog na numero tulad ng 25, 50 o 100. Maaari rin itong isang numero na umaangkop sa isang tiyak na sistema na makakatulong sa iyo na kabisaduhin ang aparador. Ang alpabeto ay mahusay para sa pagbibigay sa iyo ng dose-dosenang mga iba't ibang mga aparador mula sa A-Z.
      • - -
      • Gumamit ng mga system ng memorya. Kung hindi mo ito gagawin ay magkakaroon ka ng maraming mga problema sa pagsaulo sa iyong mga wardrobes. Maraming mga posibleng sistema na maaari mong gamitin. Ilalarawan ko ang ilan sa kanila sa ibaba.
      • - -
      • Gumamit ng pamilyar na mga peg. Sa tuwing nagpupumiglas ka ng imahinasyon ng ilan sa iyong mga peg ay dapat mong tanungin ang iyong sarili na palitan ito ng mas mahusay. Mayroong literal na milyon-milyong mga posibleng pegs para sa iyo doon. Gumamit lamang ng mga gusto mo.
      • - -
      • Bend ang mga patakaran. Ang pagkakasundo sa iyong mga system ay hindi kinakailangan. Bend ang mga patakaran hangga't gusto mo. Ang tanging bagay na nabibilang sa pagtatapos ay maaari mong maalala ang iyong aparador nang madali at wala kang mga problema sa iyong mga peg.
      • - -
      • Gumamit ng isang ayon sa numero. Ang isa sa mga pinakamahalagang bagay ng isang maayos na aparador ay maaari mong palaging tumalon sa bawat solong peg sa system nito. Hindi mo kailangang sundin ang buong pagkakasunud-sunod tulad ng kailangan mong gawin gamit ang String Paraan.
      • - -
      • Tiyaking kung bakit at paano mo magagamit ang pamamaraang ito. Ang pagsasaulo ng isang bagay upang maging mas mahusay sa pag-memorize ng ibang bagay na sobrang tunog para sa karamihan ng mga tao. Kung natitiyak mong mapapabuti nito ang iyong memorya magpakailanman at kung anong mga bagay na iyong isasaulo dito ay mag-uudyok ka sa iyong sarili na gawin ito.
      • - -
      - -

      Gumamit ng mga simpleng code tulad ng Animal Alphabet

      - -

      Tulad ng nakikita mo sa ibaba ng alpabeto ay isang mahusay na supply para sa isang 26-aparador. Kailangan mo lang baguhin ang kategorya at maaari kang magsimula muli mula sa titik A. Maraming mga maisip na wardrobes tulad ng mga musikero, aktor, may akda, pulitiko, cartoon character at marami pa. Dahil ang alpabeto ay isang likas na pagkakasunud-sunod ng 26 na numero na maaari mo ring lumikha ng unang quarter ng iyong bagong sistema ng numero sa labas ng aparador na ito. Tatlo pa sa mga listahan na iyon at mayroon kang isang buong 100-lista ng mga numero ng mga peg.

      - -

      Halimbawa ng isang Animal Alphabet

      - -
        -
      • A = Alligator
      • -
      • B = Butterfly
      • -
      • C = Crab
      • -
      • D = Dolphin
      • -
      • E = Elephant
      • -
      • F = Frog
      • -
      • G = Giraffe
      • -
      • H = Kabayo
      • -
      • I = Iguana
      • -
      • J = dikya
      • -
      • K = Kangaroo
      • -
      • L = Lizard
      • -
      • M = Mouse
      • -
      • N = Nautilus
      • -
      • O = Owl
      • -
      • P = Panda
      • -
      • Q = Quail
      • -
      • R = Rhinoceros
      • -
      • S = Suso
      • -
      • T = Tigre
      • -
      • U = Unicorn
      • -
      • V = Vulture
      • -
      • W = Walrus
      • -
      • X = X-Mas Reindeer
      • -
      • Y = Yak
      • -
      • Z = Zebra
      • -
      - -

      Lumikha ng isang 2-digit na system - paulit-ulit

      - -

      Ang paggamit ng isang sistema ng numero para sa bawat kumbinasyon ng dalawang perpektong numero (00-99) ay magbibigay sa iyo ng isang maayos na 100-aparador. Personal na sa palagay ko ay maaaring ito ang pinakamahusay na aparador na makukuha mo. Ang bilang 100 ay isang kompromiso sa pagitan ng madali ngunit hindi nababaluktot na 10-aparador at ang malakas ngunit mahirap na 1.000-aparador.

      - -

      Maaari kang lumikha ng gayong aparador sa anumang pamamaraan na gusto mo. Maaaring ito ang Dominic System, ang Major System o ang Ben System. Maaari itong maging isang kumplikadong Numero ng Hugis o Numero ng Rhyme System. O maaari kang magkaroon ng isang bagong bagay tulad ng paggamit ng sampung magkakaibang mga kategorya na may sampung mga peg bawat isa, iniutos ng phonetic code ng Major System.

      - -

      Nagsimula ako sa Major System at ginagamit ko ito ngayon bilang aking pangunahing aparador. Mula doon ay gumawa ako ng dalawa pang listahan upang makabuo ng isang Person-Action-Object System (PAO). Iyon ang batayan para sa lahat ng aking mga bagong wardrobes. Hindi ko na ginagamit ang anumang codification ngunit ikinonekta lamang ang bawat bagong listahan ng 100 sa dalawa sa aking mga lumang listahan.

      - -

      Paano kabisaduhin ang isang aparador nang walang anumang codification

      - -

      Gumawa ako ng sampung wardrobes na may 100 katao bawat isa. Upang maisaulo ang mga ito ginamit ko ang aking listahan ng 100 aksyon at ang aking listahan ng 100 mga bagay at na-overlay ang mga ito. Mukhang ang sumusunod na halimbawa:

      - -
        -
      • 674 = Jean Claude van Damme
      • -
      • 67 = nakabitin
      • -
      • 74 = kotse
      • -
      - -

      Gumamit ng inutos na paglalakbay

      - -

      Maaari mong gamitin ang Paraan ng Loci para sa iyong bagong aparador. Karaniwang ito ay isang aparador na gawa sa maraming mga kilalang lokasyon sa isang hilera. Ngunit sa halip na kabisaduhin lamang ang paglalakbay sa isang pagkakasunud-sunod na nais mong gawin sa iyong mga paglalakbay ay iniutos mo ito at kabisaduhin ang mga posisyon ng bawat lokasyon bilang isang numero. Dahil ang prosesong ito ay tumatagal ng oras maaari kang magsimula sa pagsaulo sa bawat sampung lokasyon bilang mga kawit. Sa paglipas ng panahon malalaman mo ang eksaktong mga posisyon kung nakatuon ka sa pag-aaral ng mga ito. O iugnay mo ito sa iyong mayroon nang numero ng System at malalaman mo ang lahat ng mga posisyon mula sa simula.

      - -

      Ang bawat listahan na iyong isinasaulo ay isang bagong Wardrobe

      - -

      Kung nakagawa ka na ng isang aparador at gamitin mo sa unang pagkakataon upang kabisaduhin ang isang tiyak na listahan ng impormasyon ay gagawa ka ng isa pang aparador sa pamamagitan ng paggawa nito. Kung kabisaduhin mo ang mga pangulo ng Estados Unidos ng Amerika sa pagkakasunud-sunod ng kanilang pagkapangulo halimbawa makikita mo ang mga ito sa kanilang mga bilang ng pangulo. Dahil ang kanilang kinatawan ngayon ay isang numero sa kanilang sarili maaari mong gamitin ang mga ito bilang isang nakatayo na aparador. Mula sa George Washington hanggang sa Barack Obama ay magiging bago mong 44-aparador.

      - -

      Dahil ito ay nagbibigay sa iyo ng isang kakatwang numero (hindi sa isang punto ng matematika ng view ngunit mula sa pananaw ng isang master master) maaari kang magdagdag ng karagdagang impormasyon upang gawin itong 50 o kahit 100. Kung nais mong manatiling kakayahang umangkop para sa paparating na mga pangulo maaari silang maglingkod bilang meryenda hanggang sa susunod na halalan.

      - -

      Talagang ginagawa mo sa layunin kung ano ang ginagawa ng iyong utak na hindi sinasadya sa lahat ng mga alaala: Inuugnay mo ang impormasyon pagkatapos ng impormasyon sa bawat isa. Ang malaking pagkakaiba ay, na maaari mong palaging alalahanin ang iyong memorya dahil alam mo kung saan titingnan ang iyong malaking silid na tinatawag na utak.

      - -

      Paano gamitin ang iyong aparador

      - -

      Iugnay ang iyong (1) sa iyong (A). Gamitin ang iyong pagkamalikhain upang pahintulutan ang Alligator (1) na makisalamuha kay George Washington (A), ang Butterfly (2) kasama si John Adams (B) at ang Crab (3) kasama si Thomas Jefferson (C). (Huwag malito sa katotohanan na ang Alligator ay (1) at HINDI (A). Nangangahulugan lamang ito na ang Alligator ay ang numero uno sa iyong aktwal na aparador. Ang (A) ay kumakatawan sa unang elemento ng iyong listahan, sa sa kasong iyon George Washington.

      - -

      Kung nahihirapan ka sa pag-uugnay ng mga pangalan sa mga hayop na dapat mong isipin sa labas ng kahon: Gumamit ng isang bagay na nagpapaalala sa iyo ng pangalan sa halip na ang pangalan mismo. Na maaaring maging isang item, ibang tao, isang kanta atbp.

      - -
        -
      • Ang Alligator ay nakasuot ng puting peluka ng Washington.
      • -
      • Ang Butterfly ay nakatira sa Hardin ng Eden kasama sina Adan at Eva. John ang pangalan nito.
      • -
      • Ang Crab ay nagkakaroon ng isang mahusay na ideya. Ang isang kumikinang na bombilya ay lumilitaw sa itaas ng ulo nito ngunit hindi ito kumikinang. Kinukumpuni ito ni Thomas Edison nang may malaking pagsisikap gamit ang isang tool na nabuo tulad ng isang "J".
      • -
      • Lalo na ang aking pakikipag-ugnay na numero ng tatlo ay tila napakalayo. Ngunit maibabalik ka rin nito sa mga kinakailangang elemento upang muling itayo ang pangalang Thomas Jefferson.
      • -
      - -

      Para sa higit na malikhaing inspirasyon dapat mong basahin ang tungkol sa 7 Mga Sangkap ng Kaisipan at Ang Perpektong Asosasyon.

      - -

      Babala: Hindi ko gagamitin ang Alphabet para sa isang gawain na tulad nito sapagkat binibigyan ka lamang nito ng 26 na liham. Ito ay simpleng halimbawa lamang. Iminumungkahi ko ang paggamit ng Major System o isang bagay na katulad ng 100 mga peg peg sa memorya. Sa kabilang banda maaari kang magdagdag ng apat na listahan ng alpabeto, alisin ang pinaka nakakainis na liham, halimbawa "X" at mayroon kang 100. Gawin ang nais mo.

      - -

      Hayaan itong lumaki

      - -

      Kapag nag-memorize ka ng maraming mga wardrob na may parehong pagkalito ng system ay hindi maiiwasan. Upang maiwasan ang paggamit ng iyong Alligator nang maraming mga okasyon nang hindi nalilito kung aling kwento ang tama na kailangan mong gumamit ng isang keyword (*) bilang isang pangatlong elemento para sa bawat isa sa iyong mga asosasyon. Iyon ay magreresulta sa sumusunod na konstruksyon:

      - -

      (*) - (1) - (A), (*) - (2) - (B), atbp.

      - -

      Ito ay may kaugnayan sa Self Enhanced Memory Matrix (SEM³). Personal na hindi ko gusto ang diskarte na ito sa lahat dahil may masyadong maraming hindi nauugnay na chunking sa aking opinyon. Sa halip hinayaan kong lumaki ang aking mga wardrobes na bumubuo ng mas malalaking mga sistema tulad ng isinulat ko sa itaas kasama ang halimbawa ng Jean Claude van Damme. Dapat mong subukan ito at hanapin ang tamang diskarte para sa iyong personal na panlasa.

      - -

      Konklusyon

      - -

      Ang Paraan ng Wardrobe ay marahil ang pinakamahusay na sistema ng mnemonic na alam ko. Kailangan nito ang isang handa na aparador bago ka lumukso sa pagkilos at kabisaduhin ang iba pa. Ngunit pagkatapos ay magagawa mong kabisaduhin ang maraming iba't ibang uri ng impormasyon. Maaari mong gamitin ito bilang mga system number at bilang mga lokasyon upang mag-imbak ng pansamantalang listahan. Maaari mo ring maiimbak nang permanente ito sa pamamagitan lamang ng paggamit ng bawat aparador nang isang beses at magpatuloy sa iyong bagong nilikha na aparador mula sa huling listahan na naisaulo. Ngunit hindi ito iminumungkahi ko. Ang pagsasama-sama ng isang keyword na may tamang wardrobe o alternatibong pag-overlay ng iyong PAO tulad ng ginawa ko sa itaas ay sa palagay ko ang dalawang pinakamalakas na diskarte para sa mas mahabang listahan. Napakalakas ng mga ito upang magamit mo lamang ang isang solong 100-aparador nang daan-daang beses nang paulit-ulit.

      diff --git a/app/src/main/res/values-b+fil/strings.xml b/app/src/main/res/values-b+fil/strings.xml index 05f903b5..fe53d39f 100644 --- a/app/src/main/res/values-b+fil/strings.xml +++ b/app/src/main/res/values-b+fil/strings.xml @@ -1,163 +1,163 @@ - Katulong sa Memoryal - Mag log in - Alamin - Pagsasanay - Magugunita - Kagustuhan - Maging Isang Bahagi - Ipatupad - Aking espasyo - Mga Paalala - Kagustuhan - Piliin ang Disiplina - Numero - Mga Pangalan - Mga kard - Binary Digits - Mga Lugar - Petsa - Mga Pagkain - Mga Kulay - Mga Sulat - Random - Mga Digit - Pumili ng file - Ipasok ang mga sagot - Kalidad - Kinuha ang oras - Suriin - Sumuko! - Lumipas ang Oras - Natitirang oras - Maling - Tamang - Ang iyong mga Tugon - Tamang mga sagot - Tanggalin - Naiwan - Ipasok ang petsa - Pagsasalita - Ipasok ang bilang ng - mga halaga - deck - mga salita - mga lugar - mga pangalan - mga kaganapan - Pumili ng maximum na mga numero sa isang halaga - Gaano karaming mga halaga sa magkasama - Stopwatch - Timer - Piliin ang Timekeeper - Magsimula - Tapos na ang oras - Mangyaring Ipasok ang Tagal! - I-reset - Tumigil - Ipagpatuloy - Ipasok ang bilang ng mga halaga at laki ng bawat halaga - I-save - I-save ang Nabigo. Muling ulitin? - Oo - Hindi - Walang pagpigil sa oras - Mga Minuto - Pangalawa - Susunod - Nakaraan - Ipakita lamang ang taon - Isama ang mga negatibong numero - Isama ang mga numero ng desimal - Simulan ang Timer - Simulan ang Stopwatch - Pamantayan - Pasadyang - Piliin ang antas - Piliin ang taon ng pagsisimula - Piliin ang taong pagtatapos - Kinakailangan ang mga pahintulot sa pag-iimbak para sa Recall - Nagsasalita - Mga pangunahing Sistema - Mga Ben System - Mga wardrobes - Mga listahan - Mga algorithm - Mga Salita - Pangalan - Ipasok dito - Lumabas nang hindi nakakatipid - Ang aking Space file picker - Paalalahanan Mo Ako Paminsan-minsan - Gusto Kong Magsanay Sa - Bilang ng mga screen ng mySpace - Batay sa Lokasyon - Sa panahon ng pagbibiyahe - 22:30 - Tema - AppTheme - Liwanag - Madilim - tumusok - Single card - Ipakita ang grid kapag nagsasanay ng mga kard - Ipakita ang solong kard kapag nagsasanay ng mga kard - Bilang ng mga haligi sa Mga Kard ng Praktis - Bilang ng mga haligi sa Mga Recall Cards - Ang aking mga tab na Space ay nasa ilalim ng screen - Ang aking mga tab na Space ay nasa tuktok ng screen - Nangunguna sa mga zero - Huwag magdagdag ng mga zero bago ang isang maliit na bilang - Magdagdag ng mga zero bago ang isang maliit na bilang - Letter case - Shuffle Decks - Magkalas ang lahat ng mga deck nang magkasama - I-shuffle ang isang deck nang sabay-sabay - Pindutin muli ang dalawang beses upang lumabas mula sa pangunahing screen - I-clear ang lahat ng pagsasanay sa cache - Maiwasan ang hindi sinasadyang paglabas ng app - Pindutin ang pabalik ng isang beses lamang upang lumabas mula sa pangunahing screen - Mga tab sa ilalim - Mga Sulat - 2x \nNumbers - 1x \nBinary digit - 1x \nWords - 1x \nNames - .5x \nPlaces - .5x - Paraan Ng Loci - Ang Perpektong Samahan - Ang pangunahing System - Pagkakapantay-pantay - Marami pa upang malaman - Ang PAO Memory System - Paraan ng Wardrobe - Ginawa mo na ang transaksyon na iyon \nMagawa ng iba pa: p - Listahan ng mga naibigay na halaga - Salamat - \t - Palawakin - Bisitahin ang Aking Space - Subukan muli - Nagkaroon ng isang error, mangyaring iulat ito sa developer - Nalilito? Magsimula sa tuktok - Dagdag - disiplina - Rate ng pagsasalita - Bago - Patakaran sa Pagkapribado - Mangyaring suriin ang imbakan - Para sa tamang pag-andar, mangyaring i-download ang app mula sa Google Play Store - Mangyaring magpasok ng isang pangalan - Hindi natagpuan ang file. Subukan muli - IOException. Pakiulit muli - Mga Wika - Hindi nag-save ng walang pangalan na file - Hindi mahanap - Nai-save - Paghahanap - Umabot sa ilalim. Naghahanap mula sa itaas - Subukan muli gamit ang isang mas maikling pangalan - Buong imbakan ng aparato - Ang pahintulot upang ma-access ang imbakan ay kinakailangan - Mangyaring maghintay - Ang mga petsa na ito ay hindi totoo - Ang mga pagsalin ay maaaring mali + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 05f903b5..fe53d39f 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -1,163 +1,163 @@ - Katulong sa Memoryal - Mag log in - Alamin - Pagsasanay - Magugunita - Kagustuhan - Maging Isang Bahagi - Ipatupad - Aking espasyo - Mga Paalala - Kagustuhan - Piliin ang Disiplina - Numero - Mga Pangalan - Mga kard - Binary Digits - Mga Lugar - Petsa - Mga Pagkain - Mga Kulay - Mga Sulat - Random - Mga Digit - Pumili ng file - Ipasok ang mga sagot - Kalidad - Kinuha ang oras - Suriin - Sumuko! - Lumipas ang Oras - Natitirang oras - Maling - Tamang - Ang iyong mga Tugon - Tamang mga sagot - Tanggalin - Naiwan - Ipasok ang petsa - Pagsasalita - Ipasok ang bilang ng - mga halaga - deck - mga salita - mga lugar - mga pangalan - mga kaganapan - Pumili ng maximum na mga numero sa isang halaga - Gaano karaming mga halaga sa magkasama - Stopwatch - Timer - Piliin ang Timekeeper - Magsimula - Tapos na ang oras - Mangyaring Ipasok ang Tagal! - I-reset - Tumigil - Ipagpatuloy - Ipasok ang bilang ng mga halaga at laki ng bawat halaga - I-save - I-save ang Nabigo. Muling ulitin? - Oo - Hindi - Walang pagpigil sa oras - Mga Minuto - Pangalawa - Susunod - Nakaraan - Ipakita lamang ang taon - Isama ang mga negatibong numero - Isama ang mga numero ng desimal - Simulan ang Timer - Simulan ang Stopwatch - Pamantayan - Pasadyang - Piliin ang antas - Piliin ang taon ng pagsisimula - Piliin ang taong pagtatapos - Kinakailangan ang mga pahintulot sa pag-iimbak para sa Recall - Nagsasalita - Mga pangunahing Sistema - Mga Ben System - Mga wardrobes - Mga listahan - Mga algorithm - Mga Salita - Pangalan - Ipasok dito - Lumabas nang hindi nakakatipid - Ang aking Space file picker - Paalalahanan Mo Ako Paminsan-minsan - Gusto Kong Magsanay Sa - Bilang ng mga screen ng mySpace - Batay sa Lokasyon - Sa panahon ng pagbibiyahe - 22:30 - Tema - AppTheme - Liwanag - Madilim - tumusok - Single card - Ipakita ang grid kapag nagsasanay ng mga kard - Ipakita ang solong kard kapag nagsasanay ng mga kard - Bilang ng mga haligi sa Mga Kard ng Praktis - Bilang ng mga haligi sa Mga Recall Cards - Ang aking mga tab na Space ay nasa ilalim ng screen - Ang aking mga tab na Space ay nasa tuktok ng screen - Nangunguna sa mga zero - Huwag magdagdag ng mga zero bago ang isang maliit na bilang - Magdagdag ng mga zero bago ang isang maliit na bilang - Letter case - Shuffle Decks - Magkalas ang lahat ng mga deck nang magkasama - I-shuffle ang isang deck nang sabay-sabay - Pindutin muli ang dalawang beses upang lumabas mula sa pangunahing screen - I-clear ang lahat ng pagsasanay sa cache - Maiwasan ang hindi sinasadyang paglabas ng app - Pindutin ang pabalik ng isang beses lamang upang lumabas mula sa pangunahing screen - Mga tab sa ilalim - Mga Sulat - 2x \nNumbers - 1x \nBinary digit - 1x \nWords - 1x \nNames - .5x \nPlaces - .5x - Paraan Ng Loci - Ang Perpektong Samahan - Ang pangunahing System - Pagkakapantay-pantay - Marami pa upang malaman - Ang PAO Memory System - Paraan ng Wardrobe - Ginawa mo na ang transaksyon na iyon \nMagawa ng iba pa: p - Listahan ng mga naibigay na halaga - Salamat - \t - Palawakin - Bisitahin ang Aking Space - Subukan muli - Nagkaroon ng isang error, mangyaring iulat ito sa developer - Nalilito? Magsimula sa tuktok - Dagdag - disiplina - Rate ng pagsasalita - Bago - Patakaran sa Pagkapribado - Mangyaring suriin ang imbakan - Para sa tamang pag-andar, mangyaring i-download ang app mula sa Google Play Store - Mangyaring magpasok ng isang pangalan - Hindi natagpuan ang file. Subukan muli - IOException. Pakiulit muli - Mga Wika - Hindi nag-save ng walang pangalan na file - Hindi mahanap - Nai-save - Paghahanap - Umabot sa ilalim. Naghahanap mula sa itaas - Subukan muli gamit ang isang mas maikling pangalan - Buong imbakan ng aparato - Ang pahintulot upang ma-access ang imbakan ay kinakailangan - Mangyaring maghintay - Ang mga petsa na ito ay hindi totoo - Ang mga pagsalin ay maaaring mali + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/memory_athlete/memoryassistant/ExampleUnitTest.java b/app/src/test/java/com/memory_athlete/memoryassistant/ExampleUnitTest.java index 82c13899..a3bc242a 100644 --- a/app/src/test/java/com/memory_athlete/memoryassistant/ExampleUnitTest.java +++ b/app/src/test/java/com/memory_athlete/memoryassistant/ExampleUnitTest.java @@ -1,9 +1,9 @@ package com.memory_athlete.memoryassistant; -import org.junit.Test; - import static org.junit.Assert.assertEquals; +import org.junit.Test; + /** * Example local unit test, which will execute on the development machine (host). * diff --git a/build.gradle b/build.gradle index 0f4b5e85..81e37ab7 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ buildscript { name 'Google' } google() + mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:3.5.2' @@ -19,6 +20,10 @@ buildscript { classpath 'com.google.firebase:perf-plugin:1.3.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // at line 4 //classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1' + // Add the dependency for the Crashlytics Gradle plugin + // Add the dependency for the Crashlytics Gradle plugin + //classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2' + // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -34,4 +39,6 @@ allprojects { task clean(type: Delete) { delete rootProject.buildDir -} \ No newline at end of file +} + + diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e56735f5..f4d7b2bf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Sat Oct 19 14:06:10 BST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/gradlew b/gradlew index 9d82f789..b0d6d0ab 100644 --- a/gradlew +++ b/gradlew @@ -1,4 +1,20 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## ## @@ -6,20 +22,38 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +64,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,26 +75,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +105,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -150,11 +170,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec99730..15e1ee37 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem http://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -8,14 +24,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +62,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +75,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line From 002f894df7735610de467bd45d00fe104c5480e7 Mon Sep 17 00:00:00 2001 From: Anuja Shetye <55632820+shetyeanuja@users.noreply.github.com> Date: Fri, 7 Oct 2022 10:35:53 +0530 Subject: [PATCH 02/31] Crashlytics dependency added --- app/build.gradle | 5 +++++ .../memoryassistant/main/MainActivity.java | 10 ++++++---- build.gradle | 7 ++++--- gradle/wrapper/gradle-wrapper.properties | 5 +++-- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 70f48093..093fbc92 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,6 +91,10 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation platform('com.google.firebase:firebase-bom:28.0.1') + implementation 'com.google.firebase:firebase-analytics' + implementation 'com.google.firebase:firebase-crashlytics' + testImplementation 'junit:junit:4.12' //noinspection GradleCompatible androidTestImplementation 'androidx.test:rules:1.1.1' @@ -102,3 +106,4 @@ repositories { //maven { url 'https://maven.fabric.io/public' } } apply plugin: 'com.google.gms.google-services' +apply plugin: 'com.google.firebase.crashlytics' diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java index 8da86b7d..22c3fcad 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java @@ -1,5 +1,8 @@ package com.memory_athlete.memoryassistant.main; +import static android.widget.Toast.makeText; +import static com.memory_athlete.memoryassistant.Helper.REQUEST_STORAGE_ACCESS; + import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; @@ -21,7 +24,6 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; -//import com.crashlytics.android.Crashlytics; import com.google.android.material.snackbar.Snackbar; import com.google.firebase.BuildConfig; import com.google.firebase.analytics.FirebaseAnalytics; @@ -37,11 +39,10 @@ import java.util.Locale; import java.util.Objects; -//import io.fabric.sdk.android.Fabric; import timber.log.Timber; -import static android.widget.Toast.makeText; -import static com.memory_athlete.memoryassistant.Helper.REQUEST_STORAGE_ACCESS; +//import com.crashlytics.android.Crashlytics; +//import io.fabric.sdk.android.Fabric; public class MainActivity extends AppCompatActivity { boolean backPressed = false; @@ -60,6 +61,7 @@ public boolean onCreateOptionsMenu(Menu menu) { public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == R.id.privacy_policy_menu) { startActivity(new Intent(MainActivity.this, PrivacyPolicy.class)); + //throw new RuntimeException("Testing crash"); } else { return super.onOptionsItemSelected(item); } diff --git a/build.gradle b/build.gradle index 81e37ab7..5016e6df 100644 --- a/build.gradle +++ b/build.gradle @@ -15,14 +15,15 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' - classpath 'com.google.gms:google-services:4.3.3' + classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.google.gms:google-services:4.3.14' classpath 'com.google.firebase:perf-plugin:1.3.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // at line 4 //classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1' // Add the dependency for the Crashlytics Gradle plugin // Add the dependency for the Crashlytics Gradle plugin - //classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.4.1' + //2.6.1 // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f4d7b2bf..a23862b2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Fri Oct 07 10:22:16 IST 2022 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME From 25f5e7d60617ad0db7e3acf9ee60dbb8a0968b52 Mon Sep 17 00:00:00 2001 From: Anuja Shetye <55632820+shetyeanuja@users.noreply.github.com> Date: Fri, 7 Oct 2022 13:48:52 +0530 Subject: [PATCH 03/31] Crashlytics dependency added --- bash.exe.stackdump | 20 ++++++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 5 ++- gradlew | 37 +++++++++++------------ gradlew.bat | 27 +++++------------ 5 files changed, 47 insertions(+), 42 deletions(-) create mode 100644 bash.exe.stackdump create mode 100644 gradle/wrapper/gradle-wrapper.jar diff --git a/bash.exe.stackdump b/bash.exe.stackdump new file mode 100644 index 00000000..0a95582c --- /dev/null +++ b/bash.exe.stackdump @@ -0,0 +1,20 @@ +Stack trace: +Frame Function Args +000FFFF9EC8 001800647D1 (000FFFFA0E8, 00000000002, 000FFFFCE00, 000FFFFDE50) +000FFFF9F70 00180066C00 (00000000064, 00000000000, 00000000240, 00000000000) +000FFFFA5F0 0018014B838 (00000752CF0, 00000000000, 00000000000, 000FFFFA818) +000FFFFA770 00180064AB3 (00000000000, 00000000000, 00000000000, 000FFFFAE00) +000FFFFADB0 7FF86C53235F (000FFFFADB0, 000FFFFB470, 00000000000, 000FFFFA8B0) +000FFFFADB0 7FF86C4E14A4 (000FFFFBA10, 000FFFFB880, 00800058870, 00000000007) +000FFFFB880 7FF86C530E8E (00000000000, 7919DF05995F, 7FF86C52996C, 00000000000) +000FFFFB880 00100408A4F (00000000000, 00000000000, 00000000000, 00000000000) +000FFFFB880 0010040AB98 (00100402D65, 00000000010, 00000000010, 000FFFFC788) +0080007C230 00100401A34 (00180176271, 0080007C180, 0080007B5A0, 0080007B6B0) +0080007C230 00100459DF5 (0080007C8C0, 00000000014, 00000000000, 0080007B540) +0080007C230 00100459677 (00100000009, 00000000000, 001005DADA0, 00000000000) +00000000000 00100459775 (00800000002, 00000000001, 00000000001, 00000000010) +00000000000 001004C0079 (000FFFFCC80, 00800038610, 0018004B08F, 00180049FE0) +000FFFFCCE0 0018004B0FB (00000000000, 00000000000, 00000000000, 00000000000) +000FFFFCDA0 00180048A2A (00000000000, 00000000000, 00000000000, 00000000000) +000FFFFCE50 00180048AEC (00000000000, 00000000000, 00000000000, 00000000000) +End of stack trace diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 zcma&O1CT9Y(k9%tZQHhO+qUh#ZQHhO+qmuS+qP|E@9xZO?0h@l{(r>DQ>P;GjjD{w zH}lENr;dU&FbEU?00aa80D$0M0RRB{U*7-#kbjS|qAG&4l5%47zyJ#WrfA#1$1Ctx zf&Z_d{GW=lf^w2#qRJ|CvSJUi(^E3iv~=^Z(zH}F)3Z%V3`@+rNB7gTVU{Bb~90p|f+0(v;nz01EG7yDMX9@S~__vVgv%rS$+?IH+oZ03D5zYrv|^ zC1J)SruYHmCki$jLBlTaE5&dFG9-kq3!^i>^UQL`%gn6)jz54$WDmeYdsBE9;PqZ_ zoGd=P4+|(-u4U1dbAVQrFWoNgNd;0nrghPFbQrJctO>nwDdI`Q^i0XJDUYm|T|RWc zZ3^Qgo_Qk$%Fvjj-G}1NB#ZJqIkh;kX%V{THPqOyiq)d)0+(r9o(qKlSp*hmK#iIY zA^)Vr$-Hz<#SF=0@tL@;dCQsm`V9s1vYNq}K1B)!XSK?=I1)tX+bUV52$YQu*0%fnWEukW>mxkz+%3-S!oguE8u#MGzST8_Dy^#U?fA@S#K$S@9msUiX!gd_ow>08w5)nX{-KxqMOo7d?k2&?Vf z&diGDtZr(0cwPe9z9FAUSD9KC)7(n^lMWuayCfxzy8EZsns%OEblHFSzP=cL6}?J| z0U$H!4S_TVjj<`6dy^2j`V`)mC;cB%* z8{>_%E1^FH!*{>4a7*C1v>~1*@TMcLK{7nEQ!_igZC}ikJ$*<$yHy>7)oy79A~#xE zWavoJOIOC$5b6*q*F_qN1>2#MY)AXVyr$6x4b=$x^*aqF*L?vmj>Mgv+|ITnw_BoW zO?jwHvNy^prH{9$rrik1#fhyU^MpFqF2fYEt(;4`Q&XWOGDH8k6M=%@fics4ajI;st# zCU^r1CK&|jzUhRMv;+W~6N;u<;#DI6cCw-otsc@IsN3MoSD^O`eNflIoR~l4*&-%RBYk@gb^|-JXs&~KuSEmMxB}xSb z@K76cXD=Y|=I&SNC2E+>Zg?R6E%DGCH5J1nU!A|@eX9oS(WPaMm==k2s_ueCqdZw| z&hqHp)47`c{BgwgvY2{xz%OIkY1xDwkw!<0veB#yF4ZKJyabhyyVS`gZepcFIk%e2 zTcrmt2@-8`7i-@5Nz>oQWFuMC_KlroCl(PLSodswHqJ3fn<;gxg9=}~3x_L3P`9Sn zChIf}8vCHvTriz~T2~FamRi?rh?>3bX1j}%bLH+uFX+p&+^aXbOK7clZxdU~6Uxgy z8R=obwO4dL%pmVo*Ktf=lH6hnlz_5k3cG;m8lgaPp~?eD!Yn2kf)tU6PF{kLyn|oI@eQ`F z3IF7~Blqg8-uwUuWZScRKn%c2_}dXB6Dx_&xR*n9M9LXasJhtZdr$vBY!rP{c@=)& z#!?L$2UrkvClwQO>U*fSMs67oSj2mxiJ$t;E|>q%Kh_GzzWWO&3;ufU%2z%ucBU8H z3WIwr$n)cfCXR&>tyB7BcSInK>=ByZA%;cVEJhcg<#6N{aZC4>K41XF>ZgjG`z_u& zGY?;Ad?-sgiOnI`oppF1o1Gurqbi*;#x2>+SSV6|1^G@ooVy@fg?wyf@0Y!UZ4!}nGuLeC^l)6pwkh|oRY`s1Pm$>zZ3u-83T|9 zGaKJIV3_x+u1>cRibsaJpJqhcm%?0-L;2 zitBrdRxNmb0OO2J%Y&Ym(6*`_P3&&5Bw157{o7LFguvxC$4&zTy#U=W*l&(Q2MNO} zfaUwYm{XtILD$3864IA_nn34oVa_g^FRuHL5wdUd)+W-p-iWCKe8m_cMHk+=? zeKX)M?Dt(|{r5t7IenkAXo%&EXIb-i^w+0CX0D=xApC=|Xy(`xy+QG^UyFe z+#J6h_&T5i#sV)hj3D4WN%z;2+jJcZxcI3*CHXGmOF3^)JD5j&wfX)e?-|V0GPuA+ zQFot%aEqGNJJHn$!_}#PaAvQ^{3-Ye7b}rWwrUmX53(|~i0v{}G_sI9uDch_brX&6 zWl5Ndj-AYg(W9CGfQf<6!YmY>Ey)+uYd_JNXH=>|`OH-CDCmcH(0%iD_aLlNHKH z7bcW-^5+QV$jK?R*)wZ>r9t}loM@XN&M-Pw=F#xn(;u3!(3SXXY^@=aoj70;_=QE9 zGghsG3ekq#N||u{4We_25U=y#T*S{4I{++Ku)> zQ!DZW;pVcn>b;&g2;YE#+V`v*Bl&Y-i@X6D*OpNA{G@JAXho&aOk(_j^weW{#3X5Y z%$q_wpb07EYPdmyH(1^09i$ca{O<}7) zRWncXdSPgBE%BM#by!E>tdnc$8RwUJg1*x($6$}ae$e9Knj8gvVZe#bLi!<+&BkFj zg@nOpDneyc+hU9P-;jmOSMN|*H#>^Ez#?;%C3hg_65leSUm;iz)UkW)jX#p)e&S&M z1|a?wDzV5NVnlhRBCd_;F87wp>6c<&nkgvC+!@KGiIqWY4l}=&1w7|r6{oBN8xyzh zG$b#2=RJp_iq6)#t5%yLkKx(0@D=C3w+oiXtSuaQ%I1WIb-eiE$d~!)b@|4XLy!CZ z9p=t=%3ad@Ep+<9003D2KZ5VyP~_n$=;~r&YUg5UZ0KVD&tR1DHy9x)qWtKJp#Kq# zP*8p#W(8JJ_*h_3W}FlvRam?<4Z+-H77^$Lvi+#vmhL9J zJ<1SV45xi;SrO2f=-OB(7#iNA5)x1uNC-yNxUw|!00vcW2PufRm>e~toH;M0Q85MQLWd?3O{i8H+5VkR@l9Dg-ma ze2fZ%>G(u5(k9EHj2L6!;(KZ8%8|*-1V|B#EagbF(rc+5iL_5;Eu)L4Z-V;0HfK4d z*{utLse_rvHZeQ>V5H=f78M3Ntg1BPxFCVD{HbNA6?9*^YIq;B-DJd{Ca2L#)qWP? zvX^NhFmX?CTWw&Ns}lgs;r3i+Bq@y}Ul+U%pzOS0Fcv9~aB(0!>GT0)NO?p=25LjN z2bh>6RhgqD7bQj#k-KOm@JLgMa6>%-ok1WpOe)FS^XOU{c?d5shG(lIn3GiVBxmg`u%-j=)^v&pX1JecJics3&jvPI)mDut52? z3jEA)DM%}BYbxxKrizVYwq?(P&19EXlwD9^-6J+4!}9{ywR9Gk42jjAURAF&EO|~N z)?s>$Da@ikI4|^z0e{r`J8zIs>SpM~Vn^{3fArRu;?+43>lD+^XtUcY1HidJwnR6+ z!;oG2=B6Z_=M%*{z-RaHc(n|1RTKQdNjjV!Pn9lFt^4w|AeN06*j}ZyhqZ^!-=cyGP_ShV1rGxkx8t zB;8`h!S{LD%ot``700d0@Grql(DTt4Awgmi+Yr0@#jbe=2#UkK%rv=OLqF)9D7D1j z!~McAwMYkeaL$~kI~90)5vBhBzWYc3Cj1WI0RS`z000R8-@ET0dA~*r(gSiCJmQMN&4%1D zyVNf0?}sBH8zNbBLn>~(W{d3%@kL_eQ6jEcR{l>C|JK z(R-fA!z|TTRG40|zv}7E@PqCAXP3n`;%|SCQ|ZS%ym$I{`}t3KPL&^l5`3>yah4*6 zifO#{VNz3)?ZL$be;NEaAk9b#{tV?V7 zP|wf5YA*1;s<)9A4~l3BHzG&HH`1xNr#%){4xZ!jq%o=7nN*wMuXlFV{HaiQLJ`5G zBhDi#D(m`Q1pLh@Tq+L;OwuC52RdW7b8}~60WCOK5iYMUad9}7aWBuILb({5=z~YF zt?*Jr5NG+WadM{mDL>GyiByCuR)hd zA=HM?J6l1Xv0Dl+LW@w$OTcEoOda^nFCw*Sy^I@$sSuneMl{4ys)|RY#9&NxW4S)9 zq|%83IpslTLoz~&vTo!Ga@?rj_kw{|k{nv+w&Ku?fyk4Ki4I?);M|5Axm)t+BaE)D zm(`AQ#k^DWrjbuXoJf2{Aj^KT zFb1zMSqxq|vceV+Mf-)$oPflsO$@*A0n0Z!R{&(xh8s}=;t(lIy zv$S8x>m;vQNHuRzoaOo?eiWFe{0;$s`Bc+Osz~}Van${u;g(su`3lJ^TEfo~nERfP z)?aFzpDgnLYiERsKPu|0tq4l2wT)Atr6Qb%m-AUn6HnCue*yWICp7TjW$@sO zm5rm4aTcPQ(rfi7a`xP7cKCFrJD}*&_~xgLyr^-bmsL}y;A5P|al8J3WUoBSjqu%v zxC;mK!g(7r6RRJ852Z~feoC&sD3(6}^5-uLK8o)9{8L_%%rItZK9C){UxB|;G>JbP zsRRtS4-3B*5c+K2kvmgZK8472%l>3cntWUOVHxB|{Ay~aOg5RN;{PJgeVD*H%ac+y!h#wi%o2bF2Ca8IyMyH{>4#{E_8u^@+l-+n=V}Sq?$O z{091@v%Bd*3pk0^2UtiF9Z+(a@wy6 zUdw8J*ze$K#=$48IBi1U%;hmhO>lu!uU;+RS}p&6@rQila7WftH->*A4=5W|Fmtze z)7E}jh@cbmr9iup^i%*(uF%LG&!+Fyl@LFA-}Ca#bxRfDJAiR2dt6644TaYw1Ma79 zt8&DYj31j^5WPNf5P&{)J?WlCe@<3u^78wnd(Ja4^a>{^Tw}W>|Cjt^If|7l^l)^Q zbz|7~CF(k_9~n|h;ysZ+jHzkXf(*O*@5m zLzUmbHp=x!Q|!9NVXyipZ3)^GuIG$k;D)EK!a5=8MFLI_lpf`HPKl=-Ww%z8H_0$j ztJ||IfFG1lE9nmQ0+jPQy zCBdKkjArH@K7jVcMNz);Q(Q^R{d5G?-kk;Uu_IXSyWB)~KGIizZL(^&qF;|1PI7!E zTP`%l)gpX|OFn&)M%txpQ2F!hdA~hX1Cm5)IrdljqzRg!f{mN%G~H1&oqe`5eJCIF zHdD7O;AX-{XEV(a`gBFJ9ews#CVS2y!&>Cm_dm3C8*n3MA*e67(WC?uP@8TXuMroq z{#w$%z@CBIkRM7?}Xib+>hRjy?%G!fiw8! z8(gB+8J~KOU}yO7UGm&1g_MDJ$IXS!`+*b*QW2x)9>K~Y*E&bYMnjl6h!{17_8d!%&9D`a7r&LKZjC<&XOvTRaKJ1 zUY@hl5^R&kZl3lU3njk`3dPzxj$2foOL26r(9zsVF3n_F#v)s5vv3@dgs|lP#eylq62{<-vczqP!RpVBTgI>@O6&sU>W|do17+#OzQ7o5A$ICH z?GqwqnK^n2%LR;$^oZM;)+>$X3s2n}2jZ7CdWIW0lnGK-b#EG01)P@aU`pg}th&J-TrU`tIpb5t((0eu|!u zQz+3ZiOQ^?RxxK4;zs=l8q!-n7X{@jSwK(iqNFiRColuEOg}!7cyZi`iBX4g1pNBj zAPzL?P^Ljhn;1$r8?bc=#n|Ed7wB&oHcw()&*k#SS#h}jO?ZB246EGItsz*;^&tzp zu^YJ0=lwsi`eP_pU8}6JA7MS;9pfD;DsSsLo~ogzMNP70@@;Fm8f0^;>$Z>~}GWRw!W5J3tNX*^2+1f3hz{~rIzJo z6W%J(H!g-eI_J1>0juX$X4Cl6i+3wbc~k146UIX&G22}WE>0ga#WLsn9tY(&29zBvH1$`iWtTe zG2jYl@P!P)eb<5DsR72BdI7-zP&cZNI{7q3e@?N8IKc4DE#UVr->|-ryuJXk^u^>4 z$3wE~=q390;XuOQP~TNoDR?#|NSPJ%sTMInA6*rJ%go|=YjGe!B>z6u$IhgQSwoV* zjy3F2#I>uK{42{&IqP59)Y(1*Z>>#W8rCf4_eVsH)`v!P#^;BgzKDR`ARGEZzkNX+ zJUQu=*-ol=Xqqt5=`=pA@BIn@6a9G8C{c&`i^(i+BxQO9?YZ3iu%$$da&Kb?2kCCo zo7t$UpSFWqmydXf@l3bVJ=%K?SSw)|?srhJ-1ZdFu*5QhL$~-IQS!K1s@XzAtv6*Y zl8@(5BlWYLt1yAWy?rMD&bwze8bC3-GfNH=p zynNFCdxyX?K&G(ZZ)afguQ2|r;XoV^=^(;Cku#qYn4Lus`UeKt6rAlFo_rU`|Rq z&G?~iWMBio<78of-2X(ZYHx~=U0Vz4btyXkctMKdc9UM!vYr~B-(>)(Hc|D zMzkN4!PBg%tZoh+=Gba!0++d193gbMk2&krfDgcbx0jI92cq?FFESVg0D$>F+bil} zY~$)|>1HZsX=5sAZ2WgPB5P=8X#TI+NQ(M~GqyVB53c6IdX=k>Wu@A0Svf5#?uHaF zsYn|koIi3$(%GZ2+G+7Fv^lHTb#5b8sAHSTnL^qWZLM<(1|9|QFw9pnRU{svj}_Al zL)b9>fN{QiA($8peNEJyy`(a{&uh-T4_kdZFIVsKKVM(?05}76EEz?#W za^fiZOAd14IJ4zLX-n7Lq0qlQ^lW8Cvz4UKkV9~P}>sq0?xD3vg+$4vLm~C(+ zM{-3Z#qnZ09bJ>}j?6ry^h+@PfaD7*jZxBEY4)UG&daWb??6)TP+|3#Z&?GL?1i+280CFsE|vIXQbm| zM}Pk!U`U5NsNbyKzkrul-DzwB{X?n3E6?TUHr{M&+R*2%yOiXdW-_2Yd6?38M9Vy^ z*lE%gA{wwoSR~vN0=no}tP2Ul5Gk5M(Xq`$nw#ndFk`tcpd5A=Idue`XZ!FS>Q zG^0w#>P4pPG+*NC9gLP4x2m=cKP}YuS!l^?sHSFftZy{4CoQrb_ z^20(NnG`wAhMI=eq)SsIE~&Gp9Ne0nD4%Xiu|0Fj1UFk?6avDqjdXz{O1nKao*46y zT8~iA%Exu=G#{x=KD;_C&M+Zx4+n`sHT>^>=-1YM;H<72k>$py1?F3#T1*ef9mLZw z5naLQr?n7K;2l+{_uIw*_1nsTn~I|kkCgrn;|G~##hM;9l7Jy$yJfmk+&}W@JeKcF zx@@Woiz8qdi|D%aH3XTx5*wDlbs?dC1_nrFpm^QbG@wM=i2?Zg;$VK!c^Dp8<}BTI zyRhAq@#%2pGV49*Y5_mV4+OICP|%I(dQ7x=6Ob}>EjnB_-_18*xrY?b%-yEDT(wrO z9RY2QT0`_OpGfMObKHV;QLVnrK%mc?$WAdIT`kJQT^n%GuzE7|9@k3ci5fYOh(287 zuIbg!GB3xLg$YN=n)^pHGB0jH+_iIiC=nUcD;G6LuJsjn2VI1cyZx=a?ShCsF==QK z;q~*m&}L<-cb+mDDXzvvrRsybcgQ;Vg21P(uLv5I+eGc7o7tc6`;OA9{soHFOz zT~2?>Ts}gprIX$wRBb4yE>ot<8+*Bv`qbSDv*VtRi|cyWS>)Fjs>fkNOH-+PX&4(~ z&)T8Zam2L6puQl?;5zg9h<}k4#|yH9czHw;1jw-pwBM*O2hUR6yvHATrI%^mvs9q_ z&ccT0>f#eDG<^WG^q@oVqlJrhxH)dcq2cty@l3~|5#UDdExyXUmLQ}f4#;6fI{f^t zDCsgIJ~0`af%YR%Ma5VQq-p21k`vaBu6WE?66+5=XUd%Ay%D$irN>5LhluRWt7 zov-=f>QbMk*G##&DTQyou$s7UqjjW@k6=!I@!k+S{pP8R(2=e@io;N8E`EOB;OGoI zw6Q+{X1_I{OO0HPpBz!X!@`5YQ2)t{+!?M_iH25X(d~-Zx~cXnS9z>u?+If|iNJbx zyFU2d1!ITX64D|lE0Z{dLRqL1Ajj=CCMfC4lD3&mYR_R_VZ>_7_~|<^o*%_&jevU+ zQ4|qzci=0}Jydw|LXLCrOl1_P6Xf@c0$ieK2^7@A9UbF{@V_0p%lqW|L?5k>bVM8|p5v&2g;~r>B8uo<4N+`B zH{J)h;SYiIVx@#jI&p-v3dwL5QNV1oxPr8J%ooezTnLW>i*3Isb49%5i!&ac_dEXv zvXmVUck^QHmyrF8>CGXijC_R-y(Qr{3Zt~EmW)-nC!tiH`wlw5D*W7Pip;T?&j%kX z6DkZX4&}iw>hE(boLyjOoupf6JpvBG8}jIh!!VhnD0>}KSMMo{1#uU6kiFcA04~|7 zVO8eI&x1`g4CZ<2cYUI(n#wz2MtVFHx47yE5eL~8bot~>EHbevSt}LLMQX?odD{Ux zJMnam{d)W4da{l7&y-JrgiU~qY3$~}_F#G7|MxT)e;G{U`In&?`j<5D->}cb{}{T(4DF0BOk-=1195KB-E*o@c?`>y#4=dMtYtSY=&L{!TAjFVcq0y@AH`vH! z$41+u!Ld&}F^COPgL(EE{0X7LY&%D7-(?!kjFF7=qw<;`V{nwWBq<)1QiGJgUc^Vz ztMUlq1bZqKn17|6x6iAHbWc~l1HcmAxr%$Puv!znW)!JiukwIrqQ00|H$Z)OmGG@= zv%A8*4cq}(?qn4rN6o`$Y))(MyXr8R<2S^J+v(wmFmtac!%VOfN?&(8Nr!T@kV`N; z*Q33V3t`^rN&aBiHet)18wy{*wi1=W!B%B-Q6}SCrUl$~Hl{@!95ydml@FK8P=u4s z4e*7gV2s=YxEvskw2Ju!2%{8h01rx-3`NCPc(O zH&J0VH5etNB2KY6k4R@2Wvl^Ck$MoR3=)|SEclT2ccJ!RI9Nuter7u9@;sWf-%um;GfI!=eEIQ2l2p_YWUd{|6EG ze{yO6;lMc>;2tPrsNdi@&1K6(1;|$xe8vLgiouj%QD%gYk`4p{Ktv9|j+!OF-P?@p z;}SV|oIK)iwlBs+`ROXkhd&NK zzo__r!B>tOXpBJMDcv!Mq54P+n4(@dijL^EpO1wdg~q+!DT3lB<>9AANSe!T1XgC=J^)IP0XEZ()_vpu!!3HQyJhwh?r`Ae%Yr~b% zO*NY9t9#qWa@GCPYOF9aron7thfWT`eujS4`t2uG6)~JRTI;f(ZuoRQwjZjp5Pg34 z)rp$)Kr?R+KdJ;IO;pM{$6|2y=k_siqvp%)2||cHTe|b5Ht8&A{wazGNca zX$Ol?H)E_R@SDi~4{d-|8nGFhZPW;Cts1;08TwUvLLv&_2$O6Vt=M)X;g%HUr$&06 zISZb(6)Q3%?;3r~*3~USIg=HcJhFtHhIV(siOwV&QkQe#J%H9&E21!C*d@ln3E@J* zVqRO^<)V^ky-R|%{(9`l-(JXq9J)1r$`uQ8a}$vr9E^nNiI*thK8=&UZ0dsFN_eSl z(q~lnD?EymWLsNa3|1{CRPW60>DSkY9YQ;$4o3W7Ms&@&lv9eH!tk~N&dhqX&>K@} zi1g~GqglxkZ5pEFkllJ)Ta1I^c&Bt6#r(QLQ02yHTaJB~- zCcE=5tmi`UA>@P=1LBfBiqk)HB4t8D?02;9eXj~kVPwv?m{5&!&TFYhu>3=_ zsGmYZ^mo*-j69-42y&Jj0cBLLEulNRZ9vXE)8~mt9C#;tZs;=#M=1*hebkS;7(aGf zcs7zH(I8Eui9UU4L--))yy`&d&$In&VA2?DAEss4LAPCLd>-$i?lpXvn!gu^JJ$(DoUlc6wE98VLZ*z`QGQov5l4Fm_h?V-;mHLYDVOwKz7>e4+%AzeO>P6v}ndPW| zM>m#6Tnp7K?0mbK=>gV}=@k*0Mr_PVAgGMu$j+pWxzq4MAa&jpCDU&-5eH27Iz>m^ zax1?*HhG%pJ((tkR(V(O(L%7v7L%!_X->IjS3H5kuXQT2!ow(;%FDE>16&3r){!ex zhf==oJ!}YU89C9@mfDq!P3S4yx$aGB?rbtVH?sHpg?J5C->!_FHM%Hl3#D4eplxzQ zRA+<@LD%LKSkTk2NyWCg7u=$%F#;SIL44~S_OGR}JqX}X+=bc@swpiClB`Zbz|f!4 z7Ysah7OkR8liXfI`}IIwtEoL}(URrGe;IM8%{>b1SsqXh)~w}P>yiFRaE>}rEnNkT z!HXZUtxUp1NmFm)Dm@-{FI^aRQqpSkz}ZSyKR%Y}YHNzBk)ZIp} zMtS=aMvkgWKm9&oTcU0?S|L~CDqA+sHpOxwnswF-fEG)cXCzUR?ps@tZa$=O)=L+5 zf%m58cq8g_o}3?Bhh+c!w4(7AjxwQ3>WnVi<{{38g7yFboo>q|+7qs<$8CPXUFAN< zG&}BHbbyQ5n|qqSr?U~GY{@GJ{(Jny{bMaOG{|IkUj7tj^9pa9|FB_<+KHLxSxR;@ zHpS$4V)PP+tx}22fWx(Ku9y+}Ap;VZqD0AZW4gCDTPCG=zgJmF{|x;(rvdM|2|9a}cex6xrMkERnkE;}jvU-kmzd%_J50$M`lIPCKf+^*zL=@LW`1SaEc%=m zQ+lT06Gw+wVwvQ9fZ~#qd430v2HndFsBa9WjD0P}K(rZYdAt^5WQIvb%D^Q|pkVE^ zte$&#~zmULFACGfS#g=2OLOnIf2Of-k!(BIHjs77nr!5Q1*I9 z1%?=~#Oss!rV~?-6Gm~BWJiA4mJ5TY&iPm_$)H1_rTltuU1F3I(qTQ^U$S>%$l z)Wx1}R?ij0idp@8w-p!Oz{&*W;v*IA;JFHA9%nUvVDy7Q8woheC#|8QuDZb-L_5@R zOqHwrh|mVL9b=+$nJxM`3eE{O$sCt$UK^2@L$R(r^-_+z?lOo+me-VW=Zw z-Bn>$4ovfWd%SPY`ab-u9{INc*k2h+yH%toDHIyqQ zO68=u`N}RIIs7lsn1D){)~%>ByF<>i@qFb<-axvu(Z+6t7v<^z&gm9McRB~BIaDn$ z#xSGT!rzgad8o>~kyj#h1?7g96tOcCJniQ+*#=b7wPio>|6a1Z?_(TS{)KrPe}(8j z!#&A=k(&Pj^F;r)CI=Z{LVu>uj!_W1q4b`N1}E(i%;BWjbEcnD=mv$FL$l?zS6bW!{$7j1GR5ocn94P2u{ z70tAAcpqtQo<@cXw~@i-@6B23;317|l~S>CB?hR5qJ%J3EFgyBdJd^fHZu7AzHF(BQ!tyAz^L0`X z23S4Fe{2X$W0$zu9gm%rg~A>ijaE#GlYlrF9$ds^QtaszE#4M(OLVP2O-;XdT(XIC zatwzF*)1c+t~c{L=fMG8Z=k5lv>U0;C{caN1NItnuSMp)6G3mbahu>E#sj&oy94KC zpH}8oEw{G@N3pvHhp{^-YaZeH;K+T_1AUv;IKD<=mv^&Ueegrb!yf`4VlRl$M?wsl zZyFol(2|_QM`e_2lYSABpKR{{NlxlDSYQNkS;J66aT#MSiTx~;tUmvs-b*CrR4w=f z8+0;*th6kfZ3|5!Icx3RV11sp=?`0Jy3Fs0N4GZQMN=8HmT6%x9@{Dza)k}UwL6JT zHRDh;%!XwXr6yuuy`4;Xsn0zlR$k%r%9abS1;_v?`HX_hI|+EibVnlyE@3aL5vhQq zlIG?tN^w@0(v9M*&L+{_+RQZw=o|&BRPGB>e5=ys7H`nc8nx)|-g;s7mRc7hg{GJC zAe^vCIJhajmm7C6g! zL&!WAQ~5d_5)00?w_*|*H>3$loHrvFbitw#WvLB!JASO?#5Ig5$Ys10n>e4|3d;tS zELJ0|R4n3Az(Fl3-r^QiV_C;)lQ1_CW{5bKS15U|E9?ZgLec@%kXr84>5jV2a5v=w z?pB1GPdxD$IQL4)G||B_lI+A=08MUFFR4MxfGOu07vfIm+j=z9tp~5i_6jb`tR>qV z$#`=BQ*jpCjm$F0+F)L%xRlnS%#&gro6PiRfu^l!EVan|r3y}AHJQOORGx4~ z&<)3=K-tx518DZyp%|!EqpU!+X3Et7n2AaC5(AtrkW>_57i}$eqs$rupubg0a1+WO zGHZKLN2L0D;ab%{_S1Plm|hx8R?O14*w*f&2&bB050n!R2by zw!@XOQx$SqZ5I<(Qu$V6g>o#A!JVwErWv#(Pjx=KeS0@hxr4?13zj#oWwPS(7Ro|v z>Mp@Kmxo79q|}!5qtX2-O@U&&@6s~!I&)1WQIl?lTnh6UdKT_1R640S4~f=_xoN3- zI+O)$R@RjV$F=>Ti7BlnG1-cFKCC(t|Qjm{SalS~V-tX#+2ekRhwmN zZr`8{QF6y~Z!D|{=1*2D-JUa<(1Z=;!Ei!KiRNH?o{p5o3crFF=_pX9O-YyJchr$~ zRC`+G+8kx~fD2k*ZIiiIGR<8r&M@3H?%JVOfE>)})7ScOd&?OjgAGT@WVNSCZ8N(p zuQG~76GE3%(%h1*vUXg$vH{ua0b`sQ4f0*y=u~lgyb^!#CcPJa2mkSEHGLsnO^kb$ zru5_l#nu=Y{rSMWiYx?nO{8I!gH+?wEj~UM?IrG}E|bRIBUM>UlY<`T1EHpRr36vv zBi&dG8oxS|J$!zoaq{+JpJy+O^W(nt*|#g32bd&K^w-t>!Vu9N!k9eA8r!Xc{utY> zg9aZ(D2E0gL#W0MdjwES-7~Wa8iubPrd?8-$C4BP?*wok&O8+ykOx{P=Izx+G~hM8 z*9?BYz!T8~dzcZr#ux8kS7u7r@A#DogBH8km8Ry4slyie^n|GrTbO|cLhpqgMdsjX zJ_LdmM#I&4LqqsOUIXK8gW;V0B(7^$y#h3h>J0k^WJfAMeYek%Y-Dcb_+0zPJez!GM zAmJ1u;*rK=FNM0Nf}Y!!P9c4)HIkMnq^b;JFd!S3?_Qi2G#LIQ)TF|iHl~WKK6JmK zbv7rPE6VkYr_%_BT}CK8h=?%pk@3cz(UrZ{@h40%XgThP*-Oeo`T0eq9 zA8BnWZKzCy5e&&_GEsU4*;_k}(8l_&al5K-V*BFM=O~;MgRkYsOs%9eOY6s6AtE*<7GQAR2ulC3RAJrG_P1iQK5Z~&B z&f8X<>yJV6)oDGIlS$Y*D^Rj(cszTy5c81a5IwBr`BtnC6_e`ArI8CaTX_%rx7;cn zR-0?J_LFg*?(#n~G8cXut(1nVF0Oka$A$1FGcERU<^ggx;p@CZc?3UB41RY+wLS`LWFNSs~YP zuw1@DNN3lTd|jDL7gjBsd9}wIw}4xT2+8dBQzI00m<@?c2L%>}QLfK5%r!a-iII`p zX@`VEUH)uj^$;7jVUYdADQ2k*!1O3WdfgF?OMtUXNpQ1}QINamBTKDuv19^{$`8A1 zeq%q*O0mi@(%sZU>Xdb0Ru96CFqk9-L3pzLVsMQ`Xpa~N6CR{9Rm2)A|CI21L(%GW zh&)Y$BNHa=FD+=mBw3{qTgw)j0b!Eahs!rZnpu)z!!E$*eXE~##yaXz`KE5(nQM`s zD!$vW9XH)iMxu9R>r$VlLk9oIR%HxpUiW=BK@4U)|1WNQ=mz9a z^!KkO=>GaJ!GBXm{KJj^;kh-MkUlEQ%lza`-G&}C5y1>La1sR6hT=d*NeCnuK%_LV zOXt$}iP6(YJKc9j-Fxq~*ItVUqljQ8?oaysB-EYtFQp9oxZ|5m0^Hq(qV!S+hq#g( z?|i*H2MIr^Kxgz+3vIljQ*Feejy6S4v~jKEPTF~Qhq!(ms5>NGtRgO5vfPPc4Z^AM zTj!`5xEreIN)vaNxa|q6qWdg>+T`Ol0Uz)ckXBXEGvPNEL3R8hB3=C5`@=SYgAju1 z!)UBr{2~=~xa{b8>x2@C7weRAEuatC)3pkRhT#pMPTpSbA|tan%U7NGMvzmF?c!V8 z=pEWxbdXbTAGtWTyI?Fml%lEr-^AE}w#l(<7OIw;ctw}imYax&vR4UYNJZK6P7ZOd zP87XfhnUHxCUHhM@b*NbTi#(-8|wcv%3BGNs#zRCVV(W?1Qj6^PPQa<{yaBwZ`+<`w|;rqUY_C z&AeyKwwf*q#OW-F()lir=T^<^wjK65Lif$puuU5+tk$;e_EJ;Lu+pH>=-8=PDhkBg z8cWt%@$Sc#C6F$Vd+0507;{OOyT7Hs%nKS88q-W!$f~9*WGBpHGgNp}=C*7!RiZ5s zn1L_DbKF@B8kwhDiLKRB@lsXVVLK|ph=w%_`#owlf@s@V(pa`GY$8h%;-#h@TsO|Y8V=n@*!Rog7<7Cid%apR|x zOjhHCyfbIt%+*PCveTEcuiDi%Wx;O;+K=W?OFUV%)%~6;gl?<0%)?snDDqIvkHF{ zyI02)+lI9ov42^hL>ZRrh*HhjF9B$A@=H94iaBESBF=eC_KT$8A@uB^6$~o?3Wm5t1OIaqF^~><2?4e3c&)@wKn9bD? zoeCs;H>b8DL^F&>Xw-xjZEUFFTv>JD^O#1E#)CMBaG4DX9bD(Wtc8Rzq}9soQ8`jf zeSnHOL}<+WVSKp4kkq&?SbETjq6yr@4%SAqOG=9E(3YeLG9dtV+8vmzq+6PFPk{L; z(&d++iu=^F%b+ea$i2UeTC{R*0Isk;vFK!no<;L+(`y`3&H-~VTdKROkdyowo1iqR zbVW(3`+(PQ2>TKY>N!jGmGo7oeoB8O|P_!Ic@ zZ^;3dnuXo;WJ?S+)%P>{Hcg!Jz#2SI(s&dY4QAy_vRlmOh)QHvs_7c&zkJCmJGVvV zX;Mtb>QE+xp`KyciG$Cn*0?AK%-a|=o!+7x&&yzHQOS>8=B*R=niSnta^Pxp1`=md z#;$pS$4WCT?mbiCYU?FcHGZ#)kHVJTTBt^%XE(Q};aaO=Zik0UgLcc0I(tUpt(>|& zcxB_|fxCF7>&~5eJ=Dpn&5Aj{A^cV^^}(7w#p;HG&Q)EaN~~EqrE1qKrMAc&WXIE;>@<&)5;gD2?={Xf@Mvn@OJKw=8Mgn z!JUFMwD+s==JpjhroT&d{$kQAy%+d`a*XxDEVxy3`NHzmITrE`o!;5ClXNPb4t*8P zzAivdr{j_v!=9!^?T3y?gzmqDWX6mkzhIzJ-3S{T5bcCFMr&RPDryMcdwbBuZbsgN zGrp@^i?rcfN7v0NKGzDPGE#4yszxu=I_`MI%Z|10nFjU-UjQXXA?k8Pk|OE<(?ae) zE%vG#eZAlj*E7_3dx#Zz4kMLj>H^;}33UAankJiDy5ZvEhrjr`!9eMD8COp}U*hP+ zF}KIYx@pkccIgyxFm#LNw~G&`;o&5)2`5aogs`1~7cMZQ7zj!%L4E`2yzlQN6REX20&O<9 zKV6fyr)TScJPPzNTC2gL+0x#=u>(({{D7j)c-%tvqls3#Y?Z1m zV5WUE)zdJ{$p>yX;^P!UcXP?UD~YM;IRa#Rs5~l+*$&nO(;Ers`G=0D!twR(0GF@c zHl9E5DQI}Oz74n zfKP>&$q0($T4y$6w(p=ERAFh+>n%iaeRA%!T%<^+pg?M)@ucY<&59$x9M#n+V&>}=nO9wCV{O~lg&v#+jcUj(tQ z`0u1YH)-`U$15a{pBkGyPL0THv1P|4e@pf@3IBZS4dVJPo#H>pWq%Lr0YS-SeWash z8R7=jb28KPMI|_lo#GEO|5B?N_e``H*23{~a!AmUJ+fb4HX-%QI@lSEUxKlGV7z7Q zSKw@-TR>@1RL%w{x}dW#k1NgW+q4yt2Xf1J62Bx*O^WG8OJ|FqI4&@d3_o8Id@*)4 zYrk=>@!wv~mh7YWv*bZhxqSmFh2Xq)o=m;%n$I?GSz49l1$xRpPu_^N(vZ>*>Z<04 z2+rP70oM=NDysd!@fQdM2OcyT?3T^Eb@lIC-UG=Bw{BjQ&P`KCv$AcJ;?`vdZ4){d z&gkoUK{$!$$K`3*O-jyM1~p-7T*qb)Ys>Myt^;#1&a%O@x8A+E>! zY8=eD`ZG)LVagDLBeHg>=atOG?Kr%h4B%E6m@J^C+U|y)XX@f z8oyJDW|9g=<#f<{JRr{y#~euMnv)`7j=%cHWLc}ngjq~7k**6%4u>Px&W%4D94(r* z+akunK}O0DC2A%Xo9jyF;DobX?!1I(7%}@7F>i%&nk*LMO)bMGg2N+1iqtg+r(70q zF5{Msgsm5GS7DT`kBsjMvOrkx&|EU!{{~gL4d2MWrAT=KBQ-^zQCUq{5PD1orxlIL zq;CvlWx#f1NWvh`hg011I%?T_s!e38l*lWVt|~z-PO4~~1g)SrJ|>*tXh=QfXT)%( z+ex+inPvD&O4Ur;JGz>$sUOnWdpSLcm1X%aQDw4{dB!cnj`^muI$CJ2%p&-kULVCE z>$eMR36kN$wCPR+OFDM3-U(VOrp9k3)lI&YVFqd;Kpz~K)@Fa&FRw}L(SoD z9B4a+hQzZT-BnVltst&=kq6Y(f^S4hIGNKYBgMxGJ^;2yrO}P3;r)(-I-CZ)26Y6? z&rzHI_1GCvGkgy-t1E;r^3Le30|%$ebDRu2+gdLG)r=A~Qz`}~&L@aGJ{}vVs_GE* zVUjFnzHiXfKQbpv&bR&}l2bzIjAooB)=-XNcYmrGmBh(&iu@o!^hn0^#}m2yZZUK8 zufVm7Gq0y`Mj;9b>`c?&PZkU0j4>IL=UL&-Lp3j&47B5pAW4JceG{!XCA)kT<%2nqCxj<)uy6XR_uws~>_MEKPOpAQ!H zkn>FKh)<9DwwS*|Y(q?$^N!6(51O0 z^JM~Ax{AI1Oj$fs-S5d4T7Z_i1?{%0SsIuQ&r8#(JA=2iLcTN+?>wOL532%&dMYkT z*T5xepC+V6zxhS@vNbMoi|i)=rpli@R9~P!39tWbSSb904ekv7D#quKbgFEMTb48P zuq(VJ+&L8aWU(_FCD$3^uD!YM%O^K(dvy~Wm2hUuh6bD|#(I39Xt>N1Y{ZqXL`Fg6 zKQ?T2htHN!(Bx;tV2bfTtIj7e)liN-29s1kew>v(D^@)#v;}C4-G=7x#;-dM4yRWm zyY`cS21ulzMK{PoaQ6xChEZ}o_#}X-o}<&0)$1#3we?+QeLt;aVCjeA)hn!}UaKt< zat1fHEx13y-rXNMvpUUmCVzocPmN~-Y4(YJvQ#db)4|%B!rBsgAe+*yor~}FrNH08 z3V!97S}D7d$zbSD{$z;@IYMxM6aHdypIuS*pr_U6;#Y!_?0i|&yU*@16l z*dcMqDQgfNBf}?quiu4e>H)yTVfsp#f+Du0@=Kc41QockXkCkvu>FBd6Q+@FL!(Yx z2`YuX#eMEiLEDhp+9uFqME_E^faV&~9qjBHJkIp~%$x^bN=N)K@kvSVEMdDuzA0sn z88CBG?`RX1@#hQNd`o^V{37)!w|nA)QfiYBE^m=yQKv-fQF+UCMcuEe1d4BH7$?>b zJl-r9@0^Ie=)guO1vOd=i$_4sz>y3x^R7n4ED!5oXL3@5**h(xr%Hv)_gILarO46q+MaDOF%ChaymKoI6JU5Pg;7#2n9-18|S1;AK+ zgsn6;k6-%!QD>D?cFy}8F;r@z8H9xN1jsOBw2vQONVqBVEbkiNUqgw~*!^##ht>w0 zUOykwH=$LwX2j&nLy=@{hr)2O&-wm-NyjW7n~Zs9UlH;P7iP3 zI}S(r0YFVYacnKH(+{*)Tbw)@;6>%=&Th=+Z6NHo_tR|JCI8TJiXv2N7ei7M^Q+RM z?9o`meH$5Yi;@9XaNR#jIK^&{N|DYNNbtdb)XW1Lv2k{E>;?F`#Pq|&_;gm~&~Zc9 zf+6ZE%{x4|{YdtE?a^gKyzr}dA>OxQv+pq|@IXL%WS0CiX!V zm$fCePA%lU{%pTKD7|5NJHeXg=I0jL@$tOF@K*MI$)f?om)D63K*M|r`gb9edD1~Y zc|w7N)Y%do7=0{RC|AziW7#am$)9jciRJ?IWl9PE{G3U+$%FcyKs_0Cgq`=K3@ttV z9g;M!3z~f_?P%y3-ph%vBMeS@p7P&Ea8M@97+%XEj*(1E6vHj==d zjsoviB>j^$_^OI_DEPvFkVo(BGRo%cJeD){6Uckei=~1}>sp299|IRjhXe)%?uP0I zF5+>?0#Ye}T^Y$u_rc4=lPcq4K^D(TZG-w30-YiEM=dcK+4#o*>lJ8&JLi+3UcpZk z!^?95S^C0ja^jwP`|{<+3cBVog$(mRdQmadS+Vh~z zS@|P}=|z3P6uS+&@QsMp0no9Od&27O&14zHXGAOEy zh~OKpymK5C%;LLb467@KgIiVwYbYd6wFxI{0-~MOGfTq$nBTB!{SrWmL9Hs}C&l&l#m?s*{tA?BHS4mVKHAVMqm63H<|c5n0~k)-kbg zXidai&9ZUy0~WFYYKT;oe~rytRk?)r8bptITsWj(@HLI;@=v5|XUnSls7$uaxFRL+ zRVMGuL3w}NbV1`^=Pw*0?>bm8+xfeY(1PikW*PB>>Tq(FR`91N0c2&>lL2sZo5=VD zQY{>7dh_TX98L2)n{2OV=T10~*YzX27i2Q7W86M4$?gZIXZaBq#sA*{PH8){|GUi;oM>e?ua7eF4WFuFYZSG| zze?srg|5Ti8Og{O zeFxuw9!U+zhyk?@w zjsA6(oKD=Ka;A>Ca)oPORxK+kxH#O@zhC!!XS4@=swnuMk>t+JmLmFiE^1aX3f<)D@`%K0FGK^gg1a1j>zi z2KhV>sjU7AX3F$SEqrXSC}fRx64GDoc%!u2Yag68Lw@w9v;xOONf@o)Lc|Uh3<21ctTYu-mFZuHk*+R{GjXHIGq3p)tFtQp%TYqD=j1&y)>@zxoxUJ!G@ zgI0XKmP6MNzw>nRxK$-Gbzs}dyfFzt>#5;f6oR27ql!%+{tr+(`(>%51|k`ML} zY4eE)Lxq|JMas(;JibNQds1bUB&r}ydMQXBY4x(^&fY_&LlQC)3hylc$~8&~|06-D z#T+%66rYbHX%^KuqJED_wuGB+=h`nWA!>1n0)3wZrBG3%`b^Ozv6__dNa@%V14|!D zQ?o$z5u0^8`giv%qE!BzZ!3j;BlDlJDk)h@9{nSQeEk!z9RGW) z${RSF3phEM*ce*>Xdp}585vj$|40=&S{S-GTiE?Op*vY&Lvr9}BO$XWy80IF+6@%n z5*2ueT_g@ofP#u5pxb7n*fv^Xtt7&?SRc{*2Ka-*!BuOpf}neHGCiHy$@Ka1^Dint z;DkmIL$-e)rj4o2WQV%Gy;Xg(_Bh#qeOsTM2f@KEe~4kJ8kNLQ+;(!j^bgJMcNhvklP5Z6I+9Fq@c&D~8Fb-4rmDT!MB5QC{Dsb;BharP*O;SF4& zc$wj-7Oep7#$WZN!1nznc@Vb<_Dn%ga-O#J(l=OGB`dy=Sy&$(5-n3zzu%d7E#^8`T@}V+5B;PP8J14#4cCPw-SQTdGa2gWL0*zKM z#DfSXs_iWOMt)0*+Y>Lkd=LlyoHjublNLefhKBv@JoC>P7N1_#> zv=mLWe96%EY;!ZGSQDbZWb#;tzqAGgx~uk+-$+2_8U`!ypbwXl z^2E-FkM1?lY@yt8=J3%QK+xaZ6ok=-y%=KXCD^0r!5vUneW>95PzCkOPO*t}p$;-> ze5j-BLT_;)cZQzR2CEsm@rU7GZfFtdp*a|g4wDr%8?2QkIGasRfDWT-Dvy*U{?IHT z*}wGnzdlSptl#ZF^sf)KT|BJs&kLG91^A6ls{CzFprZ6-Y!V0Xysh%9p%iMd7HLsS zN+^Un$tDV)T@i!v?3o0Fsx2qI(AX_$dDkBzQ@fRM%n zRXk6hb9Py#JXUs+7)w@eo;g%QQ95Yq!K_d=z{0dGS+pToEI6=Bo8+{k$7&Z zo4>PH(`ce8E-Ps&uv`NQ;U$%t;w~|@E3WVOCi~R4oj5wP?%<*1C%}Jq%a^q~T7u>K zML5AKfQDv6>PuT`{SrKHRAF+^&edg6+5R_#H?Lz3iGoWo#PCEd0DS;)2U({{X#zU^ zw_xv{4x7|t!S)>44J;KfA|DC?;uQ($l+5Vp7oeqf7{GBF9356nx|&B~gs+@N^gSdd zvb*>&W)|u#F{Z_b`f#GVtQ`pYv3#||N{xj1NgB<#=Odt6{eB%#9RLt5v zIi|0u70`#ai}9fJjKv7dE!9ZrOIX!3{$z_K5FBd-Kp-&e4(J$LD-)NMTp^_pB`RT; zftVVlK2g@+1Ahv2$D){@Y#cL#dUj9*&%#6 zd2m9{1NYp>)6=oAvqdCn5#cx{AJ%S8skUgMglu2*IAtd+z1>B&`MuEAS(D(<6X#Lj z?f4CFx$)M&$=7*>9v1ER4b6!SIz-m0e{o0BfkySREchp?WdVPpQCh!q$t>?rL!&Jg zd#heM;&~A}VEm8Dvy&P|J*eAV&w!&Nx6HFV&B8jJFVTmgLaswn!cx$&%JbTsloz!3 zMEz1d`k==`Ueub_JAy_&`!ogbwx27^ZXgFNAbx=g_I~5nO^r)}&myw~+yY*cJl4$I znNJ32M&K=0(2Dj_>@39`3=FX!v3nZHno_@q^!y}%(yw0PqOo=);6Y@&ylVe>nMOZ~ zd>j#QQSBn3oaWd;qy$&5(5H$Ayi)0haAYO6TH>FR?rhqHmNOO+(})NB zLI@B@v0)eq!ug`>G<@htRlp3n!EpU|n+G+AvXFrWSUsLMBfL*ZB`CRsIVHNTR&b?K zxBgsN0BjfB>UVcJ|x%=-zb%OV7lmZc& zxiupadZVF7)6QuhoY;;FK2b*qL0J-Rn-8!X4ZY$-ZSUXV5DFd7`T41c(#lAeLMoeT z4%g655v@7AqT!i@)Edt5JMbN(=Q-6{=L4iG8RA%}w;&pKmtWvI4?G9pVRp|RTw`g0 zD5c12B&A2&P6Ng~8WM2eIW=wxd?r7A*N+&!Be7PX3s|7~z=APxm=A?5 zt>xB4WG|*Td@VX{Rs)PV0|yK`oI3^xn(4c_j&vgxk_Y3o(-`_5o`V zRTghg6%l@(qodXN;dB#+OKJEEvhfcnc#BeO2|E(5df-!fKDZ!%9!^BJ_4)9P+9Dq5 zK1=(v?KmIp34r?z{NEWnLB3Px{XYwy-akun4F7xTRr2^zeYW{gcK9)>aJDdU5;w5@ zak=<+-PLH-|04pelTb%ULpuuuJC7DgyT@D|p{!V!0v3KpDnRjANN12q6SUR3mb9<- z>2r~IApQGhstZ!3*?5V z8#)hJ0TdZg0M-BK#nGFP>$i=qk82DO z7h;Ft!D5E15OgW)&%lej*?^1~2=*Z5$2VX>V{x8SC+{i10BbtUk9@I#Vi&hX)q
      Q!LwySI{Bnv%Sm)yh{^sSVJ8&h_D-BJ_YZe5eCaAWU9b$O2c z$T|{vWVRtOL!xC0DTc(Qbe`ItNtt5hr<)VijD0{U;T#bUEp381_y`%ZIav?kuYG{iyYdEBPW=*xNSc;Rlt6~F4M`5G+VtOjc z*0qGzCb@gME5udTjJA-9O<&TWd~}ysBd(eVT1-H82-doyH9RST)|+Pb{o*;$j9Tjs zhU!IlsPsj8=(x3bAKJTopW3^6AKROHR^7wZ185wJGVhA~hEc|LP;k7NEz-@4p5o}F z`AD6naG3(n=NF9HTH81=F+Q|JOz$7wm9I<+#BSmB@o_cLt2GkW9|?7mM;r!JZp89l zbo!Hp8=n!XH1{GwaDU+k)pGp`C|cXkCU5%vcH)+v@0eK>%7gWxmuMu9YLlChA|_D@ zi#5zovN_!a-0?~pUV-Rj*1P)KwdU-LguR>YM&*Nen+ln8Q$?WFCJg%DY%K}2!!1FE zDv-A%Cbwo^p(lzac&_TZ-l#9kq`mhLcY3h9ZTUVCM(Ad&=EriQY5{jJv<5K&g|*Lk zgV%ILnf1%8V2B0E&;Sp4sYbYOvvMebLwYwzkRQ#F8GpTQq#uv=J`uaSJ34OWITeSGo6+-8Xw znCk*n{kdDEi)Hi&u^)~cs@iyCkFWB2SWZU|Uc%^43ZIZQ-vWNExCCtDWjqHs;;tWf$v{}0{p0Rvxkq``)*>+Akq%|Na zA`@~-Vfe|+(AIlqru+7Ceh4nsVmO9p9jc8}HX^W&ViBDXT+uXbT#R#idPn&L>+#b6 zflC-4C5-X;kUnR~L>PSLh*gvL68}RBsu#2l`s_9KjUWRhiqF`j)`y`2`YU(>3bdBj z?>iyjEhe-~$^I5!nn%B6Wh+I`FvLNvauve~eX<+Ipl&04 zT}};W&1a3%W?dJ2=N#0t?e+aK+%t}5q%jSLvp3jZ%?&F}nOOWr>+{GFIa%wO_2`et z=JzoRR~}iKuuR+azPI8;Gf9)z3kyA4EIOSl!sRR$DlW}0>&?GbgPojmjmnln;cTqCt=ADbE zZ8GAnoM+S1(5$i8^O4t`ue;vO4i}z0wz-QEIVe5_u03;}-!G1NyY8;h^}y;tzY}i5 zqQr#Ur3Fy8sSa$Q0ys+f`!`+>9WbvU_I`Sj;$4{S>O3?#inLHCrtLy~!s#WXV=oVP zeE93*Nc`PBi4q@%Ao$x4lw9vLHM!6mn3-b_cebF|n-2vt-zYVF_&sDE--J-P;2WHo z+@n2areE0o$LjvjlV2X7ZU@j+`{*8zq`JR3gKF#EW|#+{nMyo-a>nFFTg&vhyT=b} zDa8+v0(Dgx0yRL@ZXOYIlVSZ0|MFizy0VPW8;AfA5|pe!#j zX}Py^8fl5SyS4g1WSKKtnyP+_PoOwMMwu`(i@Z)diJp~U54*-miOchy7Z35eL>^M z4p<-aIxH4VUZgS783@H%M7P9hX>t{|RU7$n4T(brCG#h9e9p! z+o`i;EGGq3&pF;~5V~eBD}lC)>if$w%Vf}AFxGqO88|ApfHf&Bvu+xdG)@vuF}Yvk z)o;~k-%+0K0g+L`Wala!$=ZV|z$e%>f0%XoLib%)!R^RoS+{!#X?h-6uu zF&&KxORdZU&EwQFITIRLo(7TA3W}y6X{?Y%y2j0It!ekU#<)$qghZtpcS>L3uh`Uj z7GY;6f$9qKynP#oS3$$a{p^{D+0oJQ71`1?OAn_m8)UGZmj3l*ZI)`V-a>MKGGFG< z&^jg#Ok%(hhm>hSrZ5;Qga4u(?^i>GiW_j9%_7M>j(^|Om$#{k+^*ULnEgzW_1gCICtAD^WpC`A z{9&DXkG#01Xo)U$OC(L5Y$DQ|Q4C6CjUKk1UkPj$nXH##J{c8e#K|&{mA*;b$r0E4 zUNo0jthwA(c&N1l=PEe8Rw_8cEl|-eya9z&H3#n`B$t#+aJ03RFMzrV@gowbe8v(c zIFM60^0&lCFO10NU4w@|61xiZ4CVXeaKjd;d?sv52XM*lS8XiVjgWpRB;&U_C0g+`6B5V&w|O6B*_q zsATxL!M}+$He)1eOWECce#eS@2n^xhlB4<_Nn?yCVEQWDs(r`|@2GqLe<#(|&P0U? z$7V5IgpWf09uIf_RazRwC?qEqRaHyL?iiS05UiGesJy%^>-C{{ypTBI&B0-iUYhk> zIk<5xpsuV@g|z(AZD+C-;A!fTG=df1=<%nxy(a(IS+U{ME4ZbDEBtcD_3V=icT6*_ z)>|J?>&6%nvHhZERBtjK+s4xnut*@>GAmA5m*OTp$!^CHTr}vM4n(X1Q*;{e-Rd2BCF-u@1ZGm z!S8hJ6L=Gl4T_SDa7Xx|-{4mxveJg=ctf`BJ*fy!yF6Dz&?w(Q_6B}WQVtNI!BVBC zKfX<>7vd6C96}XAQmF-Jd?1Q4eTfRB3q7hCh0f!(JkdWT5<{iAE#dKy*Jxq&3a1@~ z8C||Dn2mFNyrUV|<-)C^_y7@8c2Fz+2jrae9deBDu;U}tJ{^xAdxCD248(k;dCJ%o z`y3sADe>U%suxwwv~8A1+R$VB=Q?%U?4joI$um;aH+eCrBqpn- z%79D_7rb;R-;-9RTrwi9dPlg8&@tfWhhZ(Vx&1PQ+6(huX`;M9x~LrW~~#3{j0Bh2kDU$}@!fFQej4VGkJv?M4rU^x!RU zEwhu$!CA_iDjFjrJa`aocySDX16?~;+wgav;}Zut6Mg%C4>}8FL?8)Kgwc(Qlj{@#2Pt0?G`$h7P#M+qoXtlV@d}%c&OzO+QYKK`kyXaK{U(O^2DyIXCZlNQjt0^8~8JzNGrIxhj}}M z&~QZlbx%t;MJ(Vux;2tgNKGlAqphLq%pd}JG9uoVHUo?|hN{pLQ6Em%r*+7t^<);X zm~6=qChlNAVXNN*Sow->*4;}T;l;D1I-5T{Bif@4_}=>l`tK;qqDdt5zvisCKhMAH z#r}`)7VW?LZqfdmXQ%zo5bJ00{Xb9^YKrk0Nf|oIW*K@(=`o2Vndz}ZDyk{!u}PVx zzd--+_WC*U{~DH3{?GI64IB+@On&@9X>EUAo&L+G{L^dozaI4C3G#2wr~hseW@K&g zKWs{uHu-9Je!3;4pE>eBltKUXb^*hG8I&413)$J&{D4N%7PcloU6bn%jPxJyQL?g* z9g+YFFEDiE`8rW^laCNzQmi7CTnPfwyg3VDHRAl>h=In6jeaVOP@!-CP60j3+#vpL zEYmh_oP0{-gTe7Or`L6x)6w?77QVi~jD8lWN@3RHcm80iV%M1A!+Y6iHM)05iC64tb$X2lV_%Txk@0l^hZqi^%Z?#- zE;LE0uFx)R08_S-#(wC=dS&}vj6P4>5ZWjhthP=*Hht&TdLtKDR;rXEX4*z0h74FA zMCINqrh3Vq;s%3MC1YL`{WjIAPkVL#3rj^9Pj9Ss7>7duy!9H0vYF%>1jh)EPqvlr6h%R%CxDsk| z!BACz7E%j?bm=pH6Eaw{+suniuY7C9Ut~1cWfOX9KW9=H><&kQlinPV3h9R>3nJvK z4L9(DRM=x;R&d#a@oFY7mB|m8h4692U5eYfcw|QKwqRsshN(q^v$4$)HgPpAJDJ`I zkqjq(8Cd!K!+wCd=d@w%~e$=gdUgD&wj$LQ1r>-E=O@c ze+Z$x{>6(JA-fNVr)X;*)40Eym1TtUZI1Pwwx1hUi+G1Jlk~vCYeXMNYtr)1?qwyg zsX_e*$h?380O00ou?0R@7-Fc59o$UvyVs4cUbujHUA>sH!}L54>`e` zHUx#Q+Hn&Og#YVOuo*niy*GU3rH;%f``nk#NN5-xrZ34NeH$l`4@t);4(+0|Z#I>Y z)~Kzs#exIAaf--65L0UHT_SvV8O2WYeD>Mq^Y6L!Xu8%vnpofG@w!}R7M28?i1*T&zp3X4^OMCY6(Dg<-! zXmcGQrRgHXGYre7GfTJ)rhl|rs%abKT_Nt24_Q``XH{88NVPW+`x4ZdrMuO0iZ0g` z%p}y};~T5gbb9SeL8BSc`SO#ixC$@QhXxZ=B}L`tP}&k?1oSPS=4%{UOHe0<_XWln zwbl5cn(j-qK`)vGHY5B5C|QZd5)W7c@{bNVXqJ!!n$^ufc?N9C-BF2QK1(kv++h!>$QbAjq)_b$$PcJdV+F7hz0Hu@ zqj+}m0qn{t^tD3DfBb~0B36|Q`bs*xs|$i^G4uNUEBl4g;op-;Wl~iThgga?+dL7s zUP(8lMO?g{GcYpDS{NM!UA8Hco?#}eNEioRBHy4`mq!Pd-9@-97|k$hpEX>xoX+dY zDr$wfm^P&}Wu{!%?)U_(%Mn79$(ywvu*kJ9r4u|MyYLI_67U7%6Gd_vb##Nerf@>& z8W11z$$~xEZt$dPG}+*IZky+os5Ju2eRi;1=rUEeIn>t-AzC_IGM-IXWK3^6QNU+2pe=MBn4I*R@A%-iLDCOHTE-O^wo$sL_h{dcPl=^muAQb`_BRm};=cy{qSkui;`WSsj9%c^+bIDQ z0`_?KX0<-=o!t{u(Ln)v>%VGL z0pC=GB7*AQ?N7N{ut*a%MH-tdtNmNC+Yf$|KS)BW(gQJ*z$d{+{j?(e&hgTy^2|AR9vx1Xre2fagGv0YXWqtNkg*v%40v?BJBt|f9wX5 z{QTlCM}b-0{mV?IG>TW_BdviUKhtosrBqdfq&Frdz>cF~yK{P@(w{Vr7z2qKFwLhc zQuogKO@~YwyS9%+d-zD7mJG~@?EFJLSn!a&mhE5$_4xBl&6QHMzL?CdzEnC~C3$X@ zvY!{_GR06ep5;<#cKCSJ%srxX=+pn?ywDwtJ2{TV;0DKBO2t++B(tIO4)Wh`rD13P z4fE$#%zkd=UzOB74gi=-*CuID&Z3zI^-`4U^S?dHxK8fP*;fE|a(KYMgMUo`THIS1f!*6dOI2 zFjC3O=-AL`6=9pp;`CYPTdVX z8(*?V&%QoipuH0>WKlL8A*zTKckD!paN@~hh zmXzm~qZhMGVdQGd=AG8&20HW0RGV8X{$9LldFZYm zE?}`Q3i?xJRz43S?VFMmqRyvWaS#(~Lempg9nTM$EFDP(Gzx#$r)W&lpFKqcAoJh-AxEw$-bjW>`_+gEi z2w`99#UbFZGiQjS8kj~@PGqpsPX`T{YOj`CaEqTFag;$jY z8_{Wzz>HXx&G*Dx<5skhpETxIdhKH?DtY@b9l8$l?UkM#J-Snmts7bd7xayKTFJ(u zyAT&@6cAYcs{PBfpqZa%sxhJ5nSZBPji?Zlf&}#L?t)vC4X5VLp%~fz2Sx<*oN<7` z?ge=k<=X7r<~F7Tvp9#HB{!mA!QWBOf%EiSJ6KIF8QZNjg&x~-%e*tflL(ji_S^sO ztmib1rp09uon}RcsFi#k)oLs@$?vs(i>5k3YN%$T(5Or(TZ5JW9mA6mIMD08=749$ z!d+l*iu{Il7^Yu}H;lgw=En1sJpCKPSqTCHy4(f&NPelr31^*l%KHq^QE>z>Ks_bH zjbD?({~8Din7IvZeJ>8Ey=e;I?thpzD=zE5UHeO|neioJwG;IyLk?xOz(yO&0DTU~ z^#)xcs|s>Flgmp;SmYJ4g(|HMu3v7#;c*Aa8iF#UZo7CvDq4>8#qLJ|YdZ!AsH%^_7N1IQjCro

      K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a23862b2..da9702f9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Fri Oct 07 10:22:16 IST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index b0d6d0ab..4f906e0c 100644 --- a/gradlew +++ b/gradlew @@ -7,7 +7,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -125,10 +126,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -154,19 +156,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -175,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 15e1ee37..ac1b06f9 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -5,7 +5,7 @@ @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem -@rem http://www.apache.org/licenses/LICENSE-2.0 +@rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, @@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -51,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -61,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From 1e2b377c9da3e42751575bdd31290ae126c3ff9f Mon Sep 17 00:00:00 2001 From: Anuja Shetye <55632820+shetyeanuja@users.noreply.github.com> Date: Wed, 12 Oct 2022 10:20:31 +0530 Subject: [PATCH 04/31] Language settings --- app/build.gradle | 23 +- app/src/main/AndroidManifest.xml | 47 ++- .../memoryassistant/Helper.java | 13 +- .../inAppBilling/DonateActivity.java | 11 +- .../lessons/ImplementLesson.java | 7 + .../lessons/LessonFragment.java | 7 +- .../memoryassistant/lessons/Lessons.java | 11 +- .../memoryassistant/main/Contribute.java | 7 + .../memoryassistant/main/CreditsActivity.java | 6 + .../main/DisciplineActivity.java | 10 +- .../memoryassistant/main/Implement.java | 12 +- .../memoryassistant/main/Learn.java | 7 + .../memoryassistant/main/MainActivity.java | 26 +- .../memoryassistant/main/Practice.java | 6 + .../memoryassistant/main/Preferences.java | 34 +- .../memoryassistant/main/PrivacyPolicy.java | 7 + .../memoryassistant/main/RecallSelector.java | 7 + .../memoryassistant/mySpace/MySpace.java | 10 +- .../mySpace/MySpaceFragment.java | 6 +- .../memoryassistant/mySpace/WriteFile.java | 6 + .../preferences/ClearPracticePreference.java | 9 +- .../preferences/TimePreference.java | 1 + .../memoryassistant/recall/RecallCards.java | 13 +- .../memoryassistant/recall/RecallComplex.java | 7 + .../memoryassistant/recall/RecallSimple.java | 16 +- .../reminders/ReminderUtils.java | 1 + .../services/MySpaceJobService.java | 7 + .../services/ReminderJobService.java | 7 + .../main/res/layout/activity_contribute.xml | 1 + app/src/main/res/layout/activity_credits.xml | 1 + app/src/main/res/layout/activity_learn.xml | 3 +- app/src/main/res/layout/activity_main.xml | 1 + app/src/main/res/layout/activity_practice.xml | 1 + .../res/layout/activity_privacy_policy.xml | 1 + app/src/main/res/layout/activity_recall.xml | 30 +- .../main/res/layout/activity_view_pager.xml | 10 +- .../layout/activity_view_pager_bottom_tab.xml | 9 +- .../main/res/layout/activity_write_file.xml | 12 +- .../main/res/layout/fragment_disciplines.xml | 45 ++- app/src/main/res/layout/item_category.xml | 2 + app/src/main/res/layout/item_contribute.xml | 3 + app/src/main/res/layout/item_date.xml | 9 +- app/src/main/res/layout/item_lesson_list.xml | 5 +- app/src/main/res/layout/loading.xml | 3 +- app/src/main/res/layout/sku.xml | 13 +- app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-fil/strings.xml | 316 +++++++++--------- app/src/main/res/values/arrays.xml | 23 ++ app/src/main/res/values/strings.xml | 23 ++ app/src/main/res/xml/settings_main.xml | 7 + build.gradle | 7 +- 51 files changed, 566 insertions(+), 284 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 093fbc92..2b2a7294 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ buildscript { } apply plugin: 'com.android.application' apply plugin: 'com.google.firebase.firebase-perf' -//apply plugin: 'io.fabric' apply plugin: 'kotlin-android' +//apply plugin: 'io.fabric' //apply plugin: 'com.jakewharton.hugo' //def keystorePropertiesFile = rootProject.file("other/.keystore.properties") @@ -26,16 +26,17 @@ android { // storePassword keystoreProperties['storePassword'] // } // } - compileSdkVersion 29 + compileSdkVersion 32 buildToolsVersion '28.0.3' defaultConfig { applicationId "com.memory_athelte.memoryassistant" minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 32 versionCode 153 versionName "1.8.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true + //resConfigs "en", "en-GB", "fr", "ja", "zh-Hans-MO", "zh-Hant-MO" } buildTypes { debug{ @@ -65,45 +66,45 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.multidex:multidex:2.0.1' - implementation 'com.google.android.material:material:1.1.0' implementation 'androidx.preference:preference:1.1.0' implementation 'androidx.browser:browser:1.2.0' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.vectordrawable:vectordrawable:1.1.0' - implementation 'com.google.firebase:firebase-appindexing:19.1.0' implementation 'com.firebase:firebase-jobdispatcher:0.8.5' implementation 'com.google.firebase:firebase-core:17.2.3' implementation 'com.google.firebase:firebase-perf:19.0.5' - //implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' - implementation 'org.solovyev.android:checkout:1.2.2' implementation 'com.squareup.picasso:picasso:2.71828' - implementation 'com.jakewharton.timber:timber:4.7.1' implementation 'com.jakewharton:butterknife:' + butterknifeVersion + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'androidx.preference:preference:1.1.1' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + //implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' + testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'junit:junit:4.12' annotationProcessor 'com.jakewharton:butterknife-compiler:' + butterknifeVersion - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation platform('com.google.firebase:firebase-bom:28.0.1') implementation 'com.google.firebase:firebase-analytics' implementation 'com.google.firebase:firebase-crashlytics' - testImplementation 'junit:junit:4.12' //noinspection GradleCompatible androidTestImplementation 'androidx.test:rules:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-intents:' + espressoVersion androidTestImplementation 'androidx.test.espresso:espresso-core:' + espressoVersion + } repositories { mavenCentral() //maven { url 'https://maven.fabric.io/public' } } + apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e441730c..45c1ff0c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,6 @@ - + + android:launchMode="singleTop" + android:exported="true"> - - + tools:targetApi="jelly_bean"> @@ -74,10 +76,10 @@ tools:targetApi="jelly_bean" /> + tools:targetApi="jelly_bean"> @@ -150,9 +152,9 @@ android:name=".inAppBilling.DonateActivity" android:parentActivityName=".main.Contribute" tools:targetApi="jelly_bean"> - - - + - - - + tools:targetApi="jelly_bean" /> @@ -179,14 +178,12 @@ - - - - - - - - + + + + \ No newline at end of file diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/Helper.java b/app/src/main/java/com/memory_athlete/memoryassistant/Helper.java index 0f1ab0f9..0bd0b2b4 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/Helper.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/Helper.java @@ -1,5 +1,10 @@ package com.memory_athlete.memoryassistant; +import static android.Manifest.permission.READ_EXTERNAL_STORAGE; +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; +import static androidx.core.app.ActivityCompat.requestPermissions; +import static androidx.core.content.ContextCompat.checkSelfPermission; + import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager; @@ -20,11 +25,6 @@ import timber.log.Timber; -import static android.Manifest.permission.READ_EXTERNAL_STORAGE; -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static androidx.core.app.ActivityCompat.requestPermissions; -import static androidx.core.content.ContextCompat.checkSelfPermission; - /** * Created by Manik on 15/07/17. */ @@ -182,6 +182,8 @@ public static void theme(Context context, Activity activity) { context.setTheme(R.style.light); } } + + // custom themes - Cards, Lessons, LessonFragment, ImplementLesson, RecallCards, DisciplineActivity // return true if directory was created successfully. returns false if it fails (when storage permissions are not granted) @@ -244,4 +246,5 @@ public static void clickableViewAnimation(View view, Context context) { public static float oneDpAsPixels(int dp, Context context){ return dp * context.getResources().getDisplayMetrics().density; } + } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/inAppBilling/DonateActivity.java b/app/src/main/java/com/memory_athlete/memoryassistant/inAppBilling/DonateActivity.java index 86674de7..a6fb57fc 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/inAppBilling/DonateActivity.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/inAppBilling/DonateActivity.java @@ -1,5 +1,8 @@ package com.memory_athlete.memoryassistant.inAppBilling; +import static org.solovyev.android.checkout.ResponseCodes.ITEM_ALREADY_OWNED; + +import android.content.Context; import android.content.Intent; import android.graphics.Paint; import android.os.Bundle; @@ -18,6 +21,7 @@ import com.google.firebase.analytics.FirebaseAnalytics; import com.memory_athlete.memoryassistant.BuildConfig; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import org.solovyev.android.checkout.ActivityCheckout; @@ -36,8 +40,6 @@ import butterknife.ButterKnife; import timber.log.Timber; -import static org.solovyev.android.checkout.ResponseCodes.ITEM_ALREADY_OWNED; - public class DonateActivity extends AppCompatActivity { @BindView(R.id.recycler) RecyclerView mRecycler; @@ -245,4 +247,9 @@ void onClick(Sku sku) { else purchase(sku); } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } \ No newline at end of file diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/lessons/ImplementLesson.java b/app/src/main/java/com/memory_athlete/memoryassistant/lessons/ImplementLesson.java index 99494537..a61a38d0 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/lessons/ImplementLesson.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/lessons/ImplementLesson.java @@ -1,5 +1,6 @@ package com.memory_athlete.memoryassistant.lessons; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; @@ -17,6 +18,7 @@ import com.google.android.material.tabs.TabLayout; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.mySpace.MySpaceFragment; @@ -175,4 +177,9 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) { } return super.onOptionsItemSelected(item); } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } \ No newline at end of file diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/lessons/LessonFragment.java b/app/src/main/java/com/memory_athlete/memoryassistant/lessons/LessonFragment.java index 98b5b0b2..a48068dd 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/lessons/LessonFragment.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/lessons/LessonFragment.java @@ -1,5 +1,7 @@ package com.memory_athlete.memoryassistant.lessons; +import static com.memory_athlete.memoryassistant.Helper.clickableViewAnimation; + import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Color; @@ -29,12 +31,9 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; -import java.util.Objects; import timber.log.Timber; -import static com.memory_athlete.memoryassistant.Helper.clickableViewAnimation; - public class LessonFragment extends Fragment { private Activity activity; private int textColor; @@ -112,7 +111,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, } protected void theme() { - String theme = PreferenceManager.getDefaultSharedPreferences(Objects.requireNonNull(getActivity())) + String theme = PreferenceManager.getDefaultSharedPreferences(requireActivity()) .getString(getString(R.string.theme), "AppTheme"); String[] themes = getResources().getStringArray(R.array.themes); if (themes[1].equals(theme)) { diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/lessons/Lessons.java b/app/src/main/java/com/memory_athlete/memoryassistant/lessons/Lessons.java index 8de4592d..db4228e2 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/lessons/Lessons.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/lessons/Lessons.java @@ -1,7 +1,10 @@ package com.memory_athlete.memoryassistant.lessons; +import static com.memory_athlete.memoryassistant.Helper.clickableViewAnimation; + import android.annotation.SuppressLint; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Color; @@ -26,6 +29,7 @@ import androidx.preference.PreferenceManager; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.mySpace.MySpace; @@ -37,8 +41,6 @@ import timber.log.Timber; -import static com.memory_athlete.memoryassistant.Helper.clickableViewAnimation; - /** * Created by Manik on 14/04/17. */ @@ -395,4 +397,9 @@ public View getView(final int position, View listItemView, @NonNull final ViewGr return listItemView; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/Contribute.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/Contribute.java index c3a849c2..78890ad7 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/Contribute.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/Contribute.java @@ -2,6 +2,7 @@ import android.app.Activity; import android.content.ActivityNotFoundException; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -18,6 +19,7 @@ import com.google.firebase.analytics.FirebaseAnalytics; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.inAppBilling.DonateActivity; @@ -141,4 +143,9 @@ public View getView(int position, View convertView, @NonNull ViewGroup parent) { } enum PART_TYPE {PLAY_STORE, ACTIVITY, GITHUB, EMAIL, CREDITS} + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/CreditsActivity.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/CreditsActivity.java index 14ddfb9b..542bb33f 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/CreditsActivity.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/CreditsActivity.java @@ -15,6 +15,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import java.util.ArrayList; @@ -78,4 +79,9 @@ public View getView(final int position, View listItemView, @NonNull final ViewGr return textView; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/DisciplineActivity.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/DisciplineActivity.java index bda7e094..c462fcd7 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/DisciplineActivity.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/DisciplineActivity.java @@ -1,5 +1,8 @@ package com.memory_athlete.memoryassistant.main; +import static java.util.Objects.requireNonNull; + +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; @@ -19,6 +22,7 @@ import com.google.android.material.tabs.TabLayout; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.disciplines.BinaryDigits; import com.memory_athlete.memoryassistant.disciplines.Cards; @@ -36,8 +40,6 @@ import timber.log.Timber; -import static java.util.Objects.requireNonNull; - public class DisciplineActivity extends AppCompatActivity implements MySpaceFragment.TabTitleUpdater { boolean backPressed = false; private static ArrayList tabTitles; @@ -287,4 +289,8 @@ protected void onPostExecute(SimpleFragmentPagerAdapter adapter) { tabLayout.setupWithViewPager(viewPager); } } + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } \ No newline at end of file diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/Implement.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/Implement.java index fe9dfb62..70da1c5d 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/Implement.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/Implement.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; @@ -18,6 +19,7 @@ import androidx.appcompat.app.AppCompatActivity; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.lessons.ImplementLesson; @@ -42,7 +44,7 @@ protected void onCreate(Bundle savedInstanceState) { Timber.v(Helper.TYPE + " " + intent.getStringExtra(Helper.TYPE)); int s = intent.getIntExtra(Helper.TYPE, 0); if (s == 0) throw new RuntimeException("Error in getting 'Implement' from the intent"); - pathList.add(getString(s)); + pathList.add("Implement"); setAdapter(); } @@ -64,8 +66,10 @@ public void setAdapter() { try { StringBuilder path = new StringBuilder(); for (String i : pathList) path.append(i); + //Toast.makeText(this, pathList.get(0), Toast.LENGTH_SHORT).show(); Timber.v("path = %s", path); String[] list = listAssetFiles(path.toString()); + Toast.makeText(this, String.valueOf(list.length), Toast.LENGTH_SHORT).show(); Timber.v("list set"); if (list == null) { Toast.makeText(this, "Nothing here", Toast.LENGTH_SHORT).show(); @@ -128,7 +132,6 @@ boolean checkPathContents(ArrayList strings, @SuppressWarnings("SamePara } private String[] listAssetFiles(String path) { - String[] list; try { list = getAssets().list(path); @@ -170,4 +173,9 @@ public View getView(int position, View listItemView, @NonNull ViewGroup parent) return listItemView; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/Learn.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/Learn.java index 72ec4f30..cfa5d571 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/Learn.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/Learn.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; @@ -16,6 +17,7 @@ import androidx.appcompat.app.AppCompatActivity; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.lessons.Lessons; import com.squareup.picasso.Picasso; @@ -117,4 +119,9 @@ public View getView(int position, View listItemView, @NonNull ViewGroup parent) return listItemView; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java index 22c3fcad..83cb99f1 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/MainActivity.java @@ -5,6 +5,7 @@ import android.annotation.SuppressLint; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; @@ -22,12 +23,15 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.os.LocaleListCompat; import androidx.preference.PreferenceManager; import com.google.android.material.snackbar.Snackbar; import com.google.firebase.BuildConfig; import com.google.firebase.analytics.FirebaseAnalytics; +import com.memory_athlete.memoryassistant.BaseActivity; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.mySpace.MySpace; import com.memory_athlete.memoryassistant.reminders.ReminderUtils; @@ -95,18 +99,30 @@ protected void onCreate(Bundle savedInstanceState) { setTitle(getString(R.string.app_name)); sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences getShared = getSharedPreferences("LANGUAGE", MODE_PRIVATE); + String value = getShared.getString("str", null); + if (value != null) { + Toast.makeText(MainActivity.this,value+" language", Toast.LENGTH_SHORT).show(); + + } else { + Intent intent = new Intent(MainActivity.this, BaseActivity.class); + startActivity(intent); + } + setAdapter(); firstStart(); Helper.mayAccessStorage(this); if (!verifyInstallerId() && !BuildConfig.DEBUG) { - Toast.makeText(this, R.string.dl_from_play, Toast.LENGTH_LONG).show(); + makeText(this, R.string.dl_from_play, Toast.LENGTH_LONG).show(); FirebaseAnalytics.getInstance(this).logEvent( "release_app_not_installed_form_play", null); } if (!Locale.getDefault().getLanguage().equals("en")) - Toast.makeText(this, R.string.faulty_translations, Toast.LENGTH_LONG).show(); + makeText(this, R.string.faulty_translations, Toast.LENGTH_LONG).show(); + LocaleListCompat appLocale = LocaleListCompat.forLanguageTags("xx-YY"); + //AppCompatDelegate.setApplicationLocales(appLocale); } // resuming the MainActivity again @@ -198,6 +214,7 @@ private class Item { } } + // defining the adapter which is going to take the list of items for displaying private class MainAdapter extends ArrayAdapter { @@ -227,5 +244,10 @@ public View getView(int position, View convertView, @NonNull ViewGroup parent) { return convertView; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/Practice.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/Practice.java index 8ce4c6c4..35087e96 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/Practice.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/Practice.java @@ -19,6 +19,7 @@ import com.google.android.material.snackbar.Snackbar; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.squareup.picasso.Picasso; @@ -138,4 +139,9 @@ public View getView(int position, View listView, @NonNull ViewGroup parent) { return listView; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/Preferences.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/Preferences.java index c1a5fc16..861a8c53 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/Preferences.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/Preferences.java @@ -1,5 +1,6 @@ package com.memory_athlete.memoryassistant.main; +import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.Preference; @@ -10,7 +11,9 @@ import androidx.appcompat.app.AppCompatActivity; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; +import com.memory_athlete.memoryassistant.SettingLanguage; import com.memory_athlete.memoryassistant.preferences.TimePreference; import java.util.Objects; @@ -43,6 +46,7 @@ public void onCreate(Bundle savedInstanceState) { bindPreferenceSummaryToValue(findPreference(getString(R.string.periodic))); bindPreferenceToast(findPreference(getString(R.string.speech_rate))); + bindPreferenceToast(findPreference("Change Language")); //bindPreferenceSummaryToValue(findPreference(getString(R.string.mTheme))); //bindPreferenceSummaryToValue(findPreference(getString(R.string.location_wise))); //bindPreferenceSummaryToValue(findPreference(getString(R.string.transit))); @@ -71,7 +75,29 @@ public boolean onPreferenceChange(Preference preference, Object value) { if (changeCount++ == 1) Toast.makeText(getActivity(), R.string.speech_rate_changed_message, Toast.LENGTH_LONG).show(); - } else if (preference instanceof TimePreference) { + } + else if (Objects.equals(preference.getKey(), "Change Language")){ + + SharedPreferences Preference = androidx.preference.PreferenceManager.getDefaultSharedPreferences(getActivity()); + String language = Preference.getString("Change Language",""); + + SettingLanguage sl = new SettingLanguage(); + String string_to_locale = sl.setLang(stringValue); + LocaleHelper.setLocale(getActivity(), string_to_locale); + + SharedPreferences shrd = getActivity().getSharedPreferences("LANGUAGE",MODE_PRIVATE); + SharedPreferences.Editor editor = shrd.edit(); + editor.putString("str",stringValue); + editor.apply(); + + //Toast.makeText(getActivity(),stringValue+" Language selected",Toast.LENGTH_SHORT).show(); + + if(!language.equals(stringValue)){ + Toast.makeText(getActivity(), "Language changed. Please restart the app", Toast.LENGTH_SHORT).show(); + } + } + + else if (preference instanceof TimePreference) { int min = Integer.parseInt(stringValue.substring(stringValue.indexOf(":") + 1)); int hour = Integer.parseInt(stringValue.substring(0, stringValue.indexOf(":"))); String meridian = (hour < 12) ? " am" : " pm"; @@ -95,5 +121,11 @@ public void onStop() { if (!Objects.equals(PreferenceManager.getDefaultSharedPreferences(this) .getString(getString(R.string.theme), "AppTheme"), mTheme)) Toast.makeText(this, "Please restart the app", Toast.LENGTH_SHORT).show(); + + } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); } } \ No newline at end of file diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/PrivacyPolicy.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/PrivacyPolicy.java index 69d34540..5fae39dc 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/PrivacyPolicy.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/PrivacyPolicy.java @@ -1,5 +1,6 @@ package com.memory_athlete.memoryassistant.main; +import android.content.Context; import android.content.res.Resources; import android.os.Bundle; import android.webkit.WebView; @@ -8,6 +9,7 @@ import androidx.appcompat.app.AppCompatActivity; import com.google.firebase.analytics.FirebaseAnalytics; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import java.io.ByteArrayOutputStream; @@ -50,4 +52,9 @@ private String readTextFromResource() { return stream.toString(); } + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } + } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/main/RecallSelector.java b/app/src/main/java/com/memory_athlete/memoryassistant/main/RecallSelector.java index 9770120c..42d07265 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/main/RecallSelector.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/main/RecallSelector.java @@ -3,6 +3,7 @@ import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; @@ -25,6 +26,7 @@ import com.google.android.material.snackbar.Snackbar; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.recall.RecallCards; import com.memory_athlete.memoryassistant.recall.RecallComplex; @@ -353,4 +355,9 @@ public String getName() { return mFileName; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } \ No newline at end of file diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpace.java b/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpace.java index 4c2ca265..c5a2495d 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpace.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpace.java @@ -3,6 +3,7 @@ import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; @@ -25,6 +26,7 @@ import com.google.android.material.snackbar.Snackbar; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.squareup.picasso.Picasso; @@ -144,7 +146,7 @@ public void setAdapter() { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_CODE); File folder = getFilesDir(); - dir = new File(folder + File.separator + getString(R.string.my_space) + File.separator + item.mItem); + dir = new File(folder + File.separator +getString(R.string.my_space) + File.separator + item.mItem); //dir = new File(Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + item.mItem); layout.findViewById(listViewId).setVisibility(View.GONE); @@ -163,7 +165,7 @@ public void setAdapter() { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_CODE); File folder = getFilesDir(); - String fileName = folder + File.separator + "My Space" + File.separator + getTitle().toString(); + String fileName = folder + File.separator + getString(R.string.my_space) + File.separator + getTitle().toString(); //String fileName = Helper.APP_FOLDER + getString(R.string.my_space) + File.separator + getTitle(); @@ -267,6 +269,10 @@ public View getView(int position, View listItemView, @NonNull ViewGroup parent) return listItemView; } } + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } //major, ben, equations, derivations, lists, algos, words, wardrobes \ No newline at end of file diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpaceFragment.java b/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpaceFragment.java index 98e4ada5..ab5399f8 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpaceFragment.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/MySpaceFragment.java @@ -31,6 +31,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.reminders.ReminderUtils; @@ -103,7 +104,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, } catch (Resources.NotFoundException e) { // Timber.e(e); Toast.makeText(getActivity(), R.string.dl_from_play, Toast.LENGTH_LONG).show(); - Objects.requireNonNull(getActivity()).finish(); + requireActivity().finish(); return rootView; } rootView.findViewById(R.id.add_search).setVisibility(GONE); @@ -434,7 +435,7 @@ public boolean save(View rootView) { outputStream.close(); SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences( - Objects.requireNonNull(getActivity())).edit(); + requireActivity()).edit(); editor.putLong(fname, System.currentTimeMillis()); Timber.v(fname + "made at " + System.currentTimeMillis()); editor.apply(); @@ -521,4 +522,5 @@ public View getView(int position, View listItemView, @NonNull ViewGroup parent) return listItemView; } } + } \ No newline at end of file diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/WriteFile.java b/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/WriteFile.java index 67fbb6dc..23d2187e 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/WriteFile.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/mySpace/WriteFile.java @@ -1,5 +1,6 @@ package com.memory_athlete.memoryassistant.mySpace; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; @@ -20,6 +21,7 @@ import androidx.preference.PreferenceManager; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.memory_athlete.memoryassistant.reminders.ReminderUtils; @@ -262,4 +264,8 @@ public void search(View view) { if (!search(stringToSearch)) searchEditText.requestFocus(); } + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/preferences/ClearPracticePreference.java b/app/src/main/java/com/memory_athlete/memoryassistant/preferences/ClearPracticePreference.java index 3d0d2800..7ee02d66 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/preferences/ClearPracticePreference.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/preferences/ClearPracticePreference.java @@ -1,5 +1,9 @@ package com.memory_athlete.memoryassistant.preferences; +import static android.Manifest.permission.READ_EXTERNAL_STORAGE; +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; +import static androidx.core.content.ContextCompat.checkSelfPermission; + import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; @@ -12,10 +16,6 @@ import java.io.File; import java.util.Objects; -import static android.Manifest.permission.READ_EXTERNAL_STORAGE; -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static androidx.core.content.ContextCompat.checkSelfPermission; - /** * Created by Manik on 10/09/17. */ @@ -63,4 +63,5 @@ private void deleteRecursive(File fileOrDirectory) { //noinspection ResultOfMethodCallIgnored fileOrDirectory.delete(); } + } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/preferences/TimePreference.java b/app/src/main/java/com/memory_athlete/memoryassistant/preferences/TimePreference.java index 64b06590..4f54c450 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/preferences/TimePreference.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/preferences/TimePreference.java @@ -91,4 +91,5 @@ protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { lastHour=getHour(time); lastMinute=getMinute(time); } + } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallCards.java b/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallCards.java index 361aa6d7..1a44a9d3 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallCards.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallCards.java @@ -1,7 +1,11 @@ package com.memory_athlete.memoryassistant.recall; +import static com.memory_athlete.memoryassistant.Helper.makeCardString; +import static java.lang.Integer.parseInt; + import android.annotation.SuppressLint; import android.app.Activity; +import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.util.TypedValue; @@ -16,6 +20,7 @@ import androidx.annotation.NonNull; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import com.squareup.picasso.Picasso; @@ -25,9 +30,6 @@ import timber.log.Timber; -import static com.memory_athlete.memoryassistant.Helper.makeCardString; -import static java.lang.Integer.parseInt; - public class RecallCards extends RecallSimple { CardAdapter mAdapter; int cardSelectorTextColour = -1; @@ -218,6 +220,11 @@ public View getView(int position, View convertView, @NonNull ViewGroup parent) { return imageView;//listItemView; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallComplex.java b/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallComplex.java index 86a7a77c..dae74254 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallComplex.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallComplex.java @@ -2,6 +2,7 @@ import android.annotation.SuppressLint; import android.app.Activity; +import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.text.Html; @@ -18,6 +19,7 @@ import androidx.annotation.NonNull; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import java.io.File; @@ -311,6 +313,11 @@ public String getResponse() { return response; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } //TODO minimise response text diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallSimple.java b/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallSimple.java index 21475c48..d02994c1 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallSimple.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/recall/RecallSimple.java @@ -1,5 +1,10 @@ package com.memory_athlete.memoryassistant.recall; +import static android.text.InputType.TYPE_CLASS_NUMBER; +import static android.text.InputType.TYPE_CLASS_TEXT; +import static java.lang.Math.abs; +import static java.lang.Math.pow; + import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; @@ -23,6 +28,7 @@ import com.google.firebase.analytics.FirebaseAnalytics; import com.memory_athlete.memoryassistant.Helper; +import com.memory_athlete.memoryassistant.LocaleHelper; import com.memory_athlete.memoryassistant.R; import java.io.File; @@ -33,11 +39,6 @@ import timber.log.Timber; -import static android.text.InputType.TYPE_CLASS_NUMBER; -import static android.text.InputType.TYPE_CLASS_TEXT; -import static java.lang.Math.abs; -import static java.lang.Math.pow; - public class RecallSimple extends AppCompatActivity { protected boolean givenUp = false; protected boolean resetSWFlag = true; @@ -708,6 +709,11 @@ protected enum ResponseFormat { protected enum CompareFormat { SIMPLE_COMPARE_FORMAT, WORD_COMPARE_FORMAT, CARD_COMPARE_FORMAT } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } // TODO: shift to fragments \ No newline at end of file diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/reminders/ReminderUtils.java b/app/src/main/java/com/memory_athlete/memoryassistant/reminders/ReminderUtils.java index 67a6d039..4eb65cc0 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/reminders/ReminderUtils.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/reminders/ReminderUtils.java @@ -145,4 +145,5 @@ synchronized public static void mySpaceReminder(@NonNull final Context context, Timber.v("dispatcher scheduled, tag = " + fname + i); } } + } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/services/MySpaceJobService.java b/app/src/main/java/com/memory_athlete/memoryassistant/services/MySpaceJobService.java index d03c5357..0b6403a7 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/services/MySpaceJobService.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/services/MySpaceJobService.java @@ -1,10 +1,12 @@ package com.memory_athlete.memoryassistant.services; +import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import com.firebase.jobdispatcher.JobParameters; import com.firebase.jobdispatcher.JobService; +import com.memory_athlete.memoryassistant.LocaleHelper; import timber.log.Timber; @@ -41,4 +43,9 @@ protected void onPostExecute(Object o) { public boolean onStopJob(JobParameters job) { return false; } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/java/com/memory_athlete/memoryassistant/services/ReminderJobService.java b/app/src/main/java/com/memory_athlete/memoryassistant/services/ReminderJobService.java index a8afa84f..4f2f187f 100644 --- a/app/src/main/java/com/memory_athlete/memoryassistant/services/ReminderJobService.java +++ b/app/src/main/java/com/memory_athlete/memoryassistant/services/ReminderJobService.java @@ -1,9 +1,11 @@ package com.memory_athlete.memoryassistant.services; +import android.content.Context; import android.os.AsyncTask; import com.firebase.jobdispatcher.JobParameters; import com.firebase.jobdispatcher.JobService; +import com.memory_athlete.memoryassistant.LocaleHelper; import timber.log.Timber; @@ -39,4 +41,9 @@ public boolean onStopJob(com.firebase.jobdispatcher.JobParameters job) { Timber.v("Entered onStopJob()"); return false; } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base, "en")); + } } diff --git a/app/src/main/res/layout/activity_contribute.xml b/app/src/main/res/layout/activity_contribute.xml index 0e2cfc25..8e5a06e1 100644 --- a/app/src/main/res/layout/activity_contribute.xml +++ b/app/src/main/res/layout/activity_contribute.xml @@ -4,6 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="8dp" + android:contentDescription="@string/a_list_of_contributing_options_like_support_fund_commit_and_credits" android:divider="@android:color/transparent" android:dividerHeight="8dp" tools:context="com.memory_athlete.memoryassistant.main.Contribute"> diff --git a/app/src/main/res/layout/activity_credits.xml b/app/src/main/res/layout/activity_credits.xml index 320f07f3..03307383 100644 --- a/app/src/main/res/layout/activity_credits.xml +++ b/app/src/main/res/layout/activity_credits.xml @@ -4,6 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="16dp" + android:contentDescription="A list of all the contributors in making the app" android:divider="@null" android:dividerHeight="0dp" android:orientation="vertical" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_learn.xml b/app/src/main/res/layout/activity_learn.xml index 5f2e747a..eb5fbf08 100644 --- a/app/src/main/res/layout/activity_learn.xml +++ b/app/src/main/res/layout/activity_learn.xml @@ -10,8 +10,9 @@ android:id="@+id/learn_list" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="1" android:layout_margin="8dp" + android:layout_weight="1" + android:contentDescription="@string/a_list_of_all_the_learning_methods" android:divider="@color/color_transparent" android:dividerHeight="0px" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a276acf7..e9f8599a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -11,6 +11,7 @@ android:layout_height="0dp" android:layout_margin="8dp" android:layout_weight="1" + android:contentDescription="@string/list_of_tasks_that_can_be_performed_with_the_app" android:divider="@color/color_transparent" android:dividerHeight="0px" /> diff --git a/app/src/main/res/layout/activity_practice.xml b/app/src/main/res/layout/activity_practice.xml index 825cb07a..1d058857 100644 --- a/app/src/main/res/layout/activity_practice.xml +++ b/app/src/main/res/layout/activity_practice.xml @@ -10,6 +10,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="8dp" + android:contentDescription="@string/a_list_of_disciplines_to_practice" android:divider="@color/color_transparent" android:dividerHeight="0dp" /> diff --git a/app/src/main/res/layout/activity_privacy_policy.xml b/app/src/main/res/layout/activity_privacy_policy.xml index a2c2fcc6..f366ae8f 100644 --- a/app/src/main/res/layout/activity_privacy_policy.xml +++ b/app/src/main/res/layout/activity_privacy_policy.xml @@ -5,5 +5,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="8dp" + android:contentDescription="@string/privacy_policy_information" tools:context="com.memory_athlete.memoryassistant.main.PrivacyPolicy" /> diff --git a/app/src/main/res/layout/activity_recall.xml b/app/src/main/res/layout/activity_recall.xml index dce26f9e..23a837af 100644 --- a/app/src/main/res/layout/activity_recall.xml +++ b/app/src/main/res/layout/activity_recall.xml @@ -227,10 +227,11 @@ + tools:ignore="TextContrastCheck" /> + tools:ignore="TextContrastCheck" /> + tools:ignore="TextContrastCheck" /> -->