diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 169fd0d..674414f 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,8 +1,11 @@ + diff --git a/.idea/misc.xml b/.idea/misc.xml index 7bfef59..3543db7 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,8 @@ + + diff --git a/app/build.gradle b/app/build.gradle index c98f269..66e4ebf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-android' +apply plugin: 'com.google.gms.google-services' //apply plugin: 'kotlin-kapt' //apply plugin: 'com.chaquo.python' @@ -49,6 +50,7 @@ android { } repositories { + google() mavenCentral() maven { url "http://oss.sonatype.org/content/repositories/snapshots/" } maven { url "https://jitpack.io" } @@ -67,6 +69,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' implementation 'io.reactivex.rxjava2:rxjava:2.1.6' implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' + implementation 'com.google.firebase:firebase-auth:16.0.5' testImplementation 'junit:junit:4.12' annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0' annotationProcessor 'com.google.dagger:dagger-compiler:2.25.2' @@ -156,6 +159,18 @@ dependencies { //Lottie implementation 'com.airbnb.android:lottie:3.3.0' + implementation 'com.google.android.gms:play-services-auth:18.0.0' + + //apache + implementation 'commons-net:commons-net:3.6' + implementation 'androidx.work:work-runtime:2.3.4' + //noinspection GradleCompatible + implementation 'com.android.support:recyclerview-v7:28.0.0' + + //json ignore + implementation 'com.fasterxml.jackson.core:jackson-annotations:2.8.3' + + compile files('libs/simpleftp') } /*implementation 'com.jakewharton:butterknife:10.2.0' diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..e539c11 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,48 @@ +{ + "project_info": { + "project_number": "592877169541", + "firebase_url": "https://didaktikapp-c2949.firebaseio.com", + "project_id": "didaktikapp-c2949", + "storage_bucket": "didaktikapp-c2949.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:592877169541:android:348c33b1f7658b079e32ec", + "android_client_info": { + "package_name": "com.app.didaktikapp" + } + }, + "oauth_client": [ + { + "client_id": "592877169541-lf9bkmeb8gnpgrii0hikknqfm39ito0h.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.app.didaktikapp", + "certificate_hash": "a87065d26db8cc7a462b5ab19e113c3a0b8a8552" + } + }, + { + "client_id": "592877169541-tt43ncdr8e31rmulknq6evjeeush4n8b.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCgnZWhKFvF42o_l8yz9LWh6HRlALoQ2aQ" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "592877169541-tt43ncdr8e31rmulknq6evjeeush4n8b.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/libs/simpleftp.jar b/app/libs/simpleftp.jar new file mode 100644 index 0000000..0a77639 Binary files /dev/null and b/app/libs/simpleftp.jar differ diff --git a/app/schemas/com.app.didaktikapp.BBDD.database.AppDatabase/2.json b/app/schemas/com.app.didaktikapp.BBDD.database.AppDatabase/2.json new file mode 100644 index 0000000..5373c2c --- /dev/null +++ b/app/schemas/com.app.didaktikapp.BBDD.database.AppDatabase/2.json @@ -0,0 +1,596 @@ +{ + "formatVersion": 1, + "database": { + "version": 2, + "identityHash": "52b1d4a41223c251afdbecae8f4f9df9", + "entities": [ + { + "tableName": "GRUPO", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `DEVICEID` TEXT NOT NULL, `NOMBRE` TEXT, `FECHA` TEXT, `IDZUMELTZEGI` INTEGER, `IDPARROQUIA` INTEGER, `IDUNIVERSIDAD` INTEGER, `IDERROTA` INTEGER, `IDTREN` INTEGER, `IDGERNIKA` INTEGER, `IDREPASO1` INTEGER, `IDREPASO2` INTEGER, FOREIGN KEY(`IDZUMELTZEGI`) REFERENCES `ZUMELTZEGI`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDUNIVERSIDAD`) REFERENCES `UNIVERSITATEA`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDTREN`) REFERENCES `TREN`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDPARROQUIA`) REFERENCES `SANMIGUEL`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDERROTA`) REFERENCES `ERROTA`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDGERNIKA`) REFERENCES `GERNIKA`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDREPASO1`) REFERENCES `REPASO1`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDREPASO2`) REFERENCES `REPASO2`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "DEVICEID", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "nombre", + "columnName": "NOMBRE", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "fecha", + "columnName": "FECHA", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "idZumeltzegi", + "columnName": "IDZUMELTZEGI", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idParroquia", + "columnName": "IDPARROQUIA", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idUniversidad", + "columnName": "IDUNIVERSIDAD", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idErrota", + "columnName": "IDERROTA", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idTren", + "columnName": "IDTREN", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idGernika", + "columnName": "IDGERNIKA", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idRepaso1", + "columnName": "IDREPASO1", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idRepaso2", + "columnName": "IDREPASO2", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [ + { + "table": "ZUMELTZEGI", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDZUMELTZEGI" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "UNIVERSITATEA", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDUNIVERSIDAD" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "TREN", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDTREN" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "SANMIGUEL", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDPARROQUIA" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "ERROTA", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDERROTA" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "GERNIKA", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDGERNIKA" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "REPASO1", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDREPASO1" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "REPASO2", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDREPASO2" + ], + "referencedColumns": [ + "ID" + ] + } + ] + }, + { + "tableName": "USUARIO", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `NOMBRE` TEXT, `IDGRUPO` INTEGER, FOREIGN KEY(`IDGRUPO`) REFERENCES `GRUPO`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nombre", + "columnName": "NOMBRE", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "idGrupo", + "columnName": "IDGRUPO", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [ + { + "table": "GRUPO", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDGRUPO" + ], + "referencedColumns": [ + "ID" + ] + } + ] + }, + { + "tableName": "ZUMELTZEGI", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `FOTO1` TEXT, `FOTO2` TEXT, `SOPA` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "foto1", + "columnName": "FOTO1", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto2", + "columnName": "FOTO2", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "sopa", + "columnName": "SOPA", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "UNIVERSITATEA", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `TEST` TEXT, `FOTO1` TEXT, `FOTO2` TEXT, `FOTO3` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "test", + "columnName": "TEST", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto1", + "columnName": "FOTO1", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto2", + "columnName": "FOTO2", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto3", + "columnName": "FOTO3", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TREN", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `PUZLE` TEXT, `PALABRA` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "puzle", + "columnName": "PUZLE", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "palabra", + "columnName": "PALABRA", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SANMIGUEL", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `TEST` TEXT, `FOTO1` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "test", + "columnName": "TEST", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "fotos", + "columnName": "FOTO1", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ERROTA", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `FRASES` TEXT, `FOTO1` TEXT, `FOTO2` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "frases", + "columnName": "FRASES", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto1", + "columnName": "FOTO1", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto2", + "columnName": "FOTO2", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GERNIKA", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `TEST` TEXT, `PUZLE` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "test", + "columnName": "TEST", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "puzle", + "columnName": "PUZLE", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "REPASO1", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `FRASES` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "frases", + "columnName": "FRASES", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "REPASO2", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `SOPA` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "sopa", + "columnName": "SOPA", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"52b1d4a41223c251afdbecae8f4f9df9\")" + ] + } +} \ No newline at end of file diff --git a/app/schemas/com.app.didaktikapp.BBDD.database.AppDatabase/3.json b/app/schemas/com.app.didaktikapp.BBDD.database.AppDatabase/3.json new file mode 100644 index 0000000..d058aa9 --- /dev/null +++ b/app/schemas/com.app.didaktikapp.BBDD.database.AppDatabase/3.json @@ -0,0 +1,644 @@ +{ + "formatVersion": 1, + "database": { + "version": 3, + "identityHash": "953ee5c72e6b7c9b8aa928e71e73aa9e", + "entities": [ + { + "tableName": "GRUPO", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `DEVICEID` TEXT, `NOMBRE` TEXT, `FECHA` TEXT, `IDZUMELTZEGI` INTEGER, `IDPARROQUIA` INTEGER, `IDUNIVERSIDAD` INTEGER, `IDERROTA` INTEGER, `IDTREN` INTEGER, `IDGERNIKA` INTEGER, `IDREPASO1` INTEGER, `IDREPASO2` INTEGER, FOREIGN KEY(`IDZUMELTZEGI`) REFERENCES `ZUMELTZEGI`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDUNIVERSIDAD`) REFERENCES `UNIVERSITATEA`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDTREN`) REFERENCES `TREN`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDPARROQUIA`) REFERENCES `SANMIGUEL`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDERROTA`) REFERENCES `ERROTA`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDGERNIKA`) REFERENCES `GERNIKA`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDREPASO1`) REFERENCES `REPASO1`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`IDREPASO2`) REFERENCES `REPASO2`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deviceId", + "columnName": "DEVICEID", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "nombre", + "columnName": "NOMBRE", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "fecha", + "columnName": "FECHA", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "idZumeltzegi", + "columnName": "IDZUMELTZEGI", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idParroquia", + "columnName": "IDPARROQUIA", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idUniversidad", + "columnName": "IDUNIVERSIDAD", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idErrota", + "columnName": "IDERROTA", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idTren", + "columnName": "IDTREN", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idGernika", + "columnName": "IDGERNIKA", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idRepaso1", + "columnName": "IDREPASO1", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "idRepaso2", + "columnName": "IDREPASO2", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [ + { + "table": "ZUMELTZEGI", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDZUMELTZEGI" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "UNIVERSITATEA", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDUNIVERSIDAD" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "TREN", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDTREN" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "SANMIGUEL", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDPARROQUIA" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "ERROTA", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDERROTA" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "GERNIKA", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDGERNIKA" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "REPASO1", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDREPASO1" + ], + "referencedColumns": [ + "ID" + ] + }, + { + "table": "REPASO2", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDREPASO2" + ], + "referencedColumns": [ + "ID" + ] + } + ] + }, + { + "tableName": "USUARIO", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `NOMBRE` TEXT, `IDGRUPO` INTEGER, FOREIGN KEY(`IDGRUPO`) REFERENCES `GRUPO`(`ID`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "nombre", + "columnName": "NOMBRE", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "idGrupo", + "columnName": "IDGRUPO", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [ + { + "table": "GRUPO", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "IDGRUPO" + ], + "referencedColumns": [ + "ID" + ] + } + ] + }, + { + "tableName": "ZUMELTZEGI", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `FOTO1` TEXT, `FOTO2` TEXT, `SOPA` TEXT, `tipo` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "foto1", + "columnName": "FOTO1", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto2", + "columnName": "FOTO2", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "sopa", + "columnName": "SOPA", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tipo", + "columnName": "tipo", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "UNIVERSITATEA", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `TEST` TEXT, `FOTO1` TEXT, `FOTO2` TEXT, `FOTO3` TEXT, `tipo` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "test", + "columnName": "TEST", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto1", + "columnName": "FOTO1", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto2", + "columnName": "FOTO2", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto3", + "columnName": "FOTO3", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tipo", + "columnName": "tipo", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "TREN", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `PUZLE` TEXT, `PALABRA` TEXT, `tipo` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "puzle", + "columnName": "PUZLE", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "palabra", + "columnName": "PALABRA", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tipo", + "columnName": "tipo", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SANMIGUEL", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `TEST` TEXT, `FOTO1` TEXT, `tipo` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "test", + "columnName": "TEST", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "fotos", + "columnName": "FOTO1", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tipo", + "columnName": "tipo", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ERROTA", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `FRASES` TEXT, `FOTO1` TEXT, `FOTO2` TEXT, `tipo` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "frases", + "columnName": "FRASES", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto1", + "columnName": "FOTO1", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "foto2", + "columnName": "FOTO2", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tipo", + "columnName": "tipo", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "GERNIKA", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `TEST` TEXT, `PUZLE` TEXT, `tipo` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "test", + "columnName": "TEST", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "puzle", + "columnName": "PUZLE", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tipo", + "columnName": "tipo", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "REPASO1", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `FRASES` TEXT, `tipo` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "frases", + "columnName": "FRASES", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tipo", + "columnName": "tipo", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "REPASO2", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ESTADO` INTEGER, `FRAGMENT` INTEGER, `SOPA` TEXT, `tipo` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "ID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "estado", + "columnName": "ESTADO", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "fragment", + "columnName": "FRAGMENT", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "sopa", + "columnName": "SOPA", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tipo", + "columnName": "tipo", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "ID" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"953ee5c72e6b7c9b8aa928e71e73aa9e\")" + ] + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 96f3861..f956d0b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,9 +4,13 @@ + + + + + android:screenOrientation = "portrait" + > @@ -41,6 +46,15 @@ + + + diff --git a/app/src/main/assets/video_sanmiguel_errota.mp4 b/app/src/main/assets/video_sanmiguel_errota.mp4 new file mode 100644 index 0000000..b378d8b Binary files /dev/null and b/app/src/main/assets/video_sanmiguel_errota.mp4 differ diff --git a/app/src/main/java/com/app/didaktikapp/Activities/MapActivity.java b/app/src/main/java/com/app/didaktikapp/Activities/MapActivity.java index 5bdef3f..6f405b6 100644 --- a/app/src/main/java/com/app/didaktikapp/Activities/MapActivity.java +++ b/app/src/main/java/com/app/didaktikapp/Activities/MapActivity.java @@ -23,6 +23,11 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; +import androidx.work.Constraints; +import androidx.work.Data; +import androidx.work.NetworkType; +import androidx.work.OneTimeWorkRequest; +import androidx.work.WorkManager; import com.app.didaktikapp.BBDD.Modelos.ActividadErrota; import com.app.didaktikapp.BBDD.Modelos.ActividadSanMiguel; @@ -30,8 +35,8 @@ import com.app.didaktikapp.BBDD.Modelos.ActividadUniversitatea; import com.app.didaktikapp.BBDD.Modelos.ActividadZumeltzegi; import com.app.didaktikapp.BBDD.Modelos.Grupo; -import com.app.didaktikapp.BBDD.SQLiteControlador; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.Ftp; import com.app.didaktikapp.Fragments.FragmentErrepasoBatKotlin; import com.app.didaktikapp.Fragments.FragmentErrotaFotos; import com.app.didaktikapp.Fragments.FragmentErrotaTextos; @@ -50,6 +55,8 @@ import com.app.didaktikapp.wordsearch.features.gameplay.GamePlayActivity; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import com.mapbox.android.core.location.LocationEngine; import com.mapbox.android.core.location.LocationEngineCallback; import com.mapbox.android.core.location.LocationEngineProvider; @@ -98,10 +105,17 @@ import java.io.InputStream; import java.lang.ref.WeakReference; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.Scanner; +import io.reactivex.Completable; +import io.reactivex.CompletableObserver; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Action; +import io.reactivex.schedulers.Schedulers; import timber.log.Timber; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.lineCap; @@ -110,6 +124,12 @@ import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.lineWidth; +/** + * + * Gestiona el mapa, la localización y los lanzamientos de los fragment. + * @author gennakk + * + */ public class MapActivity extends AppCompatActivity implements OnMapReadyCallback, PermissionsListener , FragmentSanMiguel.OnFragmentInteractionListener , FragmentSanMiguelImagenes.OnFragmentInteractionListener @@ -165,8 +185,11 @@ public LocationEngineRequest getLocationEngineRequest() { private Long idgrupo ; + private Grupo grupo; + public static Grupo GRUPO_S; + private static final double DISTANCIA_MARKER = 15; private static final LatLngBounds ONIATE_BOUNDS = new LatLngBounds.Builder() @@ -199,6 +222,12 @@ public void setStyle(Style style) { private MediaPlayer mediaPlayer ; + /** + * + * Crea la actividad MapActivity + * @author gennakk + * + */ @Override protected void onCreate(Bundle savedInstanceState) { @@ -210,8 +239,13 @@ protected void onCreate(Bundle savedInstanceState) { //CARGAR OBJETO GRUPO DE LA BBDD idgrupo = getIntent().getExtras().getLong("IDGRUPO"); administrador = getIntent().getExtras().getBoolean("ADMINISTRADOR"); - grupo = DatabaseRepository.getAppDatabase().getGrupoDao().getGrupo(idgrupo); + //CUIDADO + //administrador = true; + + grupo = DatabaseRepository.getAppDatabase().getGrupoDao().getGrupo(idgrupo); + GRUPO_S = grupo; + generateData(); cargarListaLugares(); // Mapbox Access token @@ -307,6 +341,14 @@ public void onClick(View v) { } + /** + * + * Crea los estilos,los marcadores y descarga el mapa cuando el mapa está listo. + * Crea los listener de los markers dependiendo de las coordenadas lanza diferentes fragments. + * Crea capas para las rutas. + * @author gennakk + * + */ @Override public void onMapReady(@NonNull final MapboxMap mapboxMap) { @@ -460,9 +502,8 @@ public void onError(String error) { //RUTA dibujarRuta(1); -// Call this method with Context from within an Activity - + // Lanza los fragments dependiendo de las coordenadas del marcador que se clicken mapboxMap.setOnMarkerClickListener(new MapboxMap.OnMarkerClickListener() { @@ -654,6 +695,13 @@ else if( (administrador && markerLatitud == 42.979194 && markerLongitud == -2.39 } + /** + * + * Crea las rutas + * @author gennakk + * @param numruta Número de ruta para crear la ruta correspondiente. + * + */ private void dibujarRuta(int numruta) { new LoadGeoJson(MapActivity.this,numruta).execute(); @@ -661,12 +709,27 @@ private void dibujarRuta(int numruta) { } + + /** + * + * Clase que se encarga de leer el GeoJson con la ruta + * @author gennakk + * + */ private static class LoadGeoJson extends AsyncTask { private WeakReference weakReference; private String json; private int numruta; + /** + * + * Constructor de la clase GeoJson. Carga diferentes json dependiendo de numruta. + * @author gennakk + * @param activity Actividad MapActivity. + * @param numruta Número de ruta correspondiente para cargar el json. + * + */ LoadGeoJson(MapActivity activity, int numruta) { this.weakReference = new WeakReference(activity); this.numruta = numruta; @@ -693,6 +756,12 @@ private static class LoadGeoJson extends AsyncTask { @@ -755,7 +844,13 @@ private void drawLines(@NonNull FeatureCollection featureCollection,int num) { } } - + /** + * + * Lanza el fragment pasado por parámetro. + * @author gennakk + * @param fragment Fragment que se desea lanzar. + * + */ private void lanzarFragment(Fragment fragment){ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.anim.slide_in_left,R.anim.slide_out_right); @@ -771,7 +866,14 @@ private void lanzarFragment(Fragment fragment){ } - + /** + * + * Devuelve un icono dependiendo del estado + * @author gennakk + * @param estado Estado de la actividad. + * @return Devuelve un Icon con el color correspondiente. + * + */ private Icon iconoPunto(int estado) { IconFactory iconFactory = IconFactory.getInstance(context); if (estado==-1) return iconFactory.fromResource(R.drawable.pin_sinhacer); @@ -779,10 +881,24 @@ private Icon iconoPunto(int estado) { else return iconFactory.fromResource(R.drawable.pin_empezado); } + /** + * + * Devuelve si se puede entrar en el estado + * @author gennakk + * @return Devuelve true o false dependiendo del valor + * + */ private boolean entrarEnPunto(int estado) { return estado == 0 || estado == 1; } + /** + * + * Tamaño a mostrar del mapa + * @author gennakk + * @param mapboxMap Mapa usado por MapActivity. + * + */ private void showBoundsArea(MapboxMap mapboxMap) { //Delimitamos los limites del mapa en la pantalla -> Getxo @@ -796,6 +912,16 @@ private void showBoundsArea(MapboxMap mapboxMap) { mapboxMap.addPolygon(boundsArea); } + /** + * + * Actualiza la línea de la ruta + * @author gennakk + * @param latOrigen Latitud de origen + * @param lngOrigen Longitud de origen + * @param latDestino Latitud de destino + * @param lngDestino Longitud de destino + * + */ public void actualizarMarkerLinea(Double lngOrigen, Double latOrigen, Double lngDestino, Double latDestino) { routeCoordinates = new ArrayList<>(); routeCoordinates.add(Point.fromLngLat(lngOrigen, latOrigen)); @@ -808,7 +934,8 @@ public void actualizarMarkerLinea(Double lngOrigen, Double latOrigen, Double lng /** * Update the GeoJson data that's part of the LineLayer. - * + * @author gennakk + * @param routeCoordinates Lista de puntos con las coordenadas para la ruta. * */ private void drawNavigationPolylineRoute(List routeCoordinates) { @@ -831,6 +958,12 @@ public void onStyleLoaded(@NonNull Style style) { } } + /** + * + * Crea los iconos de cada marker dependiendo de su estado + * @author gennakk + * + */ private void crearIconos(){ IconFactory iconFactory = IconFactory.getInstance(context); Icon iconorojo = iconFactory.fromResource(R.drawable.pin_sinhacer); @@ -852,7 +985,6 @@ private void crearIconos(){ * para asignarle el icono correspondiente por si está o no está hecho * * He comentado el anterior for para no perder el código*/ - SQLiteControlador sql = new SQLiteControlador(getApplicationContext()); for (int x=0;x(); @@ -919,7 +1063,12 @@ private void cargarListaLugares(){ } - + /** + * + * Realiza una tarea al recibir los permisos + * @author gennakk + * + */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults); @@ -927,7 +1076,13 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis - + /** + * + * Cambia el icono de localización del usuario y trackea la ubicación. + * @author gennakk + * @param loadedMapStyle Recibe el estilo del mapa. + * + */ @SuppressWarnings( {"MissingPermission"}) private void enableLocationComponent(@NonNull Style loadedMapStyle) { // Check if permissions are enabled and if not request @@ -968,7 +1123,9 @@ private void enableLocationComponent(@NonNull Style loadedMapStyle) { } /** - * Set up the LocationEngine and the parameters for querying the device's location + * Set up the LocationEngine and the parameters for querying the device's location. + * @author gennakk + * */ @SuppressLint("MissingPermission") public void initLocationEngine() { @@ -982,12 +1139,23 @@ public void initLocationEngine() { locationEngine.getLastLocation(callback); } - + /** + * + * Explicación de los permisos del mapa. + * @author gennakk + * + */ @Override public void onExplanationNeeded(List permissionsToExplain) { Toast.makeText(this, R.string.user_location_permission_explanation, Toast.LENGTH_LONG).show(); } + /** + * + * Carga el estilo del mapa si hay permisos. + * @author gennakk + * @param granted Indica si hay o no permisos. + */ @Override public void onPermissionResult(boolean granted) { if (granted) { @@ -1003,7 +1171,13 @@ public void onStyleLoaded(@NonNull Style style) { } } - + /** + * + * Interacción con fragment. + * @author gennakk + * @param fragment Recibe el fragment. + * @param terminado Recibe si se ha terminado. + */ @Override public void onFragmentInteraction(Fragment fragment,boolean terminado) { if(fragment instanceof FragmentSanMiguelImagenes) { @@ -1012,11 +1186,23 @@ public void onFragmentInteraction(Fragment fragment,boolean terminado) { } } + /** + * + * Interacción con fragment. + * @author gennakk + * + */ @Override public void onFragmentInteraction(Uri uri) { } + /** + * + * Listener de la localización. + * @author gennakk + * + */ private class LocationChangeListeningActivityLocationCallback implements LocationEngineCallback { @@ -1124,8 +1310,16 @@ public void onFailure(@NonNull Exception exception) { } } - - + /** + * + * Cálculo de distancia entre coordenadas. + * @author gennakk + * @param lat1 Latitud del primer punto. + * @param lng1 Longitud del primer punto. + * @param lat2 Latitud del segundo punto. + * @param lng2 Longitud del segundo punto. + * + */ public static boolean distanciaCoord(double lat1, double lng1, double lat2, double lng2) { //double radioTierra = 3958.75;//en millas double radioTierra = 6371;//en kilómetros @@ -1142,13 +1336,23 @@ public static boolean distanciaCoord(double lat1, double lng1, double lat2, doub } - + /** + * + * Calcula el porcentaje de carga + * @author gennakk + * @param percentage Porcentaje. + */ private void setPercentage(final int percentage) { progressBar.setIndeterminate(false); progressBar.setProgress(percentage); } - + /** + * + * Barra de progreso inicio. + * @author gennakk + * + */ // Progress bar methods private void startProgress() { @@ -1158,6 +1362,13 @@ private void startProgress() { progressBar.setVisibility(View.VISIBLE); } + /** + * + * Barra de progreso final. + * @author gennakk + * @param message Mensaje de notificación. + * + */ private void endProgress(final String message) { // Don't notify more than once if (isEndNotified) { @@ -1174,6 +1385,12 @@ private void endProgress(final String message) { } + /** + * + * Se lanza cuando carga el fragment. + * @author gennakk + * @param fragment Fragment cargado. + */ @Override public void onAttachFragment(Fragment fragment) { if (fragment instanceof FragmentSanMiguelImagenes) { @@ -1184,7 +1401,12 @@ public void onAttachFragment(Fragment fragment) { - + /** + * + * Método onStart de MapActivity, carga al empezar. + * @author gennakk + * + */ @Override @SuppressWarnings( {"MissingPermission"}) protected void onStart() { @@ -1192,9 +1414,15 @@ protected void onStart() { mapView.onStart(); } + /** + * + * Cambia la localización a una determinada + * @author gennakk + * + */ public void cambiarLocalizacion(){ Location targetLocation = new Location("");//provider name is unnecessary - targetLocation.setLatitude(0.0d);//your coords of course + targetLocation.setLatitude(0.0d);//your coords targetLocation.setLongitude(0.0d); LocationEngineResult locationEngineResults = LocationEngineResult.create(targetLocation); @@ -1204,6 +1432,12 @@ public void cambiarLocalizacion(){ crearIconos(); } + /** + * + * Método onResume de MapActivity, carga al volver a la actividad. + * @author gennakk + * + */ @Override public void onResume() { @@ -1214,6 +1448,13 @@ public void onResume() { mapView.onResume(); } + /** + * + * Método onPause de MapActivity, carga al pausar la actividad. + * Cierra la ventana de ayuda al pulsar si está activa para no solapar con los fragment. + * @author gennakk + * + */ @Override public void onPause() { super.onPause(); @@ -1237,7 +1478,13 @@ public void onPause() { } - + /** + * + * Método onStop de MapActivity, carga al parar la actividad. + * Para de pedir la localización del usuario. + * @author gennakk + * + */ @Override protected void onStop() { @@ -1250,12 +1497,25 @@ protected void onStop() { mapView.onStop(); } + + /** + * + * PPAP (Pen-Pineapple-Apple-Pen). + * @author gennakk + * + */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } + /** + * + * Método onDestroy de MapActivity, carga al matar la actividad. + * @author gennakk + * + */ @Override protected void onDestroy() { super.onDestroy(); @@ -1265,12 +1525,24 @@ protected void onDestroy() { mapView.onDestroy(); } + /** + * + * En caso de baja memoria se lanza. + * @author gennakk + * + */ @Override public void onLowMemory() { super.onLowMemory(); mapView.onLowMemory(); } + /** + * + * Método que se ejecuta cuando se pulsa el botón de volver. + * @author gennakk + * + */ @Override public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() > 0) { @@ -1279,7 +1551,63 @@ public void onBackPressed() { super.onBackPressed(); } } + + + private void generateData(){ + + + Completable.fromAction(new Action() { + @Override + public void run() throws Exception { + DatabaseRepository.getAppDatabase().getGrupoDao().getGrupos(); + } + }).observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new CompletableObserver() { + @Override + public void onSubscribe(Disposable d) { + } + + @Override + public void onComplete() { + + + List responseList; + responseList = DatabaseRepository.getAppDatabase().getGrupoDao().getGrupos(); + Gson gson = new Gson(); + Type type = new TypeToken>(){}.getType(); + String json = gson.toJson(responseList, type); + Log.v("upload result", "send?"); + + + /*** Logic to set Data while creating worker **/ + Constraints constraints = new Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build(); + Data.Builder dataBuilder = new Data.Builder(); + //Add parameter in Data class. just like bundle. You can also add Boolean and Number in parameter. + dataBuilder.putString(Ftp.JSON, json); + Data data = dataBuilder.build(); + + OneTimeWorkRequest onetimeJob = new OneTimeWorkRequest.Builder(Ftp.class) + .setConstraints(constraints) + .setInputData(data).build(); // or PeriodicWorkRequest + //enque worker + WorkManager.getInstance().enqueue(onetimeJob); + + + Log.v("upload result", "sended"); + + } + + @Override + public void onError(Throwable e) { + Toast.makeText(MapActivity.this, "Empty data",Toast.LENGTH_LONG).show(); + } + }); + } } + diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/AppExecutors.java b/app/src/main/java/com/app/didaktikapp/BBDD/AppExecutors.java index 6496cda..d5d31e7 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/AppExecutors.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/AppExecutors.java @@ -28,6 +28,8 @@ *

* Grouping tasks like this avoids the effects of task starvation (e.g. disk reads don't wait behind * webservice requests). + * Pen-pineapple-apple-pen! + * @author gennakk */ public class AppExecutors { diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/ErrotaDao.java b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/ErrotaDao.java index 77b35be..53fc137 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/ErrotaDao.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/ErrotaDao.java @@ -10,20 +10,53 @@ import java.util.List; +/** + * Clase intermedia para acceder a BBDD y clase ActividadErrota. + * @author gennakk + */ @Dao public interface ErrotaDao { + + /** + * Obtener todas las ActividadesErrota. + * @author gennakk + * @return Lista de ActividadErrota. + */ @Query("SELECT * FROM ERROTA") List getErrotas(); + /** + * Devuelve una ActividadErrota por su ID. + * @param uuid ID + * @return ActividadErrota + * @author gennakk + */ @Query("SELECT * FROM ERROTA WHERE ID LIKE :uuid") ActividadErrota getErrota(Long uuid); + /** + * Inserta una nueva ActividadErrota. + * @param errota ActividadErrota a insertar. + * @return Devuelve su ID autogenerado. + * @author gennakk + */ @Insert Long addErrota(ActividadErrota errota); + /** + * Borra una ActividadErrota. + * P-P-A-P + * @param errota ActividadErrota a borrar. + * @author gennakk + */ @Delete void deleteErrota(ActividadErrota errota); + /** + * Actualiza una ActividadErrota + * @param errota ActividadErrota a actualizar. + * @author gennakk + */ @Update void updateErrota(ActividadErrota errota); } diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/GernikaDao.java b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/GernikaDao.java index 1b43bd3..1523d3c 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/GernikaDao.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/GernikaDao.java @@ -11,20 +11,53 @@ import java.util.List; +/** + * Clase intermedia para acceder a BBDD y clase ActividadGernika. + * @author gennakk + */ @Dao public interface GernikaDao { + + /** + * Obtener todas las ActividadesGernika. + * @author gennakk + * @return Lista de ActividadGernika. + */ @Query("SELECT * FROM GERNIKA") List getGernikas(); + /** + * Devuelve una ActividadGernika por su ID. + * @param uuid ID + * @return ActividadGernika + * @author gennakk + */ @Query("SELECT * FROM GERNIKA WHERE ID LIKE :uuid") ActividadGernika getGernika(Long uuid); + /** + * Inserta una nueva ActividadGernika. + * I have a pen, I have a apple. + * @param gernika ActividadGernika a insertar. + * @return Devuelve su ID autogenerado. + * @author gennakk + */ @Insert Long addGernika(ActividadGernika gernika); + /** + * Borra una ActividadGernika. + * @param gernika ActividadGernika a borrar. + * @author gennakk + */ @Delete void deleteGernika(ActividadGernika gernika); + /** + * Actualiza una ActividadGernika + * @param gernika ActividadGernika a actualizar. + * @author gennakk + */ @Update void updateGernika(ActividadGernika gernika); } diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/GrupoDao.java b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/GrupoDao.java index a89dc0f..6112aef 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/GrupoDao.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/GrupoDao.java @@ -10,21 +10,53 @@ import java.util.List; +/** + * Clase intermedia para acceder a BBDD y clase Grupo. + * @author gennakk + */ @Dao public interface GrupoDao { + /** + * Obtener todas los Grupos. + * @author gennakk + * @return Lista de Grupos. + */ @Query("SELECT * FROM GRUPO") List getGrupos(); + /** + * Devuelve un Grupo por su ID. + * Uh! Apple-pen! + * @param uuid ID + * @return Grupo + * @author gennakk + */ @Query("SELECT * FROM GRUPO WHERE ID LIKE :uuid") Grupo getGrupo(Long uuid); + /** + * Inserta una nuevo Grupo. + * @param grupo Grupo a insertar. + * @return Devuelve su ID autogenerado. + * @author gennakk + */ @Insert Long addGrupo(Grupo grupo); + /** + * Borra un Grupo. + * @param grupo Grupo a borrar. + * @author gennakk + */ @Delete void deleteGrupo(Grupo grupo); + /** + * Actualiza un Grupo + * @param grupo Grupo a actualizar. + * @author gennakk + */ @Update void updateGrupo(Grupo grupo); } diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/Repaso1Dao.java b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/Repaso1Dao.java index 1aa6ad5..30e5dbc 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/Repaso1Dao.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/Repaso1Dao.java @@ -11,20 +11,53 @@ import java.util.List; +/** + * Clase intermedia para acceder a BBDD y clase ActividadRepaso1. + * @author gennakk + */ @Dao public interface Repaso1Dao { + + /** + * Obtener todas las ActividadesRepaso1. + * @author gennakk + * @return Lista de ActividadRepaso1. + */ @Query("SELECT * FROM REPASO1") List getRepasos1(); + /** + * Devuelve una ActividadRepaso1 por su ID. + * I have a pen, I have pineapple. + * @param uuid ID + * @return ActividadRepaso1 + * @author gennakk + */ @Query("SELECT * FROM ERROTA WHERE ID LIKE :uuid") ActividadRepaso1 getRepaso1(Long uuid); + /** + * Inserta una nueva ActividadRepaso1. + * @param repaso1 ActividadRepaso1 a insertar. + * @return Devuelve su ID autogenerado. + * @author gennakk + */ @Insert Long addRepaso1(ActividadRepaso1 repaso1); + /** + * Borra una ActividadRepaso1. + * @param repaso1 ActividadRepaso1 a borrar. + * @author gennakk + */ @Delete void deleteRepaso1(ActividadRepaso1 repaso1); + /** + * Borra una ActividadRepaso1. + * @param repaso1 ActividadRepaso1 a borrar. + * @author gennakk + */ @Update void updateRepaso1(ActividadRepaso1 repaso1); } diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/Repaso2Dao.java b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/Repaso2Dao.java index b3a952d..15b1213 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/Repaso2Dao.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/Repaso2Dao.java @@ -12,20 +12,53 @@ import java.util.List; +/** + * Clase intermedia para acceder a BBDD y clase ActividadRepaso2. + * @author gennakk + */ @Dao public interface Repaso2Dao { + + /** + * Obtener todas las ActividadesRepaso2. + * Uh! Pineapple-pen! + * @author gennakk + * @return Lista de ActividadRepaso2. + */ @Query("SELECT * FROM REPASO2") List getRepasos2(); + /** + * Devuelve una ActividadRepaso2 por su ID. + * @param uuid ID + * @return ActividadRepaso2 + * @author gennakk + */ @Query("SELECT * FROM ERROTA WHERE ID LIKE :uuid") ActividadRepaso2 getRepaso2(Long uuid); + /** + * Inserta una nueva ActividadRepaso2. + * @param repaso2 ActividadRepaso2 a insertar. + * @return Devuelve su ID autogenerado. + * @author gennakk + */ @Insert Long addRepaso2(ActividadRepaso2 repaso2); + /** + * Borra una ActividadRepaso2. + * @param repaso2 ActividadRepaso2 a borrar. + * @author gennakk + */ @Delete void deleteRepaso2(ActividadRepaso2 repaso2); + /** + * Actualiza una ActividadRepaso2 + * @param repaso2 ActividadRepaso2 a actualizar. + * @author gennakk + */ @Update void updateRepaso2(ActividadRepaso2 repaso2); } diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/SanMiguelDao.java b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/SanMiguelDao.java index 48d87c9..518454a 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/SanMiguelDao.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/SanMiguelDao.java @@ -10,20 +10,53 @@ import java.util.List; +/** + * Clase intermedia para acceder a BBDD y clase ActividadSanMiguel. + * @author gennakk + */ @Dao public interface SanMiguelDao { + + /** + * Obtener todas las ActividadesSanMiguel. + * @author gennakk + * @return Lista de ActividadSanMiguel. + */ @Query("SELECT * FROM SANMIGUEL") List getSanMigueles(); + /** + * Devuelve una ActividadSanMiguel por su ID. + * @param uuid ID + * @return ActividadSanMiguel + * @author gennakk + */ @Query("SELECT * FROM SANMIGUEL WHERE ID LIKE :uuid") ActividadSanMiguel getSanMiguel(Long uuid); + /** + * Inserta una nueva ActividadSanMiguel. + * @param sanMiguel ActividadSanMiguel a insertar. + * @return Devuelve su ID autogenerado. + * @author gennakk + */ @Insert Long addSanMiguel(ActividadSanMiguel sanMiguel); + /** + * Borra una ActividadSanMiguel. + * Apple-pen, pineapple-pen + * @param sanMiguel ActividadSanMiguel a borrar. + * @author gennakk + */ @Delete void deleteSanMiguel(ActividadSanMiguel sanMiguel); + /** + * Actualiza una ActividadSanMiguel + * @param sanMiguel ActividadSanMiguel a actualizar. + * @author gennakk + */ @Update void updateSanMiguel(ActividadSanMiguel sanMiguel); } diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/TrenDao.java b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/TrenDao.java index 2ef18c0..b151dee 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/TrenDao.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/TrenDao.java @@ -10,21 +10,53 @@ import java.util.List; +/** + * Clase intermedia para acceder a BBDD y clase ActividadTren. + * @author gennakk + */ @Dao public interface TrenDao { + /** + * Obtener todas las ActividadesTren. + * @author gennakk + * @return Lista de ActividadTren. + */ @Query("SELECT * FROM TREN") List getTrenes(); + /** + * Devuelve una ActividadTren por su ID. + * @param uuid ID + * @return ActividadTren + * @author gennakk + */ @Query("SELECT * FROM TREN WHERE ID LIKE :uuid") ActividadTren getTren(Long uuid); + /** + * Inserta una nueva ActividadTren. + * @param tren ActividadTren a insertar. + * @return Devuelve su ID autogenerado. + * @author gennakk + */ @Insert Long addTren(ActividadTren tren); + /** + * Borra una ActividadErrota. + * @param tren ActividadErrota a borrar. + * @author gennakk + */ @Delete void deleteTren(ActividadTren tren); + /** + * Actualiza una ActividadTren. + * Uh! Pen-pineapple-apple-pen. + * @param tren ActividadTren a actualizar. + * @author gennakk + */ @Update void updateTren(ActividadTren tren); } diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/UniversitateaDao.java b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/UniversitateaDao.java index c47bb33..1c9af20 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/UniversitateaDao.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/UniversitateaDao.java @@ -10,21 +10,53 @@ import java.util.List; +/** + * Clase intermedia para acceder a BBDD y clase ActividadUniversitatea. + * @author gennakk + */ @Dao public interface UniversitateaDao { + /** + * Obtener todas las ActividadesUniversitatea. + * @author gennakk + * @return Lista de ActividadUniversitatea. + */ @Query("SELECT * FROM UNIVERSITATEA") List getUniversitateas(); + /** + * Devuelve una ActividadUniversitatea por su ID. + * @param uuid ID + * @return ActividadUniversitatea + * @author gennakk + */ @Query("SELECT * FROM UNIVERSITATEA WHERE ID LIKE :uuid") ActividadUniversitatea getUniversitatea(Long uuid); + /** + * Inserta una nueva ActividadUniversitatea. + * Pen-pineapple-apple-pen. + * @param universitatea ActividadUniversitatea a insertar. + * @return Devuelve su ID autogenerado. + * @author gennakk + */ @Insert Long addUniversitatea(ActividadUniversitatea universitatea); + /** + * Borra una ActividadUniversitatea. + * @param universitatea ActividadUniversitatea a borrar. + * @author gennakk + */ @Delete void deleteUniversitatea(ActividadUniversitatea universitatea); + /** + * Actualiza una ActividadUniversitatea + * @param universitatea ActividadUniversitatea a actualizar. + * @author gennakk + */ @Update void updateUniversitatea(ActividadUniversitatea universitatea); } diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/UsuarioDao.java b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/UsuarioDao.java index 02605a1..a57bcc2 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/UsuarioDao.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/UsuarioDao.java @@ -10,21 +10,53 @@ import java.util.List; +/** + * Clase intermedia para acceder a BBDD y clase Usuario. + * @author gennakk + */ @Dao public interface UsuarioDao { + /** + * Obtener todas los Usuarios. + * Dance time!. + * @author gennakk + * @return Lista de Usuario. + */ @Query("SELECT * FROM USUARIO") List getUsuarios(); + /** + * Devuelve una Usuario por su ID. + * @param uuid ID + * @return ActividadErrota + * @author gennakk + */ @Query("SELECT * FROM USUARIO WHERE ID LIKE :uuid") Usuario getUsuario(Integer uuid); + /** + * Inserta una nueva Usuario. + * @param usuario Usuario a insertar. + * @return Devuelve su ID autogenerado. + * @author gennakk + */ @Insert void addUsuario(Usuario usuario); + /** + * Borra un Usuario. + * @param usuario Usuario a borrar. + * @author gennakk + */ @Delete void deleteUsuario(Usuario usuario); + /** + * Actualiza un Usuario + * @param usuario Usuario a actualizar. + * @author gennakk + */ @Update void updateUsuario(Usuario usuario); diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/ZumeltzegiDao.java b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/ZumeltzegiDao.java index ac5c03f..364fd4d 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Dao/ZumeltzegiDao.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Dao/ZumeltzegiDao.java @@ -10,26 +10,58 @@ import java.util.List; +/** + * Clase intermedia para acceder a BBDD y clase ActividadZumeltzegi. + * @author gennakk + */ @Dao public interface ZumeltzegiDao { + /** + * Obtener todas las ActividadesZumeltzegi. + * @author gennakk + * @return Lista de ActividadesZumeltzegi. + */ @Query("SELECT * FROM ZUMELTZEGI") List getZumeltzegis(); + /** + * Devuelve una ActividadZumeltzegi por su ID. + * @param uuid ID + * @return ActividadZumeltzegi + * @author gennakk + */ @Query("SELECT * FROM ZUMELTZEGI WHERE ID LIKE :uuid") ActividadZumeltzegi getZumeltzegi(Long uuid); + /** + * Inserta una nueva ActividadZumeltzegi. + * I have a pen, I have a pen. + * @param zumeltzegi ActividadZumeltzegi a insertar. + * @return Devuelve su ID autogenerado. + * @author gennakk + */ @Insert Long addZumeltzegi(ActividadZumeltzegi zumeltzegi); + /** + * Borra una ActividadZumeltzegi. + * @param zumeltzegi ActividadZumeltzegi a borrar. + * @author gennakk + */ @Delete void deleteZumeltzegi(ActividadZumeltzegi zumeltzegi); + /** + * Actualiza una ActividadZumeltzegi + * @param zumeltzegi ActividadZumeltzegi a actualizar. + * @author gennakk + */ @Update void updateZumeltzegi(ActividadZumeltzegi zumeltzegi); /** - * Updating only price + * Updating only estado * By order id */ @Query("UPDATE zumeltzegi SET estado=:new_estado WHERE id = :id") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Actividad.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Actividad.java new file mode 100644 index 0000000..88751f6 --- /dev/null +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Actividad.java @@ -0,0 +1,18 @@ +package com.app.didaktikapp.BBDD.Modelos; + +/** + * Clase Actividad que extienden el resto de Actividades. + * Uh! Apple-pineapple! + * @author gennakk + */ +public class Actividad { + private int tipo; + + public int getTipo() { + return tipo; + } + + public void setTipo(int tipo) { + this.tipo = tipo; + } +} diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadErrota.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadErrota.java index 34ab2b6..c5c9b1b 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadErrota.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadErrota.java @@ -5,8 +5,14 @@ import androidx.room.Entity; import androidx.room.PrimaryKey; +/** + * Entidad ActividadErrota que crea la tabla en la BBDD ERROTA. + * Autogenera el ID. + * Uh! Apple-pineapple! + * @author gennakk + */ @Entity(tableName = "ERROTA") -public class ActividadErrota { +public class ActividadErrota extends Actividad{ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "ID") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadGernika.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadGernika.java index 8645675..81fda90 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadGernika.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadGernika.java @@ -5,8 +5,15 @@ import androidx.room.Entity; import androidx.room.PrimaryKey; + +/** + * Entidad ActividadGernika que crea la tabla en la BBDD GERNIKA. + * Autogenera el ID. + * Long pen, apple-pineapple, + * @author gennakk + */ @Entity(tableName = "GERNIKA") -public class ActividadGernika { +public class ActividadGernika extends Actividad{ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "ID") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadRepaso1.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadRepaso1.java index 3e1bbb9..5dedbfb 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadRepaso1.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadRepaso1.java @@ -5,8 +5,15 @@ import androidx.room.Entity; import androidx.room.PrimaryKey; + +/** + * Entidad ActividadRepaso1 que crea la tabla en la BBDD REPASO1. + * Autogenera el ID. + * Uh! Pen-pineapple-apple-pen! + * @author gennakk + */ @Entity(tableName = "REPASO1") -public class ActividadRepaso1 { +public class ActividadRepaso1 extends Actividad{ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "ID") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadRepaso2.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadRepaso2.java index f22c61d..893aba7 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadRepaso2.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadRepaso2.java @@ -5,8 +5,14 @@ import androidx.room.Entity; import androidx.room.PrimaryKey; +/** + * Entidad ActividadRepaso2 que crea la tabla en la BBDD REPASO2. + * Autogenera el ID. + * Pen-pineapple-apple-pen! + * @author gennakk + */ @Entity(tableName = "REPASO2") -public class ActividadRepaso2 { +public class ActividadRepaso2 extends Actividad{ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "ID") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadSanMiguel.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadSanMiguel.java index c053e82..3453a5b 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadSanMiguel.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadSanMiguel.java @@ -5,8 +5,14 @@ import androidx.room.Entity; import androidx.room.PrimaryKey; +/** + * Entidad ActividadSanMiguel que crea la tabla en la BBDD SANMIGUEL. + * Autogenera el ID. + * PPAP (Pen-Pineapple-Apple-Pen) + * @author gennakk + */ @Entity(tableName = "SANMIGUEL") -public class ActividadSanMiguel { +public class ActividadSanMiguel extends Actividad{ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "ID") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadTren.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadTren.java index 6222931..a1f7185 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadTren.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadTren.java @@ -5,8 +5,14 @@ import androidx.room.Entity; import androidx.room.PrimaryKey; +/** + * Entidad ActividadTren que crea la tabla en la BBDD TREN. + * Autogenera el ID. + * P-P-A-P + * @author gennakk + */ @Entity(tableName = "TREN") -public class ActividadTren { +public class ActividadTren extends Actividad{ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "ID") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadUniversitatea.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadUniversitatea.java index eb4cfdf..83d1e47 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadUniversitatea.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadUniversitatea.java @@ -5,8 +5,16 @@ import androidx.room.Entity; import androidx.room.PrimaryKey; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * Entidad ActividadUniversitatea que crea la tabla en la BBDD UNIVERSITATEA. + * Autogenera el ID. + * I have a pen, I have a apple. + * @author gennakk + */ @Entity(tableName = "UNIVERSITATEA") -public class ActividadUniversitatea { +public class ActividadUniversitatea extends Actividad{ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "ID") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadZumeltzegi.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadZumeltzegi.java index 12ed8a8..e5259d3 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadZumeltzegi.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/ActividadZumeltzegi.java @@ -8,8 +8,14 @@ import static androidx.room.ForeignKey.CASCADE; +/** + * Entidad ActividadZumeltzegi que crea la tabla en la BBDD ZUMELTZEGI. + * Autogenera el ID. + * Uh! Apple-pen! + * @author gennakk + */ @Entity(tableName = "ZUMELTZEGI") -public class ActividadZumeltzegi { +public class ActividadZumeltzegi extends Actividad{ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "ID") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Grupo.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Grupo.java index fab1371..b085ab4 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Grupo.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Grupo.java @@ -16,6 +16,12 @@ import static androidx.room.ForeignKey.CASCADE; +/** + * Entidad GRUPO que crea la tabla en la BBDD GRUPO. Con sus correspondientes dependencias. + * Autogenera el ID. + * I have a pen, I have pineapple. + * @author gennakk + */ @Entity(tableName = "GRUPO", foreignKeys ={ @ForeignKey(entity = ActividadZumeltzegi.class, parentColumns = "ID", @@ -57,6 +63,9 @@ public class Grupo { @NonNull private Long id ; + @ColumnInfo(name = "DEVICEID") + private String deviceId ; + @ColumnInfo(name = "NOMBRE") private String nombre; @@ -98,6 +107,14 @@ public void setId(@NonNull Long id) { this.id = id; } + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + public String getNombre() { return nombre; } diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Usuario.java b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Usuario.java index 49f0bf4..a8aff9a 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Usuario.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Modelos/Usuario.java @@ -11,6 +11,12 @@ import static androidx.room.ForeignKey.CASCADE; +/** + * Entidad Usuario que crea la tabla en la BBDD USUARIO. Con sus correspondientes dependencias. + * Autogenera el ID. + * Uh! Pineapple-pen! + * @author gennakk + */ @Entity(tableName = "USUARIO", foreignKeys =@ForeignKey(entity = Grupo.class, parentColumns = "ID", diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/SQLiteControlador.java b/app/src/main/java/com/app/didaktikapp/BBDD/SQLiteControlador.java deleted file mode 100644 index 6b5c462..0000000 --- a/app/src/main/java/com/app/didaktikapp/BBDD/SQLiteControlador.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.app.didaktikapp.BBDD; - -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.util.Log; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - -import androidx.fragment.app.Fragment; - -public class SQLiteControlador { - - private String nombrebd; - private Context context; - public SQLiteControlador(Context context) { - this.context = context; - nombrebd = "DBDidaktikapp"; - } - - public SQLiteControlador(Context context, String nombrebd) { - this.context = context; - this.nombrebd = nombrebd; - } - - private SQLiteHelper getSQLiteHelper() { - return new SQLiteHelper(context, nombrebd, null, 3); - } - - // Devuelve el id del grupo que ha creado para guardarlo en MapActivity - public int crearGrupo(String grupo, String[] alumnos) { - SQLiteHelper sqlh = getSQLiteHelper(); - SQLiteDatabase db = sqlh.getWritableDatabase(); - - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); - Date time = Calendar.getInstance().getTime(); - String fecha = sdf.format(time); - - db.execSQL("INSERT INTO Grupo(Nombre,Fecha) VALUES('"+grupo+"','"+fecha+"')"); - - Cursor c = db.rawQuery("SELECT MAX(IDGrupo) FROM Grupo",null); - c.moveToFirst(); - int idgrupo = c.getInt(0); - - if (alumnos.length==0) { - db.execSQL("INSERT INTO Participante(IDGrupo,Nombre) VALUES('"+idgrupo+"','Alumno')"); - } else { - for (int x=0;x pero vosotros los de Txurdinaga tambien podeis usarlos :P */ - db.execSQL("DROP TABLE IF EXISTS ZumeltzegiDorrea"); - db.execSQL("DROP TABLE IF EXISTS SanMiguelParrokia"); - db.execSQL("DROP TABLE IF EXISTS Unibertsitatea"); - db.execSQL("DROP TABLE IF EXISTS Trena"); - db.execSQL("DROP TABLE IF EXISTS SanMiguelErrota"); - db.execSQL("DROP TABLE IF EXISTS GernikakoArbola"); - - db.execSQL("DROP TABLE IF EXISTS Grupo"); - db.execSQL("CREATE TABLE Grupo(" + - "IDGrupo INTEGER PRIMARY KEY AUTOINCREMENT," + - "Nombre TEXT," + - "Fecha REAL)"); - - db.execSQL("DROP TABLE IF EXISTS Participante"); - db.execSQL("CREATE TABLE Participante(" + - "IDParticipante INTEGER PRIMARY KEY AUTOINCREMENT," + - "IDGrupo INTEGER," + - "Nombre TEXT," + - "FOREIGN KEY(IDGrupo) REFERENCES Grupo(IDGrupo))"); - - db.execSQL("DROP TABLE IF EXISTS ActividadZumeltzegi"); - db.execSQL("CREATE TABLE ActividadZumeltzegi(" + - "IDActividad INTEGER PRIMARY KEY AUTOINCREMENT," + - "Completado INTEGER," + - "Foto1 TEXT," + - "Foto2 TEXT," + - "IDGrupo INTEGER," + - "Fase INTEGER," + - "FOREIGN KEY(IDGrupo) REFERENCES Grupo(IDGrupo))"); - - db.execSQL("DROP TABLE IF EXISTS ActividadSanMiguel"); - db.execSQL("CREATE TABLE ActividadSanMiguel(" + - "IDActividad INTEGER PRIMARY KEY AUTOINCREMENT," + - "Completado INTEGER," + - "Test DOUBLE," + - "Foto1 TEXT," + - "Foto2 TEXT," + - "Foto3 TEXT," + - "IDGrupo INTEGER," + - "Fase INTEGER," + - "FOREIGN KEY(IDGrupo) REFERENCES Grupo(IDGrupo))"); - - db.execSQL("DROP TABLE IF EXISTS ActividadUniversidad"); - db.execSQL("CREATE TABLE ActividadUniversidad(" + - "IDActividad INTEGER PRIMARY KEY AUTOINCREMENT," + - "Completado INTEGER," + - "Test DOUBLE," + - "Foto1 TEXT," + - "Foto2 TEXT," + - "Foto3 TEXT," + - "IDGrupo INTEGER," + - "Fase INTEGER," + - "FOREIGN KEY(IDGrupo) REFERENCES Grupo(IDGrupo))"); - - db.execSQL("DROP TABLE IF EXISTS ActividadTren"); - db.execSQL("CREATE TABLE ActividadTren(" + - "IDActividad INTEGER PRIMARY KEY AUTOINCREMENT," + - "Completado INTEGER," + - "Puzle INTEGER," + - "Palabras DOUBLE," + - "IDGrupo INTEGER," + - "Fase INTEGER," + - "FOREIGN KEY(IDGrupo) REFERENCES Grupo(IDGrupo))"); - - db.execSQL("DROP TABLE IF EXISTS ActividadErrota"); - db.execSQL("CREATE TABLE ActividadErrota(" + - "IDActividad INTEGER PRIMARY KEY AUTOINCREMENT," + - "Completado INTEGER," + - "Frases INTEGER," + - "Foto1 TEXT," + - "Foto2 TEXT," + - "IDGrupo INTEGER," + - "Fase INTEGER," + - "FOREIGN KEY(IDGrupo) REFERENCES Grupo(IDGrupo))"); - - } - -} diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Service/ErrotaService.java b/app/src/main/java/com/app/didaktikapp/BBDD/Service/ErrotaService.java index 884f807..c822206 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Service/ErrotaService.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Service/ErrotaService.java @@ -12,6 +12,11 @@ import java.util.List; +/** + * Servicio de Errota, implementa el DAO. + * Apple-pen, pineapple-pen + * @author gennakk + */ public class ErrotaService { diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Service/GernikaService.java b/app/src/main/java/com/app/didaktikapp/BBDD/Service/GernikaService.java index 87c2d7f..d52a04e 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Service/GernikaService.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Service/GernikaService.java @@ -13,7 +13,11 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository; import java.util.List; - +/** + * Servicio de Gernika, implementa el DAO. + * Uh! Pen-pineapple-apple-pen + * @author gennakk + */ public class GernikaService { diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Service/GrupoService.java b/app/src/main/java/com/app/didaktikapp/BBDD/Service/GrupoService.java index de59b9b..48f58b8 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Service/GrupoService.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Service/GrupoService.java @@ -13,7 +13,11 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository; import java.util.List; - +/** + * Servicio de GrupoService, implementa el DAO. + * Pen-pineapple-apple-pen + * @author gennakk + */ public class GrupoService { @SuppressLint("StaticFieldLeak") private static GrupoService grupoService; diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Service/Repaso1Service.java b/app/src/main/java/com/app/didaktikapp/BBDD/Service/Repaso1Service.java index 0342105..9ab8800 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Service/Repaso1Service.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Service/Repaso1Service.java @@ -13,7 +13,11 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository; import java.util.List; - +/** + * Servicio de Repaso1Service, implementa el DAO. + * Dance time! + * @author gennakk + */ public class Repaso1Service { diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Service/Repaso2Service.java b/app/src/main/java/com/app/didaktikapp/BBDD/Service/Repaso2Service.java index cb17d20..2e91fb6 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Service/Repaso2Service.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Service/Repaso2Service.java @@ -15,7 +15,11 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository; import java.util.List; - +/** + * Servicio de Repaso2, implementa el DAO. + * I have a pen, I have a pen + * @author gennakk + */ public class Repaso2Service { diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Service/SanMiguelService.java b/app/src/main/java/com/app/didaktikapp/BBDD/Service/SanMiguelService.java index dd1a5f4..7fd2443 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Service/SanMiguelService.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Service/SanMiguelService.java @@ -11,7 +11,11 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository; import java.util.List; - +/** + * Servicio de SanMiguel, implementa el DAO. + * Uh! Long pen! + * @author gennakk + */ public class SanMiguelService { diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Service/TrenService.java b/app/src/main/java/com/app/didaktikapp/BBDD/Service/TrenService.java index 8c21260..57e331f 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Service/TrenService.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Service/TrenService.java @@ -11,7 +11,11 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository; import java.util.List; - +/** + * Servicio de Tren, implementa el DAO. + * I have a apple, I have pineapple + * @author gennakk + */ public class TrenService { @SuppressLint("StaticFieldLeak") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Service/UniversitateaService.java b/app/src/main/java/com/app/didaktikapp/BBDD/Service/UniversitateaService.java index 2b1d3fd..b46a5f6 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Service/UniversitateaService.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Service/UniversitateaService.java @@ -13,7 +13,11 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository; import java.util.List; - +/** + * Servicio de Universitatea, implementa el DAO. + * Uh! Apple-pineapple! + * @author gennakk + */ public class UniversitateaService { @SuppressLint("StaticFieldLeak") diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Service/UsuarioService.java b/app/src/main/java/com/app/didaktikapp/BBDD/Service/UsuarioService.java index f0f442c..5d7845d 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Service/UsuarioService.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Service/UsuarioService.java @@ -11,7 +11,11 @@ import com.app.didaktikapp.BBDD.database.AppDatabase; import java.util.List; - +/** + * Servicio de Usuario, implementa el DAO. + * Long pen, apple-pineapple, + * @author gennakk + */ public class UsuarioService { @SuppressLint("StaticFieldLeak") private static UsuarioService usuarioService; diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/Service/ZumeltzegiService.java b/app/src/main/java/com/app/didaktikapp/BBDD/Service/ZumeltzegiService.java index 1cbf440..80840ec 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/Service/ZumeltzegiService.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/Service/ZumeltzegiService.java @@ -13,7 +13,11 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository; import java.util.List; - +/** + * Servicio de Zumeltzegi, implementa el DAO. + * Uh! Pen-pineapple-apple-pen! + * @author gennakk + */ public class ZumeltzegiService { @SuppressLint("StaticFieldLeak") private static ZumeltzegiService zumeltzegiService; diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/TimestampConverter.java b/app/src/main/java/com/app/didaktikapp/BBDD/TimestampConverter.java index ed0fc1d..f26989b 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/TimestampConverter.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/TimestampConverter.java @@ -8,6 +8,11 @@ import java.util.Date; import java.util.TimeZone; +/** + * Clase para convertir las fechas para la BBDD. + * PPAP (Pen-Pineapple-Apple-Pen) + * @author gennakk + */ public class TimestampConverter { private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/database/AppDatabase.java b/app/src/main/java/com/app/didaktikapp/BBDD/database/AppDatabase.java index 6b9f963..25f1fb5 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/database/AppDatabase.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/database/AppDatabase.java @@ -37,7 +37,10 @@ import java.util.List; - +/** + * Clase con la BBDD y su estructura de clases. + * @author gennakk + */ @Database(entities = {Grupo.class, Usuario.class, ActividadZumeltzegi.class, ActividadUniversitatea.class, @@ -47,28 +50,78 @@ ActividadGernika.class, ActividadRepaso1.class, ActividadRepaso2.class}, - version = 2 ) + version = 4 ) public abstract class AppDatabase extends RoomDatabase { - + /** + * Getter de GrupoDao. + * @return GrupoDao + * @author gennakk + */ public abstract GrupoDao getGrupoDao(); + /** + * Getter de UsuarioDao. + * Uh! Long pen! + * @return UsuarioDao + * @author gennakk + */ public abstract UsuarioDao getUsuarioDao(); + /** + * Getter de ZumeltzegiDao. + * @return ZumeltzegiDao + * @author gennakk + */ public abstract ZumeltzegiDao getZumeltzegiDao(); + /** + * Getter de UniversitateaDao. + * @return UniversitateaDao + * @author gennakk + */ public abstract UniversitateaDao getUniversitateaDao(); + /** + * Getter de TrenDao. + * @return TrenDao + * @author gennakk + */ public abstract TrenDao getTrenDao(); + /** + * Getter de SanMiguelDao. + * @return SanMiguelDao + * @author gennakk + */ public abstract SanMiguelDao getSanMiguelDao(); + /** + * Getter de ErrotaDao. + * @return ErrotaDao + * @author gennakk + */ public abstract ErrotaDao getErrotaDao(); + /** + * Getter de GernikaDao. + * @return GernikaDao + * @author gennakk + */ public abstract GernikaDao getGernikaDao(); + /** + * Getter de Repaso1Dao. + * @return Repaso1Dao + * @author gennakk + */ public abstract Repaso1Dao getRepaso1Dao(); + /** + * Getter de Repaso2Dao. + * @return Repaso2Dao + * @author gennakk + */ public abstract Repaso2Dao getRepaso2Dao(); diff --git a/app/src/main/java/com/app/didaktikapp/BBDD/database/DatabaseRepository.java b/app/src/main/java/com/app/didaktikapp/BBDD/database/DatabaseRepository.java index e749642..0e66572 100644 --- a/app/src/main/java/com/app/didaktikapp/BBDD/database/DatabaseRepository.java +++ b/app/src/main/java/com/app/didaktikapp/BBDD/database/DatabaseRepository.java @@ -1,10 +1,14 @@ package com.app.didaktikapp.BBDD.database; +import android.accounts.Account; import android.content.Context; import android.os.AsyncTask; +import android.telephony.TelephonyManager; import androidx.annotation.VisibleForTesting; import androidx.room.Room; +import androidx.room.migration.Migration; +import androidx.sqlite.db.SupportSQLiteDatabase; import com.app.didaktikapp.BBDD.Modelos.ActividadErrota; import com.app.didaktikapp.BBDD.Modelos.ActividadGernika; @@ -19,6 +23,10 @@ import java.util.Calendar; import java.util.concurrent.ExecutionException; +/** + * Clase que instancia la BBDD. + * @author gennakk + */ public class DatabaseRepository { @@ -27,10 +35,20 @@ public class DatabaseRepository { @VisibleForTesting private static final String DATABASE_NAME = "didaktikappBBDD"; + /** + * Constructor de la clase. + * @param context Contexto de la aplicación. + * @author gennakk + */ public DatabaseRepository(Context context) { appDatabase = getInstance(context); } + /** + * Genera la BBDD en caso de no existir. + * @param context Contexto de la aplicación. + * @return Clase AppDatabase + */ public static AppDatabase getInstance(Context context) { if (null == appDatabase) { appDatabase = buildDatabaseInstance(context); @@ -38,18 +56,36 @@ public static AppDatabase getInstance(Context context) { return appDatabase; } + /** + * Construye la BBDD. + * @param context Contexto de la aplicación. + * @return Clase AppDatabase. + * @author gennakk + */ private static AppDatabase buildDatabaseInstance(Context context) { return Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME) + .addMigrations(MIGRATION_2_3) + .fallbackToDestructiveMigration() .allowMainThreadQueries().build(); } + /** + * Limpia la BBDD. + * @author gennakk + */ public void cleanUp(){ appDatabase = null; } - public static Long insertTaskGrupo(String nombreGrupo){ + /** + * Crea un Grupo de manera asíncrona. + * @param nombreGrupo Nombre del grupo. + * @return ID autogenerado. + * @author gennakk + */ + public static Long insertTaskGrupo(String nombreGrupo, String email){ try { @@ -58,8 +94,10 @@ public static Long insertTaskGrupo(String nombreGrupo){ protected Long doInBackground(Void... voids) { Grupo grupo = new Grupo(); grupo.setNombre(nombreGrupo); + grupo.setDeviceId(email); grupo.setFecha( Calendar.getInstance().getTime()); ActividadZumeltzegi actividadZumeltzegi = new ActividadZumeltzegi(); + grupo.setIdZumeltzegi(appDatabase.getZumeltzegiDao().addZumeltzegi(actividadZumeltzegi)); grupo.setIdUniversidad(appDatabase.getUniversitateaDao().addUniversitatea(new ActividadUniversitatea())); grupo.setIdTren(appDatabase.getTrenDao().addTren(new ActividadTren())); @@ -86,48 +124,93 @@ protected Long doInBackground(Void... voids) { } + /** + * Busca el estado de Zumeltzegi. + * @param idgrupo ID del grupo. + * @return Estado de la actividad Zumeltzegi. + */ public static Integer searchEstadoZumeltzegi(Long idgrupo){ Long id = appDatabase.getGrupoDao().getGrupo(idgrupo).getIdZumeltzegi(); return appDatabase.getZumeltzegiDao().getZumeltzegi(id).getEstado(); } + /** + * Busca el estado de SanMiguelDao. + * @param idgrupo ID del grupo. + * @return Estado de la actividad SanMiguelDao. + */ public static Integer searchEstadoSanMiguel(Long idgrupo){ Long id = appDatabase.getGrupoDao().getGrupo(idgrupo).getIdParroquia(); return appDatabase.getSanMiguelDao().getSanMiguel(id).getEstado(); } + /** + * Busca el estado de UniversitateaDao. + * @param idgrupo ID del grupo. + * @return Estado de la actividad UniversitateaDao. + */ public static Integer searchEstadoUniversidad(Long idgrupo){ Long id = appDatabase.getGrupoDao().getGrupo(idgrupo).getIdUniversidad(); return appDatabase.getUniversitateaDao().getUniversitatea(id).getEstado(); } + /** + * Busca el estado de TrenDao. + * @param idgrupo ID del grupo. + * @return Estado de la actividad TrenDao. + */ public static Integer searchEstadoTren(Long idgrupo){ Long id = appDatabase.getGrupoDao().getGrupo(idgrupo).getIdTren(); return appDatabase.getTrenDao().getTren(id).getEstado(); } + /** + * Busca el estado de ErrotaDao. + * @param idgrupo ID del grupo. + * @return Estado de la actividad ErrotaDao. + */ public static Integer searchEstadoErrota(Long idgrupo){ Long id = appDatabase.getGrupoDao().getGrupo(idgrupo).getIdErrota(); return appDatabase.getErrotaDao().getErrota(id).getEstado(); } + /** + * Busca el estado de GernikaDao. + * @param idgrupo ID del grupo. + * @return Estado de la actividad GernikaDao. + */ public static Integer searchEstadoGernika(Long idgrupo){ Long id = appDatabase.getGrupoDao().getGrupo(idgrupo).getIdGernika(); return appDatabase.getGernikaDao().getGernika(id).getEstado(); } + /** + * Busca el estado de Repaso1Dao. + * I have a apple, I have pineapple + * @param idgrupo ID del grupo. + * @return Estado de la actividad Repaso1Dao. + */ public static Integer searchEstadoRepaso1(Long idgrupo){ Long id = appDatabase.getGrupoDao().getGrupo(idgrupo).getIdRepaso1(); return appDatabase.getRepaso1Dao().getRepaso1(id).getEstado(); } + /** + * Busca el estado de Repaso2Dao. + * @param idgrupo ID del grupo. + * @return Estado de la actividad Repaso2Dao. + */ public static Integer searchEstadoRepaso2(Long idgrupo){ Long id = appDatabase.getGrupoDao().getGrupo(idgrupo).getIdRepaso2(); return appDatabase.getRepaso2Dao().getRepaso2(id).getEstado(); } - + /** + * Borra el Grupo y todas las Actividades relaccionadas. + * @param grupo Objeto Grupo. + * @author gennakk + */ public static void deleteGrupo(Grupo grupo){ appDatabase.getZumeltzegiDao().deleteZumeltzegi(appDatabase.getZumeltzegiDao().getZumeltzegi(grupo.getIdZumeltzegi())); @@ -154,11 +237,53 @@ public static void deleteGrupo(Grupo grupo){ } + /** + * Devuelve la BBDD. + * @return AppDatabase BBDD. + * @author gennakk + */ public static AppDatabase getAppDatabase() { return appDatabase; } + /** + * Setter de BBBD. + * @param appDatabase BBDD de la aplicación. + * @author gennakk + */ public static void setAppDatabase(AppDatabase appDatabase) { DatabaseRepository.appDatabase = appDatabase; } + + static final Migration MIGRATION_2_3 = new Migration(2, 3) { + @Override + public void migrate(SupportSQLiteDatabase database) { + database.execSQL("DROP TABLE ERROTA"); + database.execSQL("DROP TABLE GERNIKA"); + database.execSQL("DROP TABLE REPASO1"); + database.execSQL("DROP TABLE REPASO2"); + database.execSQL("DROP TABLE SANMIGUEL"); + database.execSQL("DROP TABLE TREN"); + database.execSQL("DROP TABLE UNIVERSITATEA"); + database.execSQL("DROP TABLE ZUMELTZEGI"); + database.execSQL("DROP TABLE GRUPO"); + database.execSQL("DROP TABLE USUARIO"); + } + }; + + static final Migration MIGRATION_3_4 = new Migration(3, 4) { + @Override + public void migrate(SupportSQLiteDatabase database) { + database.execSQL("DROP TABLE ERROTA"); + database.execSQL("DROP TABLE GERNIKA"); + database.execSQL("DROP TABLE REPASO1"); + database.execSQL("DROP TABLE REPASO2"); + database.execSQL("DROP TABLE SANMIGUEL"); + database.execSQL("DROP TABLE TREN"); + database.execSQL("DROP TABLE UNIVERSITATEA"); + database.execSQL("DROP TABLE ZUMELTZEGI"); + database.execSQL("DROP TABLE GRUPO"); + database.execSQL("DROP TABLE USUARIO"); + } + }; } diff --git a/app/src/main/java/com/app/didaktikapp/CardStack/CardStackAdapter.kt b/app/src/main/java/com/app/didaktikapp/CardStack/CardStackAdapter.kt index c031920..71bdeee 100644 --- a/app/src/main/java/com/app/didaktikapp/CardStack/CardStackAdapter.kt +++ b/app/src/main/java/com/app/didaktikapp/CardStack/CardStackAdapter.kt @@ -11,6 +11,11 @@ import com.app.didaktikapp.R import java.util.Collections.emptyList import com.bumptech.glide.Glide +/** + * Adaptador para el CardStack, crea la vista para las cartas. + * P-P-A-P + * @author gennakk + */ class CardStackAdapter( private var spots: List = emptyList() ) : RecyclerView.Adapter() { diff --git a/app/src/main/java/com/app/didaktikapp/CardStack/Spot.kt b/app/src/main/java/com/app/didaktikapp/CardStack/Spot.kt index b9a7d48..bf116bb 100644 --- a/app/src/main/java/com/app/didaktikapp/CardStack/Spot.kt +++ b/app/src/main/java/com/app/didaktikapp/CardStack/Spot.kt @@ -1,6 +1,10 @@ package com.app.didaktikapp.CardStack - +/** + * Clase Spot para el lugar e introducirlo en la carta. + * I have a pen, I have a apple + * @author gennakk + */ data class Spot( val id: Long , val name: String, diff --git a/app/src/main/java/com/app/didaktikapp/CardStack/SpotDiffCallback.kt b/app/src/main/java/com/app/didaktikapp/CardStack/SpotDiffCallback.kt index 5b48480..a5f8313 100644 --- a/app/src/main/java/com/app/didaktikapp/CardStack/SpotDiffCallback.kt +++ b/app/src/main/java/com/app/didaktikapp/CardStack/SpotDiffCallback.kt @@ -2,6 +2,11 @@ package com.app.didaktikapp.CardStack import androidx.recyclerview.widget.DiffUtil +/** + * Callback para la lista de cartas. + * Uh! Apple-pen! + * @author gennakk + */ class SpotDiffCallback( private val old: List, private val new: List diff --git a/app/src/main/java/com/app/didaktikapp/CircleMenu/CircleMenuView.java b/app/src/main/java/com/app/didaktikapp/CircleMenu/CircleMenuView.java index 476d245..f9f01e1 100644 --- a/app/src/main/java/com/app/didaktikapp/CircleMenu/CircleMenuView.java +++ b/app/src/main/java/com/app/didaktikapp/CircleMenu/CircleMenuView.java @@ -33,7 +33,9 @@ /** - * CircleMenuView + * Clase customizada de CircleMenuView. + * I have a pen, I have pineapple + * @author gennakk */ public class CircleMenuView extends FrameLayout { @@ -130,6 +132,10 @@ public void onButtonLongClickAnimationStart(@NonNull CircleMenuView view, int bu public void onButtonLongClickAnimationEnd(@NonNull CircleMenuView view, int buttonIndex) {} } + /** + * Listener de los botones. Pulsación corta. + * @author gennakk + */ private class OnButtonClickListener implements View.OnClickListener { @Override public void onClick(final View view) { @@ -158,6 +164,10 @@ public void onAnimationEnd(Animator animation) { } } + /** + * Listener de los botones. Pulsación larga. + * @author gennakk + */ private class OnButtonLongClickListener implements View.OnLongClickListener { @Override public boolean onLongClick(final View view) { @@ -187,10 +197,23 @@ public void onAnimationEnd(Animator animation) { } } + /** + * Constructor de la clase CircleMenuView. + * @param context + * @param attrs + * @gennnakk + */ public CircleMenuView(@NonNull Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } + /** + * Constructor de la clase CircleMenuView. + * @param context + * @param attrs + * @param defStyleAttr + * @author gennakk + */ public CircleMenuView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); @@ -272,6 +295,12 @@ public CircleMenuView(@NonNull Context context, @NonNull List icons, @N initButtons(context, icons, colors); } + /** + * Medidas del menú. + * @param widthMeasureSpec + * @param heightMeasureSpec + * @author gennakk + */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); @@ -282,6 +311,15 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(w, h); } + /** + * Gestión de cambios en el layout. + * @param changed + * @param left + * @param top + * @param right + * @param bottom + * @author gennakk + */ @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); @@ -300,6 +338,11 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto lp.height = bottom - top; } + /** + * Inicio del layout. + * @param context + * @author gennakk + */ private void initLayout(@NonNull Context context) { LayoutInflater.from(context).inflate(R.layout.circle_menu, this, true); @@ -316,6 +359,11 @@ private void initLayout(@NonNull Context context) { mRingView = findViewById(R.id.ring_view); } + /** + * Inicio del Menú. + * @param menuButtonColor + * @author gennakk + */ private void initMenu(int menuButtonColor) { final AnimatorListenerAdapter animListener = new AnimatorListenerAdapter() { @Override @@ -360,6 +408,13 @@ public void onClick(View view) { }); } + /** + * Inicio de los botones. + * @param context + * @param icons + * @param colors + * @author gennakk + */ private void initButtons(@NonNull Context context, @NonNull List icons, @NonNull List colors) { final int buttonsCount = Math.min(icons.size(), colors.size()); for (int i = 0; i < buttonsCount; i++) { @@ -379,6 +434,15 @@ private void initButtons(@NonNull Context context, @NonNull List icons, } } + /** + * Escalado de los botones + * @param centerX + * @param centerY + * @param angleStep + * @param offset + * @param scale + * @author gennakk + */ private void offsetAndScaleButtons(float centerX, float centerY, float angleStep, float offset, float scale) { for (int i = 0, cnt = mButtons.size(); i < cnt; i++) { final float angle = angleStep * i - 90; @@ -393,6 +457,12 @@ private void offsetAndScaleButtons(float centerX, float centerY, float angleStep } } + /** + * Getter de la animación de los botones. + * @param button + * @return Animación del botón. + * @author gennakk + */ private Animator getButtonClickAnimation(final @NonNull FloatingActionButton button) { final int buttonNumber = mButtons.indexOf(button) + 1; final float stepAngle = 360f / mButtons.size(); @@ -479,6 +549,11 @@ public void onAnimationEnd(Animator animation) { return result; } + /** + * Getter de la animación del menú al abrir. + * @return Animación del menú al abrir. + * @author gennakk + */ private Animator getOpenMenuAnimation() { final ObjectAnimator alphaAnimation = ObjectAnimator.ofFloat(mMenuButton, "alpha", DEFAULT_CLOSE_ICON_ALPHA); @@ -540,6 +615,11 @@ public void onAnimationEnd(Animator animation) { return result; } + /** + * Getter de animación de cierre del menú. + * @return Animación de cierre del menú. + * @author gennakk + */ private Animator getCloseMenuAnimation() { final ObjectAnimator scaleX1 = ObjectAnimator.ofFloat(mMenuButton, "scaleX", 0f); final ObjectAnimator scaleY1 = ObjectAnimator.ofFloat(mMenuButton, "scaleY", 0f); diff --git a/app/src/main/java/com/app/didaktikapp/FTP/ClassToFtp.java b/app/src/main/java/com/app/didaktikapp/FTP/ClassToFtp.java new file mode 100644 index 0000000..d31a4cb --- /dev/null +++ b/app/src/main/java/com/app/didaktikapp/FTP/ClassToFtp.java @@ -0,0 +1,164 @@ +package com.app.didaktikapp.FTP; + +import android.content.Context; +import android.util.Log; +import android.widget.Toast; + +import androidx.work.Constraints; +import androidx.work.Data; +import androidx.work.NetworkType; +import androidx.work.OneTimeWorkRequest; +import androidx.work.WorkManager; + +import com.app.didaktikapp.Activities.MapActivity; +import com.app.didaktikapp.BBDD.Modelos.Actividad; +import com.app.didaktikapp.BBDD.Modelos.ActividadErrota; +import com.app.didaktikapp.BBDD.Modelos.ActividadGernika; +import com.app.didaktikapp.BBDD.Modelos.ActividadUniversitatea; +import com.app.didaktikapp.BBDD.Modelos.Grupo; +import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Completable; +import io.reactivex.CompletableObserver; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Action; +import io.reactivex.schedulers.Schedulers; + +/** + * Clase para recoger datos de clases convertir a Json y enviar peticion + * @author gennakk + */ +public class ClassToFtp { + + public static final int TIPO_ERROTA = 1; + + public static final int TIPO_GERNIKA = 2; + + public static final int TIPO_REPASO1 = 3; + + public static final int TIPO_REPASO2 = 4; + + public static final int TIPO_SANMIGUEL = 5; + + public static final int TIPO_TREN = 6; + + public static final int TIPO_UNIVERSITATEA = 7; + + public static final int TIPO_ZUMELTZEGI = 8; + + /** + * Mandar peticion cuando haya internet + * @param context + * @param tipo + */ + public static void send(Context context,int tipo){ + Completable.fromAction(new Action() { + @Override + public void run() throws Exception { + DatabaseRepository.getAppDatabase().getGrupoDao().getGrupo(MapActivity.GRUPO_S.getId()); + } + }).observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new CompletableObserver() { + @Override + public void onSubscribe(Disposable d) { + } + + @Override + public void onComplete() { + + + + GrupoActividad grupoActividad = obtenerActividadGrupo(tipo); + ArrayList returnList = new ArrayList(); + returnList.add(grupoActividad); + Gson gson = new Gson(); + Type type = new TypeToken>(){}.getType(); + String json = gson.toJson(returnList, type); + Log.v("upload result", "send?"); + + + /*** Logic to set Data while creating worker **/ + Constraints constraints = new Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build(); + Data.Builder dataBuilder = new Data.Builder(); + //Add parameter in Data class. just like bundle. You can also add Boolean and Number in parameter. + dataBuilder.putString(Ftp.JSON, json); + Log.i("JSON",json); + + + Data data = dataBuilder.build(); + + OneTimeWorkRequest onetimeJob = new OneTimeWorkRequest.Builder(Ftp.class) + .setConstraints(constraints) + .setInputData(data).build(); // or PeriodicWorkRequest + //enque worker + WorkManager.getInstance().enqueue(onetimeJob); + + + Log.v("upload result", "sended"); + + if(grupoActividad.getActividad() instanceof ActividadUniversitatea){ + + + + } + } + + @Override + public void onError(Throwable e) { + Toast.makeText(context, "Empty data",Toast.LENGTH_LONG).show(); + } + }); + } + + + /** + * Obtener tipo de actividad + * @param tipo + * @return + */ + private static GrupoActividad obtenerActividadGrupo(int tipo){ + Actividad responseList = null; + if(tipo == TIPO_ERROTA) { + responseList = DatabaseRepository.getAppDatabase().getErrotaDao().getErrota(MapActivity.GRUPO_S.getId()); + } + if(tipo == TIPO_GERNIKA) { + responseList = DatabaseRepository.getAppDatabase().getGernikaDao().getGernika(MapActivity.GRUPO_S.getId()); + } + if(tipo == TIPO_REPASO1) { + responseList = DatabaseRepository.getAppDatabase().getRepaso1Dao().getRepaso1(MapActivity.GRUPO_S.getId()); + } + if(tipo == TIPO_REPASO2) { + responseList = DatabaseRepository.getAppDatabase().getRepaso2Dao().getRepaso2(MapActivity.GRUPO_S.getId()); + } + if(tipo == TIPO_SANMIGUEL) { + responseList = DatabaseRepository.getAppDatabase().getSanMiguelDao().getSanMiguel(MapActivity.GRUPO_S.getId()); + } + if(tipo == TIPO_TREN) { + responseList = DatabaseRepository.getAppDatabase().getTrenDao().getTren(MapActivity.GRUPO_S.getId()); + } + if(tipo == TIPO_UNIVERSITATEA) { + responseList = DatabaseRepository.getAppDatabase().getUniversitateaDao().getUniversitatea(MapActivity.GRUPO_S.getId()); + } + if(tipo == TIPO_ZUMELTZEGI) { + responseList = DatabaseRepository.getAppDatabase().getZumeltzegiDao().getZumeltzegi(MapActivity.GRUPO_S.getId()); + } + + responseList.setTipo(tipo); + return new GrupoActividad(MapActivity.GRUPO_S, responseList); + + } + + + + +} diff --git a/app/src/main/java/com/app/didaktikapp/FTP/Ftp.java b/app/src/main/java/com/app/didaktikapp/FTP/Ftp.java new file mode 100644 index 0000000..63da807 --- /dev/null +++ b/app/src/main/java/com/app/didaktikapp/FTP/Ftp.java @@ -0,0 +1,262 @@ +package com.app.didaktikapp.FTP; + +import android.app.Activity; +import android.app.Application; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Environment; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.Constraints; +import androidx.core.content.ContextCompat; +import androidx.work.NetworkType; +import androidx.work.OneTimeWorkRequest; +import androidx.work.WorkManager; +import androidx.work.Worker; +import androidx.work.WorkerParameters; + +import com.app.didaktikapp.R; +import com.google.gson.JsonObject; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; + +import org.apache.commons.net.ftp.FTP; +import org.apache.commons.net.ftp.FTPClient; +import org.jibble.simpleftp.*; + +import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; + +/** + * Clase asíncrona encargada de el upload de datos al FTP + * @author gennakk + */ +public class Ftp extends Worker { + + public static final String JSON = "json"; + public static String IPDEFAULT = "88.27.169.221"; + public static String USER = "didaktikapp"; + public static String PASS = "Dw2*"; + + public static final String IPASSETS = "ipservidor.txt"; + + public Ftp(@NonNull Context context, @NonNull WorkerParameters workerParams) { + super(context, workerParams); + } + + /** + * Método para llamar cuando se cumpla una condicion + * @return + */ + @NonNull + @Override + public Result doWork() { + + String ip = loadData(getApplicationContext()); + Log.v("upload result", ip); + + Context context = getApplicationContext(); + + String jsonString = getInputData().getString(JSON); + + FTPClient con = null; + try + { + con = new FTPClient(); + con.connect(ip); + Log.v("upload result", "loging"); + if (con.login(USER, PASS)) + { + Log.v("upload result", "logged"); + con.enterLocalPassiveMode(); // important! + con.setFileType(FTP.BINARY_FILE_TYPE); + File file; + file = File.createTempFile("json", null, context.getCacheDir()); + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.write(jsonString); + + writer.close(); + + FileInputStream in = new FileInputStream(file); + + + boolean result = con.storeFile("/json.json", in); + in.close(); + if (result) Log.v("upload result", "succeeded"); + con.logout(); + con.disconnect(); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + return null; + } + + public static String loadData(Context context) { + + SharedPreferences sharedPref = context.getSharedPreferences( + context.getResources().getString(R.string.preference_file_key), Context.MODE_PRIVATE); + + return sharedPref.getString(context.getResources().getString(R.string.servidor), IPDEFAULT); + + } + + public static void sendImage(Context context, Bitmap bitmap, String mail, String idGrupo, String act){ + + + Thread thread = new Thread(new Runnable() { + + @Override + public void run() { + try { + try + { + SimpleFTP ftp = new SimpleFTP(); + String ip = loadData(context); + // Connect to an FTP server on port 21. + ftp.connect(ip, 21, USER, PASS); + + // Set binary mode. + ftp.bin(); + + // Change to a new working directory on the FTP server. + //ftp.cwd("web"); + //create a file to write bitmap data + // path to /data/data/yourapp/app_data/imageDir + ContextWrapper cw = new ContextWrapper(context); + File directory = cw.getDir("imageDir", Context.MODE_PRIVATE); + File f = new File(directory, mail+"_"+idGrupo+"_"+act+".jpg"); + + + //Convert bitmap to byte array + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100 /*ignored for PNG*/, bos); + byte[] bitmapdata = bos.toByteArray(); + FileOutputStream fos = new FileOutputStream(f); + /* + InputStream in = context.getContentResolver().openInputStream(bitmap); + //write the bytes in file + FileOutputStream fos = new FileOutputStream(f); + OutputStream out = new FileOutputStream(new File(mail+"_"+idGrupo+"_"+act+".jpg")); + byte[] buf = new byte[1024]; + int len; + while((len=in.read(buf))>0){ + out.write(buf,0,len); + } + out.close(); + in.close(); + + */ + fos.write(bitmapdata); + fos.flush(); + fos.close(); + // Upload some files. + + ftp.stor(f); + + + // Quit from the FTP server. + ftp.disconnect(); + Log.i("NOERROR","NOERROR"); + + } + catch (IOException e) + { + Log.i("ERROR","ERROR"); + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + Log.i("ERROR1","ERROR1"); + + } + } + }); + + thread.start(); + + } + +// /** +// * Método encargado de la llamada +// * @param jsonString string con el json a enviar +// * @param context contexto de la aplicación +// */ +// public static void sendData(String jsonString, Context context){ +// +// Constraints constraints = new Constraints.Builder() +// .setRequiredNetworkType(NetworkType.CONNECTED) +// .build(); +// +// OneTimeWorkRequest onetimeJob = new OneTimeWorkRequest.Builder(YourJob.class) +// .setConstraints(constraints).build(); // or PeriodicWorkRequest +// WorkManager.getInstance().enqueue(onetimeJob); +// +// FTPClient con = null; +// +// try +// { +// con = new FTPClient(); +// con.connect(context.getString(R.string.hostNameFTP)); +// Log.v("upload result", "loging"); +// if (con.login(context.getString(R.string.hostUserFTP), context.getString(R.string.hostpassFTP))) +// { +// Log.v("upload result", "logged"); +// con.enterLocalPassiveMode(); // important! +// con.setFileType(FTP.BINARY_FILE_TYPE); +// File file; +// file = File.createTempFile("json", null, context.getCacheDir()); +// BufferedWriter writer = new BufferedWriter(new FileWriter(file)); +// writer.write(jsonString); +// +// writer.close(); +// +// FileInputStream in = new FileInputStream(file); +// +// +// boolean result = con.storeFile("/json.json", in); +// in.close(); +// if (result) Log.v("upload result", "succeeded"); +// con.logout(); +// con.disconnect(); +// } +// } +// catch (Exception e) +// { +// e.printStackTrace(); +// } +// +// +// +// +// +// +// } +// +// +// @Override +// protected Object doInBackground(Object[] objects) { +// +// sendData((String)objects[0],(Context) objects[1]); +// return null; +// } + + +} diff --git a/app/src/main/java/com/app/didaktikapp/FTP/GrupoActividad.java b/app/src/main/java/com/app/didaktikapp/FTP/GrupoActividad.java new file mode 100644 index 0000000..2b17f69 --- /dev/null +++ b/app/src/main/java/com/app/didaktikapp/FTP/GrupoActividad.java @@ -0,0 +1,36 @@ +package com.app.didaktikapp.FTP; + +import com.app.didaktikapp.BBDD.Modelos.Actividad; +import com.app.didaktikapp.BBDD.Modelos.Grupo; + +/** + * Clase que guarda el grupo ha realizado las actividades + */ +public class GrupoActividad { + + private Grupo grupo; + private Actividad actividad; + + public GrupoActividad(Grupo grupo, Actividad actividad){ + + this.grupo = grupo; + this.actividad = actividad; + + } + + public Grupo getGrupo() { + return grupo; + } + + public void setGrupo(Grupo grupo) { + this.grupo = grupo; + } + + public Actividad getActividad() { + return actividad; + } + + public void setActividad(Actividad actividad) { + this.actividad = actividad; + } +} diff --git a/app/src/main/java/com/app/didaktikapp/FlatDialog/FlatDialog.java b/app/src/main/java/com/app/didaktikapp/FlatDialog/FlatDialog.java index 047d9db..0d2548d 100644 --- a/app/src/main/java/com/app/didaktikapp/FlatDialog/FlatDialog.java +++ b/app/src/main/java/com/app/didaktikapp/FlatDialog/FlatDialog.java @@ -21,7 +21,11 @@ import com.app.didaktikapp.R; import com.app.didaktikapp.wordsearch.easyadapter.SimpleAdapterDelegate; - +/** + * Diálogo FlatDialog customizado. + * Uh! Pineapple-pen! + * @author gennakk + */ public class FlatDialog extends Dialog { private Context context; diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrepasoBatKotlin.kt b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrepasoBatKotlin.kt index fe185cf..d9cee5b 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrepasoBatKotlin.kt +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrepasoBatKotlin.kt @@ -1,8 +1,11 @@ package com.app.didaktikapp.Fragments import android.content.Context +import android.graphics.Color import android.net.Uri import android.os.Bundle +import android.os.Handler +import android.os.Vibrator import android.util.Log import android.view.LayoutInflater import android.view.View @@ -21,8 +24,13 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository import com.app.didaktikapp.CardStack.CardStackAdapter import com.app.didaktikapp.CardStack.Spot import com.app.didaktikapp.CardStack.SpotDiffCallback +import com.app.didaktikapp.FTP.ClassToFtp import com.app.didaktikapp.R +import com.google.android.material.floatingactionbutton.FloatingActionButton import com.muddzdev.styleabletoast.StyleableToast +import com.wooplr.spotlight.SpotlightConfig +import com.wooplr.spotlight.utils.SpotlightSequence +import com.wooplr.spotlight.utils.Utils import com.yuyakaido.android.cardstackview.* // TODO: Rename parameter arguments, choose names that match @@ -67,6 +75,42 @@ class FragmentErrepasoBatKotlin : Fragment(), CardStackListener { setupNavigation() setupCardStackView() setupButton() + + /* + Botón flotante de ayuda + */ + + /* + Botón flotante de ayuda + */ + val floatingActionButton: FloatingActionButton = view!!.findViewById(R.id.helpButton) + floatingActionButton.setOnClickListener { + val config = SpotlightConfig() + config.maskColor = Color.parseColor("#E63A3A3A") + config.introAnimationDuration = 400 + config.fadingTextDuration = 400 + config.padding = 20 + config.isDismissOnTouch = true + config.isDismissOnBackpress = true + config.isPerformClick = false + config.headingTvSize = 24 + config.headingTvColor = Color.parseColor("#2B82C5") + config.subHeadingTvSize = 24 + config.subHeadingTvColor = Color.parseColor("#FAFAFA") + config.lineAnimationDuration = 300 + config.lineStroke = Utils.dpToPx(4) + config.lineAndArcColor = Color.parseColor("#2B82C5") + config.setShowTargetArc(true) + val handler = Handler() + handler.postDelayed({ + SpotlightSequence.getInstance(activity, config) + .addSpotlight(view!!.findViewById(R.id.helpButton), getString(R.string.AyudaErrepasoTituloPregunta), getString(R.string.AyudaErrepasoDetallePregunta), "pregunta") + .addSpotlight(view!!.findViewById(R.id.like_button), getString(R.string.AyudaErrepasoTituloCorrecta), getString(R.string.AyudaErrepasoDetalleCorrecta), "correcta") + .addSpotlight(view!!.findViewById(R.id.skip_button), getString(R.string.AyudaErrepasoTituloIncorrecta), getString(R.string.AyudaErrepasoDetalleIncorrecta), "incorrecta") + .addSpotlight(view!!.findViewById(R.id.rewind_button), getString(R.string.AyudaErrepasoTituloVolver), getString(R.string.AyudaErrepasoDetalleVolver), "volver") + .startSequence() + }, 0) + } return views } @@ -145,6 +189,8 @@ class FragmentErrepasoBatKotlin : Fragment(), CardStackListener { }else{ StyleableToast.makeText(context!!, resources.getString(R.string.Incorrecta), Toast.LENGTH_SHORT, R.style.mytoastIncorrecta ).show() + vibrar() + } } @@ -155,6 +201,7 @@ class FragmentErrepasoBatKotlin : Fragment(), CardStackListener { }else{ StyleableToast.makeText(context!!, resources.getString(R.string.Incorrecta), Toast.LENGTH_SHORT, R.style.mytoastIncorrecta ).show() + vibrar() } } @@ -171,6 +218,12 @@ class FragmentErrepasoBatKotlin : Fragment(), CardStackListener { } } + private fun vibrar() { // Get instance of Vibrator from current Context + val v = context!!.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + // Vibrate for 400 milliseconds + v.vibrate(400) + } + private fun guardarBBDD() { val actividadRepaso1 = DatabaseRepository.getAppDatabase().repaso1Dao.getRepaso1(idActividad) @@ -181,6 +234,7 @@ class FragmentErrepasoBatKotlin : Fragment(), CardStackListener { actividadRepaso1.frases = "$correcta/10" DatabaseRepository.getAppDatabase().repaso1Dao.updateRepaso1(actividadRepaso1) + ClassToFtp.send(activity, ClassToFtp.TIPO_REPASO1) } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrotaFotos.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrotaFotos.java index 1679c18..0443280 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrotaFotos.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrotaFotos.java @@ -8,11 +8,13 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; import android.os.Environment; +import android.os.Handler; import android.provider.MediaStore; import android.util.Base64; import android.util.Log; @@ -36,7 +38,13 @@ import com.app.didaktikapp.Activities.MapActivity; import com.app.didaktikapp.BBDD.Modelos.ActividadErrota; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; +import com.app.didaktikapp.FTP.Ftp; import com.app.didaktikapp.R; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.wooplr.spotlight.SpotlightConfig; +import com.wooplr.spotlight.utils.SpotlightSequence; +import com.wooplr.spotlight.utils.Utils; import java.io.ByteArrayOutputStream; import java.io.File; @@ -46,6 +54,13 @@ import java.util.HashMap; import java.util.Map; +import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; + +/** + * Fragmento ErrotaFotos, correspondiente a la actividad de responder preguntas con + * fotos en San Miguel Errota. Guarda las fotos y su estado en la base de datos + * @author gennakk + */ public class FragmentErrotaFotos extends Fragment { private View view; @@ -67,6 +82,7 @@ public class FragmentErrotaFotos extends Fragment { private String mParam2; private boolean img1,img2 = false; + private String ruta1, ruta2, ruta3; public FragmentErrotaFotos() {} @@ -142,6 +158,46 @@ public void onClick(View v) { crearPreguntas(view); + /* + Botón flotante de ayuda + */ + FloatingActionButton floatingActionButton = view.findViewById(R.id.helpButton); + floatingActionButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View viewBoton) { + + SpotlightConfig config = new SpotlightConfig(); + config.setMaskColor( Color.parseColor("#E63A3A3A")); + config.setIntroAnimationDuration(400); + config.setFadingTextDuration(400); + config.setPadding(20); + config.setDismissOnTouch(true); + config.setDismissOnBackpress(true); + config.setPerformClick(false); + config.setHeadingTvSize(24); + config.setHeadingTvColor(Color.parseColor("#2B82C5")); + config.setSubHeadingTvSize(24); + config.setSubHeadingTvColor(Color.parseColor("#FAFAFA")); + config.setLineAnimationDuration(300); + config.setLineStroke(Utils.dpToPx(4)); + config.setLineAndArcColor( Color.parseColor("#2B82C5")); + config.setShowTargetArc(true); + + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + + SpotlightSequence.getInstance(getActivity(),config) + .addSpotlight(view.findViewById(R.id.helpButton), getString(R.string.AyudaErrotaTituloPregunta), getString(R.string.AyudaErrotaDetallePregunta), "pregunta") + .addSpotlight(view.findViewById(R.id.btnContinuar), getString(R.string.AyudaZumTituloContinuar), getString(R.string.AyudaZumDetalleContinuar), "continuar") + .startSequence(); + } + },0); + } + }); + return view; } @@ -199,16 +255,29 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if ((requestCode == REQUEST_IMAGE_CAPTURE1 || requestCode == REQUEST_IMAGE_CAPTURE2) && resultCode == Activity.RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); - + imageBitmap = Bitmap.createScaledBitmap(imageBitmap, 1024, 1024, false); + + File sdCard = Environment.getExternalStoragePublicDirectory( + Environment.DIRECTORY_PICTURES); + File dir = new File(sdCard.getAbsolutePath() + "/Didaktikapp"); + dir.mkdirs(); + String fileName = String.format("%d.jpg", System.currentTimeMillis()); + String foto=null; if (requestCode == REQUEST_IMAGE_CAPTURE1) { ivPregunta1.setImageBitmap(Bitmap.createScaledBitmap(imageBitmap,1000,1000,false)); // ib1.setVisibility(View.INVISIBLE); img1 = true; + ruta1 = dir.getPath()+fileName; + foto = "errota1"; } else { ivPregunta2.setImageBitmap(Bitmap.createScaledBitmap(imageBitmap,1000,1000,false)); // ib2.setVisibility(View.INVISIBLE); img2 = true; + ruta2 = dir.getPath()+fileName; + foto = "errota2"; + } + Ftp.sendImage(getApplicationContext(),imageBitmap,MapActivity.GRUPO_S.getDeviceId(),MapActivity.GRUPO_S.getNombre(),foto); if (img1 && img2) { btnContinuar.setText(getResources().getString(R.string.Terminar)); @@ -233,25 +302,10 @@ public void guardarImagen(ImageView iv){ BitmapDrawable draw = (BitmapDrawable) iv.getDrawable(); Bitmap bitmap = draw.getBitmap(); - FileOutputStream outStream = null; - File sdCard = Environment.getExternalStoragePublicDirectory( - Environment.DIRECTORY_PICTURES); - File dir = new File(sdCard.getAbsolutePath() + "/Didaktikapp"); - dir.mkdirs(); - String fileName = String.format("%d.jpg", System.currentTimeMillis()); - Log.i("FILE",fileName); - Log.i("DIR",dir.getPath()); - File outFile = new File(dir, fileName); - try { - outStream = new FileOutputStream(outFile); - bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); - outStream.flush(); - outStream.close(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - }catch (IOException e) { - e.printStackTrace(); - } + + + + MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, "Titulo" , "descripcion"); } @@ -264,11 +318,12 @@ private void guardarBBDD(){ actividadErrota.setFragment(3); - actividadErrota.setFoto1(imageToBase64(ivPregunta1)); + actividadErrota.setFoto1(ruta1); - actividadErrota.setFoto2(imageToBase64(ivPregunta2)); + actividadErrota.setFoto2(ruta2); DatabaseRepository.getAppDatabase().getErrotaDao().updateErrota(actividadErrota); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_ERROTA); } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrotaTextos.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrotaTextos.java index b6c1190..a980f79 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrotaTextos.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentErrotaTextos.java @@ -3,8 +3,10 @@ import android.annotation.SuppressLint; import android.content.ClipData; import android.content.Context; +import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; +import android.os.Handler; import android.view.DragEvent; import android.view.Gravity; import android.view.LayoutInflater; @@ -22,12 +24,22 @@ import com.app.didaktikapp.Activities.MapActivity; import com.app.didaktikapp.BBDD.Modelos.ActividadErrota; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; import com.app.didaktikapp.R; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.wooplr.spotlight.SpotlightConfig; +import com.wooplr.spotlight.utils.SpotlightSequence; +import com.wooplr.spotlight.utils.Utils; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +/** + * Fragmento ErrotaTextos, correspondiente a la actividad de arrastrar palabras a los + * huecos de un párrafo en San Miguel Errota. Guarda las respuestas en la BD así como su estado + * @author gennakk + */ public class FragmentErrotaTextos extends Fragment { private View view; @@ -134,6 +146,46 @@ public void onClick(View v) { choice3.setOnDragListener(new ChoiceDragListener()); choice4.setOnDragListener(new ChoiceDragListener()); + + /* + Botón flotante de ayuda + */ + FloatingActionButton floatingActionButton = view.findViewById(R.id.helpButton); + floatingActionButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View viewBoton) { + + SpotlightConfig config = new SpotlightConfig(); + config.setMaskColor( Color.parseColor("#E63A3A3A")); + config.setIntroAnimationDuration(400); + config.setFadingTextDuration(400); + config.setPadding(20); + config.setDismissOnTouch(true); + config.setDismissOnBackpress(true); + config.setPerformClick(false); + config.setHeadingTvSize(24); + config.setHeadingTvColor(Color.parseColor("#2B82C5")); + config.setSubHeadingTvSize(24); + config.setSubHeadingTvColor(Color.parseColor("#FAFAFA")); + config.setLineAnimationDuration(300); + config.setLineStroke(Utils.dpToPx(4)); + config.setLineAndArcColor( Color.parseColor("#2B82C5")); + config.setShowTargetArc(true); + + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + + SpotlightSequence.getInstance(getActivity(),config) + .addSpotlight(view.findViewById(R.id.helpButton), getString(R.string.AyudaErrotaTituloTextos), getString(R.string.AyudaErrotaDetalleTextos), "pregunta") + .addSpotlight(view.findViewById(R.id.btnContinuar), getString(R.string.AyudaZumTituloContinuar), getString(R.string.AyudaZumDetalleContinuar), "continuar") + .startSequence(); + } + },0); + } + }); return view; } @@ -228,6 +280,7 @@ private void guardarBBDD(){ actividadErrota.setFrases("5"); DatabaseRepository.getAppDatabase().getErrotaDao().updateErrota(actividadErrota); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_ERROTA); } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaPoema.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaPoema.java index 6a47fda..12c66c2 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaPoema.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaPoema.java @@ -16,6 +16,7 @@ import com.app.didaktikapp.BBDD.Modelos.ActividadGernika; import com.app.didaktikapp.BBDD.database.DatabaseRepository; import com.app.didaktikapp.CardStack.CardStackAdapter; +import com.app.didaktikapp.FTP.ClassToFtp; import com.app.didaktikapp.R; import com.yuyakaido.android.cardstackview.CardStackLayoutManager; import com.yuyakaido.android.cardstackview.CardStackView; @@ -156,6 +157,7 @@ private void guardarBBDD(){ actividadGernika.setFragment(2); DatabaseRepository.getAppDatabase().getGernikaDao().updateGernika(actividadGernika); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_GERNIKA); } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaPreguntas.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaPreguntas.java index 8724dcf..efca4ba 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaPreguntas.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaPreguntas.java @@ -8,6 +8,7 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; +import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -18,7 +19,12 @@ import com.app.didaktikapp.BBDD.Modelos.ActividadGernika; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; import com.app.didaktikapp.R; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.wooplr.spotlight.SpotlightConfig; +import com.wooplr.spotlight.utils.SpotlightSequence; +import com.wooplr.spotlight.utils.Utils; import in.codeshuffle.typewriterview.TypeWriterView; @@ -204,6 +210,47 @@ public void onClick(View v) { } }); + + /* + Botón flotante de ayuda + */ + FloatingActionButton floatingActionButton = view.findViewById(R.id.helpButton); + floatingActionButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View viewBoton) { + + SpotlightConfig config = new SpotlightConfig(); + config.setMaskColor( Color.parseColor("#E63A3A3A")); + config.setIntroAnimationDuration(400); + config.setFadingTextDuration(400); + config.setPadding(20); + config.setDismissOnTouch(true); + config.setDismissOnBackpress(true); + config.setPerformClick(false); + config.setHeadingTvSize(24); + config.setHeadingTvColor(Color.parseColor("#2B82C5")); + config.setSubHeadingTvSize(24); + config.setSubHeadingTvColor(Color.parseColor("#FAFAFA")); + config.setLineAnimationDuration(300); + config.setLineStroke(Utils.dpToPx(4)); + config.setLineAndArcColor( Color.parseColor("#2B82C5")); + config.setShowTargetArc(true); + + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + + SpotlightSequence.getInstance(getActivity(),config) + .addSpotlight(view.findViewById(R.id.helpButton), getString(R.string.AyudaGernikaTituloPregunta), getString(R.string.AyudaGernikaDetallePregunta), "pregunta") + .addSpotlight(view.findViewById(R.id.btnCorregir), getString(R.string.AyudaGernikaTituloRespuesta), getString(R.string.AyudaGernikaDetalleRespuesta), "respuesta") + .addSpotlight(view.findViewById(R.id.btnContinuar), getString(R.string.AyudaZumTituloContinuar), getString(R.string.AyudaZumDetalleContinuar), "continuar") + .startSequence(); + } + },0); + } + }); return view; } @@ -253,6 +300,7 @@ private void guardarBBDD(){ actividadGernika.setTest(correctas+"/3"); DatabaseRepository.getAppDatabase().getGernikaDao().updateGernika(actividadGernika); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_GERNIKA); } } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaTexto.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaTexto.java index 7fd1f96..6c005f7 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaTexto.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentGernikaTexto.java @@ -15,6 +15,7 @@ import com.app.didaktikapp.BBDD.Modelos.ActividadGernika; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; import com.app.didaktikapp.R; import in.codeshuffle.typewriterview.TypeWriterView; @@ -163,6 +164,7 @@ private void guardarBBDD(){ actividadGernika.setFragment(1); DatabaseRepository.getAppDatabase().getGernikaDao().updateGernika(actividadGernika); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_GERNIKA); } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentSanMiguel.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentSanMiguel.java index 204f9db..90442bc 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentSanMiguel.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentSanMiguel.java @@ -8,6 +8,7 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; +import android.os.Handler; import android.os.Vibrator; import android.view.LayoutInflater; import android.view.View; @@ -21,7 +22,12 @@ import com.app.didaktikapp.Activities.MapActivity; import com.app.didaktikapp.BBDD.Modelos.ActividadSanMiguel; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; import com.app.didaktikapp.R; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.wooplr.spotlight.SpotlightConfig; +import com.wooplr.spotlight.utils.SpotlightSequence; +import com.wooplr.spotlight.utils.Utils; /** * A simple {@link Fragment} subclass. @@ -247,6 +253,47 @@ public void onClick(View v) { } }); + /* + Botón flotante de ayuda + */ + FloatingActionButton floatingActionButton = view.findViewById(R.id.helpButton); + floatingActionButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View viewBoton) { + + SpotlightConfig config = new SpotlightConfig(); + config.setMaskColor( Color.parseColor("#E63A3A3A")); + config.setIntroAnimationDuration(400); + config.setFadingTextDuration(400); + config.setPadding(20); + config.setDismissOnTouch(true); + config.setDismissOnBackpress(true); + config.setPerformClick(false); + config.setHeadingTvSize(24); + config.setHeadingTvColor(Color.parseColor("#2B82C5")); + config.setSubHeadingTvSize(24); + config.setSubHeadingTvColor(Color.parseColor("#FAFAFA")); + config.setLineAnimationDuration(300); + config.setLineStroke(Utils.dpToPx(4)); + config.setLineAndArcColor( Color.parseColor("#2B82C5")); + config.setShowTargetArc(true); + + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + + SpotlightSequence.getInstance(getActivity(),config) + .addSpotlight(view.findViewById(R.id.helpButton), getString(R.string.AyudaSanMiguelTituloPregunta), getString(R.string.AyudaSanMiguelDetallePregunta), "pregunta") + .addSpotlight(view.findViewById(R.id.btnCorregir), getString(R.string.AyudaSanMiguelTituloRespuesta), getString(R.string.AyudaSanMiguelDetalleRespuesta), "respuesta") + .addSpotlight(view.findViewById(R.id.btnContinuar), getString(R.string.AyudaZumTituloContinuar), getString(R.string.AyudaZumDetalleContinuar), "continuar") + .startSequence(); + } + },0); + } + }); + return view; @@ -273,6 +320,7 @@ private void guardarBBDD(){ actividadSanMiguel.setTest(correctas+"/4"); DatabaseRepository.getAppDatabase().getSanMiguelDao().updateSanMiguel(actividadSanMiguel); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_SANMIGUEL); } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentSanMiguelTinderKotlin.kt b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentSanMiguelTinderKotlin.kt index d2a0167..0fe3583 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentSanMiguelTinderKotlin.kt +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentSanMiguelTinderKotlin.kt @@ -1,8 +1,11 @@ package com.app.didaktikapp.Fragments import android.content.Context +import android.graphics.Color import android.net.Uri import android.os.Bundle +import android.os.Handler +import android.os.Vibrator import android.util.Log import android.view.LayoutInflater import android.view.View @@ -22,11 +25,16 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository import com.app.didaktikapp.CardStack.CardStackAdapter import com.app.didaktikapp.CardStack.Spot import com.app.didaktikapp.CardStack.SpotDiffCallback +import com.app.didaktikapp.FTP.ClassToFtp import com.app.didaktikapp.R +import com.google.android.material.floatingactionbutton.FloatingActionButton import com.muddzdev.styleabletoast.StyleableToast +import com.wooplr.spotlight.SpotlightConfig +import com.wooplr.spotlight.utils.SpotlightSequence +import com.wooplr.spotlight.utils.Utils import com.yuyakaido.android.cardstackview.* -// TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private const val ARG_PARAM1 = "param1" private const val ARG_PARAM2 = "param2" @@ -54,7 +62,11 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { private var correcta = 0 - + /** + * Método para crear el fragment + * @author gennakk + * + */ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { @@ -62,20 +74,69 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { } } + /** + * Método para crear la vista. + * @return Vista del fragment FragmentSanMiguelTinderKotlin + * @author gennakk + */ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { views = inflater.inflate(R.layout.fragment_san_miguel_tinder, container, false) setupNavigation() setupCardStackView() setupButton() + + /* + Botón flotante de ayuda + */ + /* + Botón flotante de ayuda + */ + val floatingActionButton: FloatingActionButton = view!!.findViewById(R.id.helpButton) + floatingActionButton.setOnClickListener { + val config = SpotlightConfig() + config.maskColor = Color.parseColor("#E63A3A3A") + config.introAnimationDuration = 400 + config.fadingTextDuration = 400 + config.padding = 20 + config.isDismissOnTouch = true + config.isDismissOnBackpress = true + config.isPerformClick = false + config.headingTvSize = 24 + config.headingTvColor = Color.parseColor("#2B82C5") + config.subHeadingTvSize = 24 + config.subHeadingTvColor = Color.parseColor("#FAFAFA") + config.lineAnimationDuration = 300 + config.lineStroke = Utils.dpToPx(4) + config.lineAndArcColor = Color.parseColor("#2B82C5") + config.setShowTargetArc(true) + val handler = Handler() + handler.postDelayed({ + SpotlightSequence.getInstance(activity, config) + .addSpotlight(view!!.findViewById(R.id.like_button), getString(R.string.AyudaSanMiguelTinderTituloCorrecta), getString(R.string.AyudaSanMiguelTinderDetalleCorrecta), "correcta") + .addSpotlight(view!!.findViewById(R.id.skip_button), getString(R.string.AyudaSanMiguelTinderTituloIncorrecta), getString(R.string.AyudaSanMiguelTinderDetalleIncorrecta), "incorrecta") + .addSpotlight(view!!.findViewById(R.id.rewind_button), getString(R.string.AyudaSanMiguelTinderTituloRetroceder), getString(R.string.AyudaSanMiguelTinderDetalleRetroceder), "retroceder") + .addSpotlight(view!!.findViewById(R.id.btnContinuar), getString(R.string.AyudaZumTituloContinuar), getString(R.string.AyudaZumDetalleContinuar), "continuar") + .startSequence() + }, 0) + } return views } - // TODO: Rename method, update argument and hook method into UI event + /** + * Fragment interaction. + * @param uri + * @author gennakk + */ fun onButtonPressed(uri: Uri) { listener?.onFragmentInteraction(uri) } + /** + * Método para implementar fragment. + * @param context Contexto de la app. + * @author gennakk + */ override fun onAttach(context: Context) { super.onAttach(context) if (context is OnFragmentInteractionListener) { @@ -85,6 +146,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { } } + /** + * Método para quitar el fragment. + * @author gennakk + */ override fun onDetach() { super.onDetach() listener = null @@ -111,11 +176,9 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { * Use this factory method to create a new instance of * this fragment using the provided parameters. * - * @param param1 Parameter 1. - * @param param2 Parameter 2. + * @param param1 Id de la actividad * @return A new instance of fragment FragmentSanMiguelTinderKotlin. */ - // TODO: Rename and change types and number of parameters @JvmStatic fun newInstance(idActividad: Long) = FragmentSanMiguelTinderKotlin().apply { @@ -126,11 +189,18 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { } - + /** + * Evento para el drag de la carta. + * @author gennakk + */ override fun onCardDragging(direction: Direction, ratio: Float) { Log.d("CardStackView", "onCardDragging: d = ${direction.name}, r = $ratio") } + /** + * Evento para el swipe de la carta. + * @author gennakk + */ override fun onCardSwiped(direction: Direction) { Log.d("CardStackView", "onCardSwiped: p = ${manager.topPosition}, d = $direction") if (manager.topPosition == adapter.itemCount - 6) { @@ -146,6 +216,7 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { }else{ StyleableToast.makeText(context!!, resources.getString(R.string.Incorrecta), Toast.LENGTH_SHORT, R.style.mytoastIncorrecta ).show() + vibrar() } } @@ -156,6 +227,7 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { }else{ StyleableToast.makeText(context!!, resources.getString(R.string.Incorrecta), Toast.LENGTH_SHORT, R.style.mytoastIncorrecta ).show() + vibrar() } } @@ -172,6 +244,20 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { } } + /** + * Método para vibrar el dispositivo. + * @author gennakk + */ + private fun vibrar() { // Get instance of Vibrator from current Context + val v = context!!.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + // Vibrate for 400 milliseconds + v.vibrate(400) + } + + /** + * Guardar en BBDD los ejercicios. + * @author gennakk + */ private fun guardarBBDD() { val actividadSanMiguel: ActividadSanMiguel? = DatabaseRepository.getAppDatabase().sanMiguelDao.getSanMiguel(idActividad) @@ -182,27 +268,48 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { actividadSanMiguel.fotos = "${correcta}/6" DatabaseRepository.getAppDatabase().sanMiguelDao.updateSanMiguel(actividadSanMiguel) + ClassToFtp.send(getActivity(), ClassToFtp.TIPO_SANMIGUEL); } + /** + * Evento para el rewound de la carta. + * @author gennakk + */ override fun onCardRewound() { Log.d("CardStackView", "onCardRewound: ${manager.topPosition}") } + /** + * Evento para el cancel de la carta. + * @author gennakk + */ override fun onCardCanceled() { Log.d("CardStackView", "onCardCanceled: ${manager.topPosition}") } + /** + * Evento para el la aparición de la carta. + * @author gennakk + */ override fun onCardAppeared(view: View, position: Int) { val textView = view.findViewById(R.id.item_name) Log.d("CardStackView", "onCardAppeared: ($position) ${textView.text}") } + /** + * Evento para el desaparición de la carta. + * @author gennakk + */ override fun onCardDisappeared(view: View, position: Int) { val textView = view.findViewById(R.id.item_name) Log.d("CardStackView", "onCardDisappeared: ($position) ${textView.text}") } + /** + * Evento para el navegación de la carta. + * @author gennakk + */ private fun setupNavigation() { // // Toolbar // val toolbar = views!!.findViewById(R.id.toolbar) @@ -230,10 +337,18 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { // } } + /** + * Set up de la vista CardStack. + * @author gennakk + */ private fun setupCardStackView() { initialize() } + /** + * Set up de los botones de las cartas. + * @author gennakk + */ private fun setupButton() { val skip = views!!.findViewById(R.id.skip_button) skip.setOnClickListener { @@ -269,6 +384,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { } } + /** + * Inicialización del CardStack View. + * @author gennakk + */ private fun initialize() { manager.setStackFrom(StackFrom.Top) @@ -291,6 +410,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { } } + /** + * Paginación del CardStack. + * @author gennakk + */ private fun paginate() { val old = adapter.getSpots() val new = old.plus(createSpots()) @@ -300,6 +423,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { result.dispatchUpdatesTo(adapter) } + /** + * Recargar. + * @author gennakk + */ private fun reload() { val old = adapter.getSpots() val new = createSpots() @@ -309,6 +436,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { result.dispatchUpdatesTo(adapter) } + /** + * Añadir primera carta. + * @author gennakk + */ private fun addFirst(size: Int) { val old = adapter.getSpots() val new = mutableListOf().apply { @@ -323,6 +454,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { result.dispatchUpdatesTo(adapter) } + /** + * Añadir última carta. + * @author gennakk + */ private fun addLast(size: Int) { val old = adapter.getSpots() val new = mutableListOf().apply { @@ -335,6 +470,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { result.dispatchUpdatesTo(adapter) } + /** + * Borrar primera carta. + * @author gennakk + */ private fun removeFirst(size: Int) { if (adapter.getSpots().isEmpty()) { return @@ -353,6 +492,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { result.dispatchUpdatesTo(adapter) } + /** + * Borrar última carta. + * @author gennakk + */ private fun removeLast(size: Int) { if (adapter.getSpots().isEmpty()) { return @@ -371,6 +514,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { result.dispatchUpdatesTo(adapter) } + /** + * Reemplazar carta. + * @author gennakk + */ private fun replace() { val old = adapter.getSpots() val new = mutableListOf().apply { @@ -382,6 +529,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { adapter.notifyItemChanged(manager.topPosition) } + /** + * Intercambiar carta. + * @author gennakk + */ private fun swap() { val old = adapter.getSpots() val new = mutableListOf().apply { @@ -397,6 +548,11 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { result.dispatchUpdatesTo(adapter) } + /** + * Crear Spot. + * @author gennakk + * @return Spot + */ private fun createSpot(): Spot { return Spot( id = count++, @@ -406,6 +562,11 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { ) } + /** + * Crear lista de Spots. + * @author gennakk + * @return Lista con todos los Spots. + */ private fun createSpots(): List { val spots = ArrayList() spots.add(Spot(id = count++,name = "", city = "", url = R.drawable.sanmiguelcorrecta1)) @@ -418,6 +579,10 @@ class FragmentSanMiguelTinderKotlin : Fragment(), CardStackListener { return spots } + /** + * Método onDestroy del fragment FragmentSanMiguelKotlin. + * @author gennakk + */ override fun onDestroy() { super.onDestroy() (activity as MapActivity?)!!.cambiarLocalizacion() diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentTrenTexto.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentTrenTexto.java index 88d09c4..322df07 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentTrenTexto.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentTrenTexto.java @@ -7,6 +7,7 @@ import androidx.fragment.app.Fragment; +import android.os.Handler; import android.text.SpannableString; import android.text.Spanned; import android.text.TextPaint; @@ -26,7 +27,14 @@ import android.widget.VideoView; import com.app.didaktikapp.Activities.MapActivity; +import com.app.didaktikapp.BBDD.Modelos.ActividadTren; +import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; import com.app.didaktikapp.R; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.wooplr.spotlight.SpotlightConfig; +import com.wooplr.spotlight.utils.SpotlightSequence; +import com.wooplr.spotlight.utils.Utils; import java.util.Map; @@ -111,8 +119,16 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, @Override public void onClick(View v) { + ActividadTren actividadTren = DatabaseRepository.getAppDatabase().getTrenDao().getTren(idActividad); + actividadTren.setEstado(2); + + actividadTren.setFragment(2); + + DatabaseRepository.getAppDatabase().getTrenDao().updateTren(actividadTren); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_TREN); //CERRAR FRAGMENT + getFragmentManager().beginTransaction().remove(FragmentTrenTexto.this).commit(); } }); @@ -131,7 +147,7 @@ public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) String texto = textoCambiar.getText().toString(); if (pregunta.equals("(1) ->")) { - if (seleccionado.equals("Postetxea")) { + if (seleccionado.equals(getResources().getStringArray(R.array.TrenTextoCambiar)[1])) { textoError.setText(""); textoPregunta.setText("(2) ->"); int location = texto.indexOf("________"); @@ -146,7 +162,7 @@ public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) } } else if (pregunta.equals("(2) ->")) { - if (seleccionado.equals("Vasco-Navarro")) { + if (seleccionado.equals(getResources().getStringArray(R.array.TrenTextoCambiar)[2])) { textoError.setText(""); textoPregunta.setText("(3) ->"); int location = texto.indexOf("________"); @@ -158,7 +174,7 @@ public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) } } else if (pregunta.equals("(3) ->")) { - if (seleccionado.equals("Gasteizetik")) { + if (seleccionado.equals(getResources().getStringArray(R.array.TrenTextoCambiar)[0])) { textoError.setText(""); int location = texto.indexOf("________"); String pp = texto.substring(0,location); @@ -181,6 +197,46 @@ public void onNothingSelected(AdapterView arg0) { } }); + /* + Botón flotante de ayuda + */ + FloatingActionButton floatingActionButton = view.findViewById(R.id.helpButton); + floatingActionButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View viewBoton) { + + SpotlightConfig config = new SpotlightConfig(); + config.setMaskColor( Color.parseColor("#E63A3A3A")); + config.setIntroAnimationDuration(400); + config.setFadingTextDuration(400); + config.setPadding(20); + config.setDismissOnTouch(true); + config.setDismissOnBackpress(true); + config.setPerformClick(false); + config.setHeadingTvSize(24); + config.setHeadingTvColor(Color.parseColor("#2B82C5")); + config.setSubHeadingTvSize(24); + config.setSubHeadingTvColor(Color.parseColor("#FAFAFA")); + config.setLineAnimationDuration(300); + config.setLineStroke(Utils.dpToPx(4)); + config.setLineAndArcColor( Color.parseColor("#2B82C5")); + config.setShowTargetArc(true); + + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + + SpotlightSequence.getInstance(getActivity(),config) + .addSpotlight(view.findViewById(R.id.trenTextoSpinner), getString(R.string.AyudaTrenTitulo), getString(R.string.AyudaTrenDetalle), "pregunta") + .addSpotlight(view.findViewById(R.id.btnContinuar), getString(R.string.AyudaZumTituloContinuar), getString(R.string.AyudaZumDetalleContinuar), "continuar") + .startSequence(); + } + },0); + } + }); + return view; } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaFotos.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaFotos.java index 9e5328a..0432721 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaFotos.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaFotos.java @@ -3,13 +3,18 @@ import android.Manifest; import android.app.Activity; import android.content.Context; +import android.content.ContextWrapper; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; +import android.os.Handler; +import android.os.StrictMode; import android.provider.MediaStore; import android.util.Base64; import android.util.Log; @@ -30,8 +35,14 @@ import com.app.didaktikapp.Activities.MapActivity; import com.app.didaktikapp.BBDD.Modelos.ActividadUniversitatea; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; +import com.app.didaktikapp.FTP.Ftp; import com.app.didaktikapp.R; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.muddzdev.styleabletoast.StyleableToast; +import com.wooplr.spotlight.SpotlightConfig; +import com.wooplr.spotlight.utils.SpotlightSequence; +import com.wooplr.spotlight.utils.Utils; import java.io.ByteArrayOutputStream; import java.io.File; @@ -39,9 +50,15 @@ import java.io.FileOutputStream; import java.io.IOException; +import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; +/** + * Fragmento UnibertsitateaFotos, donde se tienen que sacar fotos para + * responder preguntas. Guarda las fotos y su estado en la base de datos + * @author gennakk + */ public class FragmentUnibertsitateaFotos extends Fragment { - + private Uri outuri; private View view; private LinearLayout fotosLayout; @@ -63,7 +80,7 @@ public class FragmentUnibertsitateaFotos extends Fragment { private ImageView img1, img2, img3; - private String mParam1, mParam2, mParam3; + private String ruta1, ruta2, ruta3; private boolean fotohecha1, fotohecha2, fotohecha3; @@ -87,8 +104,8 @@ public void onCreate(Bundle savedInstanceState) { if (getArguments() != null) { idActividad = getArguments().getLong(ARG_PARAM1); - mParam2 = getArguments().getString(ARG_PARAM2); - mParam3 = getArguments().getString(ARG_PARAM3); + //mParam2 = getArguments().getString(ARG_PARAM2); + //mParam3 = getArguments().getString(ARG_PARAM3); } } @@ -158,7 +175,8 @@ public void onClick(View v) { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 225); } else { - + Toast. + makeText(getContext(),"PERMISSOREAD",Toast.LENGTH_LONG).show(); } } @@ -168,6 +186,46 @@ public void onClick(View v) { REQUEST_IMAGE_CAPTURE1); } + /* + Botón flotante de ayuda + */ + FloatingActionButton floatingActionButton = view.findViewById(R.id.helpButton); + floatingActionButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View viewBoton) { + + SpotlightConfig config = new SpotlightConfig(); + config.setMaskColor( Color.parseColor("#E63A3A3A")); + config.setIntroAnimationDuration(400); + config.setFadingTextDuration(400); + config.setPadding(20); + config.setDismissOnTouch(true); + config.setDismissOnBackpress(true); + config.setPerformClick(false); + config.setHeadingTvSize(24); + config.setHeadingTvColor(Color.parseColor("#2B82C5")); + config.setSubHeadingTvSize(24); + config.setSubHeadingTvColor(Color.parseColor("#FAFAFA")); + config.setLineAnimationDuration(300); + config.setLineStroke(Utils.dpToPx(4)); + config.setLineAndArcColor( Color.parseColor("#2B82C5")); + config.setShowTargetArc(true); + + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + + SpotlightSequence.getInstance(getActivity(),config) + .addSpotlight(view.findViewById(R.id.helpButton), getString(R.string.AyudaUniversidadTituloFotos), getString(R.string.AyudaUniversidadDetalleFotos), "pregunta") + .addSpotlight(view.findViewById(R.id.btnContinuar), getString(R.string.AyudaZumTituloContinuar), getString(R.string.AyudaZumDetalleContinuar), "continuar") + .startSequence(); + } + },0); + } + }); + return view; } @@ -178,8 +236,18 @@ public void onClick(View v) { } private void dispatchTakePictureIntent(View v){ - Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - + //Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); + StrictMode.setVmPolicy(builder.build()); + Intent takePictureIntent = new Intent(); + takePictureIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); + ContextWrapper cw = new ContextWrapper(getApplicationContext()); + // path to /data/data/yourapp/app_data/imageDir + File sdCard = Environment.getExternalStoragePublicDirectory( + Environment.DIRECTORY_PICTURES); + File dir = new File(sdCard.getAbsolutePath() + "/Didaktikapp"); + dir.mkdirs(); + // takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outuri); int request; if (v == view.findViewById(R.id.uniImagen1)) { request = REQUEST_IMAGE_CAPTURE1; @@ -202,26 +270,44 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if ((requestCode >= REQUEST_IMAGE_CAPTURE1 && requestCode <= REQUEST_IMAGE_CAPTURE3) && resultCode == Activity.RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); - + imageBitmap = Bitmap.createScaledBitmap(imageBitmap, 1024, 1024, false); + + File sdCard = Environment.getExternalStoragePublicDirectory( + Environment.DIRECTORY_PICTURES); + File dir = new File(sdCard.getAbsolutePath() + "/Didaktikapp"); + dir.mkdirs(); + String fileName = String.format("%d.jpg", System.currentTimeMillis()); + String foto=null; if (requestCode == REQUEST_IMAGE_CAPTURE1) { img1.setImageBitmap(Bitmap.createScaledBitmap(imageBitmap,1000,1000,false)); + //img1.setImageURI(outuri); foto1.setVisibility(View.GONE); img1.setVisibility(View.VISIBLE); fotohecha1 = true; + ruta1 = dir.getPath()+fileName; + foto="uni1"; } else if (requestCode == REQUEST_IMAGE_CAPTURE2) { img2.setImageBitmap(Bitmap.createScaledBitmap(imageBitmap,1000,1000,false)); + // img2.setImageURI(outuri); + foto2.setVisibility(View.GONE); img2.setVisibility(View.VISIBLE); fotohecha2 = true; + ruta2 = dir.getPath()+fileName; + foto="uni2"; } else { img3.setImageBitmap(Bitmap.createScaledBitmap(imageBitmap,1000,1000,false)); + //img3.setImageURI(outuri); + foto3.setVisibility(View.GONE); img3.setVisibility(View.VISIBLE); fotohecha3 = true; + ruta3 = dir.getPath()+fileName; + foto="uni3"; } + Ftp.sendImage(getApplicationContext(),imageBitmap,MapActivity.GRUPO_S.getDeviceId(),MapActivity.GRUPO_S.getNombre(),foto); } - if (fotohecha1&&fotohecha2&&fotohecha3){ view.findViewById(R.id.btnContinuar).setEnabled(true); } @@ -230,7 +316,6 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { public void guardarImagen(ImageView iv){ BitmapDrawable draw = (BitmapDrawable) iv.getDrawable(); Bitmap bitmap = draw.getBitmap(); - FileOutputStream outStream = null; File sdCard = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); @@ -251,6 +336,25 @@ public void guardarImagen(ImageView iv){ e.printStackTrace(); } + /* + String foto=null; + + if(iv.getId()==R.id.uniImagenSacada1){ + ruta1 = dir.getPath()+fileName; + foto="uni1"; + } + if(iv.getId()==R.id.uniImagenSacada2){ + ruta2 = dir.getPath()+fileName; + foto="uni2"; + } + if(iv.getId()==R.id.uniImagenSacada3){ + ruta3 = dir.getPath()+fileName; + foto="uni3"; + } + + Ftp.sendImage(bitmap,MapActivity.GRUPO_S.getDeviceId(),MapActivity.GRUPO_S.getNombre(),foto); + */ + MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, "Titulo" , "descripcion"); } @@ -262,14 +366,20 @@ private void guardarBBDD(ImageView iv1,ImageView iv2,ImageView iv3){ actividadUniversitatea.setEstado(2); actividadUniversitatea.setFragment(3); - +/* actividadUniversitatea.setFoto1(imageToBase64(iv1)); actividadUniversitatea.setFoto2(imageToBase64(iv2)); actividadUniversitatea.setFoto3(imageToBase64(iv3)); +*/ + actividadUniversitatea.setFoto1(ruta1); + + actividadUniversitatea.setFoto2(ruta2); + actividadUniversitatea.setFoto3(ruta3); DatabaseRepository.getAppDatabase().getUniversitateaDao().updateUniversitatea(actividadUniversitatea); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_UNIVERSITATEA); } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaPreguntas.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaPreguntas.java index 4fdd2f2..3e22a67 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaPreguntas.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaPreguntas.java @@ -3,6 +3,7 @@ import android.content.Context; import android.graphics.Color; import android.os.Bundle; +import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -17,9 +18,19 @@ import com.app.didaktikapp.Activities.MapActivity; import com.app.didaktikapp.BBDD.Modelos.ActividadUniversitatea; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; import com.app.didaktikapp.R; - - +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.wooplr.spotlight.SpotlightConfig; +import com.wooplr.spotlight.utils.SpotlightSequence; +import com.wooplr.spotlight.utils.Utils; + +/** + * Fragmento UnibertsitateaPreguntas, donde se hacen preguntas sobre la universidad tras haber + * dado información al usuario en el fragmento anterior. Guarda las respuestas y su + * estado en la base de datos + * @author gennakk + */ public class FragmentUnibertsitateaPreguntas extends Fragment { @@ -39,6 +50,8 @@ public class FragmentUnibertsitateaPreguntas extends Fragment { private RadioButton radio1S, radio1N, radio2S, radio2N; + private int correctas; + public FragmentUnibertsitateaPreguntas() { @@ -111,14 +124,16 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { @Override public void onClick(View v) { - + correctas = 0; if(grupo1.getCheckedRadioButtonId() == radio1N.getId()){ + correctas++; radio1N.setTextColor(Color.GREEN); }else{ radio1S.setTextColor(Color.RED); } if(grupo2.getCheckedRadioButtonId() == radio2N.getId()){ + correctas++; radio2N.setTextColor(Color.GREEN); }else{ radio2S.setTextColor(Color.RED); @@ -152,6 +167,50 @@ public void onClick(View v) { } }); + + /* + Botón flotante de ayuda + */ + FloatingActionButton floatingActionButton = view.findViewById(R.id.helpButton); + floatingActionButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View viewBoton) { + + SpotlightConfig config = new SpotlightConfig(); + config.setMaskColor( Color.parseColor("#E63A3A3A")); + config.setIntroAnimationDuration(400); + config.setFadingTextDuration(400); + config.setPadding(20); + config.setDismissOnTouch(true); + config.setDismissOnBackpress(true); + config.setPerformClick(false); + config.setHeadingTvSize(24); + config.setHeadingTvColor(Color.parseColor("#2B82C5")); + config.setSubHeadingTvSize(24); + config.setSubHeadingTvColor(Color.parseColor("#FAFAFA")); + config.setLineAnimationDuration(300); + config.setLineStroke(Utils.dpToPx(4)); + config.setLineAndArcColor( Color.parseColor("#2B82C5")); + config.setShowTargetArc(true); + + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + + SpotlightSequence.getInstance(getActivity(),config) + .addSpotlight(view.findViewById(R.id.helpButton), getString(R.string.AyudaUniversidadTituloPregunta), getString(R.string.AyudaUniversidadDetallePregunta), "pregunta") + .addSpotlight(view.findViewById(R.id.btnCorregir), getString(R.string.AyudaUniversidadTituloRespuesta), getString(R.string.AyudaUniversidadDetalleRespuesta), "respuesta") + .addSpotlight(view.findViewById(R.id.btnContinuar), getString(R.string.AyudaZumTituloContinuar), getString(R.string.AyudaZumDetalleContinuar), "continuar") + .startSequence(); + } + },0); + } + }); + + + return view; } @@ -160,11 +219,10 @@ private void guardarBBDD(){ actividadUniversitatea.setFragment(2); - - //Todo: AÑADIR CUANTAS CORRECTAS SE HAN HECHO - actividadUniversitatea.setTest("CORRECTAS"); + actividadUniversitatea.setTest(correctas+"/2"); DatabaseRepository.getAppDatabase().getUniversitateaDao().updateUniversitatea(actividadUniversitatea); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_UNIVERSITATEA); } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaTexto.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaTexto.java index eae876d..56b93b8 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaTexto.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentUnibertsitateaTexto.java @@ -13,11 +13,16 @@ import com.app.didaktikapp.Activities.MapActivity; import com.app.didaktikapp.BBDD.Modelos.ActividadUniversitatea; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; import com.app.didaktikapp.R; import in.codeshuffle.typewriterview.TypeWriterView; - +/** + * Fragmento UnibertsitateaTexto, en el que el usuario puede leer un breve texto que da informacion + * sobre la universidad de Oñati. Cuando este acaba lo indica en la base de datos. + * @author gennakk + */ public class FragmentUnibertsitateaTexto extends Fragment { private static final String ARG_PARAM1 = "param1"; @@ -105,6 +110,7 @@ private void guardarBBDD(){ actividadUniversitatea.setFragment(1); DatabaseRepository.getAppDatabase().getUniversitateaDao().updateUniversitatea(actividadUniversitatea); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_UNIVERSITATEA); } diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentVideo.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentVideo.java index 922e2a5..6873cd9 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentVideo.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentVideo.java @@ -1,9 +1,11 @@ package com.app.didaktikapp.Fragments; import android.content.Context; +import android.graphics.Color; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -19,8 +21,18 @@ import com.app.didaktikapp.Activities.MapActivity; import com.app.didaktikapp.BBDD.Modelos.ActividadErrota; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; import com.app.didaktikapp.R; - +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.wooplr.spotlight.SpotlightConfig; +import com.wooplr.spotlight.utils.SpotlightSequence; +import com.wooplr.spotlight.utils.Utils; + +/** + * Fragmento de video, que se llama desde varios sitios de la aplicación pasandole el video + * que debe reproducir. Dependiendo desde donde se llame, guarda información en la base de datos + * @author gennakk + */ public class FragmentVideo extends Fragment { private View view; @@ -39,7 +51,8 @@ public class FragmentVideo extends Fragment { private static String fragment; private int rawvideo; - public FragmentVideo() {} + public FragmentVideo() { + } public static FragmentVideo newInstance(Long param1, String nombre) { @@ -68,7 +81,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, view = inflater.inflate(R.layout.fragment_errota_video, container, false); TextView titulo = view.findViewById(R.id.errotaTitulo); - switch(fragment) { + switch (fragment) { case "errota": titulo.setText(R.string.nombreLugar5); rawvideo = R.raw.video_sanmiguel_errota; @@ -82,10 +95,53 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, // rawvideo = R.raw.video_zumeltzegi; break; default: - Log.e("VIDEO","Nombre '"+fragment+"' no reconocido"); + Log.e("VIDEO", "Nombre '" + fragment + "' no reconocido"); } - //CONFIGURAMOS EL BOTON CONTINUAR + /* + Botón flotante de ayuda + */ + FloatingActionButton floatingActionButton = view.findViewById(R.id.helpButton); + floatingActionButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View viewBoton) { + + SpotlightConfig config = new SpotlightConfig(); + config.setMaskColor(Color.parseColor("#E63A3A3A")); + config.setIntroAnimationDuration(400); + config.setFadingTextDuration(400); + config.setPadding(20); + config.setDismissOnTouch(true); + config.setDismissOnBackpress(true); + config.setPerformClick(false); + config.setHeadingTvSize(24); + config.setHeadingTvColor(Color.parseColor("#2B82C5")); + config.setSubHeadingTvSize(24); + config.setSubHeadingTvColor(Color.parseColor("#FAFAFA")); + config.setLineAnimationDuration(300); + config.setLineStroke(Utils.dpToPx(4)); + config.setLineAndArcColor(Color.parseColor("#2B82C5")); + config.setShowTargetArc(true); + + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + + SpotlightSequence.getInstance(getActivity(), config) + .addSpotlight(view.findViewById(R.id.helpButton), getString(R.string.AyudaVideoTitulo), getString(R.string.AyudaVideoDetalle), "video") + .addSpotlight(view.findViewById(R.id.btnContinuar), getString(R.string.AyudaZumTituloContinuar), getString(R.string.AyudaZumDetalleContinuar), "continuar") + .startSequence(); + } + }, 0); + } + }); + + + + + //CONFIGURAMOS EL BOTON CONTINUAR btnContinuar = view.findViewById(R.id.btnContinuar); btnContinuar.setText(getResources().getString(R.string.Continuar)); btnContinuar.setOnClickListener(new View.OnClickListener() { @@ -103,6 +159,7 @@ public void onClick(View v) { ActividadErrota actividadErrota = DatabaseRepository.getAppDatabase().getErrotaDao().getErrota(idActividad); actividadErrota.setFragment(2); DatabaseRepository.getAppDatabase().getErrotaDao().updateErrota(actividadErrota); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_ERROTA); //Cerrar fragment y abrir el siguiente FragmentErrotaFotos fragment = FragmentErrotaFotos.newInstance(idActividad); diff --git a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentZumeltzegi.java b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentZumeltzegi.java index 6ec5927..a8abff6 100644 --- a/app/src/main/java/com/app/didaktikapp/Fragments/FragmentZumeltzegi.java +++ b/app/src/main/java/com/app/didaktikapp/Fragments/FragmentZumeltzegi.java @@ -8,6 +8,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.media.MediaPlayer; @@ -22,6 +23,7 @@ import androidx.fragment.app.Fragment; import android.os.Environment; +import android.os.Handler; import android.provider.MediaStore; import android.text.Html; import android.util.Base64; @@ -42,12 +44,18 @@ import com.app.didaktikapp.BBDD.Modelos.ActividadZumeltzegi; import com.app.didaktikapp.BBDD.Service.ZumeltzegiService; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; +import com.app.didaktikapp.MainActivity; import com.app.didaktikapp.R; import com.app.didaktikapp.wordsearch.features.gameover.GameOverActivity; import com.app.didaktikapp.wordsearch.features.gameplay.GamePlayActivity; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.textfield.TextInputEditText; import com.muddzdev.styleabletoast.StyleableToast; +import com.wooplr.spotlight.SpotlightConfig; +import com.wooplr.spotlight.utils.SpotlightSequence; +import com.wooplr.spotlight.utils.Utils; import org.w3c.dom.Text; @@ -101,8 +109,9 @@ public FragmentZumeltzegi() { * Use this factory method to create a new instance of * this fragment using the provided parameters. * - * @param param1 Parameter 1. + * @param param1 Parámetro con el id de la actividad. * @return A new instance of fragment FragmentZumeltzegi. + * @author gennakk */ // TODO: Rename and change types and number of parameters public static FragmentZumeltzegi newInstance(Long param1) { @@ -114,6 +123,10 @@ public static FragmentZumeltzegi newInstance(Long param1) { return fragment; } + /** + * Método para crear el fragment. + * @param savedInstanceState + */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -124,6 +137,13 @@ public void onCreate(Bundle savedInstanceState) { } } + /** + * Método para crear la vista del fragment. + * @param inflater + * @param container + * @param savedInstanceState + * @return La vista del fragment Zumeltzegi. + */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -224,15 +244,65 @@ public void onClick(View v) { DatabaseRepository.getAppDatabase().getZumeltzegiDao().updateZumeltzegi(actividadZumeltzegi); + ClassToFtp.send(getActivity(),ClassToFtp.TIPO_ZUMELTZEGI); + getFragmentManager().beginTransaction().remove(FragmentZumeltzegi.this).commit(); } }); + /* + Botón flotante de ayuda + */ + FloatingActionButton floatingActionButton = view.findViewById(R.id.helpButton); + floatingActionButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View viewBoton) { + + SpotlightConfig config = new SpotlightConfig(); + config.setMaskColor( Color.parseColor("#E63A3A3A")); + config.setIntroAnimationDuration(400); + config.setFadingTextDuration(400); + config.setPadding(20); + config.setDismissOnTouch(true); + config.setDismissOnBackpress(true); + config.setPerformClick(false); + config.setHeadingTvSize(24); + config.setHeadingTvColor(Color.parseColor("#2B82C5")); + config.setSubHeadingTvSize(24); + config.setSubHeadingTvColor(Color.parseColor("#FAFAFA")); + config.setLineAnimationDuration(300); + config.setLineStroke(Utils.dpToPx(4)); + config.setLineAndArcColor( Color.parseColor("#2B82C5")); + config.setShowTargetArc(true); + + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + + SpotlightSequence.getInstance(getActivity(),config) + .addSpotlight(view.findViewById(R.id.helpButton), getString(R.string.AyudaZumTituloPregunta), getString(R.string.AyudaZumDetallePregunta), "pregunta") + .addSpotlight(view.findViewById(R.id.helpButton), getString(R.string.AyudaZumTituloRespuesta), getString(R.string.AyudaZumDetalleRespuesta), "respuesta") + .addSpotlight(view.findViewById(R.id.btnContinuar), getString(R.string.AyudaZumTituloContinuar), getString(R.string.AyudaZumDetalleContinuar), "continuar") + .startSequence(); + } + },0); + } + }); + + return view; } + /** + * Método para convertir imagen a Base64. + * @param iv ImageView + * @return String Base64 con la imagen. + * @author gennakk + */ private String imageToBase64(ImageView iv){ iv.buildDrawingCache(); Bitmap bitmap = iv.getDrawingCache(); @@ -244,6 +314,10 @@ private String imageToBase64(ImageView iv){ return Base64.encodeToString(image, 0); } + /** + * Clase para imlpementar listener a un bóton de cámara. + * @author gennakk + */ private class ListenerBoton implements View.OnClickListener { @Override public void onClick(View v) { @@ -256,6 +330,11 @@ public void onClick(View v) { } + /** + * Método para ejecutar la cámara. + * @param v Vista del fragment. + * @author gennakk + */ private void dispatchTakePictureIntent(View v){ // Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // @@ -274,13 +353,22 @@ private void dispatchTakePictureIntent(View v){ } - // TODO: Rename method, update argument and hook method into UI event + /** + * Fragment interaction. + * @param uri + * @author gennakk + */ public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } + /** + * Método para implementar fragment. + * @param context Contexto de la app. + * @author gennakk + */ @Override public void onAttach(Context context) { super.onAttach(context); @@ -292,6 +380,10 @@ public void onAttach(Context context) { } } + /** + * Método para quitar el fragment. + * @author gennakk + */ @Override public void onDetach() { super.onDetach(); @@ -313,6 +405,13 @@ public interface OnFragmentInteractionListener { void onFragmentInteraction(Uri uri); } + /** + * Recibe el result del intent de la cámara con su imagen. + * @param requestCode + * @param resultCode + * @param data + * @author gennakk + */ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { @@ -333,13 +432,24 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { // } } + /** + * Resultado de pedir los permisos. + * @param requestCode + * @param permissions + * @param grantResults + * @author gennakk + */ @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } + /** + * Guarda imagen en una galería. + * @param iv ImageView + * @author gennakk + */ public void guardarImagen(ImageView iv){ //to get the image from the ImageView (say iv) BitmapDrawable draw = (BitmapDrawable) iv.getDrawable(); @@ -368,12 +478,20 @@ public void guardarImagen(ImageView iv){ MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, "Titulo" , "descripcion"); } + /** + * Método onPause del fragment Zumeltzegi. + * @author gennakk + */ @Override public void onPause() { super.onPause(); } + /** + * Método onDestroy del fragment Zumeltegi + * @author gennakk + */ @Override public void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/com/app/didaktikapp/InicioActivity.java b/app/src/main/java/com/app/didaktikapp/InicioActivity.java index 031b5ed..24d2bd3 100644 --- a/app/src/main/java/com/app/didaktikapp/InicioActivity.java +++ b/app/src/main/java/com/app/didaktikapp/InicioActivity.java @@ -15,6 +15,10 @@ import android.view.animation.TranslateAnimation; import android.widget.ImageView; +/** + * Activity que se muestra al lanzar la aplicación + * @author gennakk + */ public class InicioActivity extends AppCompatActivity { private ImageView imageViewOniate,imageViewCJ,imageViewUPV,imageViewLetrasOniate; diff --git a/app/src/main/java/com/app/didaktikapp/MainActivity.java b/app/src/main/java/com/app/didaktikapp/MainActivity.java index 9370c6e..0c3773d 100644 --- a/app/src/main/java/com/app/didaktikapp/MainActivity.java +++ b/app/src/main/java/com/app/didaktikapp/MainActivity.java @@ -7,7 +7,13 @@ import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleOwner; +import android.accounts.Account; +import android.accounts.AccountManager; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; +import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; @@ -32,8 +38,15 @@ import com.app.didaktikapp.BBDD.database.DatabaseRepository; import com.app.didaktikapp.CircleMenu.CircleMenuView; +import com.app.didaktikapp.FTP.Ftp; import com.app.didaktikapp.FlatDialog.FlatDialog; import com.facebook.stetho.Stetho; +import com.google.android.gms.auth.api.signin.GoogleSignIn; +import com.google.android.gms.auth.api.signin.GoogleSignInAccount; +import com.google.android.gms.auth.api.signin.GoogleSignInClient; +import com.google.android.gms.auth.api.signin.GoogleSignInOptions; +import com.google.android.gms.common.api.ApiException; +import com.google.android.gms.tasks.Task; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.muddzdev.styleabletoast.StyleableToast; import com.wooplr.spotlight.SpotlightConfig; @@ -47,18 +60,44 @@ import java.lang.ref.WeakReference; import java.util.List; import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import at.markushi.ui.CircleButton; +/** + * Activity principal encargada de lanzar el mapa, seguir una partida guardada y mostrar ayudas, + * así como manejar la base de datos y mandar información por FTP + * @author gennakk + */ public class MainActivity extends AppCompatActivity { + private final int RC_SIGN_IN = 111; + private ConstraintLayout layout; private CircleButton botonInicio,botonContinuar; - private Button botonSalir; + private Button botonSalir,botonFTP; private DatabaseRepository databaseRepository; private boolean administrador = false; + private String email; + + private GoogleSignInClient mGoogleSignInClient; + private GoogleSignInAccount account; + + @Override + protected void onStart() { + super.onStart(); + // Check for existing Google Sign In account, if the user is already signed in + // the GoogleSignInAccount will be non-null. + account = GoogleSignIn.getLastSignedInAccount(this); + if(account == null){ + Intent signInIntent = mGoogleSignInClient.getSignInIntent(); + startActivityForResult(signInIntent, RC_SIGN_IN); + } + } + @Override protected void onCreate(Bundle savedInstanceState) { @@ -66,8 +105,13 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Stetho.initializeWithDefaults(this); - - + // Configure sign-in to request the user's ID, email address, and basic + // profile. ID and basic profile are included in DEFAULT_SIGN_IN. + GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestEmail() + .build(); + // Build a GoogleSignInClient with the options specified by gso. + mGoogleSignInClient = GoogleSignIn.getClient(this, gso); // //BBDD // databaseRepository = new DatabaseRepository(MainActivity.this); // @@ -97,7 +141,18 @@ protected void onCreate(Bundle savedInstanceState) { tv.setTypeface(type); tv.setText(Html.fromHtml(getString(R.string.html_app_name))); - + botonFTP = findViewById(R.id.botonFTP); + botonFTP.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dialogoFTP(); + } + }); + if(administrador){ + botonFTP.setVisibility(View.VISIBLE); + }else{ + botonFTP.setVisibility(View.INVISIBLE); + } @@ -238,6 +293,7 @@ public void onButtonLongClickAnimationEnd(@NonNull CircleMenuView view, int inde private void activarModoAdministrador(){ StyleableToast.makeText(getApplicationContext(), getString(R.string.activarAdmin), Toast.LENGTH_LONG, R.style.mytoast).show(); administrador = true; + botonFTP.setVisibility(View.VISIBLE); } private void dialogoCambiarIdioma(){ @@ -407,14 +463,39 @@ public void onClick(View view) { //BBDD databaseRepository = new DatabaseRepository(MainActivity.this); + email = null; - //SE CREA EL GRUPO Y TODOS LOS FRAGMENTS CON SU ESTADO Y FRAGMENT = 0 - i.putExtra("IDGRUPO",DatabaseRepository.insertTaskGrupo(flatDialog.getFirstTextField())); - i.putExtra("ADMINISTRADOR",administrador); - startActivity(i); - flatDialog.dismiss(); + email = account.getEmail(); + Log.i("EMAIL",email+"..."); + if(email!=null) { + i.putExtra("IDGRUPO", DatabaseRepository.insertTaskGrupo(flatDialog.getFirstTextField(), email)); + i.putExtra("ADMINISTRADOR", administrador); + startActivity(i); + flatDialog.dismiss(); + } + /* while(email==null) { + //SE CREA EL GRUPO Y TODOS LOS FRAGMENTS CON SU ESTADO Y FRAGMENT = 0 + // Configure sign-in to request the user's ID, email address, and basic +// profile. ID and basic profile are included in DEFAULT_SIGN_IN. + gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestEmail() + .build(); + + // Build a GoogleSignInClient with the options specified by gso. + mGoogleSignInClient = GoogleSignIn.getClient(MainActivity.this, gso); + + signInIntent = mGoogleSignInClient.getSignInIntent(); + startActivityForResult(signInIntent, RC_SIGN_IN); + + if(email!=null) { + i.putExtra("IDGRUPO", DatabaseRepository.insertTaskGrupo(flatDialog.getFirstTextField(), email)); + i.putExtra("ADMINISTRADOR", administrador); + startActivity(i); + flatDialog.dismiss(); + } + } */ } }) .withSecondButtonListner(new View.OnClickListener() { @@ -426,6 +507,10 @@ public void onClick(View view) { .show(); } + private void googleAcc(){ + + } + private void eventos(){ botonSalir.setOnClickListener(new View.OnClickListener() { @@ -544,9 +629,62 @@ public void run() { + + } + private void dialogoFTP(){ + + + + final com.app.didaktikapp.FlatDialog.FlatDialog flatDialog = new com.app.didaktikapp.FlatDialog.FlatDialog(MainActivity.this); + flatDialog.setTitle(getString(R.string.TituloServidor)) + .setBackgroundColor(Color.parseColor("#2B82C5")) + .setSubtitle(getString(R.string.SubituloServidor)) + .setFirstTextFieldHint("IP del servidor") + .setFirstButtonText(getString(R.string.cambiar)) + .setFirstButtonColor(Color.parseColor("#FAFAFA")) + .setFirstButtonTextColor(Color.parseColor("#2B82C5")) + .setSecondButtonText(getString(R.string.Cancelar)) + .setSecondButtonColor(Color.parseColor("#ab000d")) + .setSecondButtonTextColor(Color.parseColor("#FAFAFA")) + .withFirstButtonListner(new View.OnClickListener() { + @Override + public void onClick(View view) { + + + + String ip = flatDialog.getFirstTextField(); + + String regex = "^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$"; + + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(ip); + + if(matcher.matches()) { + Context context = getApplicationContext(); + SharedPreferences sharedPref = context.getSharedPreferences( + getString(R.string.preference_file_key), Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sharedPref.edit(); + editor.putString(getString(R.string.servidor), ip); + editor.apply(); + StyleableToast.makeText(getApplicationContext(), getString(R.string.ipCorrecta), Toast.LENGTH_LONG, R.style.mytoastCorrecta).show(); + }else{ + StyleableToast.makeText(getApplicationContext(), getString(R.string.ipIncorrecta), Toast.LENGTH_LONG, R.style.mytoastIncorrecta).show(); + + } + } + }) + .withSecondButtonListner(new View.OnClickListener() { + @Override + public void onClick(View view) { + + flatDialog.dismiss(); + } + }) + .show(); + } private static class InsertTask extends AsyncTask { @@ -577,4 +715,32 @@ protected void onPostExecute(Boolean bool) { } } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + Log.i("SIGN","LOGIN0"+requestCode); + // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...); + if (requestCode == RC_SIGN_IN) { + // The Task returned from this call is always completed, no need to attach + // a listener. + Task task = GoogleSignIn.getSignedInAccountFromIntent(data); + handleSignInResult(task); + Log.i("SIGN","LOGIN1"); + } + } + + private void handleSignInResult(Task completedTask) { + try { + account = completedTask.getResult(ApiException.class); + Log.i("SIGN","LOGIN2"); + // Signed in successfully, show authenticated UI. + email = account.getEmail(); + Log.i("SIGN","LOGIN3"+email); + } catch (ApiException e) { + // The ApiException status code indicates the detailed failure reason. + // Please refer to the GoogleSignInStatusCodes class reference for more information. + Log.i("SIGN", "signInResult:failed code=" + e.getStatusCode()); + email = null; + } + } } diff --git a/app/src/main/java/com/app/didaktikapp/Modelo/Lugar.java b/app/src/main/java/com/app/didaktikapp/Modelo/Lugar.java index 8bb2722..74a7fb8 100644 --- a/app/src/main/java/com/app/didaktikapp/Modelo/Lugar.java +++ b/app/src/main/java/com/app/didaktikapp/Modelo/Lugar.java @@ -6,6 +6,10 @@ import java.util.Objects; +/** + * Clase que guarda un lugar en el mapa así como sus fragments + * @author gennakk + */ public class Lugar { private String nombre; diff --git a/app/src/main/java/com/app/didaktikapp/Video/CustomMediaController.java b/app/src/main/java/com/app/didaktikapp/Video/CustomMediaController.java new file mode 100644 index 0000000..b26b4d5 --- /dev/null +++ b/app/src/main/java/com/app/didaktikapp/Video/CustomMediaController.java @@ -0,0 +1,42 @@ +package com.app.didaktikapp.Video; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.MediaController; + +/** + * Clase que maneja la reproduccion de videos + * @author gennakk + */ +public class CustomMediaController extends MediaController { + private Context context; + public CustomMediaController(Context context, AttributeSet attrs) { + super(context, attrs); + this.context = context; + } + + public CustomMediaController(Context context, boolean useFastForward) { + super(context, useFastForward); + this.context = context; + } + + public CustomMediaController(Context context) { + super(context); + this.context = context; + } + + @Override + public void setAnchorView(View view) { + super.setAnchorView(view); + + Button fullScreen = new Button(context); + fullScreen.setText("FullScreen"); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + params.gravity = Gravity.RIGHT|Gravity.TOP; + addView(fullScreen, params); + } +} diff --git a/app/src/main/java/com/app/didaktikapp/wordsearch/features/gameover/GameOverActivity.java b/app/src/main/java/com/app/didaktikapp/wordsearch/features/gameover/GameOverActivity.java index ab18f3f..2ecb3e4 100644 --- a/app/src/main/java/com/app/didaktikapp/wordsearch/features/gameover/GameOverActivity.java +++ b/app/src/main/java/com/app/didaktikapp/wordsearch/features/gameover/GameOverActivity.java @@ -8,7 +8,6 @@ import androidx.core.app.NavUtils; import androidx.lifecycle.ViewModelProviders; -import com.app.didaktikapp.BBDD.SQLiteControlador; import com.app.didaktikapp.R; import com.app.didaktikapp.wordsearch.WordSearchApp; import com.app.didaktikapp.wordsearch.commons.DurationFormatter; diff --git a/app/src/main/java/com/app/didaktikapp/wordsearch/features/gameplay/GamePlayActivity.java b/app/src/main/java/com/app/didaktikapp/wordsearch/features/gameplay/GamePlayActivity.java index 7ca2fce..a9e7cdb 100644 --- a/app/src/main/java/com/app/didaktikapp/wordsearch/features/gameplay/GamePlayActivity.java +++ b/app/src/main/java/com/app/didaktikapp/wordsearch/features/gameplay/GamePlayActivity.java @@ -2,11 +2,13 @@ import android.animation.Animator; import android.animation.AnimatorInflater; +import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.os.Handler; +import android.os.Vibrator; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; @@ -16,6 +18,7 @@ import com.app.didaktikapp.BBDD.Modelos.ActividadZumeltzegi; import com.app.didaktikapp.BBDD.database.DatabaseRepository; +import com.app.didaktikapp.FTP.ClassToFtp; import com.app.didaktikapp.R; import com.app.didaktikapp.wordsearch.WordSearchApp; import com.app.didaktikapp.wordsearch.commons.DurationFormatter; @@ -285,6 +288,7 @@ private void showUsedWords(List usedWords) { } private void showFinishGame(int gameId) { + vibrar(); Intent intent = new Intent(this, GameOverActivity.class); intent.putExtra(GameOverActivity.EXTRA_GAME_ROUND_ID, gameId); @@ -301,6 +305,8 @@ private void showFinishGame(int gameId) { actividadZumeltzegi.setEstado(2); DatabaseRepository.getAppDatabase().getZumeltzegiDao().updateZumeltzegi(actividadZumeltzegi); + ClassToFtp.send(getBaseContext(),ClassToFtp.TIPO_ZUMELTZEGI); + }else if(nombre.equals(FRAGMENT_ERREPASO2)){ String a = "hola"; @@ -312,6 +318,14 @@ private void showFinishGame(int gameId) { finish(); } + private void vibrar(){ + // Get instance of Vibrator from current Context + Vibrator v = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE); + + // Vibrate for 400 milliseconds + v.vibrate(400); + } + private void setGameAsAlreadyFinished() { mLetterBoard.getStreakView().setInteractive(false); mFinishedText.setVisibility(View.VISIBLE); diff --git a/app/src/main/res/drawable/roundedbutton.xml b/app/src/main/res/drawable/roundedbutton.xml index b18dede..f3b2d55 100644 --- a/app/src/main/res/drawable/roundedbutton.xml +++ b/app/src/main/res/drawable/roundedbutton.xml @@ -1,13 +1,9 @@ - - - - - - - - - - - - \ No newline at end of file + + + + \ 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 index 8c7c16e..685e5d5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -147,4 +147,17 @@ +