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 = {
+ {"F1GMSA0001", "F1GSRDAY01"},
+ {"F1GSRDAY02"},
+ {"F1GSRDAY03"},
+ {"F1GSRDAY04"},
+ {"F1GSRDAY05"},
+ {"F1GMSA0051", "F1GSRDAY06"},
+ {"F1GSRDAY07"},
+ {"F1GSRDAY08"},
+ {"F1GSRDAY09"},
+ {"F1GSRDAY010"},
+ {"F1GMSA0101", "F1GSRDAY011"},
+ {"F1GSRDAY012"},
+ {"F1GSRDAY013"},
+ {"F1GSRDAY014"},
+ {"F1GSRDAY015"},
+ {"F1GMSA0151", "F1GSRDAY016"},
+ {"F1GSRDAY017"},
+ {"F1GSRDAY018"},
+ {"F1GSRDAY019"},
+ {"F1GSRDAY020"},
+ {"F1GMSA0201", "F1GSRDAY021"},
+ {"F1GSRDAY022"},
+ {"F1GSRDAY023"},
+ {"F1GSRDAY024"},
+ {"F1GSRDAY025"},
+ {"F1GMSA0251", "F1GSRDAY026"},
+ {"F1GSRDAY027"},
+ {"F1GSRDAY028"},
+ {"F1GSRDAY029"},
+ {"F1GSRDAY030"},
+ {"F1GMSA0301", "F1GSRDAY031"},
+ {"F1GSRDAY032"},
+ {"F1GSRDAY033"},
+ {"F1GSRDAY034"},
+ {"F1GSRDAY035"},
+ {"F1GMSA0351", "F1GSRDAY036"},
+ {"F1GSRDAY037"},
+ {"F1GSRDAY038"},
+ {"F1GSRDAY039"},
+ {"F1GSRDAY040"},
+ {"F1GMSA0401", "F1GSRDAY041"},
+ {"F1GSRDAY042"},
+ {"F1GSRDAY043"},
+ {"F1GSRDAY044"},
+ {"F1GSRDAY045"},
+ {"F1GMSA0451", "F1GSRDAY046"},
+ {"F1GSRDAY047"},
+ {"F1GSRDAY048"},
+ {"F1GSRDAY049"},
+ {"F1GSRDAY050"},
+ {"F1GMSA0501", "F1GSRDAY051"},
+ {"F1GSRDAY052"},
+ {"F1GSRDAY053"},
+ {"F1GSRDAY054"},
+ {"F1GSRDAY055"},
+ {"F1GMSA0551", "F1GSRDAY056"},
+ {"F1GSRDAY057"},
+ {"F1GSRDAY058"},
+ {"F1GSRDAY059"},
+ {"F1GSRDAY060"},
+ {"F1GMSA0601", "F1GSRDAY061"},
+ {"F1GSRDAY062"},
+ {"F1GSRDAY063"},
+ {"F1GSRDAY064"},
+ {"F1GSRDAY065"},
+ {"F1GMSA0651", "F1GSRDAY066"},
+ {"F1GSRDAY067"},
+ {"F1GSRDAY068"},
+ {"F1GSRDAY069"},
+ {"F1GSRDAY070"},
+ {"F1GMSA0701", "F1GSRDAY071"},
+ {"F1GSRDAY072"},
+ {"F1GSRDAY073"},
+ {"F1GSRDAY074"},
+ {"F1GSRDAY075"},
+ {"F1GMSA0751", "F1GSRDAY076"},
+ {"F1GSRDAY077"},
+ {"F1GSRDAY078"},
+ {"F1GSRDAY079"},
+ {"F1GSRDAY080"},
+ {"F1GMSA0801", "F1GSRDAY081"},
+ {"F1GSRDAY082"},
+ {"F1GSRDAY083"},
+ {"F1GSRDAY084"},
+ {"F1GSRDAY085"},
+ {"F1GMSA0851", "F1GSRDAY086"},
+ {"F1GSRDAY087"},
+ {"F1GSRDAY088"},
+ {"F1GSRDAY089"},
+ {"F1GSRDAY090"},
+ {"F1GMSA0901", "F1GSRDAY091"},
+ {"F1GSRDAY092"},
+ {"F1GSRDAY093"},
+ {"F1GSRDAY094"},
+ {"F1GSRDAY095"},
+ {"F1GMSA0951", "F1GSRDAY096"},
+ {"F1GSRDAY097"},
+ {"F1GSRDAY098"},
+ {"F1GSRDAY099"},
+ {"F1GSRDAY100"},
+ {"F2GMSA1001", "F2GSRDAY001"},
+ {"F2GSRDAY002"},
+ {"F2GSRDAY003"},
+ {"F2GSRDAY004"},
+ {"F2GSRDAY005"},
+ {"F2GMSA1051", "F2GSRDAY006"},
+ {"F2GSRDAY007"},
+ {"F2GSRDAY008"},
+ {"F2GSRDAY009"},
+ {"F2GSRDAY010"},
+ {"F2GMSA1101", "F2GSRDAY011"},
+ {"F2GSRDAY012"},
+ {"F2GSRDAY013"},
+ {"F2GSRDAY014"},
+ {"F2GSRDAY015"},
+ {"F2GMSA1151", "F2GSRDAY016"},
+ {"F2GSRDAY017"},
+ {"F2GSRDAY018"},
+ {"F2GSRDAY019"},
+ {"F2GSRDAY020"},
+ {"F2GMSA1201", "F2GSRDAY021"},
+ {"F2GSRDAY022"},
+ {"F2GSRDAY023"},
+ {"F2GSRDAY024"},
+ {"F2GSRDAY025"},
+ {"F2GMSA1251", "F2GSRDAY026"},
+ {"F2GSRDAY027"},
+ {"F2GSRDAY028"},
+ {"F2GSRDAY029"},
+ {"F2GSRDAY030"},
+ {"F2GMSA1301", "F2GSRDAY031"},
+ {"F2GSRDAY032"},
+ {"F2GSRDAY033"},
+ {"F2GSRDAY034"},
+ {"F2GSRDAY035"},
+ {"F2GMSA1351", "F2GSRDAY036"},
+ {"F2GSRDAY037"},
+ {"F2GSRDAY038"},
+ {"F2GSRDAY039"},
+ {"F2GSRDAY040"},
+ {"F2GMSA1401", "F2GSRDAY041"},
+ {"F2GSRDAY042"},
+ {"F2GSRDAY043"},
+ {"F2GSRDAY044"},
+ {"F2GSRDAY045"},
+ {"F2GMSA1451", "F2GSRDAY046"},
+ {"F2GSRDAY047"},
+ {"F2GSRDAY048"},
+ {"F2GSRDAY049"},
+ {"F2GSRDAY050"},
+ {"F2GMSA1501", "F2GSRDAY051"},
+ {"F2GSRDAY052"},
+ {"F2GSRDAY053"},
+ {"F2GSRDAY054"},
+ {"F2GSRDAY055"},
+ {"F2GMSA1551", "F2GSRDAY056"},
+ {"F2GSRDAY057"},
+ {"F2GSRDAY058"},
+ {"F2GSRDAY059"},
+ {"F2GSRDAY060"},
+ {"F2GMSA1601", "F2GSRDAY061"},
+ {"F2GSRDAY062"},
+ {"F2GSRDAY063"},
+ {"F2GSRDAY064"},
+ {"F2GSRDAY065"},
+ {"F2GMSA1651", "F2GSRDAY066"},
+ {"F2GSRDAY067"},
+ {"F2GSRDAY068"},
+ {"F2GSRDAY069"},
+ {"F2GSRDAY070"},
+ {"F2GMSA1701", "F2GSRDAY071"},
+ {"F2GSRDAY072"},
+ {"F2GSRDAY073"},
+ {"F2GSRDAY074"},
+ {"F2GSRDAY075"},
+ {"F2GMSA1751", "F2GSRDAY076"},
+ {"F2GSRDAY077"},
+ {"F2GSRDAY078"},
+ {"F2GSRDAY079"},
+ {"F2GSRDAY080"},
+ {"F2GMSA1801", "F2GSRDAY081"},
+ {"F2GSRDAY082"},
+ {"F2GSRDAY083"},
+ {"F2GSRDAY084"},
+ {"F2GSRDAY085"},
+ {"F2GMSA1851", "F2GSRDAY086"},
+ {"F2GSRDAY087"},
+ {"F2GSRDAY088"},
+ {"F2GSRDAY089"},
+ {"F2GSRDAY090"},
+ {"F2GMSA1901", "F2GSRDAY091"},
+ {"F2GSRDAY092"},
+ {"F2GSRDAY093"},
+ {"F2GSRDAY094"},
+ {"F2GSRDAY095"},
+ {"F2GMSA1951", "F2GSRDAY096"},
+ {"F2GSRDAY097"},
+ {"F2GSRDAY098"},
+ {"F2GSRDAY099"},
+ {"F2GSRDAY100"},
+ {"F3GMSA2001", "F3GSRDAY001"},
+ {"F3GSRDAY002"},
+ {"F3GSRDAY003"},
+ {"F3GSRDAY004"},
+ {"F3GSRDAY005"},
+ {"F3GMSA2051", "F3GSRDAY006"},
+ {"F3GSRDAY007"},
+ {"F3GSRDAY008"},
+ {"F3GSRDAY009"},
+ {"F3GSRDAY010"},
+ {"F3GMSA2101", "F3GSRDAY011"},
+ {"F3GSRDAY012"},
+ {"F3GSRDAY013"},
+ {"F3GSRDAY014"},
+ {"F3GSRDAY015"},
+ {"F3GMSA2151", "F3GSRDAY016"},
+ {"F3GSRDAY017"},
+ {"F3GSRDAY018"},
+ {"F3GSRDAY019"},
+ {"F3GSRDAY020"},
+ {"F3GMSA2201", "F3GSRDAY021"},
+ {"F3GSRDAY022"},
+ {"F3GSRDAY023"},
+ {"F3GSRDAY024"},
+ {"F3GSRDAY025"},
+ {"F3GMSA2251", "F3GSRDAY026"},
+ {"F3GSRDAY027"},
+ {"F3GSRDAY028"},
+ {"F3GSRDAY029"},
+ {"F3GSRDAY030"},
+ {"F3GMSA2301", "F3GSRDAY031"},
+ {"F3GSRDAY032"},
+ {"F3GSRDAY033"},
+ {"F3GSRDAY034"},
+ {"F3GSRDAY035"},
+ {"F3GMSA2351", "F3GSRDAY036"},
+ {"F3GSRDAY037"},
+ {"F3GSRDAY038"},
+ {"F3GSRDAY039"},
+ {"F3GSRDAY040"},
+ {"F3GMSA2401", "F3GSRDAY041"},
+ {"F3GSRDAY042"},
+ {"F3GSRDAY043"},
+ {"F3GSRDAY044"},
+ {"F3GSRDAY045"},
+ {"F3GMSA2451", "F3GSRDAY046"},
+ {"F3GSRDAY047"},
+ {"F3GSRDAY048"},
+ {"F3GSRDAY049"},
+ {"F3GSRDAY050"},
+ {"F3GMSA2501", "F3GSRDAY051"},
+ {"F3GSRDAY052"},
+ {"F3GSRDAY053"},
+ {"F3GSRDAY054"},
+ {"F3GSRDAY055"},
+ {"F3GMSA2551", "F3GSRDAY056"},
+ {"F3GSRDAY057"},
+ {"F3GSRDAY058"},
+ {"F3GSRDAY059"},
+ {"F3GSRDAY060"},
+ {"F3GMSA2601", "F3GSRDAY061"},
+ {"F3GSRDAY062"},
+ {"F3GSRDAY063"},
+ {"F3GSRDAY064"},
+ {"F3GSRDAY065"},
+ {"F3GMSA2601", "F3GSRDAY066"},
+ {"F3GSRDAY067"},
+ {"F3GSRDAY068"},
+ {"F3GSRDAY069"},
+ {"F3GSRDAY070"},
+ {"F3GMSA2701", "F3GSRDAY071"},
+ {"F3GSRDAY072"},
+ {"F3GSRDAY073"},
+ {"F3GSRDAY074"},
+ {"F3GSRDAY075"},
+ {"F3GMSA2751", "F3GSRDAY076"},
+ {"F3GSRDAY077"},
+ {"F3GSRDAY078"},
+ {"F3GSRDAY079"},
+ {"F3GSRDAY080"},
+ {"F1GMSA2801", "F3GSRDAY081"},
+ {"F3GSRDAY082"},
+ {"F3GSRDAY083"},
+ {"F3GSRDAY084"},
+ {"F3GSRDAY085"},
+ {"F3GMSA2851", "F3GSRDAY086"},
+ {"F3GSRDAY087"},
+ {"F3GSRDAY088"},
+ {"F3GSRDAY089"},
+ {"F3GSRDAY090"},
+ {"F3GMSA2901", "F3GSRDAY091"},
+ {"F3GSRDAY092"},
+ {"F3GSRDAY093"},
+ {"F3GSRDAY094"},
+ {"F3GSRDAY095"},
+ {"F3GMSA2951", "F3GSRDAY096"},
+ {"F3GSRDAY097"},
+ {"F3GSRDAY098"},
+ {"F3GSRDAY099"},
+ {"F3GSRDAY100"},
+ {"F3GSRDAY101"}
+ };
+ 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 = {
+ {"F1GMSA0001", "F1GMSA0051", "F1GSRDAY002", "F1GSRDAY007"},
+ {"F1GMSA0101", "F1GMSA0151", "F1GSRDAY004", "F1GSRDAY009"},
+ {"F1GMSA0201", "F1GMSA0251", "F1GSRDAY006", "F1GSRDAY011"},
+ {"F1GMSA0301", "F1GMSA0351", "F1GSRDAY008", "F1GSRDAY013"},
+ {"F1GMSA0401", "F1GMSA0451", "F1GSRDAY010", "F1GSRDAY015"},
+ {"F1GMSA0501", "F1GMSA0551", "F1GSRDAY012", "F1GSRDAY017"},
+ {"F1GMSA0601", "F1GMSA0651", "F1GSRDAY014", "F1GSRDAY019"},
+ {"F1GMSA0701", "F1GMSA0751", "F1GSRDAY016", "F1GSRDAY021"},
+ {"F1GMSA0801", "F1GMSA0851", "F1GSRDAY018", "F1GSRDAY023"},
+ {"F1GMSA0901", "F1GMSA0951", "F1GSRDAY020", "F1GSRDAY025"},
+ {"F2GMSA1001", "F2GMSA1051", "F1GSRDAY022", "F1GSRDAY027"},
+ {"F2GMSA1101", "F2GMSA1151", "F1GSRDAY024", "F1GSRDAY029"},
+ {"F2GMSA1201", "F2GMSA1251", "F1GSRDAY026", "F1GSRDAY031"},
+ {"F2GMSA1301", "F2GMSA1351", "F1GSRDAY028", "F1GSRDAY033"},
+ {"F2GMSA1401", "F2GMSA1451", "F1GSRDAY030", "F1GSRDAY035"},
+ {"F2GMSA1501", "F2GMSA1551", "F1GSRDAY032", "F1GSRDAY037"},
+ {"F2GMSA1601", "F2GMSA1651", "F1GSRDAY034", "F1GSRDAY039"},
+ {"F2GMSA1701", "F2GMSA1751", "F1GSRDAY036", "F1GSRDAY041"},
+ {"F2GMSA1801", "F2GMSA1851", "F1GSRDAY038", "F1GSRDAY043"},
+ {"F2GMSA1901", "F2GMSA1951", "F1GSRDAY040", "F1GSRDAY045"},
+ {"F3GMSA2001", "F3GMSA2051", "F1GSRDAY042", "F1GSRDAY047"},
+ {"F3GMSA2101", "F3GMSA2151", "F1GSRDAY044", "F1GSRDAY049"},
+ {"F3GMSA2201", "F3GMSA2251", "F1GSRDAY046", "F1GSRDAY051"},
+ {"F3GMSA2301", "F3GMSA2351", "F1GSRDAY048", "F1GSRDAY053"},
+ {"F3GMSA2401", "F3GMSA2451", "F1GSRDAY050", "F1GSRDAY055"},
+ {"F3GMSA2501", "F3GMSA2551", "F1GSRDAY052", "F1GSRDAY057"},
+ {"F3GMSA2601", "F3GMSA2651", "F1GSRDAY054", "F1GSRDAY059"},
+ {"F3GMSA2701", "F3GMSA2751", "F1GSRDAY056", "F1GSRDAY061"},
+ {"F3GMSA2801", "F3GMSA2851", "F1GSRDAY058", "F1GSRDAY063"},
+ {"F3GMSA2901", "F3GMSA2951", "F1GSRDAY060", "F1GSRDAY065"},
+ {"F1GMSC0001", "F1GMSC0051", "F1GSRDAY062", "F1GSRDAY067"},
+ {"F1GMSB0001", "F1GSRDAY064", "F1GSRDAY069"},
+ {"F1GMSB0051", "F1GSRDAY066", "F1GSRDAY071"},
+ {"F1GMSC0101", "F1GMSC0151", "F1GSRDAY068", "F1GSRDAY073"},
+ {"F1GMSB0101", "F1GSRDAY070", "F1GSRDAY075"},
+ {"F1GMSB0151", "F1GSRDAY072", "F1GSRDAY077"},
+ {"F1GMSC0201", "F1GMSC0251", "F1GSRDAY074", "F1GSRDAY079"},
+ {"F1GMSB0201", "F1GSRDAY076", "F1GSRDAY081"},
+ {"F1GMSB0251", "F1GSRDAY078", "F1GSRDAY083"},
+ {"F1GMSC0301", "F1GMSC0351", "F1GSRDAY080", "F1GSRDAY085"},
+ {"F1GMSB0301", "F1GSRDAY082", "F1GSRDAY087"},
+ {"F1GMSB0351", "F1GSRDAY084", "F1GSRDAY089"},
+ {"F1GMSC0401", "F1GMSC0451", "F1GSRDAY086", "F1GSRDAY091"},
+ {"F1GMSB0401", "F1GSRDAY088", "F1GSRDAY093"},
+ {"F1GMSB0451", "F1GSRDAY090", "F1GSRDAY095"},
+ {"F1GMSC0501", "F1GMSC0551", "F1GSRDAY092", "F1GSRDAY097"},
+ {"F1GMSB0501", "F1GSRDAY094", "F1GSRDAY099"},
+ {"F1GMSB0551", "F1GSRDAY096", "F2GSRDAY001"},
+ {"F1GMSC0601", "F1GMSC0651", "F1GSRDAY098", "F2GSRDAY003"},
+ {"F1GMSB0601", "F1GSRDAY100", "F2GSRDAY005"},
+ {"F1GMSB0651", "F2GSRDAY002", "F2GSRDAY007"},
+ {"F1GMSC0701", "F1GMSC0751", "F2GSRDAY004", "F2GSRDAY009"},
+ {"F1GMSB0701", "F2GSRDAY006", "F2GSRDAY011"},
+ {"F1GMSB0751", "F2GSRDAY008", "F2GSRDAY013"},
+ {"F1GMSC0801", "F1GMSC0851", "F2GSRDAY010", "F2GSRDAY015"},
+ {"F1GMSB0801", "F2GSRDAY012", "F2GSRDAY017"},
+ {"F1GMSB0851", "F2GSRDAY014", "F2GSRDAY019"},
+ {"F1GMSC0901", "F1GMSC0951", "F2GSRDAY016", "F2GSRDAY021"},
+ {"F1GMSB0901", "F2GSRDAY018", "F2GSRDAY023"},
+ {"F1GMSB0951", "F2GSRDAY020", "F2GSRDAY025"},
+ {"F2GMSC1001", "F2GMSC1051", "F2GSRDAY022", "F2GSRDAY027"},
+ {"F2GMSB1001", "F2GSRDAY024", "F2GSRDAY029"},
+ {"F2GMSB1051", "F2GSRDAY026", "F2GSRDAY031"},
+ {"F2GMSC1101", "F2GMSC1151", "F2GSRDAY028", "F2GSRDAY033"},
+ {"F2GMSB1101", "F2GSRDAY030", "F2GSRDAY035"},
+ {"F2GMSB1151", "F2GSRDAY032", "F2GSRDAY037"},
+ {"F2GMSC1201", "F2GMSC1251", "F2GSRDAY034", "F2GSRDAY039"},
+ {"F2GMSB1201", "F2GSRDAY036", "F2GSRDAY041"},
+ {"F2GMSB1251", "F2GSRDAY038", "F2GSRDAY043"},
+ {"F2GMSC1301", "F2GMSC1351", "F2GSRDAY040", "F2GSRDAY045"},
+ {"F2GMSB1301", "F2GSRDAY042", "F2GSRDAY047"},
+ {"F2GMSB1351", "F2GSRDAY044", "F2GSRDAY049"},
+ {"F2GMSC1401", "F2GMSC1451", "F2GSRDAY046", "F2GSRDAY051"},
+ {"F2GMSB1401", "F2GSRDAY048", "F2GSRDAY053"},
+ {"F2GMSB1451", "F2GSRDAY050", "F2GSRDAY055"},
+ {"F2GMSA1501", "F2GMSA1551", "F2GSRDAY052", "F2GSRDAY057"},
+ {"F2GMSA1601", "F2GMSA1651", "F2GSRDAY054", "F2GSRDAY059"},
+ {"F2GMSA1701", "F2GMSA1751", "F2GSRDAY056", "F2GSRDAY061"},
+ {"F2GMSA1801", "F2GMSA1851", "F2GSRDAY058", "F2GSRDAY063"},
+ {"F2GMSA1901", "F2GMSA1951", "F2GSRDAY060", "F2GSRDAY065"},
+ {"F3GMSA2001", "F3GMSA2051", "F2GSRDAY062", "F2GSRDAY067"},
+ {"F3GMSA2101", "F3GMSA2151", "F2GSRDAY064", "F2GSRDAY069"},
+ {"F3GMSA2201", "F3GMSA2251", "F2GSRDAY066", "F2GSRDAY071"},
+ {"F3GMSA2301", "F3GMSA2351", "F2GSRDAY068", "F2GSRDAY073"},
+ {"F3GMSA2401", "F3GMSA2451", "F2GSRDAY070", "F2GSRDAY075"},
+ {"F3GMSA2501", "F3GMSA2551", "F2GSRDAY072", "F2GSRDAY077"},
+ {"F3GMSA2601", "F3GMSA2651", "F2GSRDAY074", "F2GSRDAY079"},
+ {"F3GMSA2701", "F3GMSA2751", "F2GSRDAY076", "F2GSRDAY081"},
+ {"F3GMSA2801", "F3GMSA2851", "F2GSRDAY078", "F2GSRDAY083"},
+ {"F3GMSA2901", "F3GMSA2951", "F2GSRDAY080", "F2GSRDAY085"},
+ {"F2GMSC1501", "F2GMSC1551", "F2GSRDAY082", "F2GSRDAY087"},
+ {"F2GMSB1501", "F2GSRDAY084", "F2GSRDAY089"},
+ {"F2GMSB1551", "F2GSRDAY086", "F2GSRDAY091"},
+ {"F2GMSC1601", "F2GMSC1651", "F2GSRDAY088", "F2GSRDAY093"},
+ {"F2GMSB1601", "F2GSRDAY090", "F2GSRDAY095"},
+ {"F2GMSB1651", "F2GSRDAY092", "F2GSRDAY097"},
+ {"F2GMSC1701", "F2GMSC1751", "F2GSRDAY094", "F2GSRDAY099"},
+ {"F2GMSB1701", "F2GSRDAY096", "F3GSRDAY001"},
+ {"F2GMSB1751", "F2GSRDAY098", "F3GSRDAY003"},
+ {"F2GMSC1801", "F2GMSC1851", "F2GSRDAY100", "F3GSRDAY005"},
+ {"F2GMSB1801", "F3GSRDAY002", "F3GSRDAY007"},
+ {"F2GMSB1851", "F3GSRDAY004", "F3GSRDAY009"},
+ {"F2GMSC1901", "F2GMSC1951", "F3GSRDAY006", "F3GSRDAY011"},
+ {"F2GMSB1901", "F3GSRDAY008", "F3GSRDAY013"},
+ {"F2GMSB1951", "F3GSRDAY010", "F3GSRDAY015"},
+ {"F3GMSA2001", "F3GMSA2051", "F3GSRDAY012", "F3GSRDAY017"},
+ {"F3GMSA2101", "F3GMSA2151", "F3GSRDAY014", "F3GSRDAY019"},
+ {"F3GMSA2201", "F3GMSA2251", "F3GSRDAY016", "F3GSRDAY021"},
+ {"F3GMSA2301", "F3GMSA2351", "F3GSRDAY018", "F3GSRDAY023"},
+ {"F3GMSA2401", "F3GMSA2451", "F3GSRDAY020", "F3GSRDAY025"},
+ {"F3GMSA2501", "F3GMSA2551", "F3GSRDAY022", "F3GSRDAY027"},
+ {"F3GMSA2601", "F3GMSA2651", "F3GSRDAY024", "F3GSRDAY029"},
+ {"F3GMSA2701", "F3GMSA2751", "F3GSRDAY026", "F3GSRDAY031"},
+ {"F3GMSA2801", "F3GMSA2851", "F3GSRDAY028", "F3GSRDAY033"},
+ {"F3GMSA2901", "F3GMSA2951", "F3GSRDAY030", "F3GSRDAY035"},
+ {"F3GMSC2001", "F3GMSC2051", "F3GSRDAY032", "F3GSRDAY037"},
+ {"F3GMSB2001", "F3GSRDAY034", "F3GSRDAY039"},
+ {"F3GMSB2051", "F3GSRDAY036", "F3GSRDAY041"},
+ {"F3GMSC2101", "F3GMSC2151", "F3GSRDAY038", "F3GSRDAY043"},
+ {"F3GMSB2101", "F3GSRDAY040", "F3GSRDAY045"},
+ {"F3GMSB2151", "F3GSRDAY042", "F3GSRDAY047"},
+ {"F3GMSC2201", "F3GMSC2251", "F3GSRDAY044", "F3GSRDAY049"},
+ {"F3GMSB2201", "F3GSRDAY046", "F3GSRDAY051"},
+ {"F3GMSB2251", "F3GSRDAY048", "F3GSRDAY053"},
+ {"F3GMSC2301", "F3GMSC2351", "F3GSRDAY050", "F3GSRDAY055"},
+ {"F3GMSB2301", "F3GSRDAY052", "F3GSRDAY057"},
+ {"F3GMSB2351", "F3GSRDAY054", "F3GSRDAY059"},
+ {"F3GMSC2401", "F3GMSC2451", "F3GSRDAY056", "F3GSRDAY061"},
+ {"F3GMSB2401", "F3GSRDAY058", "F3GSRDAY063"},
+ {"F3GMSB2451", "F3GSRDAY060", "F3GSRDAY065"},
+ {"F3GMSC2501", "F3GMSC2551", "F3GSRDAY062", "F3GSRDAY067"},
+ {"F3GMSB2501", "F3GSRDAY064", "F3GSRDAY069"},
+ {"F3GMSB2551", "F3GSRDAY066", "F3GSRDAY071"},
+ {"F3GMSC2601", "F3GMSC2651", "F3GSRDAY068", "F3GSRDAY073"},
+ {"F3GMSB2601", "F3GSRDAY070", "F3GSRDAY075"},
+ {"F3GMSB2651", "F3GSRDAY072", "F3GSRDAY077"},
+ {"F3GMSC2701", "F3GSRDAY074", "F3GSRDAY079"},
+ {"F3GMSB2701", "F3GSRDAY076", "F3GSRDAY081"},
+ {"F3GMSC2751", "F3GMSC2801", "F3GSRDAY078", "F3GSRDAY083"},
+ {"F3GMSB2751", "F3GSRDAY080", "F3GSRDAY085"},
+ {"F3GMSC2851", "F3GSRDAY082", "F3GSRDAY087"},
+ {"F3GMSB2801", "F3GSRDAY084", "F3GSRDAY089"},
+ {"F3GMSB2851", "F3GSRDAY086", "F3GSRDAY091"},
+ {"F3GMSC2901", "F3GSRDAY088", "F3GSRDAY093"},
+ {"F3GMSB2901", "F3GSRDAY090", "F3GSRDAY095"},
+ {"F3GMSB2951", "F3GSRDAY092", "F3GSRDAY097"},
+ {"F3GSRDAY094", "F3GSRDAY100"}
+ };
+ 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 = {{"F1GMSA0001", "F1GMSA0051", "F1GSRDAY005", "F1GSRDAY010"},
+ {"F1GMSA0101", "F1GMSA0151", "F1GSRDAY011", "F1GSRDAY012"},
+ {"F1GMSA0201", "F1GMSA0251", "F1GSRDAY013", "F1GSRDAY014"},
+ {"F1GMSA0301", "F1GMSA0351", "F1GSRDAY015", "F1GSRDAY016"},
+ {"F1GMSA0401", "F1GMSA0451", "F1GSRDAY017", "F1GSRDAY018"},
+ {"F1GMSA0001", "F1GMSA0051", "F1GSRDAY019", "F1GSRDAY020"},
+ {"F1GMSA0101", "F1GMSA0151", "F1GSRDAY021", "F1GSRDAY022"},
+ {"F1GMSA0201", "F1GMSA0251", "F1GSRDAY023", "F1GSRDAY024"},
+ {"F1GMSA0301", "F1GMSA0351", "F1GSRDAY025", "F1GSRDAY026"},
+ {"F1GMSA0401", "F1GMSA0451", "F1GSRDAY027", "F1GSRDAY028"},
+ {"F1GMSC0001", "F1GMSC0051", "F1GSRDAY029", "F1GSRDAY030"},
+ {"F1GMSC0101", "F1GMSC0151", "F1GSRDAY031", "F1GSRDAY032"},
+ {"F1GMSC0201", "F1GMSC0251", "F1GSRDAY033", "F1GSRDAY034"},
+ {"F1GMSC0301", "F1GMSC0351", "F1GSRDAY035", "F1GSRDAY036"},
+ {"F1GMSC0401", "F1GMSC0451", "F1GSRDAY037", "F1GSRDAY038"},
+ {"F1GMSB0001", "F1GMSB0051", "F1GSRDAY039", "F1GSRDAY040"},
+ {"F1GMSB0101", "F1GMSB0151", "F1GSRDAY041", "F1GSRDAY042"},
+ {"F1GMSB0201", "F1GMSB0251", "F1GSRDAY043", "F1GSRDAY044"},
+ {"F1GMSB0301", "F1GMSB0351", "F1GSRDAY045", "F1GSRDAY046"},
+ {"F1GMSB0401", "F1GMSB0451", "F1GSRDAY047", "F1GSRDAY048"},
+ {"F1GSRDAY049", "F1GSRDAY050"},
+ {"F1GMSA0501", "F1GMSA0551", "F1GSRDAY055", "F1GSRDAY060"},
+ {"F1GMSA0601", "F1GMSA0651", "F1GSRDAY061", "F1GSRDAY062"},
+ {"F1GMSA0701", "F1GMSA0751", "F1GSRDAY063", "F1GSRDAY064"},
+ {"F1GMSA0801", "F1GMSA0851", "F1GSRDAY065", "F1GSRDAY066"},
+ {"F1GMSA0901", "F1GMSA0951", "F1GSRDAY067", "F1GSRDAY068"},
+ {"F1GMSA0501", "F1GMSA0551", "F1GSRDAY069", "F1GSRDAY070"},
+ {"F1GMSA0601", "F1GMSA0651", "F1GSRDAY071", "F1GSRDAY072"},
+ {"F1GMSA0701", "F1GMSA0751", "F1GSRDAY073", "F1GSRDAY074"},
+ {"F1GMSA0801", "F1GMSA0851", "F1GSRDAY075", "F1GSRDAY076"},
+ {"F1GMSA0901", "F1GMSA0951", "F1GSRDAY077", "F1GSRDAY078"},
+ {"F1GMSC0501", "F1GMSC0551", "F1GSRDAY079", "F1GSRDAY080"},
+ {"F1GMSC0601", "F1GMSC0651", "F1GSRDAY081", "F1GSRDAY082"},
+ {"F1GMSC0701", "F1GMSC0751", "F1GSRDAY083", "F1GSRDAY084"},
+ {"F1GMSC0801", "F1GMSC0851", "F1GSRDAY085", "F1GSRDAY086"},
+ {"F1GMSC0901", "F1GMSC0951", "F1GSRDAY087", "F1GSRDAY088"},
+ {"F1GMSB0501", "F1GMSB0551", "F1GSRDAY089", "F1GSRDAY090"},
+ {"F1GMSB0601", "F1GMSB0651", "F1GSRDAY091", "F1GSRDAY092"},
+ {"F1GMSB0701", "F1GMSB0751", "F1GSRDAY093", "F1GSRDAY094"},
+ {"F1GMSB0801", "F1GMSB0851", "F1GSRDAY095", "F1GSRDAY096"},
+ {"F1GMSB0901", "F1GMSB0951", "F1GSRDAY097", "F1GSRDAY098"},
+ {"F1GSRDAY099", "F1GSRDAY100"},
+ {"F2GMSA1001", "F2GMSA1051", "F2GSRDAY005", "F2GSRDAY010"},
+ {"F2GMSA1101", "F2GMSA1151", "F2GSRDAY011", "F2GSRDAY012"},
+ {"F2GMSA1201", "F2GMSA1251", "F2GSRDAY013", "F2GSRDAY014"},
+ {"F2GMSA1301", "F2GMSA1351", "F2GSRDAY015", "F2GSRDAY016"},
+ {"F2GMSA1401", "F2GMSA1451", "F2GSRDAY017", "F2GSRDAY018"},
+ {"F2GMSA1001", "F2GMSA1051", "F2GSRDAY019", "F2GSRDAY020"},
+ {"F2GMSA1101", "F2GMSA1151", "F2GSRDAY021", "F2GSRDAY022"},
+ {"F2GMSA1201", "F2GMSA1251", "F2GSRDAY023", "F2GSRDAY024"},
+ {"F2GMSA1301", "F2GMSA1351", "F2GSRDAY025", "F2GSRDAY026"},
+ {"F2GMSA1401", "F2GMSA1451", "F2GSRDAY027", "F2GSRDAY028"},
+ {"F2GMSC1001", "F2GMSC1051", "F2GSRDAY029", "F2GSRDAY030"},
+ {"F2GMSC1101", "F2GMSC1151", "F2GSRDAY031", "F2GSRDAY032"},
+ {"F2GMSC1201", "F2GMSC1251", "F2GSRDAY033", "F2GSRDAY034"},
+ {"F2GMSC1301", "F2GMSC1351", "F2GSRDAY035", "F2GSRDAY036"},
+ {"F2GMSC1401", "F2GMSC1451", "F2GSRDAY037", "F2GSRDAY038"},
+ {"F2GMSB1001", "F2GMSB1051", "F2GSRDAY039", "F2GSRDAY040"},
+ {"F2GMSB1101", "F2GMSB1151", "F2GSRDAY041", "F2GSRDAY042"},
+ {"F2GMSB1201", "F2GMSB1251", "F2GSRDAY043", "F2GSRDAY044"},
+ {"F2GMSB1301", "F2GMSB1351", "F2GSRDAY045", "F2GSRDAY046"},
+ {"F2GMSB1401", "F2GMSB1451", "F2GSRDAY047", "F2GSRDAY048"},
+ {"F2GSRDAY049", "F2GSRDAY050"},
+ {"F2GMSA1501", "F2GMSA1551", "F2GSRDAY055", "F2GSRDAY060"},
+ {"F2GMSA1601", "F2GMSA1651", "F2GSRDAY061", "F2GSRDAY062"},
+ {"F2GMSA1701", "F2GMSA1751", "F2GSRDAY063", "F2GSRDAY064"},
+ {"F2GMSA1801", "F2GMSA1851", "F2GSRDAY065", "F2GSRDAY066"},
+ {"F2GMSA1901", "F2GMSA1951", "F2GSRDAY067", "F2GSRDAY068"},
+ {"F2GMSA1501", "F2GMSA1551", "F2GSRDAY069", "F2GSRDAY070"},
+ {"F2GMSA1601", "F2GMSA1651", "F2GSRDAY071", "F2GSRDAY072"},
+ {"F2GMSA1701", "F2GMSA1751", "F2GSRDAY073", "F2GSRDAY074"},
+ {"F2GMSA1801", "F2GMSA1851", "F2GSRDAY075", "F2GSRDAY076"},
+ {"F2GMSA1901", "F2GMSA1951", "F2GSRDAY077", "F2GSRDAY078"},
+ {"F2GMSC1501", "F2GMSC1551", "F2GSRDAY079", "F2GSRDAY080"},
+ {"F2GMSC1601", "F2GMSC1651", "F2GSRDAY081", "F2GSRDAY082"},
+ {"F2GMSC1701", "F2GMSC1751", "F2GSRDAY083", "F2GSRDAY084"},
+ {"F2GMSC1801", "F2GMSC1851", "F2GSRDAY085", "F2GSRDAY086"},
+ {"F2GMSC1901", "F2GMSC1951", "F2GSRDAY087", "F2GSRDAY088"},
+ {"F2GMSB1501", "F2GMSB1551", "F2GSRDAY089", "F2GSRDAY090"},
+ {"F2GMSB1601", "F2GMSB1651", "F2GSRDAY091", "F2GSRDAY092"},
+ {"F2GMSB1701", "F2GMSB1751", "F2GSRDAY093", "F2GSRDAY094"},
+ {"F2GMSB1801", "F2GMSB1851", "F2GSRDAY095", "F2GSRDAY096"},
+ {"F2GMSB1901", "F2GMSB1951", "F2GSRDAY097", "F2GSRDAY098"},
+ {"F2GSRDAY099", "F2GSRDAY100"},
+ {"F3GMSA2001", "F3GMSA2051", "F3GSRDAY005", "F3GSRDAY010"},
+ {"F3GMSA2101", "F3GMSA2151", "F3GSRDAY011", "F3GSRDAY012"},
+ {"F3GMSA2201", "F3GMSA2251", "F3GSRDAY013", "F3GSRDAY014"},
+ {"F3GMSA2301", "F3GMSA2351", "F3GSRDAY015", "F3GSRDAY016"},
+ {"F3GMSA2401", "F3GMSA2451", "F3GSRDAY017", "F3GSRDAY018"},
+ {"F3GMSA2001", "F3GMSA2051", "F3GSRDAY019", "F3GSRDAY020"},
+ {"F3GMSA2101", "F3GMSA2151", "F3GSRDAY021", "F3GSRDAY022"},
+ {"F3GMSA2201", "F3GMSA2251", "F3GSRDAY023", "F3GSRDAY024"},
+ {"F3GMSA2301", "F3GMSA2351", "F3GSRDAY025", "F3GSRDAY026"},
+ {"F3GMSA2401", "F3GMSA2451", "F3GSRDAY027", "F3GSRDAY028"},
+ {"F3GMSC2001", "F3GMSC2051", "F3GSRDAY029", "F3GSRDAY030"},
+ {"F3GMSC2101", "F3GMSC2151", "F3GSRDAY031", "F3GSRDAY032"},
+ {"F3GMSC2201", "F3GMSC2251", "F3GSRDAY033", "F3GSRDAY034"},
+ {"F3GMSC2301", "F3GMSC2351", "F3GSRDAY035", "F3GSRDAY036"},
+ {"F3GMSC2401", "F3GMSC2451", "F3GSRDAY037", "F3GSRDAY038"},
+ {"F3GMSB2001", "F3GMSB2051", "F3GSRDAY039", "F3GSRDAY040"},
+ {"F3GMSB2101", "F3GMSB2151", "F3GSRDAY041", "F3GSRDAY042"},
+ {"F3GMSB2201", "F3GMSB2251", "F3GSRDAY043", "F3GSRDAY044"},
+ {"F3GMSB2301", "F3GMSB2351", "F3GSRDAY045", "F3GSRDAY046"},
+ {"F3GMSB2401", "F3GMSB2451", "F3GSRDAY047", "F3GSRDAY048"},
+ {"F3GSRDAY049", "F3GSRDAY050"},
+ {"F3GMSA2501", "F3GMSA2551", "F3GSRDAY055", "F3GSRDAY060"},
+ {"F3GMSA2601", "F3GMSA2651", "F3GSRDAY061", "F3GSRDAY062"},
+ {"F3GMSA2701", "F3GMSA2751", "F3GSRDAY063", "F3GSRDAY064"},
+ {"F3GMSA2801", "F3GMSA2851", "F3GSRDAY065", "F3GSRDAY066"},
+ {"F3GMSA2901", "F3GMSA2951", "F3GSRDAY067", "F3GSRDAY068"},
+ {"F3GMSA2501", "F3GMSA2551", "F3GSRDAY069", "F3GSRDAY070"},
+ {"F3GMSA2601", "F3GMSA2651", "F3GSRDAY071", "F3GSRDAY072"},
+ {"F3GMSA2701", "F3GMSA2751", "F3GSRDAY073", "F3GSRDAY074"},
+ {"F3GMSA2801", "F3GMSA2851", "F3GSRDAY075", "F3GSRDAY076"},
+ {"F3GMSA2901", "F3GMSA2951", "F3GSRDAY077", "F3GSRDAY078"},
+ {"F3GMSB2501", "F3GMSB2551", "F3GSRDAY079", "F3GSRDAY080"},
+ {"F3GMSB2601", "F3GMSB2651", "F3GSRDAY081", "F3GSRDAY082"},
+ {"F3GMSB2701", "F3GMSB2751", "F3GSRDAY083", "F3GSRDAY084"},
+ {"F3GMSB2801", "F3GMSB2851", "F3GSRDAY085", "F3GSRDAY086"},
+ {"F3GMSB2901", "F3GMSB2951", "F3GSRDAY087", "F3GSRDAY088"},
+ {"F3GMSB2501", "F3GMSB2551", "F3GSRDAY089", "F3GSRDAY090"},
+ {"F3GMSB2601", "F3GMSB2651", "F3GSRDAY091", "F3GSRDAY092"},
+ {"F3GMSB2701", "F3GMSB2751", "F3GSRDAY093", "F3GSRDAY094"},
+ {"F3GMSB2801", "F3GMSB2851", "F3GSRDAY095", "F3GSRDAY096"},
+ {"F3GMSB2901", "F3GMSB2951", "F3GSRDAY097", "F3GSRDAY098"},
+ {"F3GSRDAY099", "F3GSRDAY100"}};
+
+ 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 = {{"F1GMSA0001", "F1GMSA0051", "F1GSRDAY003", "F1GSRDAY013"},
+ {"F1GMSA0101", "F1GMSA0151", "F1GSRDAY006", "F1GSRDAY016"},
+ {"F1GMSA0201", "F1GMSA0251", "F1GSRDAY009", "F1GSRDAY019"},
+ {"F1GMSA0301", "F1GMSA0351", "F1GSRDAY012", "F1GSRDAY022"},
+ {"F1GMSA0401", "F1GMSA0451", "F1GSRDAY015", "F1GSRDAY025"},
+ {"F1GMSC0001", "F1GMSC0051", "F1GSRDAY018", "F1GSRDAY028"},
+ {"F1GMSC0101", "F1GMSC0151", "F1GSRDAY021", "F1GSRDAY031"},
+ {"F1GMSC0201", "F1GMSC0251", "F1GSRDAY026", "F1GSRDAY036"},
+ {"F1GMSC0301", "F1GMSC0351", "F1GSRDAY029", "F1GSRDAY039"},
+ {"F1GMSC0401", "F1GMSC0451", "F1GSRDAY032", "F1GSRDAY042"},
+ {"F1GMSB0001", "F1GMSB0051", "F1GSRDAY035", "F1GSRDAY045"},
+ {"F1GMSB0101", "F1GMSB0151", "F1GSRDAY038", "F1GSRDAY048"},
+ {"F1GMSB0201", "F1GMSB0251", "F1GSRDAY041", "F1GSRDAY051"},
+ {"F1GMSB0301", "F1GMSB0351", "F1GSRDAY044", "F1GSRDAY054"},
+ {"F1GMSB0401", "F1GMSB0451", "F1GSRDAY049", "F1GSRDAY059"},
+ {"F1GMSA0501", "F1GMSA0551", "F1GSRDAY052", "F1GSRDAY062"},
+ {"F1GMSA0601", "F1GMSA0651", "F1GSRDAY055", "F1GSRDAY065"},
+ {"F1GMSA0701", "F1GMSA0751", "F1GSRDAY058", "F1GSRDAY068"},
+ {"F1GMSA0801", "F1GMSA0851", "F1GSRDAY061", "F1GSRDAY071"},
+ {"F1GMSA0901", "F1GMSA0951", "F1GSRDAY064", "F1GSRDAY074"},
+ {"F1GMSC0501", "F1GMSC0551", "F1GSRDAY067", "F1GSRDAY077"},
+ {"F1GMSC0601", "F1GMSC0651", "F1GSRDAY072", "F1GSRDAY082"},
+ {"F1GMSC0701", "F1GMSC0751", "F1GSRDAY075", "F1GSRDAY085"},
+ {"F1GMSC0801", "F1GMSC0851", "F1GSRDAY078", "F1GSRDAY088"},
+ {"F1GMSC0901", "F1GMSC0951", "F1GSRDAY081", "F1GSRDAY091"},
+ {"F1GMSB0501", "F1GMSB0551", "F1GSRDAY084", "F1GSRDAY094"},
+ {"F1GMSB0601", "F1GMSB0651", "F1GSRDAY087", "F1GSRDAY097"},
+ {"F1GMSB0701", "F1GMSB0751", "F1GSRDAY090", "F1GSRDAY100"},
+ {"F1GMSB0801", "F1GMSB0851", "F1GSRDAY095", "F2GSRDAY005"},
+ {"F1GMSB0901", "F1GMSB0951", "F1GSRDAY098", "F2GSRDAY008"},
+ {"F2GMSA1001", "F2GMSA1051", "F2GSRDAY001", "F2GSRDAY011"},
+ {"F2GMSA1101", "F2GMSA1151", "F2GSRDAY004", "F2GSRDAY014"},
+ {"F2GMSA1201", "F2GMSA1251", "F2GSRDAY007", "F2GSRDAY017"},
+ {"F2GMSA1301", "F2GMSA1351", "F2GSRDAY010", "F2GSRDAY020"},
+ {"F2GMSA1401", "F2GMSA1451", "F2GSRDAY013", "F2GSRDAY023"},
+ {"F2GMSC1001", "F2GMSC1051", "F2GSRDAY018", "F2GSRDAY028"},
+ {"F2GMSC1101", "F2GMSC1151", "F2GSRDAY021", "F2GSRDAY031"},
+ {"F2GMSC1201", "F2GMSC1251", "F2GSRDAY024", "F2GSRDAY034"},
+ {"F2GMSC1301", "F2GMSC1351", "F2GSRDAY027", "F2GSRDAY037"},
+ {"F2GMSC1401", "F2GMSC1451", "F2GSRDAY030", "F2GSRDAY040"},
+ {"F2GMSB1001", "F2GMSB1051", "F2GSRDAY033", "F2GSRDAY043"},
+ {"F2GMSB1101", "F2GMSB151", "F2GSRDAY036", "F2GSRDAY046"},
+ {"F2GMSB1201", "F2GMSB1251", "F2GSRDAY041", "F2GSRDAY051"},
+ {"F2GMSB1301", "F2GMSB1351", "F2GSRDAY044", "F2GSRDAY054"},
+ {"F2GMSB1401", "F2GMSB1451", "F2GSRDAY047", "F2GSRDAY057"},
+ {"F2GMSA1501", "F2GMSA1551", "F2GSRDAY050", "F2GSRDAY060"},
+ {"F2GMSA1601", "F2GMSA1651", "F2GSRDAY053", "F2GSRDAY063"},
+ {"F2GMSA1701", "F2GMSA1751", "F2GSRDAY056", "F2GSRDAY066"},
+ {"F2GMSA1801", "F2GMSA1851", "F2GSRDAY059", "F2GSRDAY069"},
+ {"F2GMSA1901", "F2GMSA1951", "F2GSRDAY064", "F2GSRDAY074"},
+ {"F2GMSC1501", "F2GMSC1551", "F2GSRDAY067", "F2GSRDAY077"},
+ {"F2GMSC1601", "F2GMSC1651", "F2GSRDAY070", "F2GSRDAY080"},
+ {"F2GMSC1701", "F2GMSC1751", "F2GSRDAY073", "F2GSRDAY083"},
+ {"F2GMSC1801", "F2GMSC1851", "F2GSRDAY076", "F2GSRDAY086"},
+ {"F2GMSC1901", "F2GMSC1951", "F2GSRDAY079", "F2GSRDAY089"},
+ {"F2GMSB1501", "F2GMSB1551", "F2GSRDAY082", "F2GSRDAY092"},
+ {"F2GMSB1601", "F2GMSB1651", "F2GSRDAY087", "F2GSRDAY097"},
+ {"F2GMSB1701", "F2GMSB1751", "F2GSRDAY090", "F2GSRDAY100"},
+ {"F2GMSB1801", "F2GMSB1851", "F2GSRDAY093", "F3GSRDAY003"},
+ {"F2GMSB1901", "F2GMSB1951", "F2GSRDAY096", "F3GSRDAY006"},
+ {"F3GMSA2001", "F3GMSA2051", "F2GSRDAY099", "F3GSRDAY009"},
+ {"F3GMSA2101", "F3GMSA2151", "F3GSRDAY002", "F3GSRDAY012"},
+ {"F3GMSA2201", "F3GMSA2251", "F3GSRDAY005", "F3GSRDAY015"},
+ {"F3GMSA2301", "F3GMSA2351", "F3GSRDAY010", "F3GSRDAY020"},
+ {"F3GMSA2401", "F3GMSA2451", "F3GSRDAY013", "F3GSRDAY023"},
+ {"F3GMSC2001", "F3GMSC2051", "F3GSRDAY016", "F3GSRDAY026"},
+ {"F3GMSC2101", "F3GMSC2151", "F3GSRDAY019", "F3GSRDAY029"},
+ {"F3GMSC2201", "F3GMSC2251", "F3GSRDAY022", "F3GSRDAY032"},
+ {"F3GMSC2301", "F3GMSC2351", "F3GSRDAY025", "F3GSRDAY035"},
+ {"F3GMSC2401", "F3GMSC2451", "F3GSRDAY028", "F3GSRDAY038"},
+ {"F3GMSB2001", "F2GMSB2051", "F3GSRDAY033", "F3GSRDAY043"},
+ {"F3GMSB2101", "F2GMSB2151", "F3GSRDAY036", "F2GSRDAY046"},
+ {"F3GMSB2201", "F2GMSB2251", "F3GSRDAY039", "F3GSRDAY049"},
+ {"F3GMSB2301", "F2GMSB2351", "F3GSRDAY042", "F3GSRDAY052"},
+ {"F3GMSB2401", "F2GMSB2451", "F3GSRDAY045", "F3GSRDAY055"},
+ {"F3GMSA2501", "F2GMSA2551", "F3GSRDAY048", "F3GSRDAY058"},
+ {"F3GMSA2601", "F2GMSA2651", "F3GSRDAY051", "F3GSRDAY061"},
+ {"F3GMSA2701", "F2GMSA2751", "F3GSRDAY056", "F3GSRDAY066"},
+ {"F3GMSA2801", "F2GMSA2851", "F3GSRDAY059", "F3GSRDAY069"},
+ {"F3GMSA2901", "F2GMSA2951", "F3GSRDAY062", "F3GSRDAY072"},
+ {"F3GMSC2501", "F2GMSC2551", "F3GSRDAY065", "F3GSRDAY075"},
+ {"F3GMSC2601", "F2GMSC2651", "F3GSRDAY068", "F3GSRDAY078"},
+ {"F3GMSC2701", "F2GMSC2751", "F3GSRDAY071", "F3GSRDAY081"},
+ {"F3GMSC2801", "F2GMSC2851", "F3GSRDAY074", "F3GSRDAY084"},
+ {"F3GMSC2901", "F2GMSC2951", "F3GSRDAY079", "F3GSRDAY089"},
+ {"F3GMSB2501", "F2GMSB2551", "F3GSRDAY082", "F3GSRDAY092"},
+ {"F3GMSB2601", "F2GMSB2651", "F3GSRDAY085", "F3GSRDAY095"},
+ {"F3GMSB2701", "F2GMSB2751", "F3GSRDAY088", "F3GSRDAY098"},
+ {"F3GMSB2801", "F2GMSB2851", "F3GSRDAY091", "F3GSRDAY101"},
+ {"F3GMSB2901", "F2GMSB2951", "F3GSRDAY094", "F3GSRDAY104"},
+ {"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 = {{"F1GMSC0001", "F1GMSC0051", "F1GMSC0101", "F1GSRDAY003", "F1GSRDAY009"},
+ {"F1GMSC0151", "F1GMSC0201", "F1GMSC0251", "F1GSRDAY006", "F1GSRDAY012"},
+ {"F1GMSC0301", "F1GMSC0351", "F1GMSC0401", "F1GSRDAY015", "F1GSRDAY021"},
+ {"F1GMSB0001", "F1GMSB0051", "F1GSRDAY018", "F1GSRDAY024"},
+ {"F1GMSB0101", "F1GMSB0151", "F1GSRDAY027", "F1GSRDAY033"},
+ {"F1GMSB0201", "F1GMSB0251", "F1GSRDAY030", "F1GSRDAY036"},
+ {"F1GMSC0451", "F1GMSC0501", "F1GMSC0551", "F1GSRDAY039", "F1GSRDAY045"},
+ {"F1GMSC0601", "F1GMSC0651", "F1GMSC0701", "F1GSRDAY042", "F1GSRDAY048"},
+ {"F1GMSC0751", "F1GMSC0801", "F1GMSC0851", "F1GSRDAY050", "F1GSRDAY056"},
+ {"F1GMSB0301", "F1GMSB0351", "F1GSRDAY052", "F1GSRDAY058"},
+ {"F1GMSB0401", "F1GMSB0451", "F1GSRDAY054", "F1GSRDAY060"},
+ {"F1GMSB0501", "F1GMSB0551", "F1GSRDAY063", "F1GSRDAY069"},
+ {"F1GMSC0901", "F1GMSC0951", "F2GMSC1001", "F1GSRDAY066", "F1GSRDAY072"},
+ {"F2GMSC1051", "F2GMSC1101", "F2GMSC1151", "F1GSRDAY075", "F1GSRDAY081"},
+ {"F2GMSC1201", "F2GMSC1251", "F2GMSC1301", "F1GSRDAY078", "F2GSRDAY084"},
+ {"F1GMSB0601", "F1GMSB0651", "F1GSRDAY087", "F1GSRDAY093"},
+ {"F1GMSB0701", "F1GMSB0751", "F1GSRDAY090", "F1GSRDAY096"},
+ {"F1GMSB0801", "F1GMSB0851", "F1GSRDAY098", "F2GSRDAY004"},
+ {"F2GMSC1351", "F2GMSC1401", "F2GMSC1451", "F1GSRDAY100", "F2GSRDAY006"},
+ {"F2GMSC1501", "F2GMSC1551", "F2GMSC1601", "F2GSRDAY002", "F2GSRDAY008"},
+ {"F2GMSC1601", "F2GMSC1701", "F2GMSC1751", "F2GSRDAY011", "F2GSRDAY017"},
+ {"F1GMSB0901", "F1GMSB0951", "F2GSRDAY014", "F2GSRDAY020"},
+ {"F2GMSB1001", "F2GMSB1051", "F2GSRDAY023", "F2GSRDAY029"},
+ {"F2GMSB1101", "F2GMSB1151", "F2GSRDAY026", "F2GSRDAY032"},
+ {"F2GMSC1801", "F2GMSC1851", "F2GMSC1901", "F2GSRDAY035", "F2GSRDAY041"},
+ {"F2GMSC1951", "F3GMSC2001", "F3GMSC2051", "F2GSRDAY038", "F2GSRDAY044"},
+ {"F2GMSC2101", "F2GMSC2151", "F3GMSC2201", "F2GSRDAY046", "F2GSRDAY052"},
+ {"F2GMSB1201", "F2GMSB1251", "F2GSRDAY048", "F2GSRDAY054"},
+ {"F2GMSB1301", "F2GMSB1351", "F2GSRDAY050", "F2GSRDAY056"},
+ {"F2GMSB1401", "F2GMSB1451", "F2GSRDAY059", "F2GSRDAY065"},
+ {"F3GMSC2251", "F3GMSC2301", "F3GMSC2351", "F2GSRDAY062", "F2GSRDAY068"},
+ {"F3GMSC2401", "F3GMSC2451", "F3GMSC2501", "F2GSRDAY071", "F2GSRDAY077"},
+ {"F3GMSC2551", "F3GMSC2601", "F3GMSC2651", "F2GSRDAY074", "F2GSRDAY080"},
+ {"F2GMSB1501", "F2GMSB1551", "F2GSRDAY083", "F2GSRDAY089"},
+ {"F2GMSB1601", "F2GMSB1651", "F2GSRDAY086", "F2GSRDAY092"},
+ {"F2GMSB1701", "F2GMSB1751", "F2GSRDAY095", "F3GSRDAY001"},
+ {"F3GMSC2701", "F3GMSC2751", "F3GMSC2801", "F2GSRDAY098", "F3GSRDAY004"},
+ {"F3GMSC2851", "F3GMSC2901", "F3GMSC2951", "F3GSRDAY006", "F3GSRDAY012"},
+ {"F3GMSC2001", "F3GMSC2051", "F3GMSC2101", "F3GSRDAY008", "F3GSRDAY014"},
+ {"F2GMSB1801", "F2GMSB1851", "F3GSRDAY010", "F3GSRDAY016"},
+ {"F2GMSB1901", "F2GMSB1951", "F3GSRDAY019", "F3GSRDAY025"},
+ {"F3GMSB2001", "F3GMSB2051", "F3GSRDAY022", "F3GSRDAY028"},
+ {"F3GMSC2201", "F1GMSC2251", "F3GMSC2301", "F3GMSC2351", "F3GSRDAY031", "F3GSRDAY037"},
+ {"F3GMSC2401", "F3GMSC2451", "F3GMSC2501", "F3GMSC2551", "F3GSRDAY034", "F3GSRDAY040"},
+ {"F3GMSC2601", "F3GMSC2651", "F3GMSC2701", "F3GMSC2751", "F3GSRDAY043", "F3GSRDAY049"},
+ {"F3GMSB2101", "F3GMSB2151", "F3GSRDAY046", "F3GSRDAY052"},
+ {"F3GMSB2201", "F3GMSB2251", "F3GSRDAY054", "F3GSRDAY060"},
+ {"F3GMSB2301", "F3GMSB2351", "F3GSRDAY056", "F3GSRDAY062"},
+ {"F3GMSC2801", "F3GMSC2851", "F3GMSC2901", "F3GMSC2951", "F3GSRDAY058", "F3GSRDAY064"},
+ {"F3GMSB2401", "F3GMSB2451", "F3GSRDAY067", "F3GSRDAY073"},
+ {"F3GMSB2501", "F3GMSB2551", "F3GSRDAY070", "F3GSRDAY076"},
+ {"F3GMSB2601", "F3GMSB2651", "F3GSRDAY079", "F3GSRDAY085"},
+ {"F3GMSB2701", "F3GMSB2751", "F3GSRDAY082", "F3GSRDAY088"},
+ {"F3GMSB2801", "F3GMSB2851", "F3GSRDAY091", "F3GSRDAY097"},
+ {"F3GMSB2901", "F3GMSB2951", "F3GSRDAY094", "F3GSRDAY100"},
+ {"F3GSRDAY098", "F3GSRDAY104"}};
+
+
+ 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 = {{"F1GMSC0001", "F1GMSC0051", "F1GMSC0101", "F1GMSC0151", "F1GMSC0201", "F1GSRDAY003", "F1GSRDAY005", "F1GSRDAY007"},
+ {"F1GMSC0251", "F1GMSC0301", "F1GMSC0351", "F1GMSC0401", "F1GMSC0451", "F1GSRDAY010", "F1GSRDAY017", "F1GSRDAY024"},
+ {"F1GMSC0501", "F1GMSC0551", "F1GMSC0601", "F1GMSC0651", "F1GMSC0701", "F1GSRDAY012", "F1GSRDAY019", "F1GSRDAY026"},
+ {"F1GMSC0751", "F1GMSC0801", "F1GMSC0851", "F1GMSC0901", "F1GMSC0951", "F1GSRDAY014", "F1GSRDAY021", "F1GSRDAY028"},
+ {"F1GMSB0001", "F1GMSB0051", "F1GSRDAY031", "F1GSRDAY038", "F1GSRDAY045"},
+ {"F1GMSB0101", "F1GMSB0151", "F1GSRDAY033", "F1GSRDAY040", "F1GSRDAY047"},
+ {"F1GMSB0201", "F1GMSB0251", "F1GSRDAY035", "F1GSRDAY042", "F1GSRDAY049"},
+ {"F1GMSB0301", "F1GMSB0351", "F1GSRDAY052", "F1GSRDAY059", "F1GSRDAY066"},
+ {"F1GMSB0401", "F1GMSB0451", "F1GSRDAY054", "F1GSRDAY061", "F1GSRDAY068"},
+ {"F1GMSB0501", "F1GMSB0551", "F1GSRDAY056", "F1GSRDAY063", "F1GSRDAY070"},
+ {"F1GMSB0601", "F1GMSB0651", "F1GSRDAY073", "F1GSRDAY080", "F1GSRDAY087"},
+ {"F1GMSB0701", "F1GMSB0751", "F1GSRDAY075", "F1GSRDAY082", "F1GSRDAY089"},
+ {"F1GMSB0801", "F1GMSB0851", "F1GSRDAY077", "F1GSRDAY084", "F1GSRDAY091"},
+ {"F1GMSB0901", "F1GMSB0951", "F1GSRDAY094", "F2GSRDAY001", "F2GSRDAY008"},
+ {"F2GMSC1001", "F2GMSC1051", "F2GMSC1101", "F2GMSC1151", "F2GMSC1201", "F1GSRDAY096", "F2GSRDAY003", "F2GSRDAY010"},
+ {"F2GMSC1251", "F2GMSC1301", "F2GMSC1351", "F2GMSC1401", "F2GMSC1451", "F1GSRDAY098", "F2GSRDAY005", "F2GSRDAY012"},
+ {"F2GMSC1501", "F2GMSC1551", "F2GMSC1601", "F2GMSC1651", "F2GMSC1701", "F2GSRDAY015", "F2GSRDAY022", "F2GSRDAY029"},
+ {"F2GMSC1751", "F2GMSC1801", "F2GMSC1851", "F2GMSC1901", "F2GMSC1951", "F2GSRDAY017", "F2GSRDAY023", "F2GSRDAY031"},
+ {"F2GMSB1001", "F2GMSB1051", "F2GSRDAY019", "F2GSRDAY025", "F2GSRDAY033"},
+ {"F2GMSB1101", "F2GMSB1151", "F2GSRDAY036", "F2GSRDAY043", "F2GSRDAY050"},
+ {"F2GMSB1201", "F2GMSB1251", "F2GSRDAY038", "F2GSRDAY045", "F2GSRDAY052"},
+ {"F2GMSB1301", "F2GMSB1351", "F2GSRDAY040", "F2GSRDAY047", "F2GSRDAY054"},
+ {"F2GMSB1401", "F2GMSB1451", "F2GSRDAY057", "F2GSRDAY064", "F2GSRDAY071"},
+ {"F2GMSB1501", "F2GMSB1551", "F2GSRDAY059", "F2GSRDAY066", "F2GSRDAY073"},
+ {"F2GMSB1601", "F2GMSB1651", "F2GSRDAY061", "F2GSRDAY068", "F2GSRDAY075"},
+ {"F2GMSB1701", "F2GMSB1751", "F2GSRDAY078", "F2GSRDAY085", "F2GSRDAY092"},
+ {"F2GMSB1801", "F2GMSB1851", "F2GSRDAY080", "F2GSRDAY087", "F2GSRDAY094"},
+ {"F2GMSB1901", "F2GMSB1951", "F2GSRDAY082", "F2GSRDAY089", "F2GSRDAY096"},
+ {"F3GMSC2001", "F3GMSC2051", "F3GMSC2101", "F3GMSC2151", "F3GMSC2201", "F2GSRDAY099", "F3GSRDAY006", "F3GSRDAY013"},
+ {"F3GMSC2251", "F3GMSC2301", "F3GMSC2351", "F3GMSC2401", "F3GMSC2451", "F3GSRDAY001", "F3GSRDAY008", "F3GSRDAY015"},
+ {"F3GMSC2501", "F3GMSC2551", "F3GMSC2601", "F3GMSC2651", "F3GMSC2701", "F3GSRDAY003", "F3GSRDAY010", "F3GSRDAY017"},
+ {"F3GMSC2751", "F3GMSC2801", "F3GMSC2851", "F3GMSC2901", "F3GMSC2951", "F3GSRDAY020", "F3GSRDAY027", "F3GSRDAY034"},
+ {"F3GMSB2001", "F3GMSB2051", "F3GSRDAY022", "F3GSRDAY029", "F3GSRDAY036"},
+ {"F3GMSB2101", "F3GMSB2151", "F3GSRDAY024", "F3GSRDAY031", "F3GSRDAY038"},
+ {"F3GMSB2201", "F3GMSB2251", "F3GSRDAY041", "F3GSRDAY048", "F3GSRDAY055"},
+ {"F3GMSB2301", "F3GMSB2351", "F3GSRDAY043", "F3GSRDAY050", "F3GSRDAY057"},
+ {"F3GMSB2401", "F3GMSB2451", "F3GSRDAY045", "F3GSRDAY052", "F3GSRDAY059"},
+ {"F3GMSB2501", "F3GMSB2551", "F3GSRDAY062", "F3GSRDAY069", "F3GSRDAY076"},
+ {"F3GMSB2601", "F3GMSB2651", "F3GSRDAY064", "F3GSRDAY071", "F3GSRDAY078"},
+ {"F3GMSB2701", "F3GMSB2751", "F3GSRDAY066", "F3GSRDAY073", "F3GSRDAY080"},
+ {"F3GMSB2801", "F3GMSB2851", "F3GSRDAY083", "F3GSRDAY090", "F3GSRDAY097"},
+ {"F3GMSB2901", "F3GMSB2951", "F3GSRDAY085", "F3GSRDAY092", "F3GSRDAY100"}};
+
+ 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 = {{"F1GMSA0001", "F1GMSA0051", "F1GSRDAY04", "F1GSRDAY014", "F1GSRDAY024"},
+ {"F1GMSA0101", "F1GMSA0151", "F1GSRDAY08", "F1GSRDAY018", "F1GSRDAY028"},
+ {"F1GMSA0201", "F1GMSA0251", "F1GSRDAY012", "F1GSRDAY022", "F1GSRDAY032"},
+ {"F1GMSA0301", "F1GMSA0351", "F2GSRDAY036", "F1GSRDAY046", "F1GSRDAY056"},
+ {"F1GMSA0401", "F1GMSA0451", "F1GSRDAY040", "F2GSRDAY050", "F2GSRDAY060"},
+ {"F1GMSA0501", "F1GMSA0551", "F1GSRDAY044", "F1GSRDAY054", "F2GSRDAY064"},
+ {"F1GMSA0601", "F1GMSA0651", "F1GMSA0701", "F1GMSA0751", "F1GSRDAY068", "F1GSRDAY078", "F1GSRDAY088"},
+ {"F1GMSA0801", "F1GMSA0851", "F1GSRDAY072", "F1GSRDAY082", "F1GSRDAY092"},
+ {"F1GMSA0901", "F1GMSA0951", "F1GSRDAY076", "F1GSRDAY086", "F1GSRDAY096"},
+ {"F2GMSA1001", "F2GMSA1051", "F1GSRDAY100", "F2GSRDAY010", "F2GSRDAY020"},
+ {"F2GMSA1101", "F2GMSA1151", "F2GSRDAY004", "F2GSRDAY014", "F2GSRDAY024"},
+ {"F2GMSA1201", "F2GMSA1251", "F2GSRDAY008", "F2GSRDAY018", "F2GSRDAY028"},
+ {"F2GMSA1301", "F2GMSA1351", "F2GSRDAY032", "F2GSRDAY042", "F2GSRDAY052"},
+ {"F2GMSA1401", "F2GMSA1451", "F2GMSA1501", "F2GMSA1551", "F2GSRDAY036", "F2GSRDAY046", "F2GSRDAY056"},
+ {"F2GMSA1601", "F2GMSA1651", "F2GSRDAY040", "F2GSRDAY050", "F2GSRDAY060"},
+ {"F2GMSA1701", "F2GMSA1751", "F2GSRDAY064", "F2GSRDAY074", "F2GSRDAY084"},
+ {"F2GMSA1801", "F2GMSA1851", "F2GSRDAY068", "F2GSRDAY078", "F2GSRDAY088"},
+ {"F2GMSA1901", "F2GMSA1951", "F2GSRDAY072", "F2GSRDAY082", "F2GSRDAY092"},
+ {"F3GMSA2001", "F3GMSA2051", "F2GSRDAY096", "F3GSRDAY006", "F3GSRDAY016"},
+ {"F3GMSA2101", "F3GMSA2151", "F2GSRDAY100", "F3GSRDAY010", "F3GSRDAY020"},
+ {"F3GMSA2201", "F3GMSA2251", "F3GMSA2301", "F3GMSA2351", "F3GSRDAY004", "F3GSRDAY014", "F3GSRDAY024"},
+ {"F3GMSA2401", "F3GMSA2451", "F3GSRDAY028", "F3GSRDAY038", "F3GSRDAY048"},
+ {"F3GMSA2501", "F3GMSA2551", "F3GSRDAY032", "F3GSRDAY042", "F3GSRDAY052"},
+ {"F3GMSA2601", "F3GMSA2651", "F3GSRDAY036", "F3GSRDAY046", "F3GSRDAY056"},
+ {"F3GMSA2701", "F3GMSA2751", "F3GSRDAY060", "F3GSRDAY070", "F3GSRDAY080"},
+ {"F3GMSA2801", "F3GMSA2851", "F3GSRDAY064", "F3GSRDAY074", "F3GSRDAY084"},
+ {"F3GMSA2901", "F3GMSA2951", "F3GSRDAY068", "F3GSRDAY078", "F3GSRDAY088"},
+ {"F3GSRDAY092", "F3GSRDAY096", "F3GSRDAY100"}};
+
+ 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 = {{"F1GMSA0001", "F1GMSA0051", "F1GMSA0101", "F1GSRDAY04", "F1GSRDAY014", "F1GSRDAY024", "F1GSRDAY034"},
+ {"F1GMSA0151", "F1GMSA0201", "F1GMSA0251", "F1GSRDAY08", "F1GSRDAY018", "F1GSRDAY028", "F1GSRDAY038"},
+ {"F1GMSA0301", "F1GMSA0351", "F1GMSA0401", "F1GSRDAY012", "F1GSRDAY022", "F1GSRDAY032", "F1GSRDAY042"},
+ {"F1GMSA0401", "F1GMSA0451", "F1GMSA0501", "F1GSRDAY046", "F1GSRDAY056", "F1GSRDAY066", "F1GSRDAY076"},
+ {"F1GMSA0601", "F1GMSA0651", "F1GMSA0701", "F1GSRDAY050", "F1GSRDAY060", "F1GSRDAY070", "F1GSRDAY080"},
+ {"F1GMSA0751", "F1GMSA0801", "F1GMSA0851", "F1GSRDAY054", "F1GSRDAY064", "F1GSRDAY074", "F1GSRDAY084"},
+ {"F1GMSA0901", "F1GMSA0951", "F2GMSA1001", "F1GSRDAY088", "F1GSRDAY098", "F2GSRDAY008", "F2GSRDAY018"},
+ {"F2GMSA1051", "F2GMSA1101", "F2GMSA1151", "F1GSRDAY092", "F2GSRDAY002", "F2GSRDAY012", "F2GSRDAY022"},
+ {"F2GMSA1201", "F2GMSA1251", "F2GMSA1301", "F2GSRDAY096", "F2GSRDAY006", "F2GSRDAY016", "F2GSRDAY026"},
+ {"F2GMSA1351", "F2GMSA1401", "F2GMSA1451", "F2GSRDAY030", "F2GSRDAY040", "F2GSRDAY050", "F2GSRDAY060"},
+ {"F2GMSA1501", "F2GMSA1551", "F2GMSA1601", "F2GSRDAY034", "F2GSRDAY044", "F2GSRDAY054", "F2GSRDAY064"},
+ {"F2GMSA1651", "F2GMSA1701", "F2GMSA1751", "F2GSRDAY038", "F2GSRDAY048", "F2GSRDAY058", "F2GSRDAY068"},
+ {"F2GMSA1801", "F2GMSA1851", "F2GMSA1901", "F2GSRDAY072", "F2GSRDAY082", "F2GSRDAY092", "F3GSRDAY002"},
+ {"F2GMSA1951", "F3GMSA2001", "F3GMSA2051", "F2GSRDAY076", "F2GSRDAY086", "F2GSRDAY096", "F3GSRDAY006"},
+ {"F3GMSA2101", "F3GMSA2151", "F3GMSA2201", "F2GSRDAY080", "F2GSRDAY090", "F2GSRDAY100", "F3GSRDAY010"},
+ {"F3GMSA2251", "F3GMSA2301", "F3GMSA2351", "F3GSRDAY014", "F3GSRDAY024", "F3GSRDAY034", "F3GSRDAY044"},
+ {"F3GMSA2401", "F3GMSA2451", "F3GMSA2501", "F3GSRDAY018", "F3GSRDAY028", "F3GSRDAY038", "F3GSRDAY048"},
+ {"F3GMSA2551", "F3GMSA2601", "F3GMSA2651", "F3GSRDAY022", "F3GSRDAY032", "F3GSRDAY042", "F3GSRDAY052"},
+ {"F3GMSA2701", "F3GMSA2751", "F3GMSA2801", "F3GSRDAY056", "F3GSRDAY066", "F3GSRDAY076", "F3GSRDAY086"},
+ {"F3GMSA2851", "F3GMSA2901", "F3GMSA2951", "F3GSRDAY060", "F3GSRDAY070", "F3GSRDAY080", "F3GSRDAY090"},
+ {"F3GSRDAY064", "F3GSRDAY074", "F3GSRDAY084", "F3GSRDAY094", "F3GSRDAY100"}};
+
+ 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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_new_schedule_language.xml b/app/src/main/res/layout/fragment_new_schedule_language.xml
new file mode 100644
index 0000000..e34f925
--- /dev/null
+++ b/app/src/main/res/layout/fragment_new_schedule_language.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_new_schedule_schedule.xml b/app/src/main/res/layout/fragment_new_schedule_schedule.xml
new file mode 100644
index 0000000..c1010ed
--- /dev/null
+++ b/app/src/main/res/layout/fragment_new_schedule_schedule.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_new_schedule_view_schedule.xml b/app/src/main/res/layout/fragment_new_schedule_view_schedule.xml
new file mode 100644
index 0000000..da78b11
--- /dev/null
+++ b/app/src/main/res/layout/fragment_new_schedule_view_schedule.xml
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/header_navigation.xml b/app/src/main/res/layout/header_navigation.xml
new file mode 100644
index 0000000..45e8a39
--- /dev/null
+++ b/app/src/main/res/layout/header_navigation.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_add_new_schedule.xml b/app/src/main/res/layout/item_add_new_schedule.xml
new file mode 100644
index 0000000..bd1367e
--- /dev/null
+++ b/app/src/main/res/layout/item_add_new_schedule.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_language.xml b/app/src/main/res/layout/item_language.xml
new file mode 100644
index 0000000..e284397
--- /dev/null
+++ b/app/src/main/res/layout/item_language.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_menu_language.xml b/app/src/main/res/layout/item_menu_language.xml
new file mode 100644
index 0000000..e58ef38
--- /dev/null
+++ b/app/src/main/res/layout/item_menu_language.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_schedule.xml b/app/src/main/res/layout/item_schedule.xml
new file mode 100644
index 0000000..c0c6219
--- /dev/null
+++ b/app/src/main/res/layout/item_schedule.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_schedule_description.xml b/app/src/main/res/layout/item_schedule_description.xml
new file mode 100644
index 0000000..9f6774a
--- /dev/null
+++ b/app/src/main/res/layout/item_schedule_description.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_schedule_minutes.xml b/app/src/main/res/layout/item_schedule_minutes.xml
new file mode 100644
index 0000000..98c29ac
--- /dev/null
+++ b/app/src/main/res/layout/item_schedule_minutes.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_study_item.xml b/app/src/main/res/layout/item_study_item.xml
new file mode 100644
index 0000000..f86f6af
--- /dev/null
+++ b/app/src/main/res/layout/item_study_item.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/nav_drawer.xml b/app/src/main/res/menu/nav_drawer.xml
new file mode 100644
index 0000000..50b025b
--- /dev/null
+++ b/app/src/main/res/menu/nav_drawer.xml
@@ -0,0 +1,21 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/schedule_toolbar.xml b/app/src/main/res/menu/schedule_toolbar.xml
new file mode 100644
index 0000000..f287e7f
--- /dev/null
+++ b/app/src/main/res/menu/schedule_toolbar.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/toolbar.xml b/app/src/main/res/menu/toolbar.xml
new file mode 100644
index 0000000..bff37e5
--- /dev/null
+++ b/app/src/main/res/menu/toolbar.xml
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..bf0eeba
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..579e428
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..9a566c6
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..0ab43b8
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..41e2f5e
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..6370104
--- /dev/null
+++ b/app/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..2c91478
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,12 @@
+
+
+ #7986CB
+ #3F51B5
+ #303F9F
+ #1A237E
+ #009688
+ #B2DFDB
+ #E8EAF6
+ #757575
+ #E5E5E5
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..7e8d605
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..bb08a21
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,11 @@
+
+ Glossika Native
+ Open navigation drawer
+ Close navigation drawer
+ Would you like to mark all days before Day %d as complete? (Swipe right to dismiss)
+ mins
+ Add New Language
+ Import Language Pack
+ Settings
+ Languages
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..e594e52
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..7647c56
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,36 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ ext.kotlin_version = '1.2.10'
+ repositories {
+ jcenter()
+ mavenCentral()
+ maven {
+ url 'https://maven.google.com/'
+ name 'Google'
+ }
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.0.1'
+ classpath "io.realm:realm-gradle-plugin:4.1.0"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ mavenCentral()
+ maven { url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo' }
+ maven {
+ url 'https://maven.google.com/'
+ name 'Google'
+ }
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..aac7c9b
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,17 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..a235f56
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Mar 07 20:33:19 PST 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..9d82f78
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..8a0b282
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'