diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..39fb081 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml new file mode 100644 index 0000000..719bb8b --- /dev/null +++ b/.idea/codeStyleSettings.xml @@ -0,0 +1,228 @@ + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..fe72da5 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..16dee8a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + Android > Lint > Correctness + + + Android > Lint > Correctness > Messages + + + Android > Lint > Performance + + + Android > Lint > Usability > Icons + + + Control flow issuesJava + + + Java + + + Naming conventionsJava + + + XML + + + + + Android + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..780389e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/README.md b/README.md new file mode 100644 index 0000000..5290765 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Glossika Schedule +This is just a simple tool to track your progress in Glossika's (http://www.glossika.com) new schedules. + +All schedules are now included. + +You can add multiple languages and schedule types. As of 1/3/2017 all of Glossika's currently released courses are included, but if your language isn't included then you can just pick another language and use that. It doesn't really matter. diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/app-release.apk b/app/app-release.apk new file mode 100644 index 0000000..2954702 Binary files /dev/null and b/app/app-release.apk differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..9ecc26e --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,54 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'realm-android' + +android { + compileSdkVersion 27 + buildToolsVersion "26.0.2" + defaultConfig { + applicationId "ch.ralena.glossikaschedule" + minSdkVersion 19 + targetSdkVersion 27 + versionCode 10 + versionName "1.3.1" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + // Testing + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + testCompile 'junit:junit:4.12' + testCompile 'org.mockito:mockito-core:2.13.0' + // Android + compile 'com.android.support:appcompat-v7:27.1.0' + compile 'com.android.support:recyclerview-v7:27.1.0' + compile 'com.android.support:cardview-v7:27.1.0' + compile 'com.android.support:design:27.1.0' + testCompile 'junit:junit:4.12' + // Google + compile 'com.google.android:flexbox:0.3.1' + // rxJava + compile 'io.reactivex.rxjava2:rxjava:2.1.7' + compile 'io.reactivex.rxjava2:rxandroid:2.0.1' + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" + debugCompile 'com.facebook.stetho:stetho:1.5.0' + debugCompile 'com.uphyca:stetho_realm:2.1.0' + +} +repositories { + mavenCentral() +} diff --git a/app/ch.ralena.glossikaschedule-noSQL.apk b/app/ch.ralena.glossikaschedule-noSQL.apk new file mode 100644 index 0000000..df91e11 Binary files /dev/null and b/app/ch.ralena.glossikaschedule-noSQL.apk differ diff --git a/app/ch.ralena.glossikaschedule-v6.apk b/app/ch.ralena.glossikaschedule-v6.apk new file mode 100644 index 0000000..8d5ce84 Binary files /dev/null and b/app/ch.ralena.glossikaschedule-v6.apk differ diff --git a/app/ch.ralena.glossikaschedule.apk.zip b/app/ch.ralena.glossikaschedule.apk.zip new file mode 100644 index 0000000..0ad4c30 Binary files /dev/null and b/app/ch.ralena.glossikaschedule.apk.zip differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..623c1aa --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,26 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\Users\crater-windoze\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +-assumenosideeffects class android.util.Log { + public static boolean isLoggable(java.lang.String, int); + public static int v(...); + public static int i(...); + public static int w(...); + public static int d(...); + public static int e(...); +} \ No newline at end of file diff --git a/app/release/app-release.apk b/app/release/app-release.apk new file mode 100644 index 0000000..b23cdc9 Binary files /dev/null and b/app/release/app-release.apk differ diff --git a/app/release/output.json b/app/release/output.json new file mode 100644 index 0000000..5c09418 --- /dev/null +++ b/app/release/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":10},"path":"app-release.apk","properties":{"packageId":"ch.ralena.glossikaschedule","split":"","minSdkVersion":"19"}}] \ No newline at end of file diff --git a/app/src/debug/AndroidManifest.xml b/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..2cf9972 --- /dev/null +++ b/app/src/debug/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/debug/java/ch/ralena/glossikaschedule/DebugApplication.java b/app/src/debug/java/ch/ralena/glossikaschedule/DebugApplication.java new file mode 100644 index 0000000..f45fb47 --- /dev/null +++ b/app/src/debug/java/ch/ralena/glossikaschedule/DebugApplication.java @@ -0,0 +1,16 @@ +package ch.ralena.glossikaschedule; + +import com.facebook.stetho.Stetho; +import com.uphyca.stetho_realm.RealmInspectorModulesProvider; + +public class DebugApplication extends MainApplication { + @Override + public void onCreate() { + super.onCreate(); + Stetho.initialize( + Stetho.newInitializerBuilder(this) + .enableDumpapp(Stetho.defaultDumperPluginsProvider(this)) + .enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build()) + .build()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..5cc9830 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000..810c12c Binary files /dev/null and b/app/src/main/ic_launcher-web.png differ diff --git a/app/src/main/java/ch/ralena/glossikaschedule/MainActivity.java b/app/src/main/java/ch/ralena/glossikaschedule/MainActivity.java new file mode 100644 index 0000000..fa8f713 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/MainActivity.java @@ -0,0 +1,212 @@ +package ch.ralena.glossikaschedule; + +import android.content.Intent; +import android.os.Bundle; +import android.support.design.widget.NavigationView; +import android.support.design.widget.Snackbar; +import android.support.v4.app.FragmentManager; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + +import ch.ralena.glossikaschedule.adapter.DayAdapter; +import ch.ralena.glossikaschedule.adapter.NavigationAdapter; +import ch.ralena.glossikaschedule.fragment.MainFragment; +import ch.ralena.glossikaschedule.object.Schedule; +import io.realm.Realm; +import io.realm.RealmResults; + +import static ch.ralena.glossikaschedule.NewScheduleActivity.EXTRA_NEW_SCHEDULE; + +public class MainActivity extends AppCompatActivity implements DayAdapter.OnItemCheckedListener, NavigationAdapter.OnItemClickListener { + private static final String TAG = MainActivity.class.getSimpleName(); + public static final String MAIN_FRAGMENT_TAG = "main_fragment"; + public static final String TAG_SCHEDULE_ID = "schedule_id"; + private static final String TAG_SCHEDULE_INDEX = "save_schedule_index"; + + DrawerLayout drawerLayout; + NavigationView navigationView; + private FragmentManager fragmentManager; + NavigationAdapter navigationAdapter; + ActionBarDrawerToggle drawerToggle; + + RealmResults schedules; + Schedule loadedSchedule; + + private Realm realm; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + drawerLayout = findViewById(R.id.drawerLayout); + navigationView = findViewById(R.id.navigationView); + + // set up toolbar + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + fragmentManager = getSupportFragmentManager(); + + // load schedules from database + realm = Realm.getDefaultInstance(); + schedules = realm.where(Schedule.class).findAll(); + + // if we don't have any schedules yet, request to create one, otherwise load the first schedule + if (schedules.size() == 0) { + loadNewScheduleActivity(false); + } else { + if(getIntent().getBooleanExtra(EXTRA_NEW_SCHEDULE, false)) { + loadedSchedule = schedules.last(); + } else if (savedInstanceState != null) { + int scheduleIndex = savedInstanceState.getInt(TAG_SCHEDULE_INDEX); + loadedSchedule = schedules.get(scheduleIndex); + } else { + loadedSchedule = schedules.first(); + } + loadMainFragment(loadedSchedule); + } + + // set up nav drawer + setupNavigationDrawer(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + int scheduleIndex = loadedSchedule == null ? 0 : schedules.indexOf(loadedSchedule); + outState.putInt(TAG_SCHEDULE_INDEX, scheduleIndex); + } + + private void setupNavigationDrawer() { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_close) { + public void onDrawerClosed(View drawerView) { + super.onDrawerClosed(drawerView); + invalidateOptionsMenu(); + } + + public void onDrawerOpened(View drawerView) { + super.onDrawerOpened(drawerView); + invalidateOptionsMenu(); + } + }; + drawerToggle.syncState(); + drawerToggle.setDrawerIndicatorEnabled(true); + drawerLayout.addDrawerListener(drawerToggle); + + navigationView.setNavigationItemSelectedListener( + menuItem -> { + menuItem.setCheckable(true); + navigationView.setCheckedItem(menuItem.getItemId()); + drawerLayout.closeDrawers(); + return true; + }); +// RecyclerView recyclerView = (RecyclerView) findViewById(R.id.navigationRecyclerView); +// navigationAdapter = new NavigationAdapter(this, schedules, schedules.indexOf(loadedSchedule)); +// recyclerView.setAdapter(navigationAdapter); +// RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); +// recyclerView.setLayoutManager(layoutManager); + } + + private void loadMainFragment(Schedule schedule) { + // update side drawer + if (navigationAdapter != null) { + int position = schedules.indexOf(schedule); + navigationAdapter.setCurrentPosition(position); + navigationAdapter.notifyDataSetChanged(); + } + loadedSchedule = schedule; + drawerLayout.closeDrawers(); + // load new fragment + MainFragment mainFragment = new MainFragment(); + Bundle bundle = new Bundle(); + bundle.putString(TAG_SCHEDULE_ID, schedule.getId()); + mainFragment.setArguments(bundle); + fragmentManager + .beginTransaction() + .replace(R.id.fragmentPlaceHolder, mainFragment, MAIN_FRAGMENT_TAG) + .commit(); + } + + private void loadNewScheduleActivity(boolean addToBackStack) { + // close side drawer + drawerLayout.closeDrawers(); + Intent intent = new Intent(this, NewScheduleActivity.class); + // if this is the first time opening the app, there won't be any schedules so mainFragment won't have been created + // therefore we shouldn't add the new schedule activity to the backstack + MainFragment mainFragment = (MainFragment) fragmentManager.findFragmentByTag(MAIN_FRAGMENT_TAG); + if (!addToBackStack) { + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + } + startActivity(intent); + } + + @Override + public void onItemChecked() { + MainFragment mainFragment = (MainFragment) fragmentManager.findFragmentByTag(MAIN_FRAGMENT_TAG); + mainFragment.updateDay(); + } + + @Override + public void onNewSchedule() { + loadNewScheduleActivity(true); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.toolbar, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + drawerLayout.openDrawer(GravityCompat.START); // OPEN DRAWER + return true; + case R.id.action_delete: + deleteSchedule(); + return true; + } + return super.onOptionsItemSelected(item); + } + + private void deleteSchedule() { + final Snackbar snackbar = Snackbar.make(findViewById(R.id.fragmentPlaceHolder), "Delete " + loadedSchedule.getLanguage() + "?\n(Can't be undone!)", Snackbar.LENGTH_INDEFINITE); + snackbar.setAction("Delete", view -> { + // find array index of the currently loaded schedule + int position = schedules.indexOf(loadedSchedule); + + // delete the schedule + realm.executeTransaction(r -> { + schedules.deleteFromRealm(position); + }); + + // update the side menu + navigationAdapter.notifyItemRemoved(position); + + // load the next schedule if there's one left + int newPosition = position > 0 ? position - 1 : position; + if (schedules.size() > 0) { + loadMainFragment(schedules.get(newPosition)); + } else { + loadNewScheduleActivity(false); + } + snackbar.dismiss(); + }); + snackbar.show(); + } + + @Override + public void onScheduleClicked(Schedule schedule) { + loadMainFragment(schedule); + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/MainApplication.java b/app/src/main/java/ch/ralena/glossikaschedule/MainApplication.java new file mode 100644 index 0000000..8a24c68 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/MainApplication.java @@ -0,0 +1,22 @@ +package ch.ralena.glossikaschedule; + +import android.app.Application; + +import io.realm.Realm; +import io.realm.RealmConfiguration; + +// TODO: 12/30/2016 mark currently selected study day +public class MainApplication extends Application { + @Override + public void onCreate() { + super.onCreate(); + // initialize Realm + Realm.init(this); + RealmConfiguration config = new RealmConfiguration.Builder() + .name("glossikaschedule.realm") + .schemaVersion(1) + .deleteRealmIfMigrationNeeded() + .build(); + Realm.setDefaultConfiguration(config); + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/NewScheduleActivity.java b/app/src/main/java/ch/ralena/glossikaschedule/NewScheduleActivity.java new file mode 100644 index 0000000..2a691cc --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/NewScheduleActivity.java @@ -0,0 +1,102 @@ +package ch.ralena.glossikaschedule; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.MenuItem; + +import ch.ralena.glossikaschedule.data.LanguageType; +import ch.ralena.glossikaschedule.data.ScheduleData; +import ch.ralena.glossikaschedule.data.ScheduleType; +import ch.ralena.glossikaschedule.fragment.NewScheduleConfirmFragment; +import ch.ralena.glossikaschedule.fragment.NewScheduleLanguageFragment; +import io.realm.Realm; + +public class NewScheduleActivity extends AppCompatActivity { + private static final String TAG = NewScheduleActivity.class.getSimpleName(); + private static final String EXTRA_LANGUAGE = "extra_language"; + private static final String EXTRA_SCHEDULE = "extra_schedule"; + public static final String EXTRA_NEW_SCHEDULE = "extra_new_schedule"; + + + // views + private Toolbar toolbar; + // objects + private Realm realm; + + // results passed back in + public LanguageType selectedLanguage; + public ScheduleType selectedSchedule; + + @Override + protected void onCreate(Bundle savedInstanceState) { + Log.d(TAG, "onCreate"); + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_new_schedule); + + // load toolbar + toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + // prepare realm object + realm = Realm.getDefaultInstance(); + + // load first fragment + if (savedInstanceState == null) { + NewScheduleLanguageFragment fragment = new NewScheduleLanguageFragment(); + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragmentContainer, fragment) + .commit(); + } else { + selectedLanguage = savedInstanceState.getParcelable(EXTRA_LANGUAGE); + selectedSchedule = savedInstanceState.getParcelable(EXTRA_SCHEDULE); + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putParcelable(EXTRA_LANGUAGE, selectedLanguage); + outState.putParcelable(EXTRA_SCHEDULE, selectedSchedule); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + break; + case R.id.action_confirm: + loadConfirmFragment(); + break; + } + return super.onOptionsItemSelected(item); + } + + private void loadConfirmFragment() { + NewScheduleConfirmFragment fragment = new NewScheduleConfirmFragment(); + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragmentContainer, fragment) + .commit(); + } + + public void updateLanguage(LanguageType language) { + selectedLanguage = language; + } + + public void updateSchedule(ScheduleType schedule) { + selectedSchedule = schedule; + } + + public void createSchedule(String scheduleTitle) { + ScheduleData.createSchedule(realm, selectedSchedule, selectedLanguage, scheduleTitle); + Intent intent = new Intent(this, MainActivity.class); + intent.putExtra(EXTRA_NEW_SCHEDULE, true); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + } + +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/adapter/DayAdapter.java b/app/src/main/java/ch/ralena/glossikaschedule/adapter/DayAdapter.java new file mode 100644 index 0000000..24bf681 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/adapter/DayAdapter.java @@ -0,0 +1,84 @@ +package ch.ralena.glossikaschedule.adapter; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; + +import ch.ralena.glossikaschedule.R; +import ch.ralena.glossikaschedule.object.Day; +import ch.ralena.glossikaschedule.object.StudyItem; +import io.realm.Realm; +import io.realm.RealmList; + +public class DayAdapter extends RecyclerView.Adapter { + public interface OnItemCheckedListener { + void onItemChecked(); + } + + private Day day; + private RealmList studyItems; + private OnItemCheckedListener listener; + private Realm realm; + + public DayAdapter(Day day, OnItemCheckedListener listener) { + this.day = day; + this.studyItems = day.getStudyItems(); + this.listener = listener; + realm = Realm.getDefaultInstance(); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_study_item, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + ((ViewHolder) holder).bindView(studyItems.get(position)); + } + + @Override + public int getItemCount() { + return studyItems.size(); + } + + public void changeAll(final boolean isChecked) { + for (StudyItem studyItem : studyItems) { + realm.executeTransaction(r -> studyItem.setCompleted(isChecked)); + } + notifyDataSetChanged(); + } + + private class ViewHolder extends RecyclerView.ViewHolder { + StudyItem studyItem; + CheckBox fileCheckBox; + + public ViewHolder(View view) { + super(view); + fileCheckBox = (CheckBox) view.findViewById(R.id.fileCheckBox); + fileCheckBox.setOnCheckedChangeListener(mCheckedChangeListener); + } + + public void bindView(StudyItem studyItem) { + this.studyItem = studyItem; + fileCheckBox.setText(studyItem.getTitle()); + fileCheckBox.setChecked(studyItem.isCompleted()); + } + + CompoundButton.OnCheckedChangeListener mCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + realm.executeTransaction(r -> { + studyItem.setCompleted(isChecked); + day.updateDateCompleted(); + } + ); + listener.onItemChecked(); + } + }; + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/adapter/LanguageSelectAdapter.java b/app/src/main/java/ch/ralena/glossikaschedule/adapter/LanguageSelectAdapter.java new file mode 100644 index 0000000..6509a8c --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/adapter/LanguageSelectAdapter.java @@ -0,0 +1,74 @@ +package ch.ralena.glossikaschedule.adapter; + +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.List; + +import ch.ralena.glossikaschedule.R; +import ch.ralena.glossikaschedule.data.LanguageType; +import io.reactivex.subjects.PublishSubject; + +public class LanguageSelectAdapter extends RecyclerView.Adapter { + List languages; + LanguageType selectedLanguage; + + PublishSubject observable = PublishSubject.create(); + + + public PublishSubject asObservable() { + return observable; + } + + public LanguageSelectAdapter(List languages, LanguageType selectedLanguage) { + this.languages = languages; + this.selectedLanguage = selectedLanguage; + } + + @Override + public LanguageSelectAdapter.LanguageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_language, parent, false); + return new LanguageViewHolder(view); + } + + @Override + public void onBindViewHolder(LanguageSelectAdapter.LanguageViewHolder holder, int position) { + holder.bindView(languages.get(position)); + } + + @Override + public int getItemCount() { + return languages.size(); + } + + class LanguageViewHolder extends RecyclerView.ViewHolder { + TextView languageName; + ImageView flag; + + LanguageViewHolder(View itemView) { + super(itemView); + languageName = itemView.findViewById(R.id.languageLabel); + flag = itemView.findViewById(R.id.flagImageView); + } + + private void bindView(LanguageType language) { + if (language.equals(selectedLanguage)) { + itemView.setBackgroundColor(ContextCompat.getColor(itemView.getContext(), R.color.colorAccent)); + } else { + itemView.setBackgroundColor(ContextCompat.getColor(itemView.getContext(), android.R.color.transparent)); + } + itemView.setOnClickListener(view -> { + selectedLanguage = language; + notifyDataSetChanged(); + observable.onNext(language); + }); + languageName.setText(language.getName()); + flag.setImageResource(language.getDrawable()); + } + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/adapter/NavigationAdapter.java b/app/src/main/java/ch/ralena/glossikaschedule/adapter/NavigationAdapter.java new file mode 100644 index 0000000..98880ad --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/adapter/NavigationAdapter.java @@ -0,0 +1,123 @@ +package ch.ralena.glossikaschedule.adapter; + +import android.content.Context; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import ch.ralena.glossikaschedule.R; +import ch.ralena.glossikaschedule.object.Schedule; +import io.realm.RealmResults; + +public class NavigationAdapter extends RecyclerView.Adapter { + public interface OnItemClickListener { + void onNewSchedule(); + void onScheduleClicked(Schedule schedule); + } + + private static final int TYPE_LANGUAGE = 1; + private static final int TYPE_ADD_SCHEDULE = 2; + private Context context; + private OnItemClickListener listener; + private RealmResults schedules; + private int currentPosition; + + public NavigationAdapter(Context context, RealmResults schedules, int currentPosition) { + this.context = context; + listener = (OnItemClickListener) context; + this.schedules = schedules; + this.currentPosition = currentPosition; + } + + public void setCurrentPosition(int currentPosition) { + this.currentPosition = currentPosition; + } + + public int getCurrentPosition() { + return currentPosition; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + if (viewType == TYPE_LANGUAGE) { + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_menu_language, parent, false); + return new ViewHolder(view); + } else { + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_add_new_schedule, parent, false); + return new ViewHolderNew(view); + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if (position < getItemCount() - 1) + ((ViewHolder) holder).bindView(schedules.get(position), position); + } + + @Override + public int getItemCount() { + return schedules.size() + 1; + } + + @Override + public int getItemViewType(int position) { + if (position < getItemCount() - 1) { + return TYPE_LANGUAGE; + } else { + return TYPE_ADD_SCHEDULE; + } + } + + private class ViewHolder extends RecyclerView.ViewHolder { + private View view; + private TextView languageName; + private TextView scheduleType; + private ImageView flagImage; + private Schedule schedule; + + public ViewHolder(View view) { + super(view); + this.view = view; + languageName = (TextView) view.findViewById(R.id.languageLabel); + scheduleType = (TextView) view.findViewById(R.id.scheduleTypeLabel); + flagImage = (ImageView) view.findViewById(R.id.flagImageView); + this.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ViewGroup parent = (ViewGroup) view.getParent(); + int numViews = parent.getChildCount(); + for (int i = 0; i < numViews; i++) { + parent.getChildAt(i).setBackgroundResource(R.drawable.menu_language); + } + ViewHolder.this.view.setBackgroundColor(ContextCompat.getColor(context, R.color.colorPrimaryLight)); + listener.onScheduleClicked(schedule); + } + }); + } + + public void bindView(Schedule schedule, int position) { + this.schedule = schedule; + // highlight currently selected menu item + if (currentPosition == position) { + view.setBackgroundColor(ContextCompat.getColor(context, R.color.colorPrimaryLight)); + } else { + view.setBackgroundResource(R.drawable.menu_language); + } + languageName.setText(schedule.getLanguage()); + scheduleType.setText(schedule.getTitle()); + flagImage.setImageResource(schedule.getLanguageType().getDrawable()); + } + } + + private class ViewHolderNew extends RecyclerView.ViewHolder { + public ViewHolderNew(View itemView) { + super(itemView); + itemView.setOnClickListener(view -> listener.onNewSchedule()); + } + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/adapter/ScheduleAdapter.java b/app/src/main/java/ch/ralena/glossikaschedule/adapter/ScheduleAdapter.java new file mode 100644 index 0000000..9658143 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/adapter/ScheduleAdapter.java @@ -0,0 +1,141 @@ +package ch.ralena.glossikaschedule.adapter; + +import android.content.Context; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + +import ch.ralena.glossikaschedule.R; +import ch.ralena.glossikaschedule.object.Day; +import io.reactivex.subjects.PublishSubject; +import io.realm.RealmList; + +public class ScheduleAdapter extends RecyclerView.Adapter { + RealmList days; + Context context; + PublishSubject observable = PublishSubject.create(); + int currentPosition; + + public ScheduleAdapter(int currentPosition, RealmList days, Context context) { + this.currentPosition = currentPosition; + this.days = days; + this.context = context; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_schedule, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + ((ViewHolder) holder).bindView(days.get(position), position); + } + + @Override + public int getItemCount() { + return days.size(); + } + + public PublishSubject asObservable() { + return observable; + } + + public void removeHighlight() { + int position = currentPosition; + currentPosition = -1; + notifyItemChanged(position); + } + + private class ViewHolder extends RecyclerView.ViewHolder { + LinearLayout dayLayout; + TextView dayLabel; + TextView dateLabel; + Day day; + int position; + + public ViewHolder(View view) { + super(view); + dayLayout = view.findViewById(R.id.dayLayout); + dayLabel = view.findViewById(R.id.dayLabel); + dateLabel = view.findViewById(R.id.dateLabel); + view.setOnClickListener(onClickListener); + } + + public void bindView(Day day, int position) { + this.day = day; + this.position = position; + dayLabel.setText(day.getDayNumber() + ""); + if (day.isCompleted()) { + dateLabel.setText(day.getFormattedDateShort()); + } else { + dateLabel.setText(calculateDate(day)); + } + if (day.isCompleted()) { + dayLabel.setTextColor(ContextCompat.getColor(context, android.R.color.white)); + dateLabel.setTextColor(ContextCompat.getColor(context, android.R.color.white)); + if (day.wasCompletedToday()) { + dayLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.colorAccent)); + } else { + dayLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.colorPrimaryLight)); + } + } else { + dayLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.colorBackground)); + dayLabel.setTextColor(ContextCompat.getColor(context, R.color.colorTextLight)); + dateLabel.setTextColor(ContextCompat.getColor(context, R.color.colorTextLight)); + } + + if (position == currentPosition) { + dayLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.colorPrimaryDark)); + dayLabel.setTextColor(ContextCompat.getColor(context, android.R.color.white)); + dateLabel.setTextColor(ContextCompat.getColor(context, android.R.color.white)); + } + + } + + private String calculateDate(Day day1) { + int daysLeft = 0; + boolean alreadyDone = false; + for (Day day : days) { + if (day.getFormattedDateShort().equals(getFormattedDate(0))) { + alreadyDone = true; + } + if (!day.isCompleted()) { + daysLeft = day1.getDayNumber() - day.getDayNumber(); + break; + } + } + + if (!alreadyDone) { + // if we haven't completed anything yet today + return daysLeft == 0 ? "today" : getFormattedDate(daysLeft); + } else { + // if we have, we need to make sure counting starts from tomorrow + return getFormattedDate(daysLeft + 1); + } + } + + private String getFormattedDate(int daysLeft) { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_YEAR, daysLeft); + SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd"); + return dateFormat.format(calendar.getTime()); + } + + View.OnClickListener onClickListener = new View.OnClickListener() { + @Override + public void onClick(View view) { + currentPosition = position; + observable.onNext(day); + } + }; + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/adapter/ScheduleSelectAdapter.java b/app/src/main/java/ch/ralena/glossikaschedule/adapter/ScheduleSelectAdapter.java new file mode 100644 index 0000000..9e8a17d --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/adapter/ScheduleSelectAdapter.java @@ -0,0 +1,82 @@ +package ch.ralena.glossikaschedule.adapter; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import ch.ralena.glossikaschedule.R; +import ch.ralena.glossikaschedule.data.ScheduleType; + +public class ScheduleSelectAdapter extends RecyclerView.Adapter { + public interface OnScheduleSelectedListener { + void onScheduleSelected(ScheduleType schedule); + } + + OnScheduleSelectedListener listener; + + Map> schedules; + List minutesList; + int currentSelection; + + public ScheduleSelectAdapter(TreeMap> schedules) { + minutesList = new ArrayList<>(); + for (Integer integer : schedules.keySet()) { + minutesList.add(integer); + } + this.schedules = schedules; + } + + @Override + public ScheduleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_schedule_minutes, parent, false); + listener = (OnScheduleSelectedListener) parent.getContext(); + return new ScheduleViewHolder(view); + } + + @Override + public void onBindViewHolder(ScheduleViewHolder holder, int position) { + holder.bindView(position); + } + + @Override + public int getItemCount() { + return schedules.size(); + } + + class ScheduleViewHolder extends RecyclerView.ViewHolder { + TextView minutesLabel; + + ScheduleViewHolder(View itemView) { + super(itemView); + minutesLabel = itemView.findViewById(R.id.minutesLabel); + } + + private void bindView(int position) { + itemView.setOnClickListener(view -> { + notifyItemChanged(currentSelection); + notifyItemChanged(position); + currentSelection = position; + }); + + if (position == currentSelection) { + itemView.setBackgroundResource(R.drawable.schedule_minutes_selected); + } else { + itemView.setBackgroundResource(R.drawable.schedule_minutes); + } + +// itemView.setOnClickListener(view -> { +//// selectedLanguage = schedule; +// notifyDataSetChanged(); +//// listener.onScheduleSelected(minutes); +// }); + minutesLabel.setText(minutesList.get(position) + ""); + } + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/data/LanguageData.java b/app/src/main/java/ch/ralena/glossikaschedule/data/LanguageData.java new file mode 100644 index 0000000..acad1f4 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/data/LanguageData.java @@ -0,0 +1,62 @@ +package ch.ralena.glossikaschedule.data; + +import java.util.ArrayList; +import java.util.List; + +import ch.ralena.glossikaschedule.R; + +public class LanguageData { + public static List languages; + + static { + languages = getLanguages(); + } + + public static List getLanguages() { + List languages = new ArrayList<>(); + languages.add(new LanguageType("Arabic (Standard)", R.drawable.flag_arabic_msa)); + languages.add(new LanguageType("Arabic (Egyptian)", R.drawable.flag_arabic_egypt)); + languages.add(new LanguageType("Armenian", R.drawable.flag_armenian)); + languages.add(new LanguageType("Belarusian", R.drawable.flag_belarusian)); + languages.add(new LanguageType("Catalan", R.drawable.flag_catalan)); + languages.add(new LanguageType("Chinese (Cantonese)", R.drawable.flag_chinese_hongkong)); + languages.add(new LanguageType("Chinese (Hakka)", R.drawable.flag_chinese_china)); + languages.add(new LanguageType("Chinese (Mandarin, China)", R.drawable.flag_chinese_china)); + languages.add(new LanguageType("Chinese (Mandarin, Taiwan)", R.drawable.flag_chinese_taiwan)); + languages.add(new LanguageType("Chinese (Taiwanese Hokkien)", R.drawable.flag_chinese_taiwan)); + languages.add(new LanguageType("Chinese (Wenzhounese)", R.drawable.flag_chinese_china)); + languages.add(new LanguageType("Czech", R.drawable.flag_czech)); + languages.add(new LanguageType("Dutch", R.drawable.flag_dutch)); + languages.add(new LanguageType("Estonian", R.drawable.flag_estonian)); + languages.add(new LanguageType("Finnish", R.drawable.flag_finnish)); + languages.add(new LanguageType("French", R.drawable.flag_french)); + languages.add(new LanguageType("German", R.drawable.flag_german)); + languages.add(new LanguageType("Greek", R.drawable.flag_greek)); + languages.add(new LanguageType("Hindi", R.drawable.flag_hindi)); + languages.add(new LanguageType("Hungarian", R.drawable.flag_hungarian)); + languages.add(new LanguageType("Icelandic", R.drawable.flag_icelandic)); + languages.add(new LanguageType("Indonesian", R.drawable.flag_indonesian)); + languages.add(new LanguageType("Italian", R.drawable.flag_italian)); + languages.add(new LanguageType("Japanese", R.drawable.flag_japanese)); + languages.add(new LanguageType("Korean", R.drawable.flag_korean)); + languages.add(new LanguageType("Latvian", R.drawable.flag_latvian)); + languages.add(new LanguageType("Lithuanian", R.drawable.flag_lithuanian)); + languages.add(new LanguageType("Mongolian", R.drawable.flag_mongolian)); + languages.add(new LanguageType("Polish", R.drawable.flag_polish)); + languages.add(new LanguageType("Portuguese (Brazil)", R.drawable.flag_portuguese_brazil)); + languages.add(new LanguageType("Russian", R.drawable.flag_russian)); + languages.add(new LanguageType("Serbian", R.drawable.flag_serbian)); + languages.add(new LanguageType("Slovak", R.drawable.flag_slovak)); + languages.add(new LanguageType("Spanish (Mexico)", R.drawable.flag_spanish_mexico)); + languages.add(new LanguageType("Spanish (Spain)", R.drawable.flag_spanish_spain)); + languages.add(new LanguageType("Swahili", R.drawable.flag_none)); + languages.add(new LanguageType("Swedish", R.drawable.flag_sweden)); + languages.add(new LanguageType("Tagalog", R.drawable.flag_tagalog)); + languages.add(new LanguageType("Thai", R.drawable.flag_thai)); + languages.add(new LanguageType("Turkish", R.drawable.flag_turkish)); + languages.add(new LanguageType("Ukrainian", R.drawable.flag_ukrainian)); + languages.add(new LanguageType("Vietnamese (Northern)", R.drawable.flag_vietnamese_north)); + + return languages; + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/data/LanguageType.java b/app/src/main/java/ch/ralena/glossikaschedule/data/LanguageType.java new file mode 100644 index 0000000..b3af9da --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/data/LanguageType.java @@ -0,0 +1,58 @@ +package ch.ralena.glossikaschedule.data; + +import android.os.Parcel; +import android.os.Parcelable; + +public class LanguageType implements Parcelable { + String name; + int drawable; + + public LanguageType(String name, int drawable) { + this.name = name; + this.drawable = drawable; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getDrawable() { + return drawable; + } + + public void setDrawable(int drawable) { + this.drawable = drawable; + } + + protected LanguageType(Parcel in) { + name = in.readString(); + drawable = in.readInt(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public LanguageType createFromParcel(Parcel in) { + return new LanguageType(in); + } + + @Override + public LanguageType[] newArray(int size) { + return new LanguageType[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeString(name); + parcel.writeInt(drawable); + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/data/ScheduleData.java b/app/src/main/java/ch/ralena/glossikaschedule/data/ScheduleData.java new file mode 100644 index 0000000..446d2bb --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/data/ScheduleData.java @@ -0,0 +1,1053 @@ +package ch.ralena.glossikaschedule.data; + +import java.util.ArrayList; +import java.util.UUID; + +import ch.ralena.glossikaschedule.object.Day; +import ch.ralena.glossikaschedule.object.Schedule; +import ch.ralena.glossikaschedule.object.StudyItem; +import io.realm.Realm; + +public class ScheduleData { + public static ArrayList scheduleList; + public static final String SCHEDULE_9_RELAXED = "9-Month Relaxed"; + public static final String SCHEDULE_9_RELAXED_SUMMARY = "Use this for your first foreign language or any other very distant and different language."; + public static final String SCHEDULE_9_RELAXED_DESCRIPTION = "This schedule is for the really busy person. So there is less practice per day, and more emphasis on Spaced Repetition. Best results will be achieved by doing at least one file per day."; + public static final String[][] SCHEDULE_9_RELAXED_STRINGS = { + {"F1­GMS­A­0001", "F1­GSR­DAY­01"}, + {"F1­GSR­DAY­02"}, + {"F1­GSR­DAY­03"}, + {"F1­GSR­DAY­04"}, + {"F1­GSR­DAY­05"}, + {"F1­GMS­A­0051", "F1­GSR­DAY­06"}, + {"F1­GSR­DAY­07"}, + {"F1­GSR­DAY­08"}, + {"F1­GSR­DAY­09"}, + {"F1­GSR­DAY­010"}, + {"F1­GMS­A­0101", "F1­GSR­DAY­011"}, + {"F1­GSR­DAY­012"}, + {"F1­GSR­DAY­013"}, + {"F1­GSR­DAY­014"}, + {"F1­GSR­DAY­015"}, + {"F1­GMS­A­0151", "F1­GSR­DAY­016"}, + {"F1­GSR­DAY­017"}, + {"F1­GSR­DAY­018"}, + {"F1­GSR­DAY­019"}, + {"F1­GSR­DAY­020"}, + {"F1­GMS­A­0201", "F1­GSR­DAY­021"}, + {"F1­GSR­DAY­022"}, + {"F1­GSR­DAY­023"}, + {"F1­GSR­DAY­024"}, + {"F1­GSR­DAY­025"}, + {"F1­GMS­A­0251", "F1­GSR­DAY­026"}, + {"F1­GSR­DAY­027"}, + {"F1­GSR­DAY­028"}, + {"F1­GSR­DAY­029"}, + {"F1­GSR­DAY­030"}, + {"F1­GMS­A­0301", "F1­GSR­DAY­031"}, + {"F1­GSR­DAY­032"}, + {"F1­GSR­DAY­033"}, + {"F1­GSR­DAY­034"}, + {"F1­GSR­DAY­035"}, + {"F1­GMS­A­0351", "F1­GSR­DAY­036"}, + {"F1­GSR­DAY­037"}, + {"F1­GSR­DAY­038"}, + {"F1­GSR­DAY­039"}, + {"F1­GSR­DAY­040"}, + {"F1­GMS­A­0401", "F1­GSR­DAY­041"}, + {"F1­GSR­DAY­042"}, + {"F1­GSR­DAY­043"}, + {"F1­GSR­DAY­044"}, + {"F1­GSR­DAY­045"}, + {"F1­GMS­A­0451", "F1­GSR­DAY­046"}, + {"F1­GSR­DAY­047"}, + {"F1­GSR­DAY­048"}, + {"F1­GSR­DAY­049"}, + {"F1­GSR­DAY­050"}, + {"F1­GMS­A­0501", "F1­GSR­DAY­051"}, + {"F1­GSR­DAY­052"}, + {"F1­GSR­DAY­053"}, + {"F1­GSR­DAY­054"}, + {"F1­GSR­DAY­055"}, + {"F1­GMS­A­0551", "F1­GSR­DAY­056"}, + {"F1­GSR­DAY­057"}, + {"F1­GSR­DAY­058"}, + {"F1­GSR­DAY­059"}, + {"F1­GSR­DAY­060"}, + {"F1­GMS­A­0601", "F1­GSR­DAY­061"}, + {"F1­GSR­DAY­062"}, + {"F1­GSR­DAY­063"}, + {"F1­GSR­DAY­064"}, + {"F1­GSR­DAY­065"}, + {"F1­GMS­A­0651", "F1­GSR­DAY­066"}, + {"F1­GSR­DAY­067"}, + {"F1­GSR­DAY­068"}, + {"F1­GSR­DAY­069"}, + {"F1­GSR­DAY­070"}, + {"F1­GMS­A­0701", "F1­GSR­DAY­071"}, + {"F1­GSR­DAY­072"}, + {"F1­GSR­DAY­073"}, + {"F1­GSR­DAY­074"}, + {"F1­GSR­DAY­075"}, + {"F1­GMS­A­0751", "F1­GSR­DAY­076"}, + {"F1­GSR­DAY­077"}, + {"F1­GSR­DAY­078"}, + {"F1­GSR­DAY­079"}, + {"F1­GSR­DAY­080"}, + {"F1­GMS­A­0801", "F1­GSR­DAY­081"}, + {"F1­GSR­DAY­082"}, + {"F1­GSR­DAY­083"}, + {"F1­GSR­DAY­084"}, + {"F1­GSR­DAY­085"}, + {"F1­GMS­A­0851", "F1­GSR­DAY­086"}, + {"F1­GSR­DAY­087"}, + {"F1­GSR­DAY­088"}, + {"F1­GSR­DAY­089"}, + {"F1­GSR­DAY­090"}, + {"F1­GMS­A­0901", "F1­GSR­DAY­091"}, + {"F1­GSR­DAY­092"}, + {"F1­GSR­DAY­093"}, + {"F1­GSR­DAY­094"}, + {"F1­GSR­DAY­095"}, + {"F1­GMS­A­0951", "F1­GSR­DAY­096"}, + {"F1­GSR­DAY­097"}, + {"F1­GSR­DAY­098"}, + {"F1­GSR­DAY­099"}, + {"F1­GSR­DAY­100"}, + {"F2­GMS­A­1001", "F2­GSR­DAY­001"}, + {"F2­GSR­DAY­002"}, + {"F2­GSR­DAY­003"}, + {"F2­GSR­DAY­004"}, + {"F2­GSR­DAY­005"}, + {"F2­GMS­A­1051", "F2­GSR­DAY­006"}, + {"F2­GSR­DAY­007"}, + {"F2­GSR­DAY­008"}, + {"F2­GSR­DAY­009"}, + {"F2­GSR­DAY­010"}, + {"F2­GMS­A­1101", "F2­GSR­DAY­011"}, + {"F2­GSR­DAY­012"}, + {"F2­GSR­DAY­013"}, + {"F2­GSR­DAY­014"}, + {"F2­GSR­DAY­015"}, + {"F2­GMS­A­1151", "F2­GSR­DAY­016"}, + {"F2­GSR­DAY­017"}, + {"F2­GSR­DAY­018"}, + {"F2­GSR­DAY­019"}, + {"F2­GSR­DAY­020"}, + {"F2­GMS­A­1201", "F2­GSR­DAY­021"}, + {"F2­GSR­DAY­022"}, + {"F2­GSR­DAY­023"}, + {"F2­GSR­DAY­024"}, + {"F2­GSR­DAY­025"}, + {"F2­GMS­A­1251", "F2­GSR­DAY­026"}, + {"F2­GSR­DAY­027"}, + {"F2­GSR­DAY­028"}, + {"F2­GSR­DAY­029"}, + {"F2­GSR­DAY­030"}, + {"F2­GMS­A­1301", "F2­GSR­DAY­031"}, + {"F2­GSR­DAY­032"}, + {"F2­GSR­DAY­033"}, + {"F2­GSR­DAY­034"}, + {"F2­GSR­DAY­035"}, + {"F2­GMS­A­1351", "F2­GSR­DAY­036"}, + {"F2­GSR­DAY­037"}, + {"F2­GSR­DAY­038"}, + {"F2­GSR­DAY­039"}, + {"F2­GSR­DAY­040"}, + {"F2­GMS­A­1401", "F2­GSR­DAY­041"}, + {"F2­GSR­DAY­042"}, + {"F2­GSR­DAY­043"}, + {"F2­GSR­DAY­044"}, + {"F2­GSR­DAY­045"}, + {"F2­GMS­A­1451", "F2­GSR­DAY­046"}, + {"F2­GSR­DAY­047"}, + {"F2­GSR­DAY­048"}, + {"F2­GSR­DAY­049"}, + {"F2­GSR­DAY­050"}, + {"F2­GMS­A­1501", "F2­GSR­DAY­051"}, + {"F2­GSR­DAY­052"}, + {"F2­GSR­DAY­053"}, + {"F2­GSR­DAY­054"}, + {"F2­GSR­DAY­055"}, + {"F2­GMS­A­1551", "F2­GSR­DAY­056"}, + {"F2­GSR­DAY­057"}, + {"F2­GSR­DAY­058"}, + {"F2­GSR­DAY­059"}, + {"F2­GSR­DAY­060"}, + {"F2­GMS­A­1601", "F2­GSR­DAY­061"}, + {"F2­GSR­DAY­062"}, + {"F2­GSR­DAY­063"}, + {"F2­GSR­DAY­064"}, + {"F2­GSR­DAY­065"}, + {"F2­GMS­A­1651", "F2­GSR­DAY­066"}, + {"F2­GSR­DAY­067"}, + {"F2­GSR­DAY­068"}, + {"F2­GSR­DAY­069"}, + {"F2­GSR­DAY­070"}, + {"F2­GMS­A­1701", "F2­GSR­DAY­071"}, + {"F2­GSR­DAY­072"}, + {"F2­GSR­DAY­073"}, + {"F2­GSR­DAY­074"}, + {"F2­GSR­DAY­075"}, + {"F2­GMS­A­1751", "F2­GSR­DAY­076"}, + {"F2­GSR­DAY­077"}, + {"F2­GSR­DAY­078"}, + {"F2­GSR­DAY­079"}, + {"F2­GSR­DAY­080"}, + {"F2­GMS­A­1801", "F2­GSR­DAY­081"}, + {"F2­GSR­DAY­082"}, + {"F2­GSR­DAY­083"}, + {"F2­GSR­DAY­084"}, + {"F2­GSR­DAY­085"}, + {"F2­GMS­A­1851", "F2­GSR­DAY­086"}, + {"F2­GSR­DAY­087"}, + {"F2­GSR­DAY­088"}, + {"F2­GSR­DAY­089"}, + {"F2­GSR­DAY­090"}, + {"F2­GMS­A­1901", "F2­GSR­DAY­091"}, + {"F2­GSR­DAY­092"}, + {"F2­GSR­DAY­093"}, + {"F2­GSR­DAY­094"}, + {"F2­GSR­DAY­095"}, + {"F2­GMS­A­1951", "F2­GSR­DAY­096"}, + {"F2­GSR­DAY­097"}, + {"F2­GSR­DAY­098"}, + {"F2­GSR­DAY­099"}, + {"F2­GSR­DAY­100"}, + {"F3­GMS­A­2001", "F3­GSR­DAY­001"}, + {"F3­GSR­DAY­002"}, + {"F3­GSR­DAY­003"}, + {"F3­GSR­DAY­004"}, + {"F3­GSR­DAY­005"}, + {"F3­GMS­A­2051", "F3­GSR­DAY­006"}, + {"F3­GSR­DAY­007"}, + {"F3­GSR­DAY­008"}, + {"F3­GSR­DAY­009"}, + {"F3­GSR­DAY­010"}, + {"F3­GMS­A­2101", "F3­GSR­DAY­011"}, + {"F3­GSR­DAY­012"}, + {"F3­GSR­DAY­013"}, + {"F3­GSR­DAY­014"}, + {"F3­GSR­DAY­015"}, + {"F3­GMS­A­2151", "F3­GSR­DAY­016"}, + {"F3­GSR­DAY­017"}, + {"F3­GSR­DAY­018"}, + {"F3­GSR­DAY­019"}, + {"F3­GSR­DAY­020"}, + {"F3­GMS­A­2201", "F3­GSR­DAY­021"}, + {"F3­GSR­DAY­022"}, + {"F3­GSR­DAY­023"}, + {"F3­GSR­DAY­024"}, + {"F3­GSR­DAY­025"}, + {"F3­GMS­A­2251", "F3­GSR­DAY­026"}, + {"F3­GSR­DAY­027"}, + {"F3­GSR­DAY­028"}, + {"F3­GSR­DAY­029"}, + {"F3­GSR­DAY­030"}, + {"F3­GMS­A­2301", "F3­GSR­DAY­031"}, + {"F3­GSR­DAY­032"}, + {"F3­GSR­DAY­033"}, + {"F3­GSR­DAY­034"}, + {"F3­GSR­DAY­035"}, + {"F3­GMS­A­2351", "F3­GSR­DAY­036"}, + {"F3­GSR­DAY­037"}, + {"F3­GSR­DAY­038"}, + {"F3­GSR­DAY­039"}, + {"F3­GSR­DAY­040"}, + {"F3­GMS­A­2401", "F3­GSR­DAY­041"}, + {"F3­GSR­DAY­042"}, + {"F3­GSR­DAY­043"}, + {"F3­GSR­DAY­044"}, + {"F3­GSR­DAY­045"}, + {"F3­GMS­A­2451", "F3­GSR­DAY­046"}, + {"F3­GSR­DAY­047"}, + {"F3­GSR­DAY­048"}, + {"F3­GSR­DAY­049"}, + {"F3­GSR­DAY­050"}, + {"F3­GMS­A­2501", "F3­GSR­DAY­051"}, + {"F3­GSR­DAY­052"}, + {"F3­GSR­DAY­053"}, + {"F3­GSR­DAY­054"}, + {"F3­GSR­DAY­055"}, + {"F3­GMS­A­2551", "F3­GSR­DAY­056"}, + {"F3­GSR­DAY­057"}, + {"F3­GSR­DAY­058"}, + {"F3­GSR­DAY­059"}, + {"F3­GSR­DAY­060"}, + {"F3­GMS­A­2601", "F3­GSR­DAY­061"}, + {"F3­GSR­DAY­062"}, + {"F3­GSR­DAY­063"}, + {"F3­GSR­DAY­064"}, + {"F3­GSR­DAY­065"}, + {"F3­GMS­A­2601", "F3­GSR­DAY­066"}, + {"F3­GSR­DAY­067"}, + {"F3­GSR­DAY­068"}, + {"F3­GSR­DAY­069"}, + {"F3­GSR­DAY­070"}, + {"F3­GMS­A­2701", "F3­GSR­DAY­071"}, + {"F3­GSR­DAY­072"}, + {"F3­GSR­DAY­073"}, + {"F3­GSR­DAY­074"}, + {"F3­GSR­DAY­075"}, + {"F3­GMS­A­2751", "F3­GSR­DAY­076"}, + {"F3­GSR­DAY­077"}, + {"F3­GSR­DAY­078"}, + {"F3­GSR­DAY­079"}, + {"F3­GSR­DAY­080"}, + {"F1­GMS­A­2801", "F3­GSR­DAY­081"}, + {"F3­GSR­DAY­082"}, + {"F3­GSR­DAY­083"}, + {"F3­GSR­DAY­084"}, + {"F3­GSR­DAY­085"}, + {"F3­GMS­A­2851", "F3­GSR­DAY­086"}, + {"F3­GSR­DAY­087"}, + {"F3­GSR­DAY­088"}, + {"F3­GSR­DAY­089"}, + {"F3­GSR­DAY­090"}, + {"F3­GMS­A­2901", "F3­GSR­DAY­091"}, + {"F3­GSR­DAY­092"}, + {"F3­GSR­DAY­093"}, + {"F3­GSR­DAY­094"}, + {"F3­GSR­DAY­095"}, + {"F3­GMS­A­2951", "F3­GSR­DAY­096"}, + {"F3­GSR­DAY­097"}, + {"F3­GSR­DAY­098"}, + {"F3­GSR­DAY­099"}, + {"F3­GSR­DAY­100"}, + {"F3­GSR­DAY­101"} + }; + public static final String SCHEDULE_5_INTENSIVE = "5-Month Intensive"; + public static final String SCHEDULE_5_INTENSIVE_SUMMARY = "This is one of our favorites. If you're jumping into a new language, no matter the difficulty, and want to get results within a half year and can afford 90 minutes per day, this is the schedule for you."; + public static final String SCHEDULE_5_INTENSIVE_DESCRIPTION = "This schedule is for the serious learner that really wants to put in the work to get results within a half year. If you are an experienced language learner working on a completely new and different language, this is the beDer choice of the two 5-month courses."; + public static final String[][] SCHEDULE_5_INTENSIVE_STRINGS = {{"F1-GMS-A-0001", "F1-GMS-A-0051", "F1-GMS-A-0101", "F1-GSR-DAY-002", "F1-GSR-DAY-005", "F1-GSR-DAY-006"}, + {"F1-GMS-A-0151", "F1-GMS-A-0201", "F1-GMS-A-0251", "F1-GSR-DAY-004", "F1-GSR-DAY-007", "F1-GSR-DAY-008"}, + {"F1-GMS-A-0301", "F1-GMS-A-0351", "F1-GMS-A-0401", "F1-GSR-DAY-006", "F1-GSR-DAY-009", "F1-GSR-DAY-010"}, + {"F1-GMS-A-0451", "F1-GMS-A-0501", "F1-GMS-A-0551", "F1-GSR-DAY-008", "F1-GSR-DAY-011", "F1-GSR-DAY-012"}, + {"F1-GMS-A-0601", "F1-GMS-A-0651", "F1-GSR-DAY-010", "F1-GSR-DAY-013", "F1-GSR-DAY-014"}, + {"F1-GMS-A-0701", "F1-GMS-A-0751", "F1-GSR-DAY-012", "F1-GSR-DAY-015", "F1-GSR-DAY-016"}, + {"F1-GMS-A-0801", "F1-GMS-A-0851", "F1-GSR-DAY-014", "F1-GSR-DAY-017", "F1-GSR-DAY-018"}, + {"F1-GMS-A-0901", "F1-GMS-A-0951", "F1-GSR-DAY-016", "F1-GSR-DAY-019", "F1-GSR-DAY-020"}, + {"F2-GMS-A-1001", "F2-GMS-A-1051", "F1-GSR-DAY-018", "F1-GSR-DAY-021", "F1-GSR-DAY-022"}, + {"F2-GMS-A-1101", "F2-GMS-A-1151", "F1-GSR-DAY-020", "F1-GSR-DAY-023", "F1-GSR-DAY-024"}, + {"F2-GMS-A-1201", "F2-GMS-A-1251", "F1-GSR-DAY-022", "F1-GSR-DAY-025", "F1-GSR-DAY-026"}, + {"F2-GMS-A-1301", "F2-GMS-A-1351", "F1-GSR-DAY-024", "F1-GSR-DAY-027", "F1-GSR-DAY-028"}, + {"F2-GMS-A-1401", "F2-GMS-A-1451", "F1-GSR-DAY-026", "F1-GSR-DAY-029", "F1-GSR-DAY-030"}, + {"F2-GMS-A-1501", "F2-GMS-A-1551", "F1-GSR-DAY-028", "F1-GSR-DAY-031", "F1-GSR-DAY-032"}, + {"F2-GMS-A-1601", "F2-GMS-A-1651", "F1-GSR-DAY-030", "F1-GSR-DAY-033", "F1-GSR-DAY-034"}, + {"F2-GMS-A-1701", "F2-GMS-A-1751", "F1-GSR-DAY-032", "F1-GSR-DAY-035", "F1-GSR-DAY-036"}, + {"F2-GMS-A-1801", "F2-GMS-A-1851", "F1-GSR-DAY-034", "F1-GSR-DAY-037", "F1-GSR-DAY-038"}, + {"F2-GMS-A-1901", "F2-GMS-A-1951", "F1-GSR-DAY-036", "F1-GSR-DAY-039", "F1-GSR-DAY-040"}, + {"F3-GMS-A-2001", "F3-GMS-A-2051", "F1-GSR-DAY-038", "F1-GSR-DAY-041", "F1-GSR-DAY-042"}, + {"F3-GMS-A-2101", "F3-GMS-A-2151", "F1-GSR-DAY-040", "F1-GSR-DAY-043", "F1-GSR-DAY-044"}, + {"F3-GMS-A-2201", "F3-GMS-A-2251", "F1-GSR-DAY-042", "F1-GSR-DAY-045", "F1-GSR-DAY-046"}, + {"F3-GMS-A-2301", "F3-GMS-A-2351", "F1-GSR-DAY-044", "F1-GSR-DAY-047", "F1-GSR-DAY-048"}, + {"F3-GMS-A-2401", "F3-GMS-A-2451", "F1-GSR-DAY-046", "F1-GSR-DAY-049", "F1-GSR-DAY-050"}, + {"F3-GMS-A-2501", "F3-GMS-A-2551", "F1-GSR-DAY-048", "F1-GSR-DAY-051", "F1-GSR-DAY-052"}, + {"F3-GMS-A-2601", "F3-GMS-A-2651", "F1-GSR-DAY-050", "F1-GSR-DAY-053", "F1-GSR-DAY-054"}, + {"F3-GMS-A-2701", "F3-GMS-A-2751", "F1-GSR-DAY-052", "F1-GSR-DAY-055", "F1-GSR-DAY-056"}, + {"F3-GMS-A-2801", "F3-GMS-A-2851", "F1-GSR-DAY-054", "F1-GSR-DAY-057", "F1-GSR-DAY-058"}, + {"F3-GMS-A-2901", "F3-GMS-A-2951", "F1-GSR-DAY-056", "F1-GSR-DAY-059", "F1-GSR-DAY-060"}, + {"F1-GMS-C-0001", "F1-GMS-C-0051", "F1-GSR-DAY-058", "F1-GSR-DAY-061", "F1-GSR-DAY-062"}, + {"F1-GMS-C-0101", "F1-GMS-C-0151", "F1-GSR-DAY-060", "F1-GSR-DAY-063", "F1-GSR-DAY-064"}, + {"F1-GMS-C-0201", "F1-GMS-C-0251", "F1-GSR-DAY-062", "F1-GSR-DAY-065", "F1-GSR-DAY-066"}, + {"F1-GMS-C-0301", "F1-GMS-C-0351", "F1-GSR-DAY-064", "F1-GSR-DAY-067", "F1-GSR-DAY-068"}, + {"F1-GMS-C-0401", "F1-GMS-C-0451", "F1-GSR-DAY-066", "F1-GSR-DAY-069", "F1-GSR-DAY-070"}, + {"F1-GMS-C-0501", "F1-GMS-C-0551", "F1-GSR-DAY-068", "F1-GSR-DAY-071", "F1-GSR-DAY-072"}, + {"F1-GMS-C-0601", "F1-GMS-C-0651", "F1-GSR-DAY-070", "F1-GSR-DAY-073", "F1-GSR-DAY-074"}, + {"F1-GMS-C-0701", "F1-GMS-C-0751", "F1-GSR-DAY-072", "F1-GSR-DAY-075", "F1-GSR-DAY-076"}, + {"F1-GMS-C-0801", "F1-GMS-C-0851", "F1-GSR-DAY-074", "F1-GSR-DAY-077", "F1-GSR-DAY-078"}, + {"F1-GMS-C-0901", "F1-GMS-C-0951", "F1-GSR-DAY-076", "F1-GSR-DAY-079", "F1-GSR-DAY-080"}, + {"F1-GMS-B-0001", "F1-GMS-B-0051", "F1-GSR-DAY-078", "F1-GSR-DAY-081", "F1-GSR-DAY-082"}, + {"F1-GMS-B-0101", "F1-GMS-B-0151", "F1-GSR-DAY-080", "F1-GSR-DAY-083", "F1-GSR-DAY-084"}, + {"F1-GMS-B-0201", "F1-GMS-B-0251", "F1-GSR-DAY-082", "F1-GSR-DAY-085", "F1-GSR-DAY-086"}, + {"F1-GMS-B-0301", "F1-GMS-B-0351", "F1-GSR-DAY-084", "F1-GSR-DAY-087", "F1-GSR-DAY-088"}, + {"F1-GMS-B-0401", "F1-GMS-B-0451", "F1-GSR-DAY-086", "F1-GSR-DAY-089", "F1-GSR-DAY-090"}, + {"F1-GMS-B-0501", "F1-GMS-B-0551", "F1-GSR-DAY-088", "F1-GSR-DAY-091", "F1-GSR-DAY-092"}, + {"F1-GMS-B-0601", "F1-GMS-B-0651", "F1-GSR-DAY-090", "F1-GSR-DAY-093", "F1-GSR-DAY-094"}, + {"F1-GMS-B-0701", "F1-GMS-B-0751", "F1-GSR-DAY-092", "F1-GSR-DAY-095", "F1-GSR-DAY-096"}, + {"F1-GMS-B-0801", "F1-GMS-B-0851", "F1-GSR-DAY-094", "F1-GSR-DAY-097", "F1-GSR-DAY-098"}, + {"F1-GMS-B-0901", "F1-GMS-B-0951", "F1-GSR-DAY-096", "F1-GSR-DAY-099", "F1-GSR-DAY-100"}, + {"F2-GMS-A-1001", "F2-GMS-A-1051", "F1-GSR-DAY-098", "F2-GSR-DAY-001", "F2-GSR-DAY-002"}, + {"F2-GMS-A-1101", "F2-GMS-A-1151", "F2-GSR-DAY-000", "F2-GSR-DAY-003", "F2-GSR-DAY-004"}, + {"F2-GMS-A-1201", "F2-GMS-A-1251", "F2-GSR-DAY-002", "F2-GSR-DAY-005", "F2-GSR-DAY-006"}, + {"F2-GMS-A-1301", "F2-GMS-A-1351", "F2-GSR-DAY-004", "F2-GSR-DAY-007", "F2-GSR-DAY-008"}, + {"F2-GMS-A-1401", "F2-GMS-A-1451", "F2-GSR-DAY-006", "F2-GSR-DAY-009", "F2-GSR-DAY-010"}, + {"F2-GMS-A-1501", "F2-GMS-A-1551", "F2-GSR-DAY-008", "F2-GSR-DAY-011", "F2-GSR-DAY-012"}, + {"F2-GMS-A-1601", "F2-GMS-A-1651", "F2-GSR-DAY-010", "F2-GSR-DAY-013", "F2-GSR-DAY-014"}, + {"F2-GMS-A-1701", "F2-GMS-A-1751", "F2-GSR-DAY-012", "F2-GSR-DAY-015", "F2-GSR-DAY-016"}, + {"F2-GMS-A-1801", "F2-GMS-A-1851", "F2-GSR-DAY-014", "F2-GSR-DAY-017", "F2-GSR-DAY-018"}, + {"F2-GMS-A-1901", "F2-GMS-A-1951", "F2-GSR-DAY-016", "F2-GSR-DAY-019", "F2-GSR-DAY-020"}, + {"F3-GMS-A-2001", "F3-GMS-A-2051", "F2-GSR-DAY-018", "F2-GSR-DAY-021", "F2-GSR-DAY-022"}, + {"F3-GMS-A-2101", "F3-GMS-A-2151", "F2-GSR-DAY-020", "F2-GSR-DAY-023", "F2-GSR-DAY-024"}, + {"F3-GMS-A-2201", "F3-GMS-A-2251", "F2-GSR-DAY-022", "F2-GSR-DAY-025", "F2-GSR-DAY-026"}, + {"F3-GMS-A-2301", "F3-GMS-A-2351", "F2-GSR-DAY-024", "F2-GSR-DAY-027", "F2-GSR-DAY-028"}, + {"F3-GMS-A-2401", "F3-GMS-A-2451", "F2-GSR-DAY-026", "F2-GSR-DAY-029", "F2-GSR-DAY-030"}, + {"F3-GMS-A-2501", "F3-GMS-A-2551", "F2-GSR-DAY-028", "F2-GSR-DAY-031", "F2-GSR-DAY-032"}, + {"F3-GMS-A-2601", "F3-GMS-A-2651", "F2-GSR-DAY-030", "F2-GSR-DAY-033", "F2-GSR-DAY-034"}, + {"F3-GMS-A-2701", "F3-GMS-A-2751", "F2-GSR-DAY-032", "F2-GSR-DAY-035", "F2-GSR-DAY-036"}, + {"F3-GMS-A-2801", "F3-GMS-A-2851", "F2-GSR-DAY-034", "F2-GSR-DAY-037", "F2-GSR-DAY-038"}, + {"F3-GMS-A-2901", "F3-GMS-A-2951", "F2-GSR-DAY-036", "F2-GSR-DAY-039", "F2-GSR-DAY-040"}, + {"F2-GMS-C-1001", "F2-GMS-C-1051", "F2-GSR-DAY-038", "F2-GSR-DAY-041", "F2-GSR-DAY-042"}, + {"F2-GMS-C-1101", "F2-GMS-C-1151", "F2-GSR-DAY-040", "F2-GSR-DAY-043", "F2-GSR-DAY-044"}, + {"F2-GMS-C-1201", "F2-GMS-C-1251", "F2-GSR-DAY-042", "F2-GSR-DAY-045", "F2-GSR-DAY-046"}, + {"F2-GMS-C-1301", "F2-GMS-C-1351", "F2-GSR-DAY-044", "F2-GSR-DAY-047", "F2-GSR-DAY-048"}, + {"F2-GMS-C-1401", "F2-GMS-C-1451", "F2-GSR-DAY-046", "F2-GSR-DAY-049", "F2-GSR-DAY-050"}, + {"F2-GMS-C-1501", "F2-GMS-C-1551", "F2-GSR-DAY-048", "F2-GSR-DAY-051", "F2-GSR-DAY-052"}, + {"F2-GMS-C-1601", "F2-GMS-C-1651", "F2-GSR-DAY-050", "F2-GSR-DAY-053", "F2-GSR-DAY-054"}, + {"F2-GMS-C-1701", "F2-GMS-C-1751", "F2-GSR-DAY-052", "F2-GSR-DAY-055", "F2-GSR-DAY-056"}, + {"F2-GMS-C-1801", "F2-GMS-C-1851", "F2-GSR-DAY-054", "F2-GSR-DAY-057", "F2-GSR-DAY-058"}, + {"F2-GMS-C-1901", "F2-GMS-C-1951", "F2-GSR-DAY-056", "F2-GSR-DAY-059", "F2-GSR-DAY-060"}, + {"F1-GMS-B-0001", "F1-GMS-B-0051", "F2-GSR-DAY-058", "F2-GSR-DAY-061", "F2-GSR-DAY-062"}, + {"F1-GMS-B-0101", "F1-GMS-B-0151", "F2-GSR-DAY-060", "F2-GSR-DAY-063", "F2-GSR-DAY-064"}, + {"F1-GMS-B-0201", "F1-GMS-B-0251", "F2-GSR-DAY-062", "F2-GSR-DAY-065", "F2-GSR-DAY-066"}, + {"F1-GMS-B-0301", "F1-GMS-B-0351", "F2-GSR-DAY-064", "F2-GSR-DAY-067", "F2-GSR-DAY-068"}, + {"F1-GMS-B-0401", "F1-GMS-B-0451", "F2-GSR-DAY-066", "F2-GSR-DAY-069", "F2-GSR-DAY-070"}, + {"F1-GMS-B-0501", "F1-GMS-B-0551", "F2-GSR-DAY-068", "F2-GSR-DAY-071", "F2-GSR-DAY-072"}, + {"F1-GMS-B-0601", "F1-GMS-B-0651", "F2-GSR-DAY-070", "F2-GSR-DAY-073", "F2-GSR-DAY-074"}, + {"F1-GMS-B-0701", "F1-GMS-B-0751", "F2-GSR-DAY-072", "F2-GSR-DAY-075", "F2-GSR-DAY-076"}, + {"F1-GMS-B-0801", "F1-GMS-B-0851", "F2-GSR-DAY-074", "F2-GSR-DAY-077", "F2-GSR-DAY-078"}, + {"F1-GMS-B-0901", "F1-GMS-B-0951", "F2-GSR-DAY-076", "F2-GSR-DAY-079", "F2-GSR-DAY-080"}, + {"F2-GMS-B-1001", "F2-GMS-B-1051", "F2-GSR-DAY-078", "F2-GSR-DAY-081", "F2-GSR-DAY-082"}, + {"F2-GMS-B-1101", "F2-GMS-B-1151", "F2-GSR-DAY-080", "F2-GSR-DAY-083", "F2-GSR-DAY-084"}, + {"F2-GMS-B-1201", "F2-GMS-B-1251", "F2-GSR-DAY-082", "F2-GSR-DAY-085", "F2-GSR-DAY-086"}, + {"F2-GMS-B-1301", "F2-GMS-B-1351", "F2-GSR-DAY-084", "F2-GSR-DAY-087", "F2-GSR-DAY-088"}, + {"F2-GMS-B-1401", "F2-GMS-B-1451", "F2-GSR-DAY-086", "F2-GSR-DAY-089", "F2-GSR-DAY-090"}, + {"F2-GMS-B-1501", "F2-GMS-B-1551", "F2-GSR-DAY-088", "F2-GSR-DAY-091", "F2-GSR-DAY-092"}, + {"F2-GMS-B-1601", "F2-GMS-B-1651", "F2-GSR-DAY-090", "F2-GSR-DAY-093", "F2-GSR-DAY-094"}, + {"F2-GMS-B-1701", "F2-GMS-B-1751", "F2-GSR-DAY-092", "F2-GSR-DAY-095", "F2-GSR-DAY-096"}, + {"F2-GMS-B-1801", "F2-GMS-B-1851", "F2-GSR-DAY-094", "F2-GSR-DAY-097", "F2-GSR-DAY-098"}, + {"F2-GMS-B-1901", "F2-GMS-B-1951", "F2-GSR-DAY-096", "F2-GSR-DAY-099", "F2-GSR-DAY-100"}, + {"F3-GMS-A-2001", "F3-GMS-A-2051", "F2-GSR-DAY-100", "F3-GSR-DAY-005", "F3-GSR-DAY-006"}, + {"F3-GMS-A-2101", "F3-GMS-A-2151", "F3-GSR-DAY-004", "F3-GSR-DAY-007", "F3-GSR-DAY-008"}, + {"F3-GMS-A-2201", "F3-GMS-A-2251", "F3-GSR-DAY-006", "F3-GSR-DAY-009", "F3-GSR-DAY-010"}, + {"F3-GMS-A-2301", "F3-GMS-A-2351", "F3-GSR-DAY-008", "F3-GSR-DAY-011", "F3-GSR-DAY-012"}, + {"F3-GMS-A-2401", "F3-GMS-A-2451", "F3-GSR-DAY-010", "F3-GSR-DAY-013", "F3-GSR-DAY-014"}, + {"F3-GMS-A-2501", "F3-GMS-A-2551", "F3-GSR-DAY-012", "F3-GSR-DAY-015", "F3-GSR-DAY-016"}, + {"F3-GMS-A-2601", "F3-GMS-A-2651", "F3-GSR-DAY-014", "F3-GSR-DAY-017", "F3-GSR-DAY-018"}, + {"F3-GMS-A-2701", "F3-GMS-A-2751", "F3-GSR-DAY-016", "F3-GSR-DAY-019", "F3-GSR-DAY-020"}, + {"F3-GMS-A-2801", "F3-GMS-A-2851", "F3-GSR-DAY-018", "F3-GSR-DAY-021", "F3-GSR-DAY-022"}, + {"F3-GMS-A-2901", "F3-GMS-A-2951", "F3-GSR-DAY-020", "F3-GSR-DAY-023", "F3-GSR-DAY-024"}, + {"F3-GMS-C-2001", "F3-GMS-C-2051", "F3-GMS-C-2101", "F3-GSR-DAY-022", "F3-GSR-DAY-025", "F3-GSR-DAY-026"}, + {"F3-GMS-C-2151", "F3-GMS-C-2201", "F3-GMS-C-2251", "F3-GSR-DAY-024", "F3-GSR-DAY-027", "F3-GSR-DAY-028"}, + {"F3-GMS-C-2301", "F3-GMS-C-2351", "F3-GSR-DAY-026", "F3-GSR-DAY-029", "F3-GSR-DAY-030"}, + {"F3-GMS-C-2401", "F3-GMS-C-2451", "F3-GSR-DAY-028", "F3-GSR-DAY-031", "F3-GSR-DAY-032"}, + {"F3-GMS-C-2501", "F3-GMS-C-2551", "F3-GSR-DAY-030", "F3-GSR-DAY-033", "F3-GSR-DAY-034"}, + {"F3-GMS-C-2601", "F3-GMS-C-2651", "F3-GSR-DAY-032", "F3-GSR-DAY-035", "F3-GSR-DAY-036"}, + {"F3-GMS-C-2701", "F3-GMS-C-2751", "F3-GSR-DAY-034", "F3-GSR-DAY-037", "F3-GSR-DAY-038"}, + {"F3-GMS-C-2801", "F3-GMS-C-2851", "F3-GSR-DAY-036", "F3-GSR-DAY-039", "F3-GSR-DAY-040"}, + {"F3-GMS-C-2901", "F3-GMS-C-2951", "F3-GSR-DAY-038", "F3-GSR-DAY-041", "F3-GSR-DAY-042"}, + {"F1-GMS-B-0001", "F1-GMS-B-0051", "F3-GSR-DAY-040", "F3-GSR-DAY-043", "F3-GSR-DAY-044"}, + {"F1-GMS-B-0101", "F1-GMS-B-0151", "F3-GSR-DAY-042", "F3-GSR-DAY-045", "F3-GSR-DAY-046"}, + {"F1-GMS-B-0201", "F1-GMS-B-0251", "F3-GSR-DAY-044", "F3-GSR-DAY-047", "F3-GSR-DAY-048"}, + {"F1-GMS-B-0301", "F1-GMS-B-0351", "F3-GSR-DAY-046", "F3-GSR-DAY-049", "F3-GSR-DAY-050"}, + {"F1-GMS-B-0401", "F1-GMS-B-0451", "F3-GSR-DAY-048", "F3-GSR-DAY-051", "F3-GSR-DAY-052"}, + {"F1-GMS-B-0501", "F1-GMS-B-0551", "F3-GSR-DAY-050", "F3-GSR-DAY-053", "F3-GSR-DAY-054"}, + {"F1-GMS-B-0601", "F1-GMS-B-0651", "F3-GSR-DAY-052", "F3-GSR-DAY-055", "F3-GSR-DAY-056"}, + {"F1-GMS-B-0701", "F1-GMS-B-0751", "F3-GSR-DAY-054", "F3-GSR-DAY-057", "F3-GSR-DAY-058"}, + {"F1-GMS-B-0801", "F1-GMS-B-0851", "F3-GSR-DAY-056", "F3-GSR-DAY-059", "F3-GSR-DAY-060"}, + {"F1-GMS-B-0901", "F1-GMS-B-0951", "F3-GSR-DAY-058", "F3-GSR-DAY-061", "F3-GSR-DAY-062"}, + {"F2-GMS-B-1001", "F2-GMS-B-1051", "F3-GSR-DAY-060", "F3-GSR-DAY-063", "F3-GSR-DAY-064"}, + {"F2-GMS-B-1101", "F2-GMS-B-1151", "F3-GSR-DAY-062", "F3-GSR-DAY-065", "F3-GSR-DAY-066"}, + {"F2-GMS-B-1201", "F2-GMS-B-1251", "F3-GSR-DAY-064", "F3-GSR-DAY-067", "F3-GSR-DAY-068"}, + {"F2-GMS-B-1301", "F2-GMS-B-1351", "F3-GSR-DAY-066", "F3-GSR-DAY-069", "F3-GSR-DAY-070"}, + {"F2-GMS-B-1401", "F2-GMS-B-1451", "F3-GSR-DAY-068", "F3-GSR-DAY-071", "F3-GSR-DAY-072"}, + {"F2-GMS-B-1501", "F2-GMS-B-1551", "F3-GSR-DAY-070", "F3-GSR-DAY-073", "F3-GSR-DAY-074"}, + {"F2-GMS-B-1601", "F2-GMS-B-1651", "F3-GSR-DAY-072", "F3-GSR-DAY-075", "F3-GSR-DAY-076"}, + {"F2-GMS-B-1701", "F2-GMS-B-1751", "F3-GSR-DAY-074", "F3-GSR-DAY-077", "F3-GSR-DAY-078"}, + {"F2-GMS-B-1801", "F2-GMS-B-1851", "F3-GSR-DAY-076", "F3-GSR-DAY-079", "F3-GSR-DAY-080"}, + {"F2-GMS-B-1901", "F2-GMS-B-1951", "F3-GSR-DAY-078", "F3-GSR-DAY-081", "F3-GSR-DAY-082"}, + {"F3-GMS-B-2001", "F3-GMS-B-2051", "F3-GSR-DAY-080", "F3-GSR-DAY-083", "F3-GSR-DAY-084"}, + {"F3-GMS-B-2101", "F3-GMS-B-2151", "F3-GSR-DAY-082", "F3-GSR-DAY-085", "F3-GSR-DAY-086"}, + {"F3-GMS-B-2201", "F3-GMS-B-2251", "F3-GSR-DAY-084", "F3-GSR-DAY-087", "F3-GSR-DAY-088"}, + {"F3-GMS-B-2301", "F3-GMS-B-2351", "F3-GSR-DAY-086", "F3-GSR-DAY-089", "F3-GSR-DAY-090"}, + {"F3-GMS-B-2401", "F3-GMS-B-2451", "F3-GSR-DAY-088", "F3-GSR-DAY-091", "F3-GSR-DAY-092"}, + {"F3-GMS-B-2501", "F3-GMS-B-2551", "F3-GSR-DAY-090", "F3-GSR-DAY-093", "F3-GSR-DAY-094"}, + {"F3-GMS-B-2601", "F3-GMS-B-2651", "F3-GSR-DAY-092", "F3-GSR-DAY-095", "F3-GSR-DAY-096"}, + {"F3-GMS-B-2701", "F3-GMS-B-2751", "F3-GSR-DAY-094", "F3-GSR-DAY-097", "F3-GSR-DAY-098"}, + {"F3-GMS-B-2801", "F3-GMS-B-2851", "F3-GSR-DAY-096", "F3-GSR-DAY-099", "F3-GSR-DAY-100"}, + {"F3-GMS-B-2901", "F3-GMS-B-2951", "F3-GSR-DAY-098", "F3-GSR-DAY-101", "F3-GSR-DAY-102"}}; + public static final String SCHEDULE_5_RELAXED = "5-Month Relaxed"; + public static final String SCHEDULE_5_RELAXED_SUMMARY = "Recommended as a refresher course on a language you may have studied before. You're still very serious about it and want to see results within a half year."; + public static final String SCHEDULE_5_RELAXED_DESCRIPTION = "This schedule is for the busy person that wants to get results within a half year or for experienced learners trying a completely different language for the first time."; + public static final String[][] SCHEDULE_5_RELAXED_STRINGS = { + {"F1­GMS­A­0001", "F1­GMS­A­0051", "F1­GSR­DAY­002", "F1­GSR­DAY­007"}, + {"F1­GMS­A­0101", "F1­GMS­A­0151", "F1­GSR­DAY­004", "F1­GSR­DAY­009"}, + {"F1­GMS­A­0201", "F1­GMS­A­0251", "F1­GSR­DAY­006", "F1­GSR­DAY­011"}, + {"F1­GMS­A­0301", "F1­GMS­A­0351", "F1­GSR­DAY­008", "F1­GSR­DAY­013"}, + {"F1­GMS­A­0401", "F1­GMS­A­0451", "F1­GSR­DAY­010", "F1­GSR­DAY­015"}, + {"F1­GMS­A­0501", "F1­GMS­A­0551", "F1­GSR­DAY­012", "F1­GSR­DAY­017"}, + {"F1­GMS­A­0601", "F1­GMS­A­0651", "F1­GSR­DAY­014", "F1­GSR­DAY­019"}, + {"F1­GMS­A­0701", "F1­GMS­A­0751", "F1­GSR­DAY­016", "F1­GSR­DAY­021"}, + {"F1­GMS­A­0801", "F1­GMS­A­0851", "F1­GSR­DAY­018", "F1­GSR­DAY­023"}, + {"F1­GMS­A­0901", "F1­GMS­A­0951", "F1­GSR­DAY­020", "F1­GSR­DAY­025"}, + {"F2­GMS­A­1001", "F2­GMS­A­1051", "F1­GSR­DAY­022", "F1­GSR­DAY­027"}, + {"F2­GMS­A­1101", "F2­GMS­A­1151", "F1­GSR­DAY­024", "F1­GSR­DAY­029"}, + {"F2­GMS­A­1201", "F2­GMS­A­1251", "F1­GSR­DAY­026", "F1­GSR­DAY­031"}, + {"F2­GMS­A­1301", "F2­GMS­A­1351", "F1­GSR­DAY­028", "F1­GSR­DAY­033"}, + {"F2­GMS­A­1401", "F2­GMS­A­1451", "F1­GSR­DAY­030", "F1­GSR­DAY­035"}, + {"F2­GMS­A­1501", "F2­GMS­A­1551", "F1­GSR­DAY­032", "F1­GSR­DAY­037"}, + {"F2­GMS­A­1601", "F2­GMS­A­1651", "F1­GSR­DAY­034", "F1­GSR­DAY­039"}, + {"F2­GMS­A­1701", "F2­GMS­A­1751", "F1­GSR­DAY­036", "F1­GSR­DAY­041"}, + {"F2­GMS­A­1801", "F2­GMS­A­1851", "F1­GSR­DAY­038", "F1­GSR­DAY­043"}, + {"F2­GMS­A­1901", "F2­GMS­A­1951", "F1­GSR­DAY­040", "F1­GSR­DAY­045"}, + {"F3­GMS­A­2001", "F3­GMS­A­2051", "F1­GSR­DAY­042", "F1­GSR­DAY­047"}, + {"F3­GMS­A­2101", "F3­GMS­A­2151", "F1­GSR­DAY­044", "F1­GSR­DAY­049"}, + {"F3­GMS­A­2201", "F3­GMS­A­2251", "F1­GSR­DAY­046", "F1­GSR­DAY­051"}, + {"F3­GMS­A­2301", "F3­GMS­A­2351", "F1­GSR­DAY­048", "F1­GSR­DAY­053"}, + {"F3­GMS­A­2401", "F3­GMS­A­2451", "F1­GSR­DAY­050", "F1­GSR­DAY­055"}, + {"F3­GMS­A­2501", "F3­GMS­A­2551", "F1­GSR­DAY­052", "F1­GSR­DAY­057"}, + {"F3­GMS­A­2601", "F3­GMS­A­2651", "F1­GSR­DAY­054", "F1­GSR­DAY­059"}, + {"F3­GMS­A­2701", "F3­GMS­A­2751", "F1­GSR­DAY­056", "F1­GSR­DAY­061"}, + {"F3­GMS­A­2801", "F3­GMS­A­2851", "F1­GSR­DAY­058", "F1­GSR­DAY­063"}, + {"F3­GMS­A­2901", "F3­GMS­A­2951", "F1­GSR­DAY­060", "F1­GSR­DAY­065"}, + {"F1­GMS­C­0001", "F1­GMS­C­0051", "F1­GSR­DAY­062", "F1­GSR­DAY­067"}, + {"F1­GMS­B­0001", "F1­GSR­DAY­064", "F1­GSR­DAY­069"}, + {"F1­GMS­B­0051", "F1­GSR­DAY­066", "F1­GSR­DAY­071"}, + {"F1­GMS­C­0101", "F1­GMS­C­0151", "F1­GSR­DAY­068", "F1­GSR­DAY­073"}, + {"F1­GMS­B­0101", "F1­GSR­DAY­070", "F1­GSR­DAY­075"}, + {"F1­GMS­B­0151", "F1­GSR­DAY­072", "F1­GSR­DAY­077"}, + {"F1­GMS­C­0201", "F1­GMS­C­0251", "F1­GSR­DAY­074", "F1­GSR­DAY­079"}, + {"F1­GMS­B­0201", "F1­GSR­DAY­076", "F1­GSR­DAY­081"}, + {"F1­GMS­B­0251", "F1­GSR­DAY­078", "F1­GSR­DAY­083"}, + {"F1­GMS­C­0301", "F1­GMS­C­0351", "F1­GSR­DAY­080", "F1­GSR­DAY­085"}, + {"F1­GMS­B­0301", "F1­GSR­DAY­082", "F1­GSR­DAY­087"}, + {"F1­GMS­B­0351", "F1­GSR­DAY­084", "F1­GSR­DAY­089"}, + {"F1­GMS­C­0401", "F1­GMS­C­0451", "F1­GSR­DAY­086", "F1­GSR­DAY­091"}, + {"F1­GMS­B­0401", "F1­GSR­DAY­088", "F1­GSR­DAY­093"}, + {"F1­GMS­B­0451", "F1­GSR­DAY­090", "F1­GSR­DAY­095"}, + {"F1­GMS­C­0501", "F1­GMS­C­0551", "F1­GSR­DAY­092", "F1­GSR­DAY­097"}, + {"F1­GMS­B­0501", "F1­GSR­DAY­094", "F1­GSR­DAY­099"}, + {"F1­GMS­B­0551", "F1­GSR­DAY­096", "F2­GSR­DAY­001"}, + {"F1­GMS­C­0601", "F1­GMS­C­0651", "F1­GSR­DAY­098", "F2­GSR­DAY­003"}, + {"F1­GMS­B­0601", "F1­GSR­DAY­100", "F2­GSR­DAY­005"}, + {"F1­GMS­B­0651", "F2­GSR­DAY­002", "F2­GSR­DAY­007"}, + {"F1­GMS­C­0701", "F1­GMS­C­0751", "F2­GSR­DAY­004", "F2­GSR­DAY­009"}, + {"F1­GMS­B­0701", "F2­GSR­DAY­006", "F2­GSR­DAY­011"}, + {"F1­GMS­B­0751", "F2­GSR­DAY­008", "F2­GSR­DAY­013"}, + {"F1­GMS­C­0801", "F1­GMS­C­0851", "F2­GSR­DAY­010", "F2­GSR­DAY­015"}, + {"F1­GMS­B­0801", "F2­GSR­DAY­012", "F2­GSR­DAY­017"}, + {"F1­GMS­B­0851", "F2­GSR­DAY­014", "F2­GSR­DAY­019"}, + {"F1­GMS­C­0901", "F1­GMS­C­0951", "F2­GSR­DAY­016", "F2­GSR­DAY­021"}, + {"F1­GMS­B­0901", "F2­GSR­DAY­018", "F2­GSR­DAY­023"}, + {"F1­GMS­B­0951", "F2­GSR­DAY­020", "F2­GSR­DAY­025"}, + {"F2­GMS­C­1001", "F2­GMS­C­1051", "F2­GSR­DAY­022", "F2­GSR­DAY­027"}, + {"F2­GMS­B­1001", "F2­GSR­DAY­024", "F2­GSR­DAY­029"}, + {"F2­GMS­B­1051", "F2­GSR­DAY­026", "F2­GSR­DAY­031"}, + {"F2­GMS­C­1101", "F2­GMS­C­1151", "F2­GSR­DAY­028", "F2­GSR­DAY­033"}, + {"F2­GMS­B­1101", "F2­GSR­DAY­030", "F2­GSR­DAY­035"}, + {"F2­GMS­B­1151", "F2­GSR­DAY­032", "F2­GSR­DAY­037"}, + {"F2­GMS­C­1201", "F2­GMS­C­1251", "F2­GSR­DAY­034", "F2­GSR­DAY­039"}, + {"F2­GMS­B­1201", "F2­GSR­DAY­036", "F2­GSR­DAY­041"}, + {"F2­GMS­B­1251", "F2­GSR­DAY­038", "F2­GSR­DAY­043"}, + {"F2­GMS­C­1301", "F2­GMS­C­1351", "F2­GSR­DAY­040", "F2­GSR­DAY­045"}, + {"F2­GMS­B­1301", "F2­GSR­DAY­042", "F2­GSR­DAY­047"}, + {"F2­GMS­B­1351", "F2­GSR­DAY­044", "F2­GSR­DAY­049"}, + {"F2­GMS­C­1401", "F2­GMS­C­1451", "F2­GSR­DAY­046", "F2­GSR­DAY­051"}, + {"F2­GMS­B­1401", "F2­GSR­DAY­048", "F2­GSR­DAY­053"}, + {"F2­GMS­B­1451", "F2­GSR­DAY­050", "F2­GSR­DAY­055"}, + {"F2­GMS­A­1501", "F2­GMS­A­1551", "F2­GSR­DAY­052", "F2­GSR­DAY­057"}, + {"F2­GMS­A­1601", "F2­GMS­A­1651", "F2­GSR­DAY­054", "F2­GSR­DAY­059"}, + {"F2­GMS­A­1701", "F2­GMS­A­1751", "F2­GSR­DAY­056", "F2­GSR­DAY­061"}, + {"F2­GMS­A­1801", "F2­GMS­A­1851", "F2­GSR­DAY­058", "F2­GSR­DAY­063"}, + {"F2­GMS­A­1901", "F2­GMS­A­1951", "F2­GSR­DAY­060", "F2­GSR­DAY­065"}, + {"F3­GMS­A­2001", "F3­GMS­A­2051", "F2­GSR­DAY­062", "F2­GSR­DAY­067"}, + {"F3­GMS­A­2101", "F3­GMS­A­2151", "F2­GSR­DAY­064", "F2­GSR­DAY­069"}, + {"F3­GMS­A­2201", "F3­GMS­A­2251", "F2­GSR­DAY­066", "F2­GSR­DAY­071"}, + {"F3­GMS­A­2301", "F3­GMS­A­2351", "F2­GSR­DAY­068", "F2­GSR­DAY­073"}, + {"F3­GMS­A­2401", "F3­GMS­A­2451", "F2­GSR­DAY­070", "F2­GSR­DAY­075"}, + {"F3­GMS­A­2501", "F3­GMS­A­2551", "F2­GSR­DAY­072", "F2­GSR­DAY­077"}, + {"F3­GMS­A­2601", "F3­GMS­A­2651", "F2­GSR­DAY­074", "F2­GSR­DAY­079"}, + {"F3­GMS­A­2701", "F3­GMS­A­2751", "F2­GSR­DAY­076", "F2­GSR­DAY­081"}, + {"F3­GMS­A­2801", "F3­GMS­A­2851", "F2­GSR­DAY­078", "F2­GSR­DAY­083"}, + {"F3­GMS­A­2901", "F3­GMS­A­2951", "F2­GSR­DAY­080", "F2­GSR­DAY­085"}, + {"F2­GMS­C­1501", "F2­GMS­C­1551", "F2­GSR­DAY­082", "F2­GSR­DAY­087"}, + {"F2­GMS­B­1501", "F2­GSR­DAY­084", "F2­GSR­DAY­089"}, + {"F2­GMS­B­1551", "F2­GSR­DAY­086", "F2­GSR­DAY­091"}, + {"F2­GMS­C­1601", "F2­GMS­C­1651", "F2­GSR­DAY­088", "F2­GSR­DAY­093"}, + {"F2­GMS­B­1601", "F2­GSR­DAY­090", "F2­GSR­DAY­095"}, + {"F2­GMS­B­1651", "F2­GSR­DAY­092", "F2­GSR­DAY­097"}, + {"F2­GMS­C­1701", "F2­GMS­C­1751", "F2­GSR­DAY­094", "F2­GSR­DAY­099"}, + {"F2­GMS­B­1701", "F2­GSR­DAY­096", "F3­GSR­DAY­001"}, + {"F2­GMS­B­1751", "F2­GSR­DAY­098", "F3­GSR­DAY­003"}, + {"F2­GMS­C­1801", "F2­GMS­C­1851", "F2­GSR­DAY­100", "F3­GSR­DAY­005"}, + {"F2­GMS­B­1801", "F3­GSR­DAY­002", "F3­GSR­DAY­007"}, + {"F2­GMS­B­1851", "F3­GSR­DAY­004", "F3­GSR­DAY­009"}, + {"F2­GMS­C­1901", "F2­GMS­C­1951", "F3­GSR­DAY­006", "F3­GSR­DAY­011"}, + {"F2­GMS­B­1901", "F3­GSR­DAY­008", "F3­GSR­DAY­013"}, + {"F2­GMS­B­1951", "F3­GSR­DAY­010", "F3­GSR­DAY­015"}, + {"F3­GMS­A­2001", "F3­GMS­A­2051", "F3­GSR­DAY­012", "F3­GSR­DAY­017"}, + {"F3­GMS­A­2101", "F3­GMS­A­2151", "F3­GSR­DAY­014", "F3­GSR­DAY­019"}, + {"F3­GMS­A­2201", "F3­GMS­A­2251", "F3­GSR­DAY­016", "F3­GSR­DAY­021"}, + {"F3­GMS­A­2301", "F3­GMS­A­2351", "F3­GSR­DAY­018", "F3­GSR­DAY­023"}, + {"F3­GMS­A­2401", "F3­GMS­A­2451", "F3­GSR­DAY­020", "F3­GSR­DAY­025"}, + {"F3­GMS­A­2501", "F3­GMS­A­2551", "F3­GSR­DAY­022", "F3­GSR­DAY­027"}, + {"F3­GMS­A­2601", "F3­GMS­A­2651", "F3­GSR­DAY­024", "F3­GSR­DAY­029"}, + {"F3­GMS­A­2701", "F3­GMS­A­2751", "F3­GSR­DAY­026", "F3­GSR­DAY­031"}, + {"F3­GMS­A­2801", "F3­GMS­A­2851", "F3­GSR­DAY­028", "F3­GSR­DAY­033"}, + {"F3­GMS­A­2901", "F3­GMS­A­2951", "F3­GSR­DAY­030", "F3­GSR­DAY­035"}, + {"F3­GMS­C­2001", "F3­GMS­C­2051", "F3­GSR­DAY­032", "F3­GSR­DAY­037"}, + {"F3­GMS­B­2001", "F3­GSR­DAY­034", "F3­GSR­DAY­039"}, + {"F3­GMS­B­2051", "F3­GSR­DAY­036", "F3­GSR­DAY­041"}, + {"F3­GMS­C­2101", "F3­GMS­C­2151", "F3­GSR­DAY­038", "F3­GSR­DAY­043"}, + {"F3­GMS­B­2101", "F3­GSR­DAY­040", "F3­GSR­DAY­045"}, + {"F3­GMS­B­2151", "F3­GSR­DAY­042", "F3­GSR­DAY­047"}, + {"F3­GMS­C­2201", "F3­GMS­C­2251", "F3­GSR­DAY­044", "F3­GSR­DAY­049"}, + {"F3­GMS­B­2201", "F3­GSR­DAY­046", "F3­GSR­DAY­051"}, + {"F3­GMS­B­2251", "F3­GSR­DAY­048", "F3­GSR­DAY­053"}, + {"F3­GMS­C­2301", "F3­GMS­C­2351", "F3­GSR­DAY­050", "F3­GSR­DAY­055"}, + {"F3­GMS­B­2301", "F3­GSR­DAY­052", "F3­GSR­DAY­057"}, + {"F3­GMS­B­2351", "F3­GSR­DAY­054", "F3­GSR­DAY­059"}, + {"F3­GMS­C­2401", "F3­GMS­C­2451", "F3­GSR­DAY­056", "F3­GSR­DAY­061"}, + {"F3­GMS­B­2401", "F3­GSR­DAY­058", "F3­GSR­DAY­063"}, + {"F3­GMS­B­2451", "F3­GSR­DAY­060", "F3­GSR­DAY­065"}, + {"F3­GMS­C­2501", "F3­GMS­C­2551", "F3­GSR­DAY­062", "F3­GSR­DAY­067"}, + {"F3­GMS­B­2501", "F3­GSR­DAY­064", "F3­GSR­DAY­069"}, + {"F3­GMS­B­2551", "F3­GSR­DAY­066", "F3­GSR­DAY­071"}, + {"F3­GMS­C­2601", "F3­GMS­C­2651", "F3­GSR­DAY­068", "F3­GSR­DAY­073"}, + {"F3­GMS­B­2601", "F3­GSR­DAY­070", "F3­GSR­DAY­075"}, + {"F3­GMS­B­2651", "F3­GSR­DAY­072", "F3­GSR­DAY­077"}, + {"F3­GMS­C­2701", "F3­GSR­DAY­074", "F3­GSR­DAY­079"}, + {"F3­GMS­B­2701", "F3­GSR­DAY­076", "F3­GSR­DAY­081"}, + {"F3­GMS­C­2751", "F3­GMS­C­2801", "F3­GSR­DAY­078", "F3­GSR­DAY­083"}, + {"F3­GMS­B­2751", "F3­GSR­DAY­080", "F3­GSR­DAY­085"}, + {"F3­GMS­C­2851", "F3­GSR­DAY­082", "F3­GSR­DAY­087"}, + {"F3­GMS­B­2801", "F3­GSR­DAY­084", "F3­GSR­DAY­089"}, + {"F3­GMS­B­2851", "F3­GSR­DAY­086", "F3­GSR­DAY­091"}, + {"F3­GMS­C­2901", "F3­GSR­DAY­088", "F3­GSR­DAY­093"}, + {"F3­GMS­B­2901", "F3­GSR­DAY­090", "F3­GSR­DAY­095"}, + {"F3­GMS­B­2951", "F3­GSR­DAY­092", "F3­GSR­DAY­097"}, + {"F3­GSR­DAY­094", "F3­GSR­DAY­100"} + }; + public static final String SCHEDULE_4_INTENSIVE = "4-Month Intensive"; + public static final String SCHEDULE_4_INTENSIVE_SUMMARY = "Best for languages you've studied before and one where you understand how it works but you plateaued and never were able to make much progress towards fluency. It's perfect for the fall semester: starting Aug 28, you'll be done by New Year's, and what a great way to celebrate."; + public static final String SCHEDULE_4_INTENSIVE_DESCRIPTION = "It’s best to use this schedule if you’re coming back to review a language you’ve studied before."; + public static final String[][] SCHEDULE_4_INTENSIVE_STRINGS = {{"F1­GMS­A­0001", "F1­GMS­A­0051", "F1­GSR­DAY­005", "F1­GSR­DAY­010"}, + {"F1­GMS­A­0101", "F1­GMS­A­0151", "F1­GSR­DAY­011", "F1­GSR­DAY­012"}, + {"F1­GMS­A­0201", "F1­GMS­A­0251", "F1­GSR­DAY­013", "F1­GSR­DAY­014"}, + {"F1­GMS­A­0301", "F1­GMS­A­0351", "F1­GSR­DAY­015", "F1­GSR­DAY­016"}, + {"F1­GMS­A­0401", "F1­GMS­A­0451", "F1­GSR­DAY­017", "F1­GSR­DAY­018"}, + {"F1­GMS­A­0001", "F1­GMS­A­0051", "F1­GSR­DAY­019", "F1­GSR­DAY­020"}, + {"F1­GMS­A­0101", "F1­GMS­A­0151", "F1­GSR­DAY­021", "F1­GSR­DAY­022"}, + {"F1­GMS­A­0201", "F1­GMS­A­0251", "F1­GSR­DAY­023", "F1­GSR­DAY­024"}, + {"F1­GMS­A­0301", "F1­GMS­A­0351", "F1­GSR­DAY­025", "F1­GSR­DAY­026"}, + {"F1­GMS­A­0401", "F1­GMS­A­0451", "F1­GSR­DAY­027", "F1­GSR­DAY­028"}, + {"F1­GMS­C­0001", "F1­GMS­C­0051", "F1­GSR­DAY­029", "F1­GSR­DAY­030"}, + {"F1­GMS­C­0101", "F1­GMS­C­0151", "F1­GSR­DAY­031", "F1­GSR­DAY­032"}, + {"F1­GMS­C­0201", "F1­GMS­C­0251", "F1­GSR­DAY­033", "F1­GSR­DAY­034"}, + {"F1­GMS­C­0301", "F1­GMS­C­0351", "F1­GSR­DAY­035", "F1­GSR­DAY­036"}, + {"F1­GMS­C­0401", "F1­GMS­C­0451", "F1­GSR­DAY­037", "F1­GSR­DAY­038"}, + {"F1­GMS­B­0001", "F1­GMS­B­0051", "F1­GSR­DAY­039", "F1­GSR­DAY­040"}, + {"F1­GMS­B­0101", "F1­GMS­B­0151", "F1­GSR­DAY­041", "F1­GSR­DAY­042"}, + {"F1­GMS­B­0201", "F1­GMS­B­0251", "F1­GSR­DAY­043", "F1­GSR­DAY­044"}, + {"F1­GMS­B­0301", "F1­GMS­B­0351", "F1­GSR­DAY­045", "F1­GSR­DAY­046"}, + {"F1­GMS­B­0401", "F1­GMS­B­0451", "F1­GSR­DAY­047", "F1­GSR­DAY­048"}, + {"F1­GSR­DAY­049", "F1­GSR­DAY­050"}, + {"F1­GMS­A­0501", "F1­GMS­A­0551", "F1­GSR­DAY­055", "F1­GSR­DAY­060"}, + {"F1­GMS­A­0601", "F1­GMS­A­0651", "F1­GSR­DAY­061", "F1­GSR­DAY­062"}, + {"F1­GMS­A­0701", "F1­GMS­A­0751", "F1­GSR­DAY­063", "F1­GSR­DAY­064"}, + {"F1­GMS­A­0801", "F1­GMS­A­0851", "F1­GSR­DAY­065", "F1­GSR­DAY­066"}, + {"F1­GMS­A­0901", "F1­GMS­A­0951", "F1­GSR­DAY­067", "F1­GSR­DAY­068"}, + {"F1­GMS­A­0501", "F1­GMS­A­0551", "F1­GSR­DAY­069", "F1­GSR­DAY­070"}, + {"F1­GMS­A­0601", "F1­GMS­A­0651", "F1­GSR­DAY­071", "F1­GSR­DAY­072"}, + {"F1­GMS­A­0701", "F1­GMS­A­0751", "F1­GSR­DAY­073", "F1­GSR­DAY­074"}, + {"F1­GMS­A­0801", "F1­GMS­A­0851", "F1­GSR­DAY­075", "F1­GSR­DAY­076"}, + {"F1­GMS­A­0901", "F1­GMS­A­0951", "F1­GSR­DAY­077", "F1­GSR­DAY­078"}, + {"F1­GMS­C­0501", "F1­GMS­C­0551", "F1­GSR­DAY­079", "F1­GSR­DAY­080"}, + {"F1­GMS­C­0601", "F1­GMS­C­0651", "F1­GSR­DAY­081", "F1­GSR­DAY­082"}, + {"F1­GMS­C­0701", "F1­GMS­C­0751", "F1­GSR­DAY­083", "F1­GSR­DAY­084"}, + {"F1­GMS­C­0801", "F1­GMS­C­0851", "F1­GSR­DAY­085", "F1­GSR­DAY­086"}, + {"F1­GMS­C­0901", "F1­GMS­C­0951", "F1­GSR­DAY­087", "F1­GSR­DAY­088"}, + {"F1­GMS­B­0501", "F1­GMS­B­0551", "F1­GSR­DAY­089", "F1­GSR­DAY­090"}, + {"F1­GMS­B­0601", "F1­GMS­B­0651", "F1­GSR­DAY­091", "F1­GSR­DAY­092"}, + {"F1­GMS­B­0701", "F1­GMS­B­0751", "F1­GSR­DAY­093", "F1­GSR­DAY­094"}, + {"F1­GMS­B­0801", "F1­GMS­B­0851", "F1­GSR­DAY­095", "F1­GSR­DAY­096"}, + {"F1­GMS­B­0901", "F1­GMS­B­0951", "F1­GSR­DAY­097", "F1­GSR­DAY­098"}, + {"F1­GSR­DAY­099", "F1­GSR­DAY­100"}, + {"F2­GMS­A­1001", "F2­GMS­A­1051", "F2­GSR­DAY­005", "F2­GSR­DAY­010"}, + {"F2­GMS­A­1101", "F2­GMS­A­1151", "F2­GSR­DAY­011", "F2­GSR­DAY­012"}, + {"F2­GMS­A­1201", "F2­GMS­A­1251", "F2­GSR­DAY­013", "F2­GSR­DAY­014"}, + {"F2­GMS­A­1301", "F2­GMS­A­1351", "F2­GSR­DAY­015", "F2­GSR­DAY­016"}, + {"F2­GMS­A­1401", "F2­GMS­A­1451", "F2­GSR­DAY­017", "F2­GSR­DAY­018"}, + {"F2­GMS­A­1001", "F2­GMS­A­1051", "F2­GSR­DAY­019", "F2­GSR­DAY­020"}, + {"F2­GMS­A­1101", "F2­GMS­A­1151", "F2­GSR­DAY­021", "F2­GSR­DAY­022"}, + {"F2­GMS­A­1201", "F2­GMS­A­1251", "F2­GSR­DAY­023", "F2­GSR­DAY­024"}, + {"F2­GMS­A­1301", "F2­GMS­A­1351", "F2­GSR­DAY­025", "F2­GSR­DAY­026"}, + {"F2­GMS­A­1401", "F2­GMS­A­1451", "F2­GSR­DAY­027", "F2­GSR­DAY­028"}, + {"F2­GMS­C­1001", "F2­GMS­C­1051", "F2­GSR­DAY­029", "F2­GSR­DAY­030"}, + {"F2­GMS­C­1101", "F2­GMS­C­1151", "F2­GSR­DAY­031", "F2­GSR­DAY­032"}, + {"F2­GMS­C­1201", "F2­GMS­C­1251", "F2­GSR­DAY­033", "F2­GSR­DAY­034"}, + {"F2­GMS­C­1301", "F2­GMS­C­1351", "F2­GSR­DAY­035", "F2­GSR­DAY­036"}, + {"F2­GMS­C­1401", "F2­GMS­C­1451", "F2­GSR­DAY­037", "F2­GSR­DAY­038"}, + {"F2­GMS­B­1001", "F2­GMS­B­1051", "F2­GSR­DAY­039", "F2­GSR­DAY­040"}, + {"F2­GMS­B­1101", "F2­GMS­B­1151", "F2­GSR­DAY­041", "F2­GSR­DAY­042"}, + {"F2­GMS­B­1201", "F2­GMS­B­1251", "F2­GSR­DAY­043", "F2­GSR­DAY­044"}, + {"F2­GMS­B­1301", "F2­GMS­B­1351", "F2­GSR­DAY­045", "F2­GSR­DAY­046"}, + {"F2­GMS­B­1401", "F2­GMS­B­1451", "F2­GSR­DAY­047", "F2­GSR­DAY­048"}, + {"F2­GSR­DAY­049", "F2­GSR­DAY­050"}, + {"F2­GMS­A­1501", "F2­GMS­A­1551", "F2­GSR­DAY­055", "F2­GSR­DAY­060"}, + {"F2­GMS­A­1601", "F2­GMS­A­1651", "F2­GSR­DAY­061", "F2­GSR­DAY­062"}, + {"F2­GMS­A­1701", "F2­GMS­A­1751", "F2­GSR­DAY­063", "F2­GSR­DAY­064"}, + {"F2­GMS­A­1801", "F2­GMS­A­1851", "F2­GSR­DAY­065", "F2­GSR­DAY­066"}, + {"F2­GMS­A­1901", "F2­GMS­A­1951", "F2­GSR­DAY­067", "F2­GSR­DAY­068"}, + {"F2­GMS­A­1501", "F2­GMS­A­1551", "F2­GSR­DAY­069", "F2­GSR­DAY­070"}, + {"F2­GMS­A­1601", "F2­GMS­A­1651", "F2­GSR­DAY­071", "F2­GSR­DAY­072"}, + {"F2­GMS­A­1701", "F2­GMS­A­1751", "F2­GSR­DAY­073", "F2­GSR­DAY­074"}, + {"F2­GMS­A­1801", "F2­GMS­A­1851", "F2­GSR­DAY­075", "F2­GSR­DAY­076"}, + {"F2­GMS­A­1901", "F2­GMS­A­1951", "F2­GSR­DAY­077", "F2­GSR­DAY­078"}, + {"F2­GMS­C­1501", "F2­GMS­C­1551", "F2­GSR­DAY­079", "F2­GSR­DAY­080"}, + {"F2­GMS­C­1601", "F2­GMS­C­1651", "F2­GSR­DAY­081", "F2­GSR­DAY­082"}, + {"F2­GMS­C­1701", "F2­GMS­C­1751", "F2­GSR­DAY­083", "F2­GSR­DAY­084"}, + {"F2­GMS­C­1801", "F2­GMS­C­1851", "F2­GSR­DAY­085", "F2­GSR­DAY­086"}, + {"F2­GMS­C­1901", "F2­GMS­C­1951", "F2­GSR­DAY­087", "F2­GSR­DAY­088"}, + {"F2­GMS­B­1501", "F2­GMS­B­1551", "F2­GSR­DAY­089", "F2­GSR­DAY­090"}, + {"F2­GMS­B­1601", "F2­GMS­B­1651", "F2­GSR­DAY­091", "F2­GSR­DAY­092"}, + {"F2­GMS­B­1701", "F2­GMS­B­1751", "F2­GSR­DAY­093", "F2­GSR­DAY­094"}, + {"F2­GMS­B­1801", "F2­GMS­B­1851", "F2­GSR­DAY­095", "F2­GSR­DAY­096"}, + {"F2­GMS­B­1901", "F2­GMS­B­1951", "F2­GSR­DAY­097", "F2­GSR­DAY­098"}, + {"F2­GSR­DAY­099", "F2­GSR­DAY­100"}, + {"F3­GMS­A­2001", "F3­GMS­A­2051", "F3­GSR­DAY­005", "F3­GSR­DAY­010"}, + {"F3­GMS­A­2101", "F3­GMS­A­2151", "F3­GSR­DAY­011", "F3­GSR­DAY­012"}, + {"F3­GMS­A­2201", "F3­GMS­A­2251", "F3­GSR­DAY­013", "F3­GSR­DAY­014"}, + {"F3­GMS­A­2301", "F3­GMS­A­2351", "F3­GSR­DAY­015", "F3­GSR­DAY­016"}, + {"F3­GMS­A­2401", "F3­GMS­A­2451", "F3­GSR­DAY­017", "F3­GSR­DAY­018"}, + {"F3­GMS­A­2001", "F3­GMS­A­2051", "F3­GSR­DAY­019", "F3­GSR­DAY­020"}, + {"F3­GMS­A­2101", "F3­GMS­A­2151", "F3­GSR­DAY­021", "F3­GSR­DAY­022"}, + {"F3­GMS­A­2201", "F3­GMS­A­2251", "F3­GSR­DAY­023", "F3­GSR­DAY­024"}, + {"F3­GMS­A­2301", "F3­GMS­A­2351", "F3­GSR­DAY­025", "F3­GSR­DAY­026"}, + {"F3­GMS­A­2401", "F3­GMS­A­2451", "F3­GSR­DAY­027", "F3­GSR­DAY­028"}, + {"F3­GMS­C­2001", "F3­GMS­C­2051", "F3­GSR­DAY­029", "F3­GSR­DAY­030"}, + {"F3­GMS­C­2101", "F3­GMS­C­2151", "F3­GSR­DAY­031", "F3­GSR­DAY­032"}, + {"F3­GMS­C­2201", "F3­GMS­C­2251", "F3­GSR­DAY­033", "F3­GSR­DAY­034"}, + {"F3­GMS­C­2301", "F3­GMS­C­2351", "F3­GSR­DAY­035", "F3­GSR­DAY­036"}, + {"F3­GMS­C­2401", "F3­GMS­C­2451", "F3­GSR­DAY­037", "F3­GSR­DAY­038"}, + {"F3­GMS­B­2001", "F3­GMS­B­2051", "F3­GSR­DAY­039", "F3­GSR­DAY­040"}, + {"F3­GMS­B­2101", "F3­GMS­B­2151", "F3­GSR­DAY­041", "F3­GSR­DAY­042"}, + {"F3­GMS­B­2201", "F3­GMS­B­2251", "F3­GSR­DAY­043", "F3­GSR­DAY­044"}, + {"F3­GMS­B­2301", "F3­GMS­B­2351", "F3­GSR­DAY­045", "F3­GSR­DAY­046"}, + {"F3­GMS­B­2401", "F3­GMS­B­2451", "F3­GSR­DAY­047", "F3­GSR­DAY­048"}, + {"F3­GSR­DAY­049", "F3­GSR­DAY­050"}, + {"F3­GMS­A­2501", "F3­GMS­A­2551", "F3­GSR­DAY­055", "F3­GSR­DAY­060"}, + {"F3­GMS­A­2601", "F3­GMS­A­2651", "F3­GSR­DAY­061", "F3­GSR­DAY­062"}, + {"F3­GMS­A­2701", "F3­GMS­A­2751", "F3­GSR­DAY­063", "F3­GSR­DAY­064"}, + {"F3­GMS­A­2801", "F3­GMS­A­2851", "F3­GSR­DAY­065", "F3­GSR­DAY­066"}, + {"F3­GMS­A­2901", "F3­GMS­A­2951", "F3­GSR­DAY­067", "F3­GSR­DAY­068"}, + {"F3­GMS­A­2501", "F3­GMS­A­2551", "F3­GSR­DAY­069", "F3­GSR­DAY­070"}, + {"F3­GMS­A­2601", "F3­GMS­A­2651", "F3­GSR­DAY­071", "F3­GSR­DAY­072"}, + {"F3­GMS­A­2701", "F3­GMS­A­2751", "F3­GSR­DAY­073", "F3­GSR­DAY­074"}, + {"F3­GMS­A­2801", "F3­GMS­A­2851", "F3­GSR­DAY­075", "F3­GSR­DAY­076"}, + {"F3­GMS­A­2901", "F3­GMS­A­2951", "F3­GSR­DAY­077", "F3­GSR­DAY­078"}, + {"F3­GMS­B­2501", "F3­GMS­B­2551", "F3­GSR­DAY­079", "F3­GSR­DAY­080"}, + {"F3­GMS­B­2601", "F3­GMS­B­2651", "F3­GSR­DAY­081", "F3­GSR­DAY­082"}, + {"F3­GMS­B­2701", "F3­GMS­B­2751", "F3­GSR­DAY­083", "F3­GSR­DAY­084"}, + {"F3­GMS­B­2801", "F3­GMS­B­2851", "F3­GSR­DAY­085", "F3­GSR­DAY­086"}, + {"F3­GMS­B­2901", "F3­GMS­B­2951", "F3­GSR­DAY­087", "F3­GSR­DAY­088"}, + {"F3­GMS­B­2501", "F3­GMS­B­2551", "F3­GSR­DAY­089", "F3­GSR­DAY­090"}, + {"F3­GMS­B­2601", "F3­GMS­B­2651", "F3­GSR­DAY­091", "F3­GSR­DAY­092"}, + {"F3­GMS­B­2701", "F3­GMS­B­2751", "F3­GSR­DAY­093", "F3­GSR­DAY­094"}, + {"F3­GMS­B­2801", "F3­GMS­B­2851", "F3­GSR­DAY­095", "F3­GSR­DAY­096"}, + {"F3­GMS­B­2901", "F3­GMS­B­2951", "F3­GSR­DAY­097", "F3­GSR­DAY­098"}, + {"F3­GSR­DAY­099", "F3­GSR­DAY­100"}}; + + public static final String SCHEDULE_3_INTENSIVE = "3-Month Intensive"; + public static final String SCHEDULE_3_INTENSIVE_SUMMARY = "This is the polyglot's refresher course, perhaps one of many languages that a polyglot knows, but needs to bring the speaking skills up a level for an upcoming event or trip abroad. This schedule is best for those who have accomplished A-level basics and want to break into B-level speaking skills."; + public static final String SCHEDULE_3_INTENSIVE_DESCRIPTION = "It’s best to use this schedule if you’re coming back to revive a language that you haven’t used in a while."; + public static final String[][] SCHEDULE_3_INTENSIVE_STRINGS = {{"F1­GMS­A­0001", "F1­GMS­A­0051", "F1­GSR­DAY­003", "F1­GSR­DAY­013"}, + {"F1­GMS­A­0101", "F1­GMS­A­0151", "F1­GSR­DAY­006", "F1­GSR­DAY­016"}, + {"F1­GMS­A­0201", "F1­GMS­A­0251", "F1­GSR­DAY­009", "F1­GSR­DAY­019"}, + {"F1­GMS­A­0301", "F1­GMS­A­0351", "F1­GSR­DAY­012", "F1­GSR­DAY­022"}, + {"F1­GMS­A­0401", "F1­GMS­A­0451", "F1­GSR­DAY­015", "F1­GSR­DAY­025"}, + {"F1­GMS­C­0001", "F1­GMS­C­0051", "F1­GSR­DAY­018", "F1­GSR­DAY­028"}, + {"F1­GMS­C­0101", "F1­GMS­C­0151", "F1­GSR­DAY­021", "F1­GSR­DAY­031"}, + {"F1­GMS­C­0201", "F1­GMS­C­0251", "F1­GSR­DAY­026", "F1­GSR­DAY­036"}, + {"F1­GMS­C­0301", "F1­GMS­C­0351", "F1­GSR­DAY­029", "F1­GSR­DAY­039"}, + {"F1­GMS­C­0401", "F1­GMS­C­0451", "F1­GSR­DAY­032", "F1­GSR­DAY­042"}, + {"F1­GMS­B­0001", "F1­GMS­B­0051", "F1­GSR­DAY­035", "F1­GSR­DAY­045"}, + {"F1­GMS­B­0101", "F1­GMS­B­0151", "F1­GSR­DAY­038", "F1­GSR­DAY­048"}, + {"F1­GMS­B­0201", "F1­GMS­B­0251", "F1­GSR­DAY­041", "F1­GSR­DAY­051"}, + {"F1­GMS­B­0301", "F1­GMS­B­0351", "F1­GSR­DAY­044", "F1­GSR­DAY­054"}, + {"F1­GMS­B­0401", "F1­GMS­B­0451", "F1­GSR­DAY­049", "F1­GSR­DAY­059"}, + {"F1­GMS­A­0501", "F1­GMS­A­0551", "F1­GSR­DAY­052", "F1­GSR­DAY­062"}, + {"F1­GMS­A­0601", "F1­GMS­A­0651", "F1­GSR­DAY­055", "F1­GSR­DAY­065"}, + {"F1­GMS­A­0701", "F1­GMS­A­0751", "F1­GSR­DAY­058", "F1­GSR­DAY­068"}, + {"F1­GMS­A­0801", "F1­GMS­A­0851", "F1­GSR­DAY­061", "F1­GSR­DAY­071"}, + {"F1­GMS­A­0901", "F1­GMS­A­0951", "F1­GSR­DAY­064", "F1­GSR­DAY­074"}, + {"F1­GMS­C­0501", "F1­GMS­C­0551", "F1­GSR­DAY­067", "F1­GSR­DAY­077"}, + {"F1­GMS­C­0601", "F1­GMS­C­0651", "F1­GSR­DAY­072", "F1­GSR­DAY­082"}, + {"F1­GMS­C­0701", "F1­GMS­C­0751", "F1­GSR­DAY­075", "F1­GSR­DAY­085"}, + {"F1­GMS­C­0801", "F1­GMS­C­0851", "F1­GSR­DAY­078", "F1­GSR­DAY­088"}, + {"F1­GMS­C­0901", "F1­GMS­C­0951", "F1­GSR­DAY­081", "F1­GSR­DAY­091"}, + {"F1­GMS­B­0501", "F1­GMS­B­0551", "F1­GSR­DAY­084", "F1­GSR­DAY­094"}, + {"F1­GMS­B­0601", "F1­GMS­B­0651", "F1­GSR­DAY­087", "F1­GSR­DAY­097"}, + {"F1­GMS­B­0701", "F1­GMS­B­0751", "F1­GSR­DAY­090", "F1­GSR­DAY­100"}, + {"F1­GMS­B­0801", "F1­GMS­B­0851", "F1­GSR­DAY­095", "F2­GSR­DAY­005"}, + {"F1­GMS­B­0901", "F1­GMS­B­0951", "F1­GSR­DAY­098", "F2­GSR­DAY­008"}, + {"F2­GMS­A­1001", "F2­GMS­A­1051", "F2­GSR­DAY­001", "F2­GSR­DAY­011"}, + {"F2­GMS­A­1101", "F2­GMS­A­1151", "F2­GSR­DAY­004", "F2­GSR­DAY­014"}, + {"F2­GMS­A­1201", "F2­GMS­A­1251", "F2­GSR­DAY­007", "F2­GSR­DAY­017"}, + {"F2­GMS­A­1301", "F2­GMS­A­1351", "F2­GSR­DAY­010", "F2­GSR­DAY­020"}, + {"F2­GMS­A­1401", "F2­GMS­A­1451", "F2­GSR­DAY­013", "F2­GSR­DAY­023"}, + {"F2­GMS­C­1001", "F2­GMS­C­1051", "F2­GSR­DAY­018", "F2­GSR­DAY­028"}, + {"F2­GMS­C­1101", "F2­GMS­C­1151", "F2­GSR­DAY­021", "F2­GSR­DAY­031"}, + {"F2­GMS­C­1201", "F2­GMS­C­1251", "F2­GSR­DAY­024", "F2­GSR­DAY­034"}, + {"F2­GMS­C­1301", "F2­GMS­C­1351", "F2­GSR­DAY­027", "F2­GSR­DAY­037"}, + {"F2­GMS­C­1401", "F2­GMS­C­1451", "F2­GSR­DAY­030", "F2­GSR­DAY­040"}, + {"F2­GMS­B­1001", "F2­GMS­B­1051", "F2­GSR­DAY­033", "F2­GSR­DAY­043"}, + {"F2­GMS­B­1101", "F2­GMS­B­151", "F2­GSR­DAY­036", "F2­GSR­DAY­046"}, + {"F2­GMS­B­1201", "F2­GMS­B­1251", "F2­GSR­DAY­041", "F2­GSR­DAY­051"}, + {"F2­GMS­B­1301", "F2­GMS­B­1351", "F2­GSR­DAY­044", "F2­GSR­DAY­054"}, + {"F2­GMS­B­1401", "F2­GMS­B­1451", "F2­GSR­DAY­047", "F2­GSR­DAY­057"}, + {"F2­GMS­A­1501", "F2­GMS­A­1551", "F2­GSR­DAY­050", "F2­GSR­DAY­060"}, + {"F2­GMS­A­1601", "F2­GMS­A­1651", "F2­GSR­DAY­053", "F2­GSR­DAY­063"}, + {"F2­GMS­A­1701", "F2­GMS­A­1751", "F2­GSR­DAY­056", "F2­GSR­DAY­066"}, + {"F2­GMS­A­1801", "F2­GMS­A­1851", "F2­GSR­DAY­059", "F2­GSR­DAY­069"}, + {"F2­GMS­A­1901", "F2­GMS­A­1951", "F2­GSR­DAY­064", "F2­GSR­DAY­074"}, + {"F2­GMS­C­1501", "F2­GMS­C­1551", "F2­GSR­DAY­067", "F2­GSR­DAY­077"}, + {"F2­GMS­C­1601", "F2­GMS­C­1651", "F2­GSR­DAY­070", "F2­GSR­DAY­080"}, + {"F2­GMS­C­1701", "F2­GMS­C­1751", "F2­GSR­DAY­073", "F2­GSR­DAY­083"}, + {"F2­GMS­C­1801", "F2­GMS­C­1851", "F2­GSR­DAY­076", "F2­GSR­DAY­086"}, + {"F2­GMS­C­1901", "F2­GMS­C­1951", "F2­GSR­DAY­079", "F2­GSR­DAY­089"}, + {"F2­GMS­B­1501", "F2­GMS­B­1551", "F2­GSR­DAY­082", "F2­GSR­DAY­092"}, + {"F2­GMS­B­1601", "F2­GMS­B­1651", "F2­GSR­DAY­087", "F2­GSR­DAY­097"}, + {"F2­GMS­B­1701", "F2­GMS­B­1751", "F2­GSR­DAY­090", "F2­GSR­DAY­100"}, + {"F2­GMS­B­1801", "F2­GMS­B­1851", "F2­GSR­DAY­093", "F3­GSR­DAY­003"}, + {"F2­GMS­B­1901", "F2­GMS­B­1951", "F2­GSR­DAY­096", "F3­GSR­DAY­006"}, + {"F3­GMS­A­2001", "F3­GMS­A­2051", "F2­GSR­DAY­099", "F3­GSR­DAY­009"}, + {"F3­GMS­A­2101", "F3­GMS­A­2151", "F3­GSR­DAY­002", "F3­GSR­DAY­012"}, + {"F3­GMS­A­2201", "F3­GMS­A­2251", "F3­GSR­DAY­005", "F3­GSR­DAY­015"}, + {"F3­GMS­A­2301", "F3­GMS­A­2351", "F3­GSR­DAY­010", "F3­GSR­DAY­020"}, + {"F3­GMS­A­2401", "F3­GMS­A­2451", "F3­GSR­DAY­013", "F3­GSR­DAY­023"}, + {"F3­GMS­C­2001", "F3­GMS­C­2051", "F3­GSR­DAY­016", "F3­GSR­DAY­026"}, + {"F3­GMS­C­2101", "F3­GMS­C­2151", "F3­GSR­DAY­019", "F3­GSR­DAY­029"}, + {"F3­GMS­C­2201", "F3­GMS­C­2251", "F3­GSR­DAY­022", "F3­GSR­DAY­032"}, + {"F3­GMS­C­2301", "F3­GMS­C­2351", "F3­GSR­DAY­025", "F3­GSR­DAY­035"}, + {"F3­GMS­C­2401", "F3­GMS­C­2451", "F3­GSR­DAY­028", "F3­GSR­DAY­038"}, + {"F3­GMS­B­2001", "F2­GMS­B­2051", "F3­GSR­DAY­033", "F3­GSR­DAY­043"}, + {"F3­GMS­B­2101", "F2­GMS­B­2151", "F3­GSR­DAY­036", "F2­GSR­DAY­046"}, + {"F3­GMS­B­2201", "F2­GMS­B­2251", "F3­GSR­DAY­039", "F3­GSR­DAY­049"}, + {"F3­GMS­B­2301", "F2­GMS­B­2351", "F3­GSR­DAY­042", "F3­GSR­DAY­052"}, + {"F3­GMS­B­2401", "F2­GMS­B­2451", "F3­GSR­DAY­045", "F3­GSR­DAY­055"}, + {"F3­GMS­A­2501", "F2­GMS­A­2551", "F3­GSR­DAY­048", "F3­GSR­DAY­058"}, + {"F3­GMS­A­2601", "F2­GMS­A­2651", "F3­GSR­DAY­051", "F3­GSR­DAY­061"}, + {"F3­GMS­A­2701", "F2­GMS­A­2751", "F3­GSR­DAY­056", "F3­GSR­DAY­066"}, + {"F3­GMS­A­2801", "F2­GMS­A­2851", "F3­GSR­DAY­059", "F3­GSR­DAY­069"}, + {"F3­GMS­A­2901", "F2­GMS­A­2951", "F3­GSR­DAY­062", "F3­GSR­DAY­072"}, + {"F3­GMS­C­2501", "F2­GMS­C­2551", "F3­GSR­DAY­065", "F3­GSR­DAY­075"}, + {"F3­GMS­C­2601", "F2­GMS­C­2651", "F3­GSR­DAY­068", "F3­GSR­DAY­078"}, + {"F3­GMS­C­2701", "F2­GMS­C­2751", "F3­GSR­DAY­071", "F3­GSR­DAY­081"}, + {"F3­GMS­C­2801", "F2­GMS­C­2851", "F3­GSR­DAY­074", "F3­GSR­DAY­084"}, + {"F3­GMS­C­2901", "F2­GMS­C­2951", "F3­GSR­DAY­079", "F3­GSR­DAY­089"}, + {"F3­GMS­B­2501", "F2­GMS­B­2551", "F3­GSR­DAY­082", "F3­GSR­DAY­092"}, + {"F3­GMS­B­2601", "F2­GMS­B­2651", "F3­GSR­DAY­085", "F3­GSR­DAY­095"}, + {"F3­GMS­B­2701", "F2­GMS­B­2751", "F3­GSR­DAY­088", "F3­GSR­DAY­098"}, + {"F3­GMS­B­2801", "F2­GMS­B­2851", "F3­GSR­DAY­091", "F3­GSR­DAY­101"}, + {"F3­GMS­B­2901", "F2­GMS­B­2951", "F3­GSR­DAY­094", "F3­GSR­DAY­104"}, + {"F3-GSR-DAY-097", "F3-GSR-DAY-100"}}; + + public static final String SCHEDULE_2_INTENSIVE = "2-Month Intensive"; + public static final String SCHEDULE_2_INTENSIVE_SUMMARY = "This is just a quicker, more intense schedule of the last one where you want to bring some A-level skills up to B-level skills. This schedule works better where you already know the vocabulary and don't need as many reps."; + public static final String SCHEDULE_2_INTENSIVE_DESCRIPTION = "An 8-Week refresher course. You can use this for new languages if they are neighboring or otherwise very similar languages where you can actively deduce the meanings of all the vocabulary (Catalan to Spanish, Portuguese to Spanish, Polish to Czech, Cantonese to Mandarin). For some directions, this tactic may not work (like Mandarin to Cantonese), but this also largely depends on you and your previous exposure to the language."; + public static final String[][] SCHEDULE_2_INTENSIVE_STRINGS = {{"F1­GMS­C­0001", "F1­GMS­C­0051", "F1­GMS­C­0101", "F1­GSR­DAY­003", "F1­GSR­DAY­009"}, + {"F1­GMS­C­0151", "F1­GMS­C­0201", "F1­GMS­C­0251", "F1­GSR­DAY­006", "F1­GSR­DAY­012"}, + {"F1­GMS­C­0301", "F1­GMS­C­0351", "F1­GMS­C­0401", "F1­GSR­DAY­015", "F1­GSR­DAY­021"}, + {"F1­GMS­B­0001", "F1­GMS­B­0051", "F1­GSR­DAY­018", "F1­GSR­DAY­024"}, + {"F1­GMS­B­0101", "F1­GMS­B­0151", "F1­GSR­DAY­027", "F1­GSR­DAY­033"}, + {"F1­GMS­B­0201", "F1­GMS­B­0251", "F1­GSR­DAY­030", "F1­GSR­DAY­036"}, + {"F1­GMS­C­0451", "F1­GMS­C­0501", "F1­GMS­C­0551", "F1­GSR­DAY­039", "F1­GSR­DAY­045"}, + {"F1­GMS­C­0601", "F1­GMS­C­0651", "F1­GMS­C­0701", "F1­GSR­DAY­042", "F1­GSR­DAY­048"}, + {"F1­GMS­C­0751", "F1­GMS­C­0801", "F1­GMS­C­0851", "F1­GSR­DAY­050", "F1­GSR­DAY­056"}, + {"F1­GMS­B­0301", "F1­GMS­B­0351", "F1­GSR­DAY­052", "F1­GSR­DAY­058"}, + {"F1­GMS­B­0401", "F1­GMS­B­0451", "F1­GSR­DAY­054", "F1­GSR­DAY­060"}, + {"F1­GMS­B­0501", "F1­GMS­B­0551", "F1­GSR­DAY­063", "F1­GSR­DAY­069"}, + {"F1­GMS­C­0901", "F1­GMS­C­0951", "F2­GMS­C­1001", "F1­GSR­DAY­066", "F1­GSR­DAY­072"}, + {"F2­GMS­C­1051", "F2­GMS­C­1101", "F2­GMS­C­1151", "F1­GSR­DAY­075", "F1­GSR­DAY­081"}, + {"F2­GMS­C­1201", "F2­GMS­C­1251", "F2­GMS­C­1301", "F1­GSR­DAY­078", "F2­GSR­DAY­084"}, + {"F1­GMS­B­0601", "F1­GMS­B­0651", "F1­GSR­DAY­087", "F1­GSR­DAY­093"}, + {"F1­GMS­B­0701", "F1­GMS­B­0751", "F1­GSR­DAY­090", "F1­GSR­DAY­096"}, + {"F1­GMS­B­0801", "F1­GMS­B­0851", "F1­GSR­DAY­098", "F2­GSR­DAY­004"}, + {"F2­GMS­C­1351", "F2­GMS­C­1401", "F2­GMS­C­1451", "F1­GSR­DAY­100", "F2­GSR­DAY­006"}, + {"F2­GMS­C­1501", "F2­GMS­C­1551", "F2­GMS­C­1601", "F2­GSR­DAY­002", "F2­GSR­DAY­008"}, + {"F2­GMS­C­1601", "F2­GMS­C­1701", "F2­GMS­C­1751", "F2­GSR­DAY­011", "F2­GSR­DAY­017"}, + {"F1­GMS­B­0901", "F1­GMS­B­0951", "F2­GSR­DAY­014", "F2­GSR­DAY­020"}, + {"F2­GMS­B­1001", "F2­GMS­B­1051", "F2­GSR­DAY­023", "F2­GSR­DAY­029"}, + {"F2­GMS­B­1101", "F2­GMS­B­1151", "F2­GSR­DAY­026", "F2­GSR­DAY­032"}, + {"F2­GMS­C­1801", "F2­GMS­C­1851", "F2­GMS­C­1901", "F2­GSR­DAY­035", "F2­GSR­DAY­041"}, + {"F2­GMS­C­1951", "F3­GMS­C­2001", "F3­GMS­C­2051", "F2­GSR­DAY­038", "F2­GSR­DAY­044"}, + {"F2­GMS­C­2101", "F2­GMS­C­2151", "F3­GMS­C­2201", "F2­GSR­DAY­046", "F2­GSR­DAY­052"}, + {"F2­GMS­B­1201", "F2­GMS­B­1251", "F2­GSR­DAY­048", "F2­GSR­DAY­054"}, + {"F2­GMS­B­1301", "F2­GMS­B­1351", "F2­GSR­DAY­050", "F2­GSR­DAY­056"}, + {"F2­GMS­B­1401", "F2­GMS­B­1451", "F2­GSR­DAY­059", "F2­GSR­DAY­065"}, + {"F3­GMS­C­2251", "F3­GMS­C­2301", "F3­GMS­C­2351", "F2­GSR­DAY­062", "F2­GSR­DAY­068"}, + {"F3­GMS­C­2401", "F3­GMS­C­2451", "F3­GMS­C­2501", "F2­GSR­DAY­071", "F2­GSR­DAY­077"}, + {"F3­GMS­C­2551", "F3­GMS­C­2601", "F3­GMS­C­2651", "F2­GSR­DAY­074", "F2­GSR­DAY­080"}, + {"F2­GMS­B­1501", "F2­GMS­B­1551", "F2­GSR­DAY­083", "F2­GSR­DAY­089"}, + {"F2­GMS­B­1601", "F2­GMS­B­1651", "F2­GSR­DAY­086", "F2­GSR­DAY­092"}, + {"F2­GMS­B­1701", "F2­GMS­B­1751", "F2­GSR­DAY­095", "F3­GSR­DAY­001"}, + {"F3­GMS­C­2701", "F3­GMS­C­2751", "F3­GMS­C­2801", "F2­GSR­DAY­098", "F3­GSR­DAY­004"}, + {"F3­GMS­C­2851", "F3­GMS­C­2901", "F3­GMS­C­2951", "F3­GSR­DAY­006", "F3­GSR­DAY­012"}, + {"F3­GMS­C­2001", "F3­GMS­C­2051", "F3­GMS­C­2101", "F3­GSR­DAY­008", "F3­GSR­DAY­014"}, + {"F2­GMS­B­1801", "F2­GMS­B­1851", "F3­GSR­DAY­010", "F3­GSR­DAY­016"}, + {"F2­GMS­B­1901", "F2­GMS­B­1951", "F3­GSR­DAY­019", "F3­GSR­DAY­025"}, + {"F3­GMS­B­2001", "F3­GMS­B­2051", "F3­GSR­DAY­022", "F3­GSR­DAY­028"}, + {"F3­GMS­C­2201", "F1­GMS­C­2251", "F3­GMS­C­2301", "F3­GMS­C­2351", "F3­GSR­DAY­031", "F3­GSR­DAY­037"}, + {"F3­GMS­C­2401", "F3­GMS­C­2451", "F3­GMS­C­2501", "F3­GMS­C­2551", "F3­GSR­DAY­034", "F3­GSR­DAY­040"}, + {"F3­GMS­C­2601", "F3­GMS­C­2651", "F3­GMS­C­2701", "F3­GMS­C­2751", "F3­GSR­DAY­043", "F3­GSR­DAY­049"}, + {"F3­GMS­B­2101", "F3­GMS­B­2151", "F3­GSR­DAY­046", "F3­GSR­DAY­052"}, + {"F3­GMS­B­2201", "F3­GMS­B­2251", "F3­GSR­DAY­054", "F3­GSR­DAY­060"}, + {"F3­GMS­B­2301", "F3­GMS­B­2351", "F3­GSR­DAY­056", "F3­GSR­DAY­062"}, + {"F3­GMS­C­2801", "F3­GMS­C­2851", "F3­GMS­C­2901", "F3­GMS­C­2951", "F3­GSR­DAY­058", "F3­GSR­DAY­064"}, + {"F3­GMS­B­2401", "F3­GMS­B­2451", "F3­GSR­DAY­067", "F3­GSR­DAY­073"}, + {"F3­GMS­B­2501", "F3­GMS­B­2551", "F3­GSR­DAY­070", "F3­GSR­DAY­076"}, + {"F3­GMS­B­2601", "F3­GMS­B­2651", "F3­GSR­DAY­079", "F3­GSR­DAY­085"}, + {"F3­GMS­B­2701", "F3­GMS­B­2751", "F3­GSR­DAY­082", "F3­GSR­DAY­088"}, + {"F3­GMS­B­2801", "F3­GMS­B­2851", "F3­GSR­DAY­091", "F3­GSR­DAY­097"}, + {"F3­GMS­B­2901", "F3­GMS­B­2951", "F3­GSR­DAY­094", "F3­GSR­DAY­100"}, + {"F3­GSR­DAY­098", "F3­GSR­DAY­104"}}; + + + public static final String SCHEDULE_6_WEEK_INTENSIVE = "6-Week Intensive"; + public static final String SCHEDULE_6_WEEK_INTENSIVE_SUMMARY = "If still lacking fluency or confidence, this push of almost 30,000 reps will give you first stage fluency and what you need to start feeling confident in the language."; + public static final String SCHEDULE_6_WEEK_INTENSIVE_DESCRIPTION = "This power user schedule will get you very close to the basic fluency threshold of 30,000 reps. It’s best to use this schedule if you’re an accomplished language learner, or you just want to boost comprehension or get a feel for a language that you don’t intend to invest a lot of time into. This schedule is also very practical for triangulation packages if you’re picking up a similar language."; + public static final String[][] SCHEDULE_6_WEEK_INTENSIVE_STRINGS = {{"F1­GMS­C­0001", "F1­GMS­C­0051", "F1­GMS­C­0101", "F1­GMS­C­0151", "F1­GMS­C­0201", "F1­GSR­DAY­003", "F1­GSR­DAY­005", "F1­GSR­DAY­007"}, + {"F1­GMS­C­0251", "F1­GMS­C­0301", "F1­GMS­C­0351", "F1­GMS­C­0401", "F1­GMS­C­0451", "F1­GSR­DAY­010", "F1­GSR­DAY­017", "F1­GSR­DAY­024"}, + {"F1­GMS­C­0501", "F1­GMS­C­0551", "F1­GMS­C­0601", "F1­GMS­C­0651", "F1­GMS­C­0701", "F1­GSR­DAY­012", "F1­GSR­DAY­019", "F1­GSR­DAY­026"}, + {"F1­GMS­C­0751", "F1­GMS­C­0801", "F1­GMS­C­0851", "F1­GMS­C­0901", "F1­GMS­C­0951", "F1­GSR­DAY­014", "F1­GSR­DAY­021", "F1­GSR­DAY­028"}, + {"F1­GMS­B­0001", "F1­GMS­B­0051", "F1­GSR­DAY­031", "F1­GSR­DAY­038", "F1­GSR­DAY­045"}, + {"F1­GMS­B­0101", "F1­GMS­B­0151", "F1­GSR­DAY­033", "F1­GSR­DAY­040", "F1­GSR­DAY­047"}, + {"F1­GMS­B­0201", "F1­GMS­B­0251", "F1­GSR­DAY­035", "F1­GSR­DAY­042", "F1­GSR­DAY­049"}, + {"F1­GMS­B­0301", "F1­GMS­B­0351", "F1­GSR­DAY­052", "F1­GSR­DAY­059", "F1­GSR­DAY­066"}, + {"F1­GMS­B­0401", "F1­GMS­B­0451", "F1­GSR­DAY­054", "F1­GSR­DAY­061", "F1­GSR­DAY­068"}, + {"F1­GMS­B­0501", "F1­GMS­B­0551", "F1­GSR­DAY­056", "F1­GSR­DAY­063", "F1­GSR­DAY­070"}, + {"F1­GMS­B­0601", "F1­GMS­B­0651", "F1­GSR­DAY­073", "F1­GSR­DAY­080", "F1­GSR­DAY­087"}, + {"F1­GMS­B­0701", "F1­GMS­B­0751", "F1­GSR­DAY­075", "F1­GSR­DAY­082", "F1­GSR­DAY­089"}, + {"F1­GMS­B­0801", "F1­GMS­B­0851", "F1­GSR­DAY­077", "F1­GSR­DAY­084", "F1­GSR­DAY­091"}, + {"F1­GMS­B­0901", "F1­GMS­B­0951", "F1­GSR­DAY­094", "F2­GSR­DAY­001", "F2­GSR­DAY­008"}, + {"F2­GMS­C­1001", "F2­GMS­C­1051", "F2­GMS­C­1101", "F2­GMS­C­1151", "F2­GMS­C­1201", "F1­GSR­DAY­096", "F2­GSR­DAY­003", "F2­GSR­DAY­010"}, + {"F2­GMS­C­1251", "F2­GMS­C­1301", "F2­GMS­C­1351", "F2­GMS­C­1401", "F2­GMS­C­1451", "F1­GSR­DAY­098", "F2­GSR­DAY­005", "F2­GSR­DAY­012"}, + {"F2­GMS­C­1501", "F2­GMS­C­1551", "F2­GMS­C­1601", "F2­GMS­C­1651", "F2­GMS­C­1701", "F2­GSR­DAY­015", "F2­GSR­DAY­022", "F2­GSR­DAY­029"}, + {"F2­GMS­C­1751", "F2­GMS­C­1801", "F2­GMS­C­1851", "F2­GMS­C­1901", "F2­GMS­C­1951", "F2­GSR­DAY­017", "F2­GSR­DAY­023", "F2­GSR­DAY­031"}, + {"F2­GMS­B­1001", "F2­GMS­B­1051", "F2­GSR­DAY­019", "F2­GSR­DAY­025", "F2­GSR­DAY­033"}, + {"F2­GMS­B­1101", "F2­GMS­B­1151", "F2­GSR­DAY­036", "F2­GSR­DAY­043", "F2­GSR­DAY­050"}, + {"F2­GMS­B­1201", "F2­GMS­B­1251", "F2­GSR­DAY­038", "F2­GSR­DAY­045", "F2­GSR­DAY­052"}, + {"F2­GMS­B­1301", "F2­GMS­B­1351", "F2­GSR­DAY­040", "F2­GSR­DAY­047", "F2­GSR­DAY­054"}, + {"F2­GMS­B­1401", "F2­GMS­B­1451", "F2­GSR­DAY­057", "F2­GSR­DAY­064", "F2­GSR­DAY­071"}, + {"F2­GMS­B­1501", "F2­GMS­B­1551", "F2­GSR­DAY­059", "F2­GSR­DAY­066", "F2­GSR­DAY­073"}, + {"F2­GMS­B­1601", "F2­GMS­B­1651", "F2­GSR­DAY­061", "F2­GSR­DAY­068", "F2­GSR­DAY­075"}, + {"F2­GMS­B­1701", "F2­GMS­B­1751", "F2­GSR­DAY­078", "F2­GSR­DAY­085", "F2­GSR­DAY­092"}, + {"F2­GMS­B­1801", "F2­GMS­B­1851", "F2­GSR­DAY­080", "F2­GSR­DAY­087", "F2­GSR­DAY­094"}, + {"F2­GMS­B­1901", "F2­GMS­B­1951", "F2­GSR­DAY­082", "F2­GSR­DAY­089", "F2­GSR­DAY­096"}, + {"F3­GMS­C­2001", "F3­GMS­C­2051", "F3­GMS­C­2101", "F3­GMS­C­2151", "F3­GMS­C­2201", "F2­GSR­DAY­099", "F3­GSR­DAY­006", "F3­GSR­DAY­013"}, + {"F3­GMS­C­2251", "F3­GMS­C­2301", "F3­GMS­C­2351", "F3­GMS­C­2401", "F3­GMS­C­2451", "F3­GSR­DAY­001", "F3­GSR­DAY­008", "F3­GSR­DAY­015"}, + {"F3­GMS­C­2501", "F3­GMS­C­2551", "F3­GMS­C­2601", "F3­GMS­C­2651", "F3­GMS­C­2701", "F3­GSR­DAY­003", "F3­GSR­DAY­010", "F3­GSR­DAY­017"}, + {"F3­GMS­C­2751", "F3­GMS­C­2801", "F3­GMS­C­2851", "F3­GMS­C­2901", "F3­GMS­C­2951", "F3­GSR­DAY­020", "F3­GSR­DAY­027", "F3­GSR­DAY­034"}, + {"F3­GMS­B­2001", "F3­GMS­B­2051", "F3­GSR­DAY­022", "F3­GSR­DAY­029", "F3­GSR­DAY­036"}, + {"F3­GMS­B­2101", "F3­GMS­B­2151", "F3­GSR­DAY­024", "F3­GSR­DAY­031", "F3­GSR­DAY­038"}, + {"F3­GMS­B­2201", "F3­GMS­B­2251", "F3­GSR­DAY­041", "F3­GSR­DAY­048", "F3­GSR­DAY­055"}, + {"F3­GMS­B­2301", "F3­GMS­B­2351", "F3­GSR­DAY­043", "F3­GSR­DAY­050", "F3­GSR­DAY­057"}, + {"F3­GMS­B­2401", "F3­GMS­B­2451", "F3­GSR­DAY­045", "F3­GSR­DAY­052", "F3­GSR­DAY­059"}, + {"F3­GMS­B­2501", "F3­GMS­B­2551", "F3­GSR­DAY­062", "F3­GSR­DAY­069", "F3­GSR­DAY­076"}, + {"F3­GMS­B­2601", "F3­GMS­B­2651", "F3­GSR­DAY­064", "F3­GSR­DAY­071", "F3­GSR­DAY­078"}, + {"F3­GMS­B­2701", "F3­GMS­B­2751", "F3­GSR­DAY­066", "F3­GSR­DAY­073", "F3­GSR­DAY­080"}, + {"F3­GMS­B­2801", "F3­GMS­B­2851", "F3­GSR­DAY­083", "F3­GSR­DAY­090", "F3­GSR­DAY­097"}, + {"F3­GMS­B­2901", "F3­GMS­B­2951", "F3­GSR­DAY­085", "F3­GSR­DAY­092", "F3­GSR­DAY­100"}}; + + public static final String SCHEDULE_4_WEEK_INTENSIVE = "4-Week Intensive"; + public static final String SCHEDULE_4_WEEK_INTENSIVE_SUMMARY = "One of our favorites to get results super fast. This is a real quick run through of a language you already know and just need to reactivate."; + public static final String SCHEDULE_4_WEEK_INTENSIVE_DESCRIPTION = "This power user schedule is best as a refresher course for a language that you haven’t used in a while or a Glossika course you previously did. This schedule is also very practical for triangulation packages if you’re picking up a similar language."; + public static final String[][] SCHEDULE_4_WEEK_INTENSIVE_STRINGS = {{"F1­GMS­A­0001", "F1­GMS­A­0051", "F1­GSR­DAY­04", "F1­GSR­DAY­014", "F1­GSR­DAY­024"}, + {"F1­GMS­A­0101", "F1­GMS­A­0151", "F1­GSR­DAY­08", "F1­GSR­DAY­018", "F1­GSR­DAY­028"}, + {"F1­GMS­A­0201", "F1­GMS­A­0251", "F1­GSR­DAY­012", "F1­GSR­DAY­022", "F1­GSR­DAY­032"}, + {"F1­GMS­A­0301", "F1­GMS­A­0351", "F2­GSR­DAY­036", "F1­GSR­DAY­046", "F1­GSR­DAY­056"}, + {"F1­GMS­A­0401", "F1­GMS­A­0451", "F1­GSR­DAY­040", "F2­GSR­DAY­050", "F2­GSR­DAY­060"}, + {"F1­GMS­A­0501", "F1­GMS­A­0551", "F1­GSR­DAY­044", "F1­GSR­DAY­054", "F2­GSR­DAY­064"}, + {"F1­GMS­A­0601", "F1­GMS­A­0651", "F1­GMS­A­0701", "F1­GMS­A­0751", "F1­GSR­DAY­068", "F1­GSR­DAY­078", "F1­GSR­DAY­088"}, + {"F1­GMS­A­0801", "F1­GMS­A­0851", "F1­GSR­DAY­072", "F1­GSR­DAY­082", "F1­GSR­DAY­092"}, + {"F1­GMS­A­0901", "F1­GMS­A­0951", "F1­GSR­DAY­076", "F1­GSR­DAY­086", "F1­GSR­DAY­096"}, + {"F2­GMS­A­1001", "F2­GMS­A­1051", "F1­GSR­DAY­100", "F2­GSR­DAY­010", "F2­GSR­DAY­020"}, + {"F2­GMS­A­1101", "F2­GMS­A­1151", "F2­GSR­DAY­004", "F2­GSR­DAY­014", "F2­GSR­DAY­024"}, + {"F2­GMS­A­1201", "F2­GMS­A­1251", "F2­GSR­DAY­008", "F2­GSR­DAY­018", "F2­GSR­DAY­028"}, + {"F2­GMS­A­1301", "F2­GMS­A­1351", "F2­GSR­DAY­032", "F2­GSR­DAY­042", "F2­GSR­DAY­052"}, + {"F2­GMS­A­1401", "F2­GMS­A­1451", "F2­GMS­A­1501", "F2­GMS­A­1551", "F2­GSR­DAY­036", "F2­GSR­DAY­046", "F2­GSR­DAY­056"}, + {"F2­GMS­A­1601", "F2­GMS­A­1651", "F2­GSR­DAY­040", "F2­GSR­DAY­050", "F2­GSR­DAY­060"}, + {"F2­GMS­A­1701", "F2­GMS­A­1751", "F2­GSR­DAY­064", "F2­GSR­DAY­074", "F2­GSR­DAY­084"}, + {"F2­GMS­A­1801", "F2­GMS­A­1851", "F2­GSR­DAY­068", "F2­GSR­DAY­078", "F2­GSR­DAY­088"}, + {"F2­GMS­A­1901", "F2­GMS­A­1951", "F2­GSR­DAY­072", "F2­GSR­DAY­082", "F2­GSR­DAY­092"}, + {"F3­GMS­A­2001", "F3­GMS­A­2051", "F2­GSR­DAY­096", "F3­GSR­DAY­006", "F3­GSR­DAY­016"}, + {"F3­GMS­A­2101", "F3­GMS­A­2151", "F2­GSR­DAY­100", "F3­GSR­DAY­010", "F3­GSR­DAY­020"}, + {"F3­GMS­A­2201", "F3­GMS­A­2251", "F3­GMS­A­2301", "F3­GMS­A­2351", "F3­GSR­DAY­004", "F3­GSR­DAY­014", "F3­GSR­DAY­024"}, + {"F3­GMS­A­2401", "F3­GMS­A­2451", "F3­GSR­DAY­028", "F3­GSR­DAY­038", "F3­GSR­DAY­048"}, + {"F3­GMS­A­2501", "F3­GMS­A­2551", "F3­GSR­DAY­032", "F3­GSR­DAY­042", "F3­GSR­DAY­052"}, + {"F3­GMS­A­2601", "F3­GMS­A­2651", "F3­GSR­DAY­036", "F3­GSR­DAY­046", "F3­GSR­DAY­056"}, + {"F3­GMS­A­2701", "F3­GMS­A­2751", "F3­GSR­DAY­060", "F3­GSR­DAY­070", "F3­GSR­DAY­080"}, + {"F3­GMS­A­2801", "F3­GMS­A­2851", "F3­GSR­DAY­064", "F3­GSR­DAY­074", "F3­GSR­DAY­084"}, + {"F3­GMS­A­2901", "F3­GMS­A­2951", "F3­GSR­DAY­068", "F3­GSR­DAY­078", "F3­GSR­DAY­088"}, + {"F3­GSR­DAY­092", "F3­GSR­DAY­096", "F3­GSR­DAY­100"}}; + + public static final String SCHEDULE_3_WEEK_INTENSIVE = "3-Week Intensive"; + public static final String SCHEDULE_3_WEEK_INTENSIVE_SUMMARY = "Same results as above, but on a 3-week schedule if you can handle the time commitment."; + public static final String SCHEDULE_3_WEEK_INTENSIVE_DESCRIPTION = "This power schedule is the most intensive schedule and only recommended for getting a taste for a language or as a quick refresher course."; + public static final String[][] SCHEDULE_3_WEEK_INTENSIVE_STRINGS = {{"F1­GMS­A­0001", "F1­GMS­A­0051", "F1­GMS­A­0101", "F1­GSR­DAY­04", "F1­GSR­DAY­014", "F1­GSR­DAY­024", "F1­GSR­DAY­034"}, + {"F1­GMS­A­0151", "F1­GMS­A­0201", "F1­GMS­A­0251", "F1­GSR­DAY­08", "F1­GSR­DAY­018", "F1­GSR­DAY­028", "F1­GSR­DAY­038"}, + {"F1­GMS­A­0301", "F1­GMS­A­0351", "F1­GMS­A­0401", "F1­GSR­DAY­012", "F1­GSR­DAY­022", "F1­GSR­DAY­032", "F1­GSR­DAY­042"}, + {"F1­GMS­A­0401", "F1­GMS­A­0451", "F1­GMS­A­0501", "F1­GSR­DAY­046", "F1­GSR­DAY­056", "F1­GSR­DAY­066", "F1­GSR­DAY­076"}, + {"F1­GMS­A­0601", "F1­GMS­A­0651", "F1­GMS­A­0701", "F1­GSR­DAY­050", "F1­GSR­DAY­060", "F1­GSR­DAY­070", "F1­GSR­DAY­080"}, + {"F1­GMS­A­0751", "F1­GMS­A­0801", "F1­GMS­A­0851", "F1­GSR­DAY­054", "F1­GSR­DAY­064", "F1­GSR­DAY­074", "F1­GSR­DAY­084"}, + {"F1­GMS­A­0901", "F1­GMS­A­0951", "F2­GMS­A­1001", "F1­GSR­DAY­088", "F1­GSR­DAY­098", "F2­GSR­DAY­008", "F2­GSR­DAY­018"}, + {"F2­GMS­A­1051", "F2­GMS­A­1101", "F2­GMS­A­1151", "F1­GSR­DAY­092", "F2­GSR­DAY­002", "F2­GSR­DAY­012", "F2­GSR­DAY­022"}, + {"F2­GMS­A­1201", "F2­GMS­A­1251", "F2­GMS­A­1301", "F2­GSR­DAY­096", "F2­GSR­DAY­006", "F2­GSR­DAY­016", "F2­GSR­DAY­026"}, + {"F2­GMS­A­1351", "F2­GMS­A­1401", "F2­GMS­A­1451", "F2­GSR­DAY­030", "F2­GSR­DAY­040", "F2­GSR­DAY­050", "F2­GSR­DAY­060"}, + {"F2­GMS­A­1501", "F2­GMS­A­1551", "F2­GMS­A­1601", "F2­GSR­DAY­034", "F2­GSR­DAY­044", "F2­GSR­DAY­054", "F2­GSR­DAY­064"}, + {"F2­GMS­A­1651", "F2­GMS­A­1701", "F2­GMS­A­1751", "F2­GSR­DAY­038", "F2­GSR­DAY­048", "F2­GSR­DAY­058", "F2­GSR­DAY­068"}, + {"F2­GMS­A­1801", "F2­GMS­A­1851", "F2­GMS­A­1901", "F2­GSR­DAY­072", "F2­GSR­DAY­082", "F2­GSR­DAY­092", "F3­GSR­DAY­002"}, + {"F2­GMS­A­1951", "F3­GMS­A­2001", "F3­GMS­A­2051", "F2­GSR­DAY­076", "F2­GSR­DAY­086", "F2­GSR­DAY­096", "F3­GSR­DAY­006"}, + {"F3­GMS­A­2101", "F3­GMS­A­2151", "F3­GMS­A­2201", "F2­GSR­DAY­080", "F2­GSR­DAY­090", "F2­GSR­DAY­100", "F3­GSR­DAY­010"}, + {"F3­GMS­A­2251", "F3­GMS­A­2301", "F3­GMS­A­2351", "F3­GSR­DAY­014", "F3­GSR­DAY­024", "F3­GSR­DAY­034", "F3­GSR­DAY­044"}, + {"F3­GMS­A­2401", "F3­GMS­A­2451", "F3­GMS­A­2501", "F3­GSR­DAY­018", "F3­GSR­DAY­028", "F3­GSR­DAY­038", "F3­GSR­DAY­048"}, + {"F3­GMS­A­2551", "F3­GMS­A­2601", "F3­GMS­A­2651", "F3­GSR­DAY­022", "F3­GSR­DAY­032", "F3­GSR­DAY­042", "F3­GSR­DAY­052"}, + {"F3­GMS­A­2701", "F3­GMS­A­2751", "F3­GMS­A­2801", "F3­GSR­DAY­056", "F3­GSR­DAY­066", "F3­GSR­DAY­076", "F3­GSR­DAY­086"}, + {"F3­GMS­A­2851", "F3­GMS­A­2901", "F3­GMS­A­2951", "F3­GSR­DAY­060", "F3­GSR­DAY­070", "F3­GSR­DAY­080", "F3­GSR­DAY­090"}, + {"F3­GSR­DAY­064", "F3­GSR­DAY­074", "F3­GSR­DAY­084", "F3­GSR­DAY­094", "F3­GSR­DAY­100"}}; + + static { + scheduleList = getScheduleTypes(); + } + + public static ArrayList getScheduleTypes() { + ArrayList scheduleTypes = new ArrayList<>(); + scheduleTypes.add(new ScheduleType(SCHEDULE_9_RELAXED, SCHEDULE_9_RELAXED_STRINGS, 20, 57000, "9 months", "43 weeks", SCHEDULE_9_RELAXED_SUMMARY, SCHEDULE_9_RELAXED_DESCRIPTION)); + scheduleTypes.add(new ScheduleType(SCHEDULE_5_RELAXED, SCHEDULE_5_RELAXED_STRINGS, 60, 64000, "5 months", "21 weeks", SCHEDULE_5_RELAXED_SUMMARY, SCHEDULE_5_RELAXED_DESCRIPTION)); + scheduleTypes.add(new ScheduleType(SCHEDULE_5_INTENSIVE, SCHEDULE_5_INTENSIVE_STRINGS, 90, 94000, "5 months", "21 weeks", SCHEDULE_5_INTENSIVE_SUMMARY, SCHEDULE_5_INTENSIVE_DESCRIPTION)); + scheduleTypes.add(new ScheduleType(SCHEDULE_4_INTENSIVE, SCHEDULE_4_INTENSIVE_STRINGS, 70, 57000, "4 months", "18 weeks", SCHEDULE_4_INTENSIVE_SUMMARY, SCHEDULE_4_INTENSIVE_DESCRIPTION)); + scheduleTypes.add(new ScheduleType(SCHEDULE_3_INTENSIVE, SCHEDULE_3_INTENSIVE_STRINGS, 60, 43000, "3 months", "13 weeks", SCHEDULE_3_INTENSIVE_SUMMARY, SCHEDULE_3_INTENSIVE_DESCRIPTION)); + scheduleTypes.add(new ScheduleType(SCHEDULE_2_INTENSIVE, SCHEDULE_2_INTENSIVE_STRINGS, 60, 31000, "2 months", "8 weeks", SCHEDULE_2_INTENSIVE_SUMMARY, SCHEDULE_2_INTENSIVE_DESCRIPTION)); + scheduleTypes.add(new ScheduleType(SCHEDULE_6_WEEK_INTENSIVE, SCHEDULE_6_WEEK_INTENSIVE_STRINGS, 90, 29000, "6 weeks", "42 days", SCHEDULE_6_WEEK_INTENSIVE_SUMMARY, SCHEDULE_6_WEEK_INTENSIVE_DESCRIPTION)); + scheduleTypes.add(new ScheduleType(SCHEDULE_4_WEEK_INTENSIVE, SCHEDULE_4_WEEK_INTENSIVE_STRINGS, 90, 18000, "4 weeks", "28 days", SCHEDULE_4_WEEK_INTENSIVE_SUMMARY, SCHEDULE_4_WEEK_INTENSIVE_DESCRIPTION)); + scheduleTypes.add(new ScheduleType(SCHEDULE_3_WEEK_INTENSIVE, SCHEDULE_3_WEEK_INTENSIVE_STRINGS, 125, 18000, "3 weeks", "21 days", SCHEDULE_3_WEEK_INTENSIVE_SUMMARY, SCHEDULE_3_WEEK_INTENSIVE_DESCRIPTION)); + return scheduleTypes; + } + + public static void createSchedule(Realm realm, ScheduleType selectedSchedule, LanguageType selectedLanguage, String title) { + // get schedule as a 2D list of strings + String[][] scheduleStrings = selectedSchedule.getSchedule(); + // save schedule into db + realm.executeTransaction(r -> { + // create schedule object + Schedule schedule = r.createObject(Schedule.class, UUID.randomUUID().toString()); + schedule.setTitle(title); + schedule.setLanguage(selectedLanguage.getName()); + // add all days to the schedule + int dayNumber = 1; + for (String[] dayItems : scheduleStrings) { + Day day = r.createObject(Day.class, UUID.randomUUID().toString()); + day.setDayNumber(dayNumber++); + // each day has a set of files to listen to + for (String dayItem : dayItems) { + StudyItem studyItem = r.createObject(StudyItem.class, UUID.randomUUID().toString()); + studyItem.setTitle(dayItem); + studyItem.setCompleted(false); + day.getStudyItems().add(studyItem); + } + schedule.getSchedule().add(day); + } + }); + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/data/ScheduleType.java b/app/src/main/java/ch/ralena/glossikaschedule/data/ScheduleType.java new file mode 100644 index 0000000..8e8262c --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/data/ScheduleType.java @@ -0,0 +1,116 @@ +package ch.ralena.glossikaschedule.data; + +import android.os.Parcel; +import android.os.Parcelable; + +public class ScheduleType implements Parcelable { + private String title; + private String[][] schedule; + private int minutesDay; + private int totalReps; + private String courseLength; + private String courseLengthSmall; + private String summary; + private String description; + + public ScheduleType(String title, String[][] schedule, int minutesDay, int totalReps, String courseLength, String courseLengthSmall, String summary, String description) { + this.title = title; + this.schedule = schedule; + this.minutesDay = minutesDay; + this.totalReps = totalReps; + this.courseLength = courseLength; + this.courseLengthSmall = courseLengthSmall; + this.summary = summary; + this.description = description; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String[][] getSchedule() { + return schedule; + } + + public void setSchedule(String[][] schedule) { + this.schedule = schedule; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public int getMinutesDay() { + return minutesDay; + } + + public String getRepsAsString() { + return String.format("%,d", totalReps); + } + + public int getTotalReps() { + return totalReps; + } + + public String getCourseLength() { + return courseLength; + } + + public String getCourseLengthSmall() { + return courseLengthSmall; + } + + protected ScheduleType(Parcel in) { + title = in.readString(); + minutesDay = in.readInt(); + totalReps = in.readInt(); + courseLength = in.readString(); + courseLengthSmall = in.readString(); + summary = in.readString(); + description = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public ScheduleType createFromParcel(Parcel in) { + return new ScheduleType(in); + } + + @Override + public ScheduleType[] newArray(int size) { + return new ScheduleType[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeString(title); + parcel.writeInt(minutesDay); + parcel.writeInt(totalReps); + parcel.writeString(courseLength); + parcel.writeString(courseLengthSmall); + parcel.writeString(summary); + parcel.writeString(description); + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/fragment/DayFragment.java b/app/src/main/java/ch/ralena/glossikaschedule/fragment/DayFragment.java new file mode 100644 index 0000000..4bd7939 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/fragment/DayFragment.java @@ -0,0 +1,97 @@ +package ch.ralena.glossikaschedule.fragment; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.os.Handler; +import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.LinearLayout; +import android.widget.TextView; + +import ch.ralena.glossikaschedule.R; +import ch.ralena.glossikaschedule.adapter.DayAdapter; +import ch.ralena.glossikaschedule.object.Day; +import io.realm.Realm; + +import static ch.ralena.glossikaschedule.MainActivity.MAIN_FRAGMENT_TAG; + +public class DayFragment extends DialogFragment { + private Realm realm; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + getDialog().setCanceledOnTouchOutside(true); + + realm = Realm.getDefaultInstance(); + + // get day from passed in bundle + Bundle bundle = getArguments(); + String dayId = bundle.getString(MainFragment.TAG_DAY_ID); + Day day = realm.where(Day.class).equalTo("id", dayId).findFirst(); + + // inflate views + View view = inflater.inflate(R.layout.fragment_day, container, false); + TextView dayLabel = view.findViewById(R.id.dayLabel); + final CheckBox checkAll = view.findViewById(R.id.checkAll); + + // set up day title + dayLabel.setText("Day " + day.getDayNumber()); + + // set up completion date + LinearLayout completedDateLayout = view.findViewById(R.id.completedDateLayout); + if (day.getFormattedDateCompleted().equals("")) { + // hide layout if it hasn't been completed yet + completedDateLayout.setVisibility(View.GONE); + } else { + TextView completedDateText = view.findViewById(R.id.completedDateText); + // if date completed = 1, it was converted over from an older version + // before we kept track of completion date + if (day.getDateCompleted() == 1) { + completedDateText.setText("---"); + } else { + // otherwise update text to show the date it was completed + completedDateText.setText(day.getFormattedDateCompleted()); + } + } + + // set up recycler view and adapter + RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); + final DayAdapter adapter = new DayAdapter(day, (DayAdapter.OnItemCheckedListener) getActivity()); + recyclerView.setAdapter(adapter); + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); + recyclerView.setLayoutManager(layoutManager); + + // set up check all listener + checkAll.setOnCheckedChangeListener((buttonView, isChecked) -> { + checkAll.setChecked(false); + adapter.changeAll(isChecked); + + // if they've all been checked, update the day's completion date + realm.executeTransaction(r -> day.updateDateCompleted()); + + // we need to wait a short while, otherwise the changes won't get marked + new Handler().postDelayed(this::dismiss, 400); + }); + + return view; + } + + @Override + public void onDismiss(DialogInterface dialog) { + if (getFragmentManager() != null) { + MainFragment mainFragment = (MainFragment) getFragmentManager().findFragmentByTag(MAIN_FRAGMENT_TAG); + if (mainFragment != null) { + mainFragment.removeHighlight(); + mainFragment.updateAdapter(); + } + } + super.onDismiss(dialog); + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/fragment/MainFragment.java b/app/src/main/java/ch/ralena/glossikaschedule/fragment/MainFragment.java new file mode 100644 index 0000000..8fe0544 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/fragment/MainFragment.java @@ -0,0 +1,234 @@ +package ch.ralena.glossikaschedule.fragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.Fragment; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import ch.ralena.glossikaschedule.MainActivity; +import ch.ralena.glossikaschedule.R; +import ch.ralena.glossikaschedule.adapter.ScheduleAdapter; +import ch.ralena.glossikaschedule.object.Day; +import ch.ralena.glossikaschedule.object.Schedule; +import ch.ralena.glossikaschedule.object.StudyItem; +import io.realm.Realm; +import io.realm.RealmList; + +// TODO: Long press with popup menu to ask to fill in all previous days +public class MainFragment extends Fragment { + private static final String TAG = MainFragment.class.getSimpleName(); + public static final String TAG_DAY_ID = "tag_day_id"; + private static final String DAY_FRAGMENT_TAG = "day_fragment"; + + private Schedule schedule; + private int currentDayId = -1; + private Day currentDay; + private ScheduleAdapter adapter; + private View rootView; + private boolean isDialogReady; + private Snackbar snackbar; + + Realm realm; + + DayFragment dayFragment; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + isDialogReady = true; + + // initialize realm object + realm = Realm.getDefaultInstance(); + + // get the arguments passed in + Bundle bundle = getArguments(); + String id = bundle.getString(MainActivity.TAG_SCHEDULE_ID); + schedule = realm.where(Schedule.class).equalTo("id", id).findFirst(); + + // set up title + ((MainActivity) getActivity()).getSupportActionBar().setTitle(schedule.getLanguage() + " - " + schedule.getTitle()); + + // load views + rootView = inflater.inflate(R.layout.fragment_main, container, false); + + // skip over all days that have already been completed + findNextIncompleteDay(); + + // set up adapter and subscribe to clicks on a day + int currentDayPosition = schedule.getSchedule().indexOf(currentDay); + adapter = new ScheduleAdapter(currentDayPosition, schedule.getSchedule(), getContext()); + adapter.asObservable().subscribe(this::showDay); + + // set up recycler view + RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.scheduleRecyclerView); + recyclerView.setAdapter(adapter); + RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getActivity(), 7); + recyclerView.setLayoutManager(layoutManager); + recyclerView.smoothScrollToPosition(currentDayPosition); + + return rootView; + } + + @Override + public void onStart() { + super.onStart(); + } + + @Override + public void onResume() { + super.onResume(); + Log.d("TAG", "onresume"); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + // if it's the first time loading the fragment, show the current day + if (savedInstanceState == null) { + showDay(currentDay); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (dayFragment != null && !isStateSaved()) { + dayFragment.dismiss(); + } + } + + // loads a dialog fragment with checkboxes for the recordings you need to study for that day + public void showDay(Day day) { + currentDay = day; + adapter.notifyItemChanged(schedule.getSchedule().indexOf(day)); + if (isDialogReady) { + if (areEmptyDays()) { + askToFillInDays(); + } else { + openDayDialog(); + } + } else { + if (areEmptyDays()) { + snackbar.setText(String.format(getString(R.string.mark_days_as_complete), currentDay.getDayNumber())); + } else { + snackbar.dismiss(); + openDayDialog(); + } + } + } + + public void updateAdapter() { + adapter.notifyDataSetChanged(); + } + + // creates the dialog fragment with the day's files + private void openDayDialog() { + if (getFragmentManager() != null) { + dayFragment = (DayFragment) getFragmentManager().findFragmentByTag(DAY_FRAGMENT_TAG); + if (dayFragment == null) { + dayFragment = new DayFragment(); + dayFragment.setStyle(DialogFragment.STYLE_NO_FRAME, R.style.dialog); + Bundle bundle = new Bundle(); + bundle.putString(TAG_DAY_ID, currentDay.getId()); + dayFragment.setArguments(bundle); + dayFragment.show(getFragmentManager(), DAY_FRAGMENT_TAG); + } + } + } + + // fill in all days from start to current day + private void askToFillInDays() { + isDialogReady = false; + snackbar = Snackbar.make(rootView, + String.format(getString(R.string.mark_days_as_complete), currentDay.getDayNumber()), + Snackbar.LENGTH_INDEFINITE) + .setAction("Yes", v -> { + for (Day day : schedule.getSchedule()) { + if (day.getDayNumber() < currentDay.getDayNumber()) { + for (StudyItem studyItem : day.getStudyItems()) { + realm.executeTransaction(r -> studyItem.setCompleted(true)); + } + realm.executeTransaction(r -> { + day.setCompleted(true); + day.updateDateCompleted(); + } + ); + } + } + adapter.notifyDataSetChanged(); + }).addCallback(new Snackbar.Callback() { + @Override + public void onDismissed(Snackbar transientBottomBar, int event) { + super.onDismissed(transientBottomBar, event); + isDialogReady = true; + openDayDialog(); + } + }); + snackbar.show(); + } + + private boolean areEmptyDays() { + RealmList days = schedule.getSchedule(); + boolean isEmpty = false; + if (currentDay != null) { + int currentDayIndex = currentDay.getDayNumber(); + for (Day day : days) { + if (day.getDayNumber() < currentDayIndex && !day.isCompleted()) + isEmpty = true; + } + } + return isEmpty; + } + + private void findNextIncompleteDay() { + for (Day day : schedule.getSchedule()) { + currentDayId = day.getDayNumber() - 1; + if (!day.isCompleted()) { + getCurrentDay(); + return; + } + } + } + + public Day getCurrentDay() { + int index = currentDayId; + if (index < 0) { + index = 0; + } + currentDay = schedule.getSchedule().get(index); + return currentDay; + } + + public void updateDay() { + // check if all items have been checked + boolean isCompleted = true; + int numberCompleted = 0; + int total = currentDay.getStudyItems().size(); + for (StudyItem studyItem : currentDay.getStudyItems()) { + if (studyItem.isCompleted()) { + numberCompleted++; + } + isCompleted = isCompleted & studyItem.isCompleted(); + } + boolean finalIsCompleted = isCompleted; + realm.executeTransaction(r -> currentDay.setCompleted(finalIsCompleted)); + + // if all items have been checked or all but one have been checked, update day's background + if (numberCompleted == total || numberCompleted == total - 1) { + int position = schedule.getSchedule().indexOf(currentDay); + adapter.notifyItemChanged(position); + } + } + + public void removeHighlight() { + adapter.removeHighlight(); + } + +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleConfirmFragment.java b/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleConfirmFragment.java new file mode 100644 index 0000000..d471478 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleConfirmFragment.java @@ -0,0 +1,47 @@ +package ch.ralena.glossikaschedule.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import ch.ralena.glossikaschedule.NewScheduleActivity; +import ch.ralena.glossikaschedule.R; + +public class NewScheduleConfirmFragment extends Fragment { + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + setHasOptionsMenu(true); + // load activity reference + NewScheduleActivity activity = (NewScheduleActivity) getActivity(); + activity.getSupportActionBar().setTitle("Name your schedule"); + // load view + View view = inflater.inflate(R.layout.fragment_new_schedule_confirm, container, false); + Button button = view.findViewById(R.id.createScheduleButton); + ImageView flagImage = view.findViewById(R.id.flagImageView); + TextView languageName = view.findViewById(R.id.languageLabel); + TextView scheduleName = view.findViewById(R.id.scheduleTitleLabel); + EditText title = view.findViewById(R.id.scheduleTitle); + // load values into views + flagImage.setImageResource(activity.selectedLanguage.getDrawable()); + languageName.setText(activity.selectedLanguage.getName()); + scheduleName.setText(activity.selectedSchedule.getTitle()); + title.setText(activity.selectedSchedule.getTitle()); + // onclick for submitting schedule + button.setOnClickListener(v -> activity.createSchedule(title.getText().toString())); + // request focus for edittext + title.requestFocus(); + InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); + return view; + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleLanguageFragment.java b/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleLanguageFragment.java new file mode 100644 index 0000000..3bf6c51 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleLanguageFragment.java @@ -0,0 +1,51 @@ +package ch.ralena.glossikaschedule.fragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.app.ActionBar; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import ch.ralena.glossikaschedule.NewScheduleActivity; +import ch.ralena.glossikaschedule.R; +import ch.ralena.glossikaschedule.adapter.LanguageSelectAdapter; +import ch.ralena.glossikaschedule.data.LanguageData; +import ch.ralena.glossikaschedule.data.LanguageType; + +public class NewScheduleLanguageFragment extends Fragment { + private LanguageType selectedLanguage; + NewScheduleActivity activity; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + // get activity + activity = ((NewScheduleActivity) getActivity()); + // update action bar + ActionBar actionBar = activity.getSupportActionBar(); + actionBar.setTitle("Which language are you studying?"); + actionBar.setDisplayHomeAsUpEnabled(false); + + // load view + View view = inflater.inflate(R.layout.fragment_new_schedule_language, container, false); + + RecyclerView recyclerView = view.findViewById(R.id.recyclerView); + LanguageSelectAdapter languageSelectAdapter = new LanguageSelectAdapter(LanguageData.languages, selectedLanguage); + languageSelectAdapter.asObservable().subscribe(language -> { + activity.updateLanguage(language); + selectedLanguage = language; + NewScheduleScheduleFragment fragment = new NewScheduleScheduleFragment(); + getFragmentManager().beginTransaction() + .replace(R.id.fragmentContainer, fragment) + .addToBackStack(null) + .commit(); + }); + recyclerView.setAdapter(languageSelectAdapter); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + return view; + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleScheduleFragment.java b/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleScheduleFragment.java new file mode 100644 index 0000000..f6e0276 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleScheduleFragment.java @@ -0,0 +1,124 @@ +package ch.ralena.glossikaschedule.fragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.app.ActionBar; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.google.android.flexbox.FlexboxLayout; + +import java.util.ArrayList; +import java.util.List; +import java.util.TreeMap; + +import ch.ralena.glossikaschedule.NewScheduleActivity; +import ch.ralena.glossikaschedule.R; +import ch.ralena.glossikaschedule.data.ScheduleData; +import ch.ralena.glossikaschedule.data.ScheduleType; + +public class NewScheduleScheduleFragment extends Fragment { + private static final String TAG = NewScheduleScheduleFragment.class.getSimpleName(); + public static final String EXTRA_SCHEDULE = "extra_schedule"; + + private LinearLayout circleContainer; + private LayoutInflater inflater; + private List minuteCircles; + private TreeMap> schedules; + NewScheduleActivity activity; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + activity = (NewScheduleActivity) getActivity(); + ActionBar actionBar = activity.getSupportActionBar(); + actionBar.setTitle("Choose a schedule"); + actionBar.setDisplayHomeAsUpEnabled(true); + + // save inflater + this.inflater = inflater; + + // organize schedules by how many minutes they take + schedules = new TreeMap<>(); + for (ScheduleType scheduleType : ScheduleData.scheduleList) { + if (!schedules.containsKey(scheduleType.getMinutesDay())) { + schedules.put(scheduleType.getMinutesDay(), new ArrayList<>()); + } + schedules.get(scheduleType.getMinutesDay()).add(scheduleType); + } + + // load view + View view = inflater.inflate(R.layout.fragment_new_schedule_schedule, container, false); + + circleContainer = view.findViewById(R.id.circleContainer); + + loadMinuteCircles(); + return view; + } + + private void loadMinuteCircles() { + minuteCircles = new ArrayList<>(); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + lp.setMargins(0, 10, 0, 10); + for (Integer minutes : schedules.keySet()) { + // inflate view + View minuteCircleView = inflater.inflate(R.layout.item_schedule_minutes, circleContainer, false); + minuteCircleView.setLayoutParams(lp); + // update minutes text + TextView minutesLabel = minuteCircleView.findViewById(R.id.minutesLabel); + minutesLabel.setText(minutes + ""); + // load descriptions + FlexboxLayout descriptionContainer = minuteCircleView.findViewById(R.id.descriptionContainer); + loadScheduleDescriptions(descriptionContainer, minutes); + + // add to arraylist and to layout + minuteCircles.add(minuteCircleView); + circleContainer.addView(minuteCircleView); + } + } + + private void loadScheduleDescriptions(FlexboxLayout descriptionContainer, int minutes) { + int index = 0; + for (ScheduleType scheduleType : schedules.get(minutes)) { + View descriptionView = inflater.inflate(R.layout.item_schedule_description, descriptionContainer, false); + // set up onclick listener + LinearLayout scheduleLayout = descriptionView.findViewById(R.id.scheduleLayout); + scheduleLayout.setOnClickListener(view -> { + loadScheduleDetails(scheduleType); + }); + // update textviews + TextView monthsLabel = descriptionView.findViewById(R.id.bigLengthLabel); + TextView weeksLabel = descriptionView.findViewById(R.id.smallLengthLabel); + TextView repsLabel = descriptionView.findViewById(R.id.repsLabel); + monthsLabel.setText(scheduleType.getCourseLength()); + weeksLabel.setText(scheduleType.getCourseLengthSmall()); + repsLabel.setText(scheduleType.getRepsAsString()); + // if it's the last one, don't show the "or" + if (++index == schedules.get(minutes).size()) { + TextView orLabel = descriptionView.findViewById(R.id.orLabel); + orLabel.setVisibility(View.GONE); + } + // add view to container + descriptionContainer.addView(descriptionView); + } + } + + private void loadScheduleDetails(ScheduleType scheduleType) { + activity.updateSchedule(scheduleType); + NewScheduleViewScheduleFragment fragment = new NewScheduleViewScheduleFragment(); + Bundle bundle = new Bundle(); + bundle.putParcelable(EXTRA_SCHEDULE, scheduleType); + fragment.setArguments(bundle); + + getFragmentManager().beginTransaction() + .replace(R.id.fragmentContainer, fragment) + .addToBackStack(null) + .commit(); + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleViewScheduleFragment.java b/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleViewScheduleFragment.java new file mode 100644 index 0000000..7d301e7 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/fragment/NewScheduleViewScheduleFragment.java @@ -0,0 +1,47 @@ +package ch.ralena.glossikaschedule.fragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import ch.ralena.glossikaschedule.R; +import ch.ralena.glossikaschedule.data.ScheduleType; + +public class NewScheduleViewScheduleFragment extends Fragment { + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + setHasOptionsMenu(true); + // get schedule from passed in bundle + ScheduleType schedule = getArguments().getParcelable(NewScheduleScheduleFragment.EXTRA_SCHEDULE); + // load view + View view = inflater.inflate(R.layout.fragment_new_schedule_view_schedule, container, false); + // load views + TextView title = view.findViewById(R.id.scheduleTitle); + TextView minutes = view.findViewById(R.id.minutesLabel); + TextView reps = view.findViewById(R.id.repsLabel); + TextView monthsWeeks = view.findViewById(R.id.monthsWeeksLabel); + TextView summary = view.findViewById(R.id.scheduleSummary); + TextView description = view.findViewById(R.id.scheduleDescription); + // update text + title.setText(schedule.getTitle()); + minutes.setText(schedule.getMinutesDay() + ""); + reps.setText(schedule.getRepsAsString() + " reps"); + monthsWeeks.setText(schedule.getCourseLength() + " (" + schedule.getCourseLengthSmall() + ")"); + summary.setText(schedule.getSummary()); + description.setText(schedule.getDescription()); + + return view; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.schedule_toolbar, menu); + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/object/Day.java b/app/src/main/java/ch/ralena/glossikaschedule/object/Day.java new file mode 100644 index 0000000..60eaa21 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/object/Day.java @@ -0,0 +1,108 @@ +package ch.ralena.glossikaschedule.object; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.UUID; + +import io.realm.RealmList; +import io.realm.RealmObject; +import io.realm.annotations.Index; +import io.realm.annotations.PrimaryKey; + +public class Day extends RealmObject { + @PrimaryKey + @Index + private String id = UUID.randomUUID().toString(); + + RealmList studyItems; + int dayNumber; + boolean isCompleted; + long dateCompleted; + + // constructors + public Day() { + super(); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public RealmList getStudyItems() { + return studyItems; + } + + public void setStudyItems(RealmList studyItems) { + this.studyItems = studyItems; + } + + public int getDayNumber() { + return dayNumber; + } + + public void setDayNumber(int dayNumber) { + this.dayNumber = dayNumber; + } + + public boolean isCompleted() { + return isCompleted; + } + + public void setCompleted(boolean completed) { + isCompleted = completed; + } + + public void setDateCompleted(long dateCompleted) { + this.dateCompleted = dateCompleted; + } + + public long getDateCompleted() { + return dateCompleted; + } + + public String getFormattedDateCompleted() { + if (dateCompleted > 0) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMM. yyyy"); + return dateFormat.format(dateCompleted); + } else { + return ""; + } + } + + public String getFormattedDateShort() { + if (dateCompleted > 0) { + SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd"); + return dateFormat.format(dateCompleted); + } else { + return ""; + } + } + + public void updateDateCompleted() { + if (dateCompleted == 0) { + // check if all study items have been completed + boolean allCompleted = true; + for (StudyItem item : studyItems) { + allCompleted = allCompleted && item.isCompleted(); + } + // if so, save today's date as the new completed date + if (allCompleted) { + dateCompleted = Calendar.getInstance().getTimeInMillis(); + } + } + } + + public boolean wasCompletedToday() { + if (dateCompleted > 0) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMM. yyyy"); + String today = dateFormat.format(Calendar.getInstance().getTimeInMillis()); + return dateFormat.format(dateCompleted).equals(today); + } else { + return false; + } + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/object/Schedule.java b/app/src/main/java/ch/ralena/glossikaschedule/object/Schedule.java new file mode 100644 index 0000000..ddfb4b6 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/object/Schedule.java @@ -0,0 +1,75 @@ +package ch.ralena.glossikaschedule.object; + +import java.util.UUID; + +import ch.ralena.glossikaschedule.data.LanguageData; +import ch.ralena.glossikaschedule.data.LanguageType; +import io.realm.RealmList; +import io.realm.RealmObject; +import io.realm.annotations.Index; +import io.realm.annotations.PrimaryKey; + +public class Schedule extends RealmObject { + @PrimaryKey + @Index + private String id = UUID.randomUUID().toString(); + + String title; // later switch to Schedule type? + String language; + RealmList schedule; + + // constructor + public Schedule() { super(); } + public Schedule(String title, String language) { + this.title = title; + this.language = language; + schedule = new RealmList(); + } + + // getters and setters + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public RealmList getSchedule() { + return schedule; + } + + public void setSchedule(RealmList schedule) { + this.schedule = schedule; + } + + public void addDay(Day day) { + schedule.add(day); + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getLanguage() { + return language; + } + + public LanguageType getLanguageType() { + LanguageType languageType = null; + for (LanguageType language : LanguageData.languages) { + if (this.language.equals(language.getName())) { + return language; + } + } + return languageType; + } +} diff --git a/app/src/main/java/ch/ralena/glossikaschedule/object/StudyItem.java b/app/src/main/java/ch/ralena/glossikaschedule/object/StudyItem.java new file mode 100644 index 0000000..f5a1801 --- /dev/null +++ b/app/src/main/java/ch/ralena/glossikaschedule/object/StudyItem.java @@ -0,0 +1,54 @@ +package ch.ralena.glossikaschedule.object; + +import java.util.UUID; + +import io.realm.RealmObject; +import io.realm.annotations.Index; +import io.realm.annotations.PrimaryKey; + +public class StudyItem extends RealmObject { + @PrimaryKey + @Index + private String id = UUID.randomUUID().toString(); + + String mTitle; + boolean mIsCompleted; + + public StudyItem() { + super(); + } + + public StudyItem(String title) { + mTitle = title; + mIsCompleted = false; + } + + public StudyItem(String title, boolean isCompleted) { + mTitle = title; + mIsCompleted = isCompleted; + } + + public String getTitle() { + return mTitle; + } + + public void setTitle(String title) { + mTitle = title; + } + + public boolean isCompleted() { + return mIsCompleted; + } + + public void setCompleted(boolean completed) { + mIsCompleted = completed; + } + + public String getId() { + return id; + } + + public void setId(long id) { + id = id; + } +} diff --git a/app/src/main/res/color/menu_text_color.xml b/app/src/main/res/color/menu_text_color.xml new file mode 100644 index 0000000..dd465f6 --- /dev/null +++ b/app/src/main/res/color/menu_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_confirm.png b/app/src/main/res/drawable-hdpi/ic_confirm.png new file mode 100644 index 0000000..757596c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_confirm.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_next.png b/app/src/main/res/drawable-hdpi/ic_next.png new file mode 100644 index 0000000..afb0c58 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_next.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_confirm.png b/app/src/main/res/drawable-mdpi/ic_confirm.png new file mode 100644 index 0000000..b788742 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_confirm.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_next.png b/app/src/main/res/drawable-mdpi/ic_next.png new file mode 100644 index 0000000..c8b8397 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_next.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_confirm.png b/app/src/main/res/drawable-xhdpi/ic_confirm.png new file mode 100644 index 0000000..4609b2d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_confirm.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_next.png b/app/src/main/res/drawable-xhdpi/ic_next.png new file mode 100644 index 0000000..46dc8d5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_next.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_confirm.png b/app/src/main/res/drawable-xxhdpi/ic_confirm.png new file mode 100644 index 0000000..0696468 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_confirm.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_next.png b/app/src/main/res/drawable-xxhdpi/ic_next.png new file mode 100644 index 0000000..40901fe Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_next.png differ diff --git a/app/src/main/res/drawable/bg_day_fragment.xml b/app/src/main/res/drawable/bg_day_fragment.xml new file mode 100644 index 0000000..5278c6f --- /dev/null +++ b/app/src/main/res/drawable/bg_day_fragment.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_background.xml b/app/src/main/res/drawable/button_background.xml new file mode 100644 index 0000000..7974da2 --- /dev/null +++ b/app/src/main/res/drawable/button_background.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_enabled.xml b/app/src/main/res/drawable/button_enabled.xml new file mode 100644 index 0000000..e74f765 --- /dev/null +++ b/app/src/main/res/drawable/button_enabled.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_pressed.xml b/app/src/main/res/drawable/button_pressed.xml new file mode 100644 index 0000000..e0adf0f --- /dev/null +++ b/app/src/main/res/drawable/button_pressed.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/circle_selected.png b/app/src/main/res/drawable/circle_selected.png new file mode 100644 index 0000000..f037668 Binary files /dev/null and b/app/src/main/res/drawable/circle_selected.png differ diff --git a/app/src/main/res/drawable/circle_unselected.png b/app/src/main/res/drawable/circle_unselected.png new file mode 100644 index 0000000..282aced Binary files /dev/null and b/app/src/main/res/drawable/circle_unselected.png differ diff --git a/app/src/main/res/drawable/clock.png b/app/src/main/res/drawable/clock.png new file mode 100644 index 0000000..d02f5ec Binary files /dev/null and b/app/src/main/res/drawable/clock.png differ diff --git a/app/src/main/res/drawable/flag_arabic_egypt.png b/app/src/main/res/drawable/flag_arabic_egypt.png new file mode 100644 index 0000000..ba88feb Binary files /dev/null and b/app/src/main/res/drawable/flag_arabic_egypt.png differ diff --git a/app/src/main/res/drawable/flag_arabic_msa.png b/app/src/main/res/drawable/flag_arabic_msa.png new file mode 100644 index 0000000..582fe2e Binary files /dev/null and b/app/src/main/res/drawable/flag_arabic_msa.png differ diff --git a/app/src/main/res/drawable/flag_armenian.png b/app/src/main/res/drawable/flag_armenian.png new file mode 100644 index 0000000..f34d791 Binary files /dev/null and b/app/src/main/res/drawable/flag_armenian.png differ diff --git a/app/src/main/res/drawable/flag_belarusian.png b/app/src/main/res/drawable/flag_belarusian.png new file mode 100644 index 0000000..57dd77d Binary files /dev/null and b/app/src/main/res/drawable/flag_belarusian.png differ diff --git a/app/src/main/res/drawable/flag_catalan.png b/app/src/main/res/drawable/flag_catalan.png new file mode 100644 index 0000000..25783ff Binary files /dev/null and b/app/src/main/res/drawable/flag_catalan.png differ diff --git a/app/src/main/res/drawable/flag_chinese_china.png b/app/src/main/res/drawable/flag_chinese_china.png new file mode 100644 index 0000000..6e1082c Binary files /dev/null and b/app/src/main/res/drawable/flag_chinese_china.png differ diff --git a/app/src/main/res/drawable/flag_chinese_hongkong.png b/app/src/main/res/drawable/flag_chinese_hongkong.png new file mode 100644 index 0000000..7fb4ecb Binary files /dev/null and b/app/src/main/res/drawable/flag_chinese_hongkong.png differ diff --git a/app/src/main/res/drawable/flag_chinese_taiwan.png b/app/src/main/res/drawable/flag_chinese_taiwan.png new file mode 100644 index 0000000..facbd7a Binary files /dev/null and b/app/src/main/res/drawable/flag_chinese_taiwan.png differ diff --git a/app/src/main/res/drawable/flag_czech.png b/app/src/main/res/drawable/flag_czech.png new file mode 100644 index 0000000..6789efb Binary files /dev/null and b/app/src/main/res/drawable/flag_czech.png differ diff --git a/app/src/main/res/drawable/flag_dutch.png b/app/src/main/res/drawable/flag_dutch.png new file mode 100644 index 0000000..2102f7f Binary files /dev/null and b/app/src/main/res/drawable/flag_dutch.png differ diff --git a/app/src/main/res/drawable/flag_estonian.png b/app/src/main/res/drawable/flag_estonian.png new file mode 100644 index 0000000..d90ae5d Binary files /dev/null and b/app/src/main/res/drawable/flag_estonian.png differ diff --git a/app/src/main/res/drawable/flag_finnish.png b/app/src/main/res/drawable/flag_finnish.png new file mode 100644 index 0000000..8aa35af Binary files /dev/null and b/app/src/main/res/drawable/flag_finnish.png differ diff --git a/app/src/main/res/drawable/flag_french.png b/app/src/main/res/drawable/flag_french.png new file mode 100644 index 0000000..0c3b1eb Binary files /dev/null and b/app/src/main/res/drawable/flag_french.png differ diff --git a/app/src/main/res/drawable/flag_german.png b/app/src/main/res/drawable/flag_german.png new file mode 100644 index 0000000..3b98e80 Binary files /dev/null and b/app/src/main/res/drawable/flag_german.png differ diff --git a/app/src/main/res/drawable/flag_greek.png b/app/src/main/res/drawable/flag_greek.png new file mode 100644 index 0000000..dfc920b Binary files /dev/null and b/app/src/main/res/drawable/flag_greek.png differ diff --git a/app/src/main/res/drawable/flag_hindi.png b/app/src/main/res/drawable/flag_hindi.png new file mode 100644 index 0000000..118d534 Binary files /dev/null and b/app/src/main/res/drawable/flag_hindi.png differ diff --git a/app/src/main/res/drawable/flag_hungarian.png b/app/src/main/res/drawable/flag_hungarian.png new file mode 100644 index 0000000..8667b94 Binary files /dev/null and b/app/src/main/res/drawable/flag_hungarian.png differ diff --git a/app/src/main/res/drawable/flag_icelandic.png b/app/src/main/res/drawable/flag_icelandic.png new file mode 100644 index 0000000..11bdd4f Binary files /dev/null and b/app/src/main/res/drawable/flag_icelandic.png differ diff --git a/app/src/main/res/drawable/flag_indonesian.png b/app/src/main/res/drawable/flag_indonesian.png new file mode 100644 index 0000000..c81f8fa Binary files /dev/null and b/app/src/main/res/drawable/flag_indonesian.png differ diff --git a/app/src/main/res/drawable/flag_italian.png b/app/src/main/res/drawable/flag_italian.png new file mode 100644 index 0000000..7fed56a Binary files /dev/null and b/app/src/main/res/drawable/flag_italian.png differ diff --git a/app/src/main/res/drawable/flag_japanese.png b/app/src/main/res/drawable/flag_japanese.png new file mode 100644 index 0000000..ce11930 Binary files /dev/null and b/app/src/main/res/drawable/flag_japanese.png differ diff --git a/app/src/main/res/drawable/flag_korean.png b/app/src/main/res/drawable/flag_korean.png new file mode 100644 index 0000000..b32a2d4 Binary files /dev/null and b/app/src/main/res/drawable/flag_korean.png differ diff --git a/app/src/main/res/drawable/flag_latvian.png b/app/src/main/res/drawable/flag_latvian.png new file mode 100644 index 0000000..fb8a583 Binary files /dev/null and b/app/src/main/res/drawable/flag_latvian.png differ diff --git a/app/src/main/res/drawable/flag_lithuanian.png b/app/src/main/res/drawable/flag_lithuanian.png new file mode 100644 index 0000000..28bcad7 Binary files /dev/null and b/app/src/main/res/drawable/flag_lithuanian.png differ diff --git a/app/src/main/res/drawable/flag_mongolian.png b/app/src/main/res/drawable/flag_mongolian.png new file mode 100644 index 0000000..f91d10d Binary files /dev/null and b/app/src/main/res/drawable/flag_mongolian.png differ diff --git a/app/src/main/res/drawable/flag_none.png b/app/src/main/res/drawable/flag_none.png new file mode 100644 index 0000000..ac10798 Binary files /dev/null and b/app/src/main/res/drawable/flag_none.png differ diff --git a/app/src/main/res/drawable/flag_polish.png b/app/src/main/res/drawable/flag_polish.png new file mode 100644 index 0000000..42c0983 Binary files /dev/null and b/app/src/main/res/drawable/flag_polish.png differ diff --git a/app/src/main/res/drawable/flag_portuguese_brazil.png b/app/src/main/res/drawable/flag_portuguese_brazil.png new file mode 100644 index 0000000..4a28b53 Binary files /dev/null and b/app/src/main/res/drawable/flag_portuguese_brazil.png differ diff --git a/app/src/main/res/drawable/flag_russian.png b/app/src/main/res/drawable/flag_russian.png new file mode 100644 index 0000000..f507110 Binary files /dev/null and b/app/src/main/res/drawable/flag_russian.png differ diff --git a/app/src/main/res/drawable/flag_serbian.png b/app/src/main/res/drawable/flag_serbian.png new file mode 100644 index 0000000..6dbeb14 Binary files /dev/null and b/app/src/main/res/drawable/flag_serbian.png differ diff --git a/app/src/main/res/drawable/flag_slovak.png b/app/src/main/res/drawable/flag_slovak.png new file mode 100644 index 0000000..e36d641 Binary files /dev/null and b/app/src/main/res/drawable/flag_slovak.png differ diff --git a/app/src/main/res/drawable/flag_spanish_mexico.png b/app/src/main/res/drawable/flag_spanish_mexico.png new file mode 100644 index 0000000..8a822a8 Binary files /dev/null and b/app/src/main/res/drawable/flag_spanish_mexico.png differ diff --git a/app/src/main/res/drawable/flag_spanish_spain.png b/app/src/main/res/drawable/flag_spanish_spain.png new file mode 100644 index 0000000..de5b732 Binary files /dev/null and b/app/src/main/res/drawable/flag_spanish_spain.png differ diff --git a/app/src/main/res/drawable/flag_sweden.png b/app/src/main/res/drawable/flag_sweden.png new file mode 100644 index 0000000..086c18e Binary files /dev/null and b/app/src/main/res/drawable/flag_sweden.png differ diff --git a/app/src/main/res/drawable/flag_tagalog.png b/app/src/main/res/drawable/flag_tagalog.png new file mode 100644 index 0000000..0d573f1 Binary files /dev/null and b/app/src/main/res/drawable/flag_tagalog.png differ diff --git a/app/src/main/res/drawable/flag_thai.png b/app/src/main/res/drawable/flag_thai.png new file mode 100644 index 0000000..ad6ed17 Binary files /dev/null and b/app/src/main/res/drawable/flag_thai.png differ diff --git a/app/src/main/res/drawable/flag_turkish.png b/app/src/main/res/drawable/flag_turkish.png new file mode 100644 index 0000000..a0b164b Binary files /dev/null and b/app/src/main/res/drawable/flag_turkish.png differ diff --git a/app/src/main/res/drawable/flag_ukrainian.png b/app/src/main/res/drawable/flag_ukrainian.png new file mode 100644 index 0000000..6c5ca91 Binary files /dev/null and b/app/src/main/res/drawable/flag_ukrainian.png differ diff --git a/app/src/main/res/drawable/flag_vietnamese_north.png b/app/src/main/res/drawable/flag_vietnamese_north.png new file mode 100644 index 0000000..125675c Binary files /dev/null and b/app/src/main/res/drawable/flag_vietnamese_north.png differ diff --git a/app/src/main/res/drawable/ic_import.png b/app/src/main/res/drawable/ic_import.png new file mode 100644 index 0000000..1df8771 Binary files /dev/null and b/app/src/main/res/drawable/ic_import.png differ diff --git a/app/src/main/res/drawable/ic_list.png b/app/src/main/res/drawable/ic_list.png new file mode 100644 index 0000000..e92ceaf Binary files /dev/null and b/app/src/main/res/drawable/ic_list.png differ diff --git a/app/src/main/res/drawable/ic_plus.png b/app/src/main/res/drawable/ic_plus.png new file mode 100644 index 0000000..020d45d Binary files /dev/null and b/app/src/main/res/drawable/ic_plus.png differ diff --git a/app/src/main/res/drawable/ic_settings.png b/app/src/main/res/drawable/ic_settings.png new file mode 100644 index 0000000..9629408 Binary files /dev/null and b/app/src/main/res/drawable/ic_settings.png differ diff --git a/app/src/main/res/drawable/menu_language.xml b/app/src/main/res/drawable/menu_language.xml new file mode 100644 index 0000000..bf45d26 --- /dev/null +++ b/app/src/main/res/drawable/menu_language.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/schedule_description.xml b/app/src/main/res/drawable/schedule_description.xml new file mode 100644 index 0000000..200cf9e --- /dev/null +++ b/app/src/main/res/drawable/schedule_description.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/schedule_minutes.xml b/app/src/main/res/drawable/schedule_minutes.xml new file mode 100644 index 0000000..327978b --- /dev/null +++ b/app/src/main/res/drawable/schedule_minutes.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/schedule_minutes_selected.xml b/app/src/main/res/drawable/schedule_minutes_selected.xml new file mode 100644 index 0000000..636effc --- /dev/null +++ b/app/src/main/res/drawable/schedule_minutes_selected.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..2b2532e --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_new_schedule.xml b/app/src/main/res/layout/activity_new_schedule.xml new file mode 100644 index 0000000..7f30733 --- /dev/null +++ b/app/src/main/res/layout/activity_new_schedule.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_day.xml b/app/src/main/res/layout/fragment_day.xml new file mode 100644 index 0000000..97cae9c --- /dev/null +++ b/app/src/main/res/layout/fragment_day.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml new file mode 100644 index 0000000..8b0e635 --- /dev/null +++ b/app/src/main/res/layout/fragment_main.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_new_schedule_confirm.xml b/app/src/main/res/layout/fragment_new_schedule_confirm.xml new file mode 100644 index 0000000..7b03555 --- /dev/null +++ b/app/src/main/res/layout/fragment_new_schedule_confirm.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + +