From 87a3759904b9fb8d7e5363b8ecf75416e22515da Mon Sep 17 00:00:00 2001 From: Apostolof Date: Tue, 17 Jul 2018 16:22:38 +0300 Subject: [PATCH] Uploads system improvements --- .../activities/upload/UploadActivity.java | 125 ++++++++- .../upload/UploadFieldsBuilderActivity.java | 260 +++++++++++++++++- 2 files changed, 370 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java index 3f25dd94..08f3b891 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadActivity.java @@ -1,6 +1,7 @@ package gr.thmmy.mthmmy.activities.upload; import android.app.Activity; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; @@ -11,6 +12,7 @@ import android.os.Bundle; import android.provider.MediaStore; import android.provider.OpenableColumns; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.support.v7.preference.PreferenceManager; import android.support.v7.widget.AppCompatButton; @@ -23,12 +25,21 @@ import android.widget.ProgressBar; import android.widget.Toast; import net.gotev.uploadservice.MultipartUploadRequest; +import net.gotev.uploadservice.ServerResponse; +import net.gotev.uploadservice.UploadInfo; import net.gotev.uploadservice.UploadNotificationConfig; +import net.gotev.uploadservice.UploadStatusDelegate; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; @@ -46,6 +57,7 @@ import static gr.thmmy.mthmmy.activities.settings.SettingsActivity.UPLOADING_APP import static gr.thmmy.mthmmy.activities.upload.UploadFieldsBuilderActivity.BUNDLE_UPLOAD_FIELD_BUILDER_COURSE; import static gr.thmmy.mthmmy.activities.upload.UploadFieldsBuilderActivity.BUNDLE_UPLOAD_FIELD_BUILDER_SEMESTER; import static gr.thmmy.mthmmy.activities.upload.UploadFieldsBuilderActivity.RESULT_DESCRIPTION; +import static gr.thmmy.mthmmy.activities.upload.UploadFieldsBuilderActivity.RESULT_FILENAME; import static gr.thmmy.mthmmy.activities.upload.UploadFieldsBuilderActivity.RESULT_TITLE; public class UploadActivity extends BaseActivity { @@ -64,6 +76,7 @@ public class UploadActivity extends BaseActivity { private ArrayList bundleCategory; private String categorySelected = "-1"; private String uploaderProfileIndex = "1"; + private String uploadFilename; private Uri fileUri; private String fileIcon; @@ -223,17 +236,65 @@ public class UploadActivity extends BaseActivity { tmpDescriptionText += uploadedFrommThmmyPromptHtml; } + String tempFilePath = null; + if (uploadFilename != null) { + tempFilePath = createTempFile(uploadFilename); + if (tempFilePath == null) { + //Something went wrong, abort + return; + } + } + try { + final String finalTempFilePath = tempFilePath; new MultipartUploadRequest(view.getContext(), uploadIndexUrl) .setUtf8Charset() .addParameter("tp-dluploadtitle", uploadTitleText) .addParameter("tp-dluploadcat", categorySelected) .addParameter("tp-dluploadtext", tmpDescriptionText) - .addFileToUpload(fileUri.toString(), "tp-dluploadfile") + .addFileToUpload(tempFilePath == null + ? fileUri.toString() + : tempFilePath + , "tp-dluploadfile") .addParameter("tp_dluploadicon", fileIcon) .addParameter("tp-uploaduser", uploaderProfileIndex) .setNotificationConfig(new UploadNotificationConfig()) - .setMaxRetries(2).startUpload(); + .setMaxRetries(2) + .setDelegate(new UploadStatusDelegate() { + @Override + public void onProgress(Context context, UploadInfo uploadInfo) { + } + + @Override + public void onError(Context context, UploadInfo uploadInfo, ServerResponse serverResponse, + Exception exception) { + Toast.makeText(context, "Upload failed", Toast.LENGTH_SHORT).show(); + if (finalTempFilePath != null) { + if (!deleteTempFile(finalTempFilePath)) { + Toast.makeText(context, "Failed to delete temp file", Toast.LENGTH_SHORT).show(); + } + } + } + + @Override + public void onCompleted(Context context, UploadInfo uploadInfo, ServerResponse serverResponse) { + if (finalTempFilePath != null) { + if (!deleteTempFile(finalTempFilePath)) { + Toast.makeText(context, "Failed to delete temp file", Toast.LENGTH_SHORT).show(); + } + } + } + + @Override + public void onCancelled(Context context, UploadInfo uploadInfo) { + if (finalTempFilePath != null) { + if (!deleteTempFile(finalTempFilePath)) { + Toast.makeText(context, "Failed to delete temp file", Toast.LENGTH_SHORT).show(); + } + } + } + }) + .startUpload(); } catch (Exception exception) { Timber.e(exception, "AndroidUploadService: %s", exception.getMessage()); } @@ -298,7 +359,7 @@ public class UploadActivity extends BaseActivity { @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_CODE_CHOOSE_FILE && data != null) { + if (requestCode == REQUEST_CODE_CHOOSE_FILE && resultCode == Activity.RESULT_OK && data != null) { fileUri = data.getData(); if (fileUri != null) { String filename = filenameFromUri(fileUri); @@ -333,7 +394,8 @@ public class UploadActivity extends BaseActivity { if (resultCode == Activity.RESULT_CANCELED) { return; } - //TODO rename file + + uploadFilename = data.getStringExtra(RESULT_FILENAME); uploadTitle.setText(data.getStringExtra(RESULT_TITLE)); uploadDescription.setText(data.getStringExtra(RESULT_DESCRIPTION)); } else { @@ -362,6 +424,61 @@ public class UploadActivity extends BaseActivity { return filename; } + @Nullable + private String createTempFile(String newFilename) { + String oldFilename = filenameFromUri(fileUri); + String fileExtension = oldFilename.substring(oldFilename.indexOf(".")); + String destinationFilename = android.os.Environment.getExternalStorageDirectory().getPath() + + File.separatorChar + "~tmp_mThmmy_uploads" + File.separatorChar + newFilename + fileExtension; + + File tempDirectory = new File(android.os.Environment.getExternalStorageDirectory().getPath() + + File.separatorChar + "~tmp_mThmmy_uploads"); + + if (!tempDirectory.exists()) { + if (!tempDirectory.mkdirs()) { + //TODO timber message? + Toast.makeText(this, "Couldn't create temporary directory", Toast.LENGTH_SHORT).show(); + return null; + } + } + + InputStream inputStream; + BufferedInputStream bufferedInputStream = null; + BufferedOutputStream bufferedOutputStream = null; + + try { + inputStream = getContentResolver().openInputStream(fileUri); + if (inputStream == null) { + //TODO timber message? + return null; + } + + bufferedInputStream = new BufferedInputStream(inputStream); + bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(destinationFilename, false)); + byte[] buf = new byte[1024]; + bufferedInputStream.read(buf); + do { + bufferedOutputStream.write(buf); + } while (bufferedInputStream.read(buf) != -1); + } catch (IOException exception) { + exception.printStackTrace(); + } finally { + try { + if (bufferedInputStream != null) bufferedInputStream.close(); + if (bufferedOutputStream != null) bufferedOutputStream.close(); + } catch (IOException exception) { + exception.printStackTrace(); + } + } + + return destinationFilename; + } + + private boolean deleteTempFile(String destinationFilename) { + File file = new File(destinationFilename); + return file.delete(); + } + private class CustomOnItemSelectedListener implements AdapterView.OnItemSelectedListener { private ArrayList parentCategories, childCategories; diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadFieldsBuilderActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadFieldsBuilderActivity.java index a7454cad..055971df 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadFieldsBuilderActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/upload/UploadFieldsBuilderActivity.java @@ -38,7 +38,7 @@ public class UploadFieldsBuilderActivity extends AppCompatActivity { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String working = s.toString(); - boolean isValid = true; + boolean isValid; if (working.length() == 4) { int currentYear = Calendar.getInstance().get(Calendar.YEAR); @@ -178,11 +178,6 @@ public class UploadFieldsBuilderActivity extends AppCompatActivity { } } - private String getGreeklishCourseName() { - //TODO - return ""; - } - private String getGreeklishPeriod() { switch (semesterRadio.getCheckedRadioButtonId()) { case R.id.upload_fields_builder_radio_button_feb: @@ -196,11 +191,6 @@ public class UploadFieldsBuilderActivity extends AppCompatActivity { } } - private String getMinifiedCourseName() { - //TODO - return ""; - } - private String getPeriod() { switch (semesterRadio.getCheckedRadioButtonId()) { case R.id.upload_fields_builder_radio_button_feb: @@ -213,4 +203,252 @@ public class UploadFieldsBuilderActivity extends AppCompatActivity { return null; } } + + @Nullable + private String getGreeklishCourseName() { + return getGreeklishOrMinifiedCourseName(true); + } + + @Nullable + private String getMinifiedCourseName() { + return getGreeklishOrMinifiedCourseName(false); + } + + + @Nullable + private String getGreeklishOrMinifiedCourseName(boolean greeklish) { + if (course.contains("Συστήματα Υπολογιστών (Υπολογιστικά Συστήματα)")) { + return greeklish ? "sys_ypologistwn" : "Συσ. Υπολογιστών"; + } else if (course.contains("Τεχνική Μηχανική")) { + return greeklish ? "texn_mhxan" : "Τεχν. Μηχαν."; + } else if (course.contains("Διαφορικές Εξισώσεις")) { + return greeklish ? "diaforikes" : "Διαφορικές"; + } else if (course.contains("Θεωρία Πιθανοτήτων και Στατιστική")) { + return greeklish ? "pithanothtes" : "Πιθανότητες"; + } else if (course.contains("Εφαρμοσμένα Μαθηματικά Ι")) { + return greeklish ? "efarmosmena_math_I" : "Εφαρμοσμένα 1"; + } else if (course.contains("Ηλεκτρικά Κυκλώματα ΙΙ")) { + return greeklish ? "kyklwmata_II" : "Κυκλώματα 2"; + } else if (course.contains("Ηλεκτρολογικά Υλικά")) { + return greeklish ? "ylika" : "Ηλεκτρ. Υλικά"; + } else if (course.contains("Ηλεκτρομαγνητικό Πεδίο Ι")) { + return greeklish ? "pedio_I" : "Πεδίο 1"; + } else if (course.contains("Θεωρία Σημάτων και Γραμμικών Συστημάτων")) { + return greeklish ? "analog_shma" : "Σύματα & Συστήματα"; + } else if (course.contains("Προγραμματιστικές Τεχνικές")) { + return greeklish ? "cpp" : "Προγραμματ. Τεχν."; + } else if (course.contains("Αριθμητική Ανάλυση")) { + return greeklish ? "arith_anal" : "Αριθμ. Ανάλυση"; + } else if (course.contains("Αρχιτεκτονική Υπολογιστών")) { + return greeklish ? "arx_ypologistwn" : "Αρχ. Υπολογιστών"; + } else if (course.contains("Εισαγωγή στην Ενεργειακή Τεχνολογία Ι")) { + return greeklish ? "EET_I" : "ΕΕΤ 1"; + } else if (course.contains("Ηλεκτρικά Κυκλώματα ΙΙΙ")) { + return greeklish ? "kyklwmata_I" : "Κυκλώματα 3"; + } else if (course.contains("Ηλεκτρομαγνητικό Πεδίο ΙΙ")) { + return greeklish ? "pedio_II" : "Πεδίο 2"; + } else if (course.contains("Στοχαστικό Σήμα")) { + return greeklish ? "stox_shma" : "Στοχ. Σήμα"; + } else if (course.contains("Ψηφιακά Συστήματα Ι")) { + return greeklish ? "pshfiaka_I" : "Ψηφιακά 1"; + } else if (course.contains("Αναλογικές Τηλεπικοινωνίες (πρώην Τηλεπικοινωνιακά Συστήματα Ι)")) { + return greeklish ? "anal_thlep" : "Αναλογικές Τηλεπ."; + } else if (course.contains("Διάδοση Ηλεκτρομαγνητικού Κύματος Ι (πρώην Πεδίο ΙΙΙ)")) { + return greeklish ? "diadosi_1" : "Διάδοση 1"; + } else if (course.contains("Δομές Δεδομένων")) { + return greeklish ? "dom_dedomenwn" : "Δομ. Δεδομ."; + } else if (course.contains("Εισαγωγή στην Ενεργειακή Τεχνολογία ΙΙ")) { + return greeklish ? "EET_2" : "ΕΕΤ2"; + } else if (course.contains("Ηλεκτρικές Μετρήσεις Ι")) { + return greeklish ? "metrhseis_1" : "Μετρήσεις 1"; + } else if (course.contains("Ηλεκτρονική ΙΙ")) { + return greeklish ? "hlektronikh_2" : "Ηλεκτρονική 2"; + } else if (course.contains("Συστήματα Αυτομάτου Ελέγχου Ι")) { + return greeklish ? "SAE_1" : "ΣΑΕ 1"; + } else if (course.contains("Γραμμική Άλγεβρα")) { + return greeklish ? "grammikh_algebra" : "Γραμμ. Άλγεβρ."; + } else if (course.contains("Δομημένος Προγραμματισμός")) { + return greeklish ? "C" : "Δομ. Προγραμμ."; + } else if (course.contains("Λογική Σχεδίαση")) { + return greeklish ? "logiki_sxediash" : "Λογική Σχεδίαση"; + } else if (course.contains("Λογισμός Ι")) { + return greeklish ? "logismos_I" : "Λογισμός 1"; + } else if (course.contains("Τεχνικές Σχεδίασης με Η/Υ")) { + return greeklish ? "sxedio" : "Σχέδιο"; + } else if (course.contains("Φυσική Ι")) { + return greeklish ? "fysikh_I" : "Φυσική 1"; + } else if (course.contains("Αντικειμενοστραφής Προγραμματισμός")) { + return greeklish ? "OOP" : "Αντικειμενοστραφής"; + } else if (course.contains("Εφαρμοσμένη Θερμοδυναμική")) { + return greeklish ? "thermodynamikh" : "Θερμοδυναμική"; + } else if (course.contains("Ηλεκτρικά Κυκλώματα Ι")) { + return greeklish ? "kyklwmata_I" : "Κυκλώματα 1"; + } else if (course.contains("Λογισμός ΙΙ")) { + return greeklish ? "logismos_II" : "Λογισμός 2"; + } else if (course.contains("Οργάνωση Υπολογιστών")) { + return greeklish ? "org_ypol" : "Οργάνωση Υπολ."; + } else if (course.contains("Ηλεκτρονική Ι")) { + return greeklish ? "hlektronikh_1" : "Ηλεκτρονική 1"; + } else if (course.contains("Διακριτά μαθηματικά")) { + return greeklish ? "diakrita" : "Διακριτά Μαθηματικά"; + } else if (course.contains("Σήματα και Συστήματα")) { + return greeklish ? "analog_shma" : "Σύματα & Συστήματα"; + } else if (course.contains("Εισαγωγή στις εφαρμογές Πυρηνικής Τεχνολογίας")) { + return greeklish ? "Intro_Purhnikh_Texn" : "Εισ. Πυρηνικη Τεχν."; + } else if (course.contains("Επιχειρησιακή Έρευνα")) { + return greeklish ? "epixeirisiaki" : "Επιχειρησιακή Έρευνα"; + } else if (course.contains("Ημιαγωγά Υλικά: Θεωρία-Διατάξεις")) { + return greeklish ? "Hmiagwga_Ylika" : "Ημιαγωγά Υλικά"; + } else if (course.contains("Μετάδοση Θερμότητας")) { + return greeklish ? "metadosi_therm" : "Μετάδοση Θερμ."; + } else if (course.contains("Συστήματα Ηλεκτρικής Ενέργειας Ι")) { + return greeklish ? "SHE_I" : "ΣΗΕ 1"; + } else if (course.contains("Υψηλές Τάσεις Ι")) { + return greeklish ? "ypshles_I" : "Υψηλές 1"; + } else if (course.contains("Τεχνολογία Ηλεκτροτεχνικών Υλικών")) { + return greeklish ? "Hlektrotexnika_Ylika" : "Ηλεκτροτεχνικά Υλικά"; + } else if (course.contains("Ηλεκτρικές Μηχανές Α'")) { + return greeklish ? "mhxanes_A" : "Μηχανές Α"; + } else if (course.contains("Σταθμοί Παραγωγής Ηλεκτρικής Ενέργειας")) { + return greeklish ? "SPHE" : "ΣΠΗΕ"; + } else if (course.contains("Συστήματα Ηλεκτρικής Ενέργειας ΙΙ")) { + return greeklish ? "SHE_II" : "ΣΗΕ 2"; + } else if (course.contains("Υψηλές Τάσεις ΙΙ")) { + return greeklish ? "ypshles_II" : "Υψηλές 2"; + } else if (course.contains("Διαχείριση Συστημάτων Ηλεκτρικής Ενέργειας")) { + return greeklish ? "ymes" : "ΥΜΕΣ"; + } else if (course.contains("Υψηλές Τάσεις ΙΙΙ")) { + return greeklish ? "ypshles_III" : "Υψηλές 3"; + } else if (course.contains("Ανάλυση Συστημάτων Ηλεκτρικής Ενέργειας")) { + return greeklish ? "ASHE" : "ΑΣΗΕ"; + } else if (course.contains("Ηλεκτρικές Μηχανές Β'")) { + return greeklish ? "mhxanes_B" : "Μηχανές Β"; + } else if (course.contains("Ηλεκτρονικά Ισχύος Ι")) { + return greeklish ? "isxyos_I" : "Ισχύος 1"; + } else if (course.contains("Συστήματα Ηλεκτρικής Ενέργειας ΙΙΙ")) { + return greeklish ? "SHE_III" : "ΣΗΕ 3"; + } else if (course.contains("Υπολογιστικές Μέθοδοι στα Ενεργειακά Συστήματα")) { + return greeklish ? "ymes" : "ΥΜΕΣ"; + } else if (course.contains("Υψηλές Τάσεις 4")) { + return greeklish ? "ypshles_IV" : "Υψηλές 4"; + } else if (course.contains("Ηλεκτρονικά Ισχύος ΙΙ")) { + return greeklish ? "isxyos_II" : "Ισχύος 2"; + } else if (course.contains("Ανάλυση και Σχεδίαση Αλγορίθμων")) { + return greeklish ? "algorithms" : "Αλγόριθμοι"; + } else if (course.contains("Διακριτά Μαθηματικά")) { + return greeklish ? "diakrita" : "Διακριτά Μαθηματικά"; + } else if (course.contains("Κβαντική Φυσική")) { + return greeklish ? "kvantikh" : "Κβαντική"; + } else if (course.contains("Ρομποτική")) { + return greeklish ? "rompotikh" : "Ρομποτική"; + } else if (course.contains("Τεχνικές Βελτιστοποίησης")) { + return greeklish ? "veltistopoihsh" : "Βελτιστοποίηση"; + } else if (course.contains("Ηλεκτρικές Μετρήσεις ΙΙ")) { + return greeklish ? "metrhseis_II" : "Μετρήσεις 2"; + } else if (course.contains("Ηλεκτρονική ΙΙΙ")) { + return greeklish ? "hlektronikh_III" : "Ηλεκτρονική 3"; + } else if (course.contains("Συστήματα Αυτομάτου Ελέγχου ΙΙ")) { + return greeklish ? "SAE_II" : "ΣΑΕ 2"; + } else if (course.contains("Ψηφιακά Συστήματα ΙΙ")) { + return greeklish ? "pshfiaka_II" : "Ψηφιακά 2"; + } else if (course.contains("Ανάλυση Χρονοσειρών")) { + return greeklish ? "xronoseires" : "Χρονοσειρές"; + } else if (course.contains("Θεωρία Υπολογισμών και Αλγορίθμων")) { + return greeklish ? "thya" : "ΘΥΑ"; + } else if (course.contains("Παράλληλα και Κατανεμημένα Συστήματα")) { + return greeklish ? "parallhla" : "Παράλληλα"; + } else if (course.contains("Προγραμματιζόμενα Κυκλώματα ASIC")) { + return greeklish ? "asic" : "ASIC"; + } else if (course.contains("Προσομοίωση και Μοντελοποίηση Συστημάτων")) { + return greeklish ? "montelopoihsh" : "Μοντελοποίηση"; + } else if (course.contains("Συστήματα Αυτομάτου Ελέγχου ΙΙI")) { + return greeklish ? "SAE_III" : "ΣΑΕ 3"; + } else if (course.contains("Σύνθεση Ενεργών και Παθητικών Κυκλωμάτων")) { + return greeklish ? "synthesh" : "Σύνθεση"; + } else if (course.contains("Δίκτυα Υπολογιστών Ι")) { + return greeklish ? "diktya_I" : "Δίκτυα 1"; + } else if (course.contains("Λειτουργικά Συστήματα")) { + return greeklish ? "OS" : "Λειτουργικά"; + } else if (course.contains("Συστήματα Μικροϋπολογιστών")) { + return greeklish ? "mikro_I" : "Μίκρο 1"; + } else if (course.contains("Ασαφή Συστήματα")) { + return greeklish ? "asafh" : "Ασαφή"; + } else if (course.contains("Γραφική με Υπολογιστές")) { + return greeklish ? "grafikh" : "Γραφική"; + } else if (course.contains("Ενσωματωμένα Συστήματα Πραγματικού Χρόνου")) { + return greeklish ? "enswmatwmena" : "Ενσωματωμένα"; + } else if (course.contains("Τηλεπικοινωνιακή Ηλεκτρονική")) { + return greeklish ? "tilep_ilektr" : "Τηλεπ. Ηλεκτρ."; + } else if (course.contains("Ψηφιακά Συστήματα ΙΙΙ")) { + return greeklish ? "pshfiaka_III" : "Ψηφιακά 3"; + } else if (course.contains("Ψηφιακή Επεξεργασία Εικόνας")) { + return greeklish ? "psee" : "ΨΕΕ"; + } else if (course.contains("Δίκτυα Υπολογιστών ΙΙ")) { + return greeklish ? "diktya_II" : "Δίκτυα 2"; + } else if (course.contains("Μικροεπεξεργαστές και Περιφερειακά")) { + return greeklish ? "mikro_II" : "Μίκρο 2"; + } else if (course.contains("Τεχνολογία Λογισμικού")) { + return greeklish ? "SE" : "Τεχνολογία Λογισμικού"; + } else if (course.contains("Ψηφιακά Φίλτρα")) { + return greeklish ? "filtra" : "Φίλτρα"; + } else if (course.contains("Αναγνώριση Προτύπων")) { + return greeklish ? "protipa" : "Αναγνώριση Προτύπων"; + } else if (course.contains("Ασφάλεια Πληροφοριακών Συστημάτων")) { + return greeklish ? "asfaleia" : "Ασφάλεια"; + } else if (course.contains("Βάσεις Δεδομένων")) { + return greeklish ? "vaseis" : "Βάσεις"; + } else if (course.contains("Βιομηχανική Πληροφορική")) { + return greeklish ? "viomix_plir" : "Βιομηχανική Πληρ"; + } else if (course.contains("Ευφυή Συστήματα Ρομπότ")) { + return greeklish ? "eufuh" : "Ευφυή"; + } else if (course.contains("Συστήματα Πολυμέσων και Εικονική Πραγματικότητα")) { + return greeklish ? "polymesa" : "Πολυμέσα"; + } else if (course.contains("Σχεδίαση Συστημάτων VLSI")) { + return greeklish ? "VLSI" : "VLSI"; + } else if (course.contains("Ακουστική Ι")) { + return greeklish ? "akoystikh_I" : "Ακουστική 1"; + } else if (course.contains("Εφαρμοσμένα Μαθηματικά ΙΙ")) { + return greeklish ? "efarmosmena_math_II" : "Εφαρμοσμένα 2"; + } else if (course.contains("Ηλεκτρακουστική Ι")) { + return greeklish ? "hlektroakoystikh_I" : "Ηλεκτροακουστική 1"; + } else if (course.contains("Οπτική Ι")) { + return greeklish ? "optikh_I" : "Οπτική 1"; + } else if (course.contains("Διάδοση Η/Μ Κύματος ΙΙ")) { + return greeklish ? "diadosi_II" : "Διάδοση 2"; + } else if (course.contains("Ψηφιακές Τηλεπικοινωνίες Ι")) { + return greeklish ? "pshf_thlep_I" : "Ψηφιακές Τηλεπ. 1"; + } else if (course.contains("Ακουστική ΙΙ")) { + return greeklish ? "akoystikh_II" : "Ακουστική 2"; + } else if (course.contains("Βιοϊατρική Τεχνολογία")) { + return greeklish ? "vioiatriki" : "Βιοιατρική"; + } else if (course.contains("Ηλεκτρακουστική ΙΙ")) { + return greeklish ? "hlektroakoystikh_II" : "Ηλεκτροακουστική 2"; + } else if (course.contains("Οπτική ΙΙ")) { + return greeklish ? "optikh_II" : "Οπτική 2"; + } else if (course.contains("Ασύρματος Τηλεπικοινωνία Ι")) { + return greeklish ? "asyrmatos_I" : "Ασύρματος 1"; + } else if (course.contains("Μικροκύματα I")) { + return greeklish ? "mikrokymata_I" : "Μικροκύματα 1"; + } else if (course.contains("Ψηφιακές Τηλεπικοινωνίες ΙΙ")) { + return greeklish ? "pshf_thlep_II" : "Ψηφιακές Τηλεπ. 2"; + } else if (course.contains("Ψηφιακή Επεξεργασία Σήματος")) { + return greeklish ? "PSES" : "ΨΕΣ"; + } else if (course.contains("Εισαγωγή στην Πολιτική Οικονομία")) { + return greeklish ? "polit_oik" : "Πολιτική Οικονομία"; + } else if (course.contains("Προηγμένες Τεχνικές Επεξεργασίας Σήματος")) { + return greeklish ? "ptes" : "ΠΤΕΣ"; + } else if (course.contains("Τηλεοπτικά Συστήματα")) { + return greeklish ? "tileoptika" : "Τηλεοπτικά"; + } else if (course.contains("Ασύρματος Τηλεπικοινωνία ΙΙ")) { + return greeklish ? "asyrmatos_II" : "Ασύρματος 2"; + } else if (course.contains("Δίκτυα Τηλεπικοινωνιών")) { + return greeklish ? "diktya_thlep" : "Δίκτυα Τηλέπ."; + } else if (course.contains("Θεωρία Πληροφοριών")) { + return greeklish ? "theoria_plir" : "Θεωρία Πληρ."; + } else if (course.contains("Οπτικές Επικοινωνίες")) { + return greeklish ? "optikes_thlep" : "Οπτικές Τηλεπ."; + } else { + return null; + } + } } \ No newline at end of file