Commit 22ac201a by Arturo Montejo Ráez

Merge branch 'develop' of http://scm.ujaen.es/softuno/pictogram into develop

parents a39ee17c a37ae423
Showing with 680 additions and 427 deletions
......@@ -15,6 +15,7 @@ import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.util.Hashtable;
import javax.net.ssl.HttpsURLConnection;
......@@ -140,8 +141,11 @@ public class RestapiWrapper {
while ((line=br.readLine()) != null) {
response.append(line);
}
if (response.length()==0) response.append("{\"result\":null}");
if (response.length()==0) response.append("null");
if (Character.isAlphabetic(response.charAt(0)))
response.append('\'').insert(0,'\'');
Log.i(com.yottacode.net.RestapiWrapper.class.getName(), "Raw server answer: " + response);
try {
JSONresponse = new JSONObject("{ "+SERVER_RESULT+": " + response + (responseCode == HttpsURLConnection.HTTP_OK
? "}"
......@@ -150,7 +154,7 @@ public class RestapiWrapper {
JSONresponse = null;
Log.e(RestapiWrapper.class.getCanonicalName(),e.getMessage());
}
// Log.i(com.yottacode.net.RestapiWrapper.class.getName(), "server answer: " + JSONresponse.toString());
Log.i(com.yottacode.net.RestapiWrapper.class.getName(), "server answer: " + JSONresponse.toString());
return JSONresponse;
}
......@@ -192,7 +196,9 @@ public class RestapiWrapper {
if (json_params) {
urlConnection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
urlConnection.setRequestProperty("Accept", "application/json, text/plain, */*");
}
} else
urlConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded; charset=utf-8");
String sparams;
if (json_params) {
sparams = params.get("json");
......@@ -213,14 +219,21 @@ public class RestapiWrapper {
//Send request
DataOutputStream wr = new DataOutputStream (
urlConnection.getOutputStream ());
wr.writeBytes(sparams);
wr.write(sparams.getBytes(Charset.forName("UTF-8")));
wr.flush();
wr.close();
return RestapiWrapper.resultToJSON(urlConnection);
}
static public class HTTPException extends Exception{
protected int code;
public HTTPException(String exception, int code) {
super(exception);
this.code=code;
}
public int getCode() {return this.code;}
}
private class HttpAsyncTaskParams {
protected String request_method;
protected String url;
......@@ -228,7 +241,8 @@ public class RestapiWrapper {
protected boolean json_params;
protected iRestapiListener listener;
protected Object result;
protected Exception error;
protected HTTPException error;
}
private class HttpAsyncTask extends AsyncTask<HttpAsyncTaskParams, Void, HttpAsyncTaskParams> {
......@@ -236,18 +250,24 @@ public class RestapiWrapper {
@Override
protected HttpAsyncTaskParams doInBackground(HttpAsyncTaskParams... params) {
JSONObject jresult=null;
try {
Log.i(com.yottacode.net.RestapiWrapper.class.getName(), " Asking to the server for " + params[0].url+" params:"+params[0].url_params +" JSON?"+params[0].json_params);
JSONObject jresult = params[0].request_method.equalsIgnoreCase("GET")
jresult = params[0].request_method.equalsIgnoreCase("GET")
? GET(params[0].url, params[0].url_params)
: POST(params[0].url, params[0].request_method, params[0].url_params, params[0].json_params);
params[0].result=jresult.get(SERVER_RESULT);
if (jresult.has(SERVER_ERROR))
params[0].error= new Exception(params[0].result+" (err code "+jresult.getString(SERVER_ERROR)+")");
} catch (Exception e) {
params[0].error= new HTTPException(params[0].result+" (err code "+jresult.getString(SERVER_ERROR)+")", jresult.getInt(SERVER_ERROR));
} catch (IOException e) {
Log.e(com.yottacode.net.RestapiWrapper.class.getName(), "Error: '" + e.getLocalizedMessage() + "' when asking for " + params[0].url);
params[0].result=null;
params[0].error=e;
params[0].error=new HTTPException(e.getMessage(),-1);
} catch (JSONException e) {
Log.e(com.yottacode.net.RestapiWrapper.class.getName(), "Error: '" + e.getLocalizedMessage() +
"' when parsing " + jresult==null ? "null json result" : jresult.toString());
params[0].result=null;
params[0].error=new HTTPException(e.getMessage(),-1);
}
return params[0];
}
......@@ -270,4 +290,19 @@ public class RestapiWrapper {
if (params.url_params!=null) params.url_params.clear();
}
}
/**
* This interface specifies which are the methods to be implemented by classes receiving
* responses to API requests.
*
* Generally, it is extended by Activities from which API requests are performed
*
* @author dofer
*/
public interface iRestapiListener {
void preExecute();
void result(JSONArray result);
void result(JSONObject result);
void error(HTTPException e);
}
}
package com.yottacode.net;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* This interface specifies which are the methods to be implemented by classes receiving
* responses to API requests.
*
* Generally, it is extended by Activities from which API requests are performed
*
* @author dofer
*/
public interface iRestapiListener {
public void preExecute();
public void result(JSONArray result);
public void result(JSONObject result);
public void error(Exception e);
}
......@@ -2,8 +2,7 @@ package com.yottacode.pictogram.action;
import android.util.Log;
import com.yottacode.net.iRestapiListener;
import com.yottacode.pictogram.dao.Picto;
import com.yottacode.net.RestapiWrapper;
import com.yottacode.pictogram.tools.PCBcontext;
import org.json.JSONArray;
......@@ -18,7 +17,7 @@ import java.util.Vector;
* Modified by Fernando on 10/11/15
* More info at http://scm.ujaen.es/softuno/pictogram/wikis/LUActions
*/
public class ActionLog implements iRestapiListener {
public class ActionLog implements RestapiWrapper.iRestapiListener {
Vector<JSONObject> actions_buffer;
......@@ -91,7 +90,7 @@ public class ActionLog implements iRestapiListener {
}
@Override
public void error(Exception e) {
public void error(RestapiWrapper.HTTPException e) {
Log.e(this.getClass().getCanonicalName(),"Error:"+e.getMessage()+" on actions="+this.actions_buffer);
}
}
......@@ -262,7 +262,6 @@ public class Device extends SQLiteOpenHelper {
while (cursor.moveToNext()) {
user = new User(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5), cursor.getString(6), cursor.getString(7), cursor.getString(8),
cursor.getInt(9), cursor.getString(10), cursor.getString(11), cursor.getString(12), cursor.getString(13), cursor.getString(14), cursor.getString(15), cursor.getString(16), cursor.getString(17));
users.add(user);
}
......@@ -273,7 +272,6 @@ public class Device extends SQLiteOpenHelper {
public void insertUser(User user) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("INSERT INTO users_detail values (" +
user.get_id_stu() + ", " +
"'" + user.get_nickname_stu() + "', " +
......
package com.yottacode.pictogram.dao;
import com.yottacode.net.RestapiWrapper;
/**
* Created by Fernando on 15/03/2016.
*/
public class LoginException extends Exception{
public class LoginException extends RestapiWrapper.HTTPException {
public static final int BAD_LOGIN=1;
public static final int NO_STUDENTS=2;
public static final int TIME_OUT=3;
int code;
public static final int NO_LICENSE=4;
public LoginException(String msg, int code) {
super(msg);
this.code=code;
super(msg,code);
this.code=msg.contains("User without students")
? LoginException.NO_STUDENTS
: msg.contains("failed to connect")
? LoginException.TIME_OUT
: msg.contains("invalid license")
? LoginException.NO_LICENSE
: msg.contains("username")
? LoginException.BAD_LOGIN
: LoginException.TIME_OUT;
}
public boolean login_failed() {return this.code==LoginException.BAD_LOGIN;}
public boolean no_supervisor_students() {return this.code==LoginException.NO_STUDENTS;}
public boolean time_out() {return this.code==LoginException.TIME_OUT;}
public boolean invalidLicense() {
return this.code==NO_LICENSE;
}
public String getLocalizedMessage() {
return super.getLocalizedMessage()+" Login ok:"+!login_failed()+" Supervisor without students:"+no_supervisor_students();
return super.getLocalizedMessage()+" Login failed:"+login_failed()+" Supervisor without students:"+no_supervisor_students()+" Invalid license:"+invalidLicense();
}
}
......@@ -310,7 +310,7 @@ public class Picto extends Img {
public int get_color() {
try {
String color = this.attributes.getString(JSON_ATTTRS.COLOR);
int icolor = Color.parseColor(color);
int icolor = color==null || color.equals("null") ? Color.WHITE : Color.parseColor(color);
return icolor;
} catch (JSONException e) {
......
......@@ -31,6 +31,7 @@ public class User {
static String PICTOGRAM_SIZE ="size";
static String TTS_ENGINE = "tts engine";
static String TTS_VOICE = "tts voice";
static String DELETE_STRIP = "delete_strip_after_delivery";
}
public final static class JSON_STUDENT_INPUT_FEEDBACK {
public static String VIBRATION="vibration";
......@@ -46,6 +47,7 @@ public class User {
private boolean mirror_mode=false;
public User(int id_stu, String nickname_stu, String pwd_stu, String name_stu, String surname_stu, String url_img_stu, String gender_stu, String lang_stu, String attributes_stu) throws JSONException {
this(id_stu, nickname_stu, pwd_stu, name_stu, surname_stu, url_img_stu, gender_stu, lang_stu, attributes_stu,User.NO_SUPERVISOR,"","","","","","M","es-es",null);
}
......@@ -258,6 +260,19 @@ public class User {
}
}
/**
*
* @return input feedback of the student configuration (default: "vibration")
*/
public boolean delete_tape_after_delivery() {
try {
return this.attributes_stu.getBoolean(JSON_STUDENT_ATTTRS.DELETE_STRIP);
} catch (JSONException e) {
return false;
}
}
/**
*
* @return input selection of the student configuration (default: "click")
......
......@@ -6,7 +6,6 @@ import android.content.Intent;
import android.util.Log;
import com.yottacode.net.RestapiWrapper;
import com.yottacode.net.iRestapiListener;
import com.yottacode.pictogram.R;
import com.yottacode.pictogram.net.ImgDownloader;
import com.yottacode.pictogram.net.ServerLogin;
......@@ -50,7 +49,7 @@ public class UserLogin {
Log.i(LOG_TAG, "Online login request for supervisor "+email);
final ProgressDialog progressDialog = ProgressDialog.show(activity, activity.getBaseContext().getString(R.string.userLoadingTxt),
activity.getBaseContext().getString(R.string.userLoadingTxt), false, false);
ServerLogin.login_supervisor(email, password, new iRestapiListener() {
ServerLogin.login_supervisor(email, password, new RestapiWrapper.iRestapiListener() {
@Override
public void preExecute() {
......@@ -98,18 +97,20 @@ public class UserLogin {
}
}
@Override
public void error(Exception e) {
public void error(RestapiWrapper.HTTPException e) {
Log.i(this.getClass().getCanonicalName(),"Login fail:"+e.getMessage()+" ("+e.getClass().getCanonicalName()+")");
if (progressDialog.isShowing()) progressDialog.dismiss();
if (e instanceof LoginException)
if (((LoginException)e).login_failed())
if (((LoginException)e).invalidLicense())
GUITools.show_alert(activity, R.string.loginNoLicenseMsg);
else if (((LoginException)e).login_failed())
GUITools.show_alert(activity, R.string.loginErrorMsg);
else if (((LoginException)e).no_supervisor_students())
GUITools.show_alert(activity, R.string.noStudentsError);
else
GUITools.show_alert(activity, R.string.serverError, e.getMessage());
GUITools.show_alert(activity, R.string.serverError, e.getMessage()+"( error "+e.getCode()+")");
else
GUITools.show_alert(activity, R.string.serverError, e.getMessage());
GUITools.show_alert(activity, R.string.serverError, e.getMessage()+"( error "+e.getCode()+")");
}
});
} else //offline
......@@ -153,7 +154,7 @@ public class UserLogin {
if (online) {
Log.i(this.getClass().getCanonicalName(), "Online login request for student "+username);
final ProgressDialog progressDialog=ProgressDialog.show(activity, activity.getString(R.string.userLoadingTxt),activity.getString(R.string.userLoadingTxt));
ServerLogin.login_student(username,password,new iRestapiListener() {
ServerLogin.login_student(username,password,new RestapiWrapper.iRestapiListener() {
@Override
public void preExecute() {
......@@ -199,16 +200,19 @@ public class UserLogin {
}
@Override
public void error(Exception e) {
public void error(RestapiWrapper.HTTPException e) {
if(progressDialog.isShowing()) progressDialog.dismiss();
if (e instanceof LoginException)
if (((LoginException)e).login_failed())
if (((LoginException)e).invalidLicense())
GUITools.show_alert(activity, R.string.loginNoLicenseMsg);
else
if (((LoginException)e).login_failed())
GUITools.show_alert(activity, R.string.loginErrorMsg);
else
GUITools.show_alert(activity, R.string.serverError, e.getMessage());
else
GUITools.show_alert(activity, R.string.serverError, e.getMessage());
Log.e(this.getClass().getCanonicalName(), "Server error:"+ e.getLocalizedMessage());
Log.e(this.getClass().getCanonicalName(), "Server Error:"+ e.getLocalizedMessage());
}});
}
......
......@@ -3,7 +3,7 @@ package com.yottacode.pictogram.grammar;
import android.os.AsyncTask;
import android.util.Log;
import com.yottacode.net.iRestapiListener;
import com.yottacode.net.RestapiWrapper;
import com.yottacode.pictogram.R;
import com.yottacode.pictogram.action.VocabularyAction;
import com.yottacode.pictogram.dao.Picto;
......@@ -148,12 +148,12 @@ public class Vocabulary implements Iterable<Picto> {
public void synchronize() {
synchronize_upload();
synchronize_upload(); // (i) uploading
//download
// and (ii) downloading
final String picto_str="/pictos";
String operation=PCBcontext.getPcbdb().getCurrentUser().get_restapi_operation_stu()+picto_str;
PCBcontext.getRestapiWrapper().ask(operation, new iRestapiListener() {
PCBcontext.getRestapiWrapper().ask(operation, new RestapiWrapper.iRestapiListener() {
@Override
public void preExecute() {
......@@ -192,7 +192,7 @@ public class Vocabulary implements Iterable<Picto> {
for (StackTraceElement s: traces)
Log.e(s.getClassName()+"."+s.getFileName()+"."+s.getLineNumber(),s.toString());
Log.e(this.getClass().getName(), " Picto JSON error from server: " + ojpicto.toString());
this.error(e);
this.error(new RestapiWrapper.HTTPException("JSON Error:"+e.getMessage(),-1));
}
}
}
......@@ -202,7 +202,7 @@ public class Vocabulary implements Iterable<Picto> {
}
@Override
public void error(Exception e) {
public void error(RestapiWrapper.HTTPException e) {
Log.e(this.getClass().getName(), " Server RESTAPI error: " + e.getLocalizedMessage());
Vocabulary.this.imgListener.error(e);
}
......
......@@ -4,7 +4,6 @@ import android.content.Intent;
import android.util.Log;
import com.yottacode.net.RestapiWrapper;
import com.yottacode.net.iRestapiListener;
import com.yottacode.pictogram.R;
import com.yottacode.pictogram.dao.LoginException;
import com.yottacode.pictogram.dao.User;
......@@ -48,7 +47,7 @@ public class NetService implements Runnable {
User user=PCBcontext.getPcbdb().getCurrentUser();
if (user.is_supervisor())
ServerLogin.login_supervisor(user.get_email_sup(), user.get_pwd_sup(), new iRestapiListener() {
ServerLogin.login_supervisor(user.get_email_sup(), user.get_pwd_sup(), new RestapiWrapper.iRestapiListener() {
@Override
public void preExecute() {
......@@ -65,12 +64,12 @@ public class NetService implements Runnable {
}
@Override
public void error(Exception e) {
Log.e(this.getClass().getSimpleName(), "Error un when server login:" + e.getMessage());
public void error(RestapiWrapper.HTTPException e) {
Log.e(this.getClass().getSimpleName(), "Error un when server login:" + e.getMessage()+"( error "+e.getCode()+")");
if (e instanceof LoginException) NetService.this.device.restart_app(false);
}
});
else ServerLogin.login_student(user.get_nickname_stu(), user.get_pwd_stu(), new iRestapiListener() {
else ServerLogin.login_student(user.get_nickname_stu(), user.get_pwd_stu(), new RestapiWrapper.iRestapiListener() {
@Override
public void preExecute() {
......@@ -87,8 +86,8 @@ public class NetService implements Runnable {
}
@Override
public void error(Exception e) {
Log.e(this.getClass().getSimpleName(),"Error un when server login:"+e.getMessage());
public void error(RestapiWrapper.HTTPException e) {
Log.e(this.getClass().getSimpleName(),"Error un when server login:"+e.getMessage()+"( error "+e.getCode()+")");
if (e instanceof LoginException) NetService.this.device.restart_app(false);
}
});
......@@ -109,7 +108,7 @@ public class NetService implements Runnable {
*/
@Override
public void run() {
PCBcontext.getRestapiWrapper().ask(ping_session, new iRestapiListener() {
PCBcontext.getRestapiWrapper().ask(ping_session, new RestapiWrapper.iRestapiListener() {
@Override
public void preExecute() {
......@@ -140,7 +139,7 @@ public class NetService implements Runnable {
}
@Override
public void error(Exception e) {
public void error(RestapiWrapper.HTTPException e) {
setOffline(e);
}
});
......
......@@ -7,7 +7,7 @@ import android.util.Log;
import com.google.gson.JsonObject;
import com.koushikdutta.ion.Ion;
import com.koushikdutta.ion.Response;
import com.yottacode.net.iRestapiListener;
import com.yottacode.net.RestapiWrapper;
import com.yottacode.pictogram.R;
import com.yottacode.pictogram.action.VocabularyAction;
import com.yottacode.pictogram.dao.Picto;
......@@ -22,6 +22,7 @@ import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpRetryException;
import java.util.Hashtable;
import java.util.concurrent.ExecutionException;
......@@ -121,7 +122,7 @@ public class PictoUploader {
e.printStackTrace();
Log.e(this.getClass().getCanonicalName(), " Error: " + e.getLocalizedMessage());
}
PCBcontext.getRestapiWrapper().ask(PCBcontext.getPcbdb().getCurrentUser().get_restapi_operation_stu() + "/picto/"+id_picto, params, "post", true, new iRestapiListener() {
PCBcontext.getRestapiWrapper().ask(PCBcontext.getPcbdb().getCurrentUser().get_restapi_operation_stu() + "/picto/"+id_picto, params, "post", true, new RestapiWrapper.iRestapiListener() {
@Override
public void preExecute() {
}
......@@ -138,7 +139,7 @@ public class PictoUploader {
}
@Override
public void error(Exception e) {
public void error(RestapiWrapper.HTTPException e) {
Log.e(this.getClass().getCanonicalName(), " Error uploading attributes: " + e.getLocalizedMessage());
listener.success(false);
......@@ -155,7 +156,9 @@ public class PictoUploader {
params.put("picto", Integer.toString(id_picto));
params.put("lang", PCBcontext.getPcbdb().getCurrentUser().get_lang_stu());
params.put("text", picto.get_translation());
PCBcontext.getRestapiWrapper().ask("picto/exp", params, "post", new iRestapiListener() {
Log.i(this.getClass().getCanonicalName(), "Uploading translation: " + picto.get_translation());
PCBcontext.getRestapiWrapper().ask("picto/exp", params, "post", new RestapiWrapper.iRestapiListener() {
@Override
public void preExecute() {
}
......@@ -171,7 +174,7 @@ public class PictoUploader {
}
@Override
public void error(Exception e) {
public void error(RestapiWrapper.HTTPException e) {
Log.e(this.getClass().getCanonicalName(), "Error uploading translation: " + e.getLocalizedMessage()+" Picto:"+params.get("picto")+" Lang:"+params.get("lang")+" Text:"+params.get("text"));
listener.success(false);
}
......@@ -229,7 +232,7 @@ public class PictoUploader {
Log.i(this.getClass().getCanonicalName(), "Picto Uploading " + params.toString());
PCBcontext.getRestapiWrapper().ask(
PCBcontext.getPcbdb().getCurrentUser().get_restapi_operation_stu() + "/picto",
params, "put", new iRestapiListener() {
params, "put", new RestapiWrapper.iRestapiListener() {
@Override
public void preExecute() {
}
......@@ -247,7 +250,7 @@ public class PictoUploader {
}
@Override
public void error(Exception e) {
public void error(RestapiWrapper.HTTPException e) {
Log.e(this.getClass().getCanonicalName(), "Picto Error: " + e.getLocalizedMessage());
}
}
......
......@@ -3,7 +3,6 @@ package com.yottacode.pictogram.net;
import android.util.Log;
import com.yottacode.net.RestapiWrapper;
import com.yottacode.net.iRestapiListener;
import com.yottacode.pictogram.dao.LoginException;
import com.yottacode.pictogram.tools.PCBcontext;
......@@ -18,20 +17,20 @@ import java.util.Hashtable;
*/
public class ServerLogin {
public static void login_student(String username, String password, iRestapiListener listener) {
public static void login_student(String username, String password, RestapiWrapper.iRestapiListener listener) {
login("stu/login", null, username, password, listener);
}
public static void login_supervisor(String email, String password, iRestapiListener listener) {
public static void login_supervisor(String email, String password, RestapiWrapper.iRestapiListener listener) {
login("sup/login", email, null, password, listener);
}
private static void login(String operation, String email, String username, String password, final iRestapiListener listener){
private static void login(String operation, String email, String username, String password, final RestapiWrapper.iRestapiListener listener){
Hashtable<String, String> postDataParams = new Hashtable<String, String>();
if (email!=null) postDataParams.put("email", email);
if (username!=null) postDataParams.put("username", username);
postDataParams.put("password", password);
PCBcontext.getRestapiWrapper().ask(operation, postDataParams, "post", new iRestapiListener() {
PCBcontext.getRestapiWrapper().ask(operation, postDataParams, "post", new RestapiWrapper.iRestapiListener() {
@Override
public void preExecute() {
listener.preExecute();
......@@ -53,18 +52,15 @@ public class ServerLogin {
PCBcontext.getVocabulary().synchronize();
}
listener.result(result);
} catch (JSONException e) {
listener.error(e);
}catch (JSONException e) {
listener.error(new RestapiWrapper.HTTPException("JSON Error:"+e.getMessage(),-1));
}
}
@Override
public void error(Exception e) {
listener.error(new LoginException(e.getMessage(),e.getMessage().contains("User without students")
? LoginException.NO_STUDENTS
: e.getMessage().contains("failed to connect")
? LoginException.TIME_OUT
: LoginException.BAD_LOGIN));
public void error(RestapiWrapper.HTTPException e) {
Log.e(this.getClass().getCanonicalName(),"Raw error from server when login:"+e.getMessage()+" (error "+e.getCode()+")");
listener.error(new LoginException(e.getMessage(),e.getCode()));
}
});
}
......
package com.yottacode.pictogram.net;
import com.yottacode.net.iRestapiListener;
import com.yottacode.pictogram.tools.PCBcontext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by Fernando on 16/12/2016.
*/
public class SessionWrapper {
public interface iSessionWrapper {
void methods(JSONArray methods);
void error(String error);
}
iSessionWrapper listener;
public SessionWrapper(iSessionWrapper listener) {
this.listener=listener;
}
public void getMethods() {
int id=PCBcontext.getPcbdb().getCurrentUser().get_id_stu();
PCBcontext.getRestapiWrapper().ask("/stu/" + id+"/methods",null,"get",true, new iRestapiListener() {
@Override
public void preExecute() {
}
@Override
public void result(JSONArray result) {
listener.methods(result);
}
@Override
public void result(JSONObject result) {
try {
listener.methods(new JSONArray(1).put(result));
} catch (JSONException e) {
listener.error(e.getMessage());
}
}
@Override
public void error(Exception e) {
listener.error(e.getMessage());
}
});
}
}
......@@ -41,23 +41,36 @@ public class ActionTalk implements Emitter.Listener {
final String param_picto_cat="id_cat";
final String action_select="select";
final String action_add="add";
final String action_show="show";
JSONObject msg = (JSONObject) args[0];
try {
Log.i(this.getClass().getName(), "raw Received message " +msg.toString());
Log.i(this.getClass().getName(), "Received message (raw): " +msg.toString()+" mirror:"+PCBcontext.getPcbdb().getCurrentUser().is_mirror_on());
String action = msg.getString(param_action).toLowerCase();
if (action.equals(action_add) || action.equals(action_select)) {
JSONObject stu_picto = msg.getJSONObject(param_attributes).getJSONObject(param_stu_picto);
JSONObject attrs_stu_picto = stu_picto.optJSONObject(param_attributes);
JSONObject picto_stupicto = stu_picto.optJSONObject(param_picto);
int picto_id = picto_stupicto.getInt(param_picto_id);
int picto_cat = attrs_stu_picto != null ? attrs_stu_picto.optInt(param_picto_cat, Picto.NO_CATEGORY) : 0;
if (PCBcontext.getPcbdb().getCurrentUser().is_mirror_on() || attrs_stu_picto.has(Picto.JSON_ATTTRS.MIRROR)) {
if (action.equals(action_add) || action.equals(action_select) ||action.equals(action_show)) {
int picto_id;
int picto_cat;
boolean mirroing=PCBcontext.getPcbdb().getCurrentUser().is_mirror_on();
if (action.equals(action_show)) {
picto_id=picto_cat=-1;
} else {
JSONObject stu_picto = msg.getJSONObject(param_attributes).getJSONObject(param_stu_picto);
JSONObject attrs_stu_picto = stu_picto.optJSONObject(param_attributes);
JSONObject picto_stupicto = stu_picto.optJSONObject(param_picto);
picto_id = picto_stupicto.getInt(param_picto_id);
picto_cat = attrs_stu_picto != null ? attrs_stu_picto.optInt(param_picto_cat, Picto.NO_CATEGORY) : 0;
mirroing|=attrs_stu_picto.has(Picto.JSON_ATTTRS.MIRROR);
}
if ( mirroing) {
Log.i(this.getClass().getName(), "Received message '" + action +
"' for picto " + picto_id + " (cat " + picto_cat + ", picto: " + picto_stupicto);
"' for picto " + picto_id + " (cat " + picto_cat);
for (iActionListener listener : this.listeners)
listener.action(action.equals(action_add) ? iActionListener.action.add : iActionListener.action.select, picto_cat, picto_id);
listener.action(action.equals(action_add)
? iActionListener.action.add
: action.equals(action_select)
? iActionListener.action.select
: iActionListener.action.show
, picto_cat, picto_id);
}
}
......@@ -68,7 +81,7 @@ public class ActionTalk implements Emitter.Listener {
}
public void addListener(iActionListener listener) {
listeners.add(listener);
if (!listeners.contains(listener)) listeners.add(listener);
}
public void removeListener(iActionListener removedlistener) {
......@@ -83,7 +96,7 @@ public class ActionTalk implements Emitter.Listener {
* @version 1.0
*/
public interface iActionListener {
enum action {add,select}
enum action {add,select,show}
void action(action action, int picto_cat, int picto_id);
}
}
......@@ -50,6 +50,8 @@ public final class PCBcontext {
}
}
public static boolean init() {return init;}
/**
* @param student
* @param listener
......
......@@ -49,9 +49,9 @@ public class BitmapTools {
return resize(width,height);
}
public BitmapTools paintSquare(int thickness, int color ) {
for (int i = 0; i < this.bitmap.getWidth(); i++)
for (int t = 1; t <= thickness; t++) {
public BitmapTools paintSquare(int thickness, int color, int step ) {
for (int i = 0; i < this.bitmap.getWidth(); i+=step)
for (int t = 1; t <= thickness; t+=step) {
this.bitmap.setPixel(i, 0 + t-1, color);
this.bitmap.setPixel(i, this.bitmap.getHeight() - t, color);
}
......@@ -136,4 +136,25 @@ public class BitmapTools {
// return out final image
return bmOut;
}
public BitmapTools disableBitmap() {
Canvas canvas = new Canvas(bitmap);
Paint alphaPaint = new Paint();
alphaPaint.setAlpha(30);
canvas.drawBitmap(bitmap, 0, 0, alphaPaint);
return this;
}
public BitmapTools paintPause( ) {
int thickness=8;
int color=Color.DKGRAY;
for (int i = this.bitmap.getWidth()/2; i < this.bitmap.getWidth()/2+thickness; i++)
for (int t = this.bitmap.getHeight()/8; t <= this.bitmap.getHeight()-this.bitmap.getHeight()/8; t++) {
this.bitmap.setPixel(i-8, t, color);
this.bitmap.setPixel(i+8, t, color);
}
return this;
}
}
......@@ -18,7 +18,8 @@
<string name="logout">Logout</string>
<string name="loginTitle">Who are you?</string>
<string name="loginErrorTxt">Login</string>
<string name="loginErrorMsg">El usuario no existe o la contraseña indicada no es correcta. Inténtelo de nuevo.</string>
<string name="loginErrorMsg">Invalid user or password. Please, try it again.</string>
<string name="loginNoLicenseMsg">Not valid user license. Please, contact with Yotta.</string>
<string name="userInetErrorMsg">Unknown new user name because Internet conection is not available</string>
<string name="userLoadingTxt">Loading</string>
<string name="userLoadingMsg">Loading students. Please wait.</string>
......
......@@ -20,6 +20,7 @@
<string name="loginTitle">¿Quién eres?</string>
<string name="loginErrorTxt">Login</string>
<string name="loginErrorMsg">El usuario no existe o la contraseña indicada no es correcta. Inténtelo de nuevo.</string>
<string name="loginNoLicenseMsg">El usuario no tiene una licencia válida. Contacte con Yotta para adquirir una.</string>
<string name="imguserLoadingMsg">Cargando imágenes de los alumnos. Por favor espere.</string>
<string name="imguserLoadingErrMsg">Imagen con formato no válido.</string>
......
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">8px</dimen>
<dimen name="activity_vertical_margin">8px</dimen>
<dimen name="small_padding">4px</dimen>
<dimen name="picto_grid_spacing">1px</dimen>
<dimen name="picto_border_width">2px</dimen>
<dimen name="picto_padding">1px</dimen>
<dimen name="picto_normal_height">90px</dimen>
<dimen name="picto_normal_width">90px</dimen>
<dimen name="tape_normal_height">100px</dimen>
<dimen name="picto_big_height">115px</dimen>
<dimen name="picto_big_width">115px</dimen>
<dimen name="tape_big_height">125px</dimen>
<dimen name="picto_session_height">75px</dimen>
<dimen name="picto_session_width">75px</dimen>
</resources>
<resources>
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen name="activity_horizontal_margin">64dp</dimen>
</resources>
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">8px</dimen>
<dimen name="activity_vertical_margin">8px</dimen>
<dimen name="small_padding">4px</dimen>
<dimen name="picto_grid_spacing">2px</dimen>
<dimen name="picto_border_width">1px</dimen>
<dimen name="picto_padding">1px</dimen>
<dimen name="picto_normal_height">90px</dimen>
<dimen name="picto_normal_width">90px</dimen>
<dimen name="tape_normal_height">100px</dimen>
<dimen name="picto_big_height">135px</dimen>
<dimen name="picto_big_width">135px</dimen>
<dimen name="tape_big_height">145px</dimen>
<dimen name="picto_session_height">84dp</dimen>
<dimen name="picto_session_width">84dp</dimen>
</resources>
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">8px</dimen>
<dimen name="activity_vertical_margin">8px</dimen>
<dimen name="small_padding">4px</dimen>
<dimen name="picto_grid_spacing">1px</dimen>
<dimen name="picto_border_width">1px</dimen>
<dimen name="picto_padding">1px</dimen>
<dimen name="picto_normal_height">90px</dimen>
<dimen name="picto_normal_width">90px</dimen>
<dimen name="tape_normal_height">100px</dimen>
<dimen name="picto_big_height">116px</dimen>
<dimen name="picto_big_width">116px</dimen>
<dimen name="tape_big_height">118px</dimen>
<dimen name="picto_session_height">75px</dimen>
<dimen name="picto_session_width">75px</dimen>
</resources>
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="small_padding">8dp</dimen>
<dimen name="picto_grid_spacing">4dp</dimen>
<dimen name="picto_border_width">1dp</dimen>
<dimen name="picto_padding">4dp</dimen>
<dimen name="picto_normal_height">75dp</dimen>
<dimen name="picto_normal_width">75dp</dimen>
<dimen name="tape_normal_height">90dp</dimen>
<dimen name="picto_big_height">90dp</dimen>
<dimen name="picto_big_width">90dp</dimen>
<dimen name="tape_big_height">110dp</dimen>
</resources>
......@@ -20,6 +20,7 @@
<string name="loginTitle">¿Quién eres?</string>
<string name="loginErrorTxt">Login</string>
<string name="loginErrorMsg">El usuario no existe o la contraseña indicada no es correcta. Inténtelo de nuevo.</string>
<string name="loginNoLicenseMsg">El usuario no tiene una licencia válida. Contacte con Yotta para adquirir una.</string>
<string name="userInetErrorMsg">Este usuario requiere conexión a internet para ser validado</string>
<string name="userLoadingTxt">Cargando</string>
<string name="userLoadingMsg">Cargando alumnos. Por favor espere.</string>
......
......@@ -62,6 +62,7 @@ import com.yottacode.pictogram.tabletlibrary.net.NetServiceTablet;
import com.yottacode.pictogram.tools.Img;
import com.yottacode.pictogram.tools.PCBcontext;
import com.yottacode.pictogram.tts.TTSHelper;
import com.yottacode.tools.GUITools;
import org.json.JSONException;
import org.json.JSONObject;
......@@ -126,7 +127,7 @@ public class PictogramActivity extends Activity implements VocabularyTalk.iVocab
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
blockNotificationBar();
// blockNotificationBar();
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(PCBcontext.getPcbdb().getCurrentUser().is_picto_size_big() ? R.layout.activity_pictogram_big : R.layout.activity_pictogram);
......@@ -144,8 +145,12 @@ public class PictogramActivity extends Activity implements VocabularyTalk.iVocab
@Override
public void action(action action, int picto_cat, int picto_id) {
Log.i(this.getClass().getCanonicalName(), action + " from " + picto_cat + "," + picto_id + " catched");
Picto picto = vocabulary.get_picto(picto_cat, picto_id);
PictogramActivity.this.execHighligthFeeback(picto, true);
if (action==ActionTalk.iActionListener.action.show) {
}
else {
Picto picto = vocabulary.get_picto(picto_cat, picto_id);
PictogramActivity.this.execHighligthFeeback(picto, true);
}
}
});
this.vocabulary.setImgDownloaderListener(new ImgDownloader.iImgDownloaderListener() {
......@@ -974,6 +979,7 @@ public class PictogramActivity extends Activity implements VocabularyTalk.iVocab
}
PictogramActivity.this.finish();
if (SessionActivity.session!=null) SessionActivity.session.finish();
PCBcontext.getNetService().restart_app(serialActivity, false);
}
return false;
......@@ -1050,7 +1056,8 @@ public class PictogramActivity extends Activity implements VocabularyTalk.iVocab
public void saved(Picto localPicto) {
PictogramActivity.this.refresh();
try {
new PictoUploader(localPicto).upload(PictogramActivity.this);
if (PCBcontext.is_user_online())
new PictoUploader(localPicto).upload(PictogramActivity.this);
} catch (IOException e) {
Log.e(Vocabulary.class.getCanonicalName(), e.getMessage());
}
......@@ -1127,9 +1134,14 @@ public class PictogramActivity extends Activity implements VocabularyTalk.iVocab
case MotionEvent.ACTION_MOVE:
if (firstTouchX > event.getX()+100) {
Intent sessionActivity = new Intent(this, SessionActivity.class);
sessionActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(sessionActivity);
if (!PCBcontext.getNetService().online())
GUITools.show_alert(this,R.string.pictogram_offline);
else {
Intent sessionActivity = new Intent(this, SessionActivity.class);
sessionActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(sessionActivity);
overridePendingTransition(R.anim.leftin, R.anim.leftout);
}
}
break;
case MotionEvent.ACTION_UP:
......
......@@ -4,7 +4,6 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
......@@ -71,7 +70,7 @@ public class SerialActivity extends Activity {
//Rellenar la lista con solo usuarios supervisor
if(!users.isEmpty()){
for(User user: users){
if(user.is_supervisor() && !idUsers.contains(new Integer(user.get_id_sup()))) {
if(user.is_supervisor() && !idUsers.contains(user.get_id_sup())) {
supUsers.add(user);
idUsers.add(user.get_id_sup());
}
......@@ -85,7 +84,11 @@ public class SerialActivity extends Activity {
listaSup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.i(this.getClass().getCanonicalName(),"Login as "+supUsers.elementAt(position).get_email_sup());
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("username", supUsers.elementAt(position).get_email_sup());
editor.putString("password", supUsers.elementAt(position).get_pwd_sup());
editor.commit();
new UserLogin().login(supUsers.elementAt(position).get_email_sup(),
supUsers.elementAt(position).get_pwd_sup(),SerialActivity.this, PictogramActivity.class, LoginActivity.class);
}
......@@ -114,7 +117,11 @@ public class SerialActivity extends Activity {
listaStu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.i(this.getClass().getCanonicalName(),"Login as "+stuUsers.elementAt(position).get_nickname_stu());
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("username", stuUsers.elementAt(position).get_name_stu());
editor.putString("password", stuUsers.elementAt(position).get_pwd_stu());
editor.commit();
new UserLogin().login(stuUsers.elementAt(position).get_nickname_stu(),
stuUsers.elementAt(position).get_pwd_stu(),SerialActivity.this, PictogramActivity.class, LoginActivity.class);
}
......@@ -124,6 +131,7 @@ public class SerialActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(this.getClass().getCanonicalName(),"Creating serial activity");
PCBcontext.init(this, new NetServiceTablet());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_serial);
......@@ -139,46 +147,6 @@ public class SerialActivity extends Activity {
stuList = (LinearLayout) findViewById(R.id.stuLay);
supList = (LinearLayout) findViewById(R.id.supLay);
mSerialViewMail.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view,boolean hasFocus) {
if(hasFocus){
if(imm.isActive(view)) {
stuList.setVisibility(View.INVISIBLE);
supList.setVisibility(View.INVISIBLE);
}else{
stuList.setVisibility(View.VISIBLE);
supList.setVisibility(View.VISIBLE);
}
}
}
});
mSerialViewMail.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
stuList.setVisibility(View.INVISIBLE);
supList.setVisibility(View.INVISIBLE);
}
});
mSerialViewPass.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view,boolean hasFocus) {
if(hasFocus) {
if (imm.isActive(view)) {
stuList.setVisibility(View.INVISIBLE);
supList.setVisibility(View.INVISIBLE);
} else {
stuList.setVisibility(View.VISIBLE);
supList.setVisibility(View.VISIBLE);
}
}
}
});
Button mEntrarButton = (Button) findViewById(R.id.entrar_button);
mEntrarButton.setOnClickListener(new OnClickListener() {
......@@ -202,6 +170,8 @@ public class SerialActivity extends Activity {
@Override
public void onStart() {
Vector<User> users;
Log.e(this.getClass().getCanonicalName(),"Starting serial activity");
if (!PCBcontext.init()) PCBcontext.init(this, new NetServiceTablet());
String default_user[] = loginUserPolicy();
String username = default_user[0];
String password = default_user[1];
......@@ -210,8 +180,7 @@ public class SerialActivity extends Activity {
mSerialViewMail.setText(username);
mSerialViewPass.setText(password);
// Escribo el último valor indicado de username
mSerialViewMail.setText(username);
if (!username.equals("") && !password.equals("") && !getIntent().getBooleanExtra("resetPrevUser", true))
new UserLogin().login(username, password, SerialActivity.this, PictogramActivity.class, LoginActivity.class);
......@@ -226,19 +195,6 @@ public class SerialActivity extends Activity {
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks whether a hardware keyboard is available
if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) {
stuList.setVisibility(View.INVISIBLE);
supList.setVisibility(View.INVISIBLE);
} else if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_YES) {
stuList.setVisibility(View.VISIBLE);
supList.setVisibility(View.VISIBLE);
}
}
}
......@@ -14,7 +14,6 @@ import android.widget.AdapterView;
import android.widget.GridView;
import com.yottacode.net.RestapiWrapper;
import com.yottacode.net.iRestapiListener;
import com.yottacode.pictogram.dao.User;
import com.yottacode.pictogram.net.ImgDownloader;
import com.yottacode.pictogram.tabletlibrary.R;
......@@ -207,9 +206,9 @@ public class StudentFragmentGrid extends Fragment{
String operation = "sup/" + sup_id + "/students";
progressDialog= ProgressDialog.show(getActivity(), getString(R.string.userLoadingTxt),
getString(R.string.userLoadingTxt), false, false);
wrapper.ask(operation, new iRestapiListener() {
wrapper.ask(operation, new RestapiWrapper.iRestapiListener() {
@Override
public void error(Exception e) {
public void error(RestapiWrapper.HTTPException e) {
Log.e(this.getClass().getName(), " Server restapi error: " + e.getLocalizedMessage());
if (progressDialog.isShowing()) progressDialog.dismiss();
GUITools.show_alert(getActivity(), R.string.loginErrorTxt, getString(R.string.serverError), new GUITools.iOKListener() {
......
......@@ -9,6 +9,7 @@ import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.yottacode.pictogram.dao.Picto;
import com.yottacode.pictogram.tools.PCBcontext;
import com.yottacode.pictogram.tts.TTSHelper;
import java.util.Iterator;
......@@ -65,7 +66,7 @@ public class TapeAdapter extends BaseAdapter {
// ELIMINAR TODOS LOS ITEMS DEL ADAPTADOR
public void endPlay(){
pictoLinkedList.clear();
if (PCBcontext.getPcbdb().getCurrentUser().delete_tape_after_delivery()) pictoLinkedList.clear();
play=false;
}
......
......@@ -15,6 +15,6 @@ public class customViewGroup extends ViewGroup {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i(this.getClass().getCanonicalName(), "**********Intercepted");
return true;
return false;
}
}
......@@ -14,7 +14,7 @@ import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.yottacode.pictogram.net.SessionWrapper;
import com.yottacode.pictogram.tabletlibrary.net.SessionWrapper;
import com.yottacode.pictogram.tabletlibrary.R;
import com.yottacode.pictogram.tools.PCBcontext;
import com.yottacode.tools.GUITools;
......@@ -23,6 +23,8 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Hashtable;
/**
* StudentFragmentGrid implements the gridview with the students
*
......@@ -44,6 +46,7 @@ public class ListInstructionsFragment extends Fragment{
int methodPosition;
int instructionPosition;
iListInstructionsFragment listener;
Hashtable<String, Integer> instructionsID;
@Override
......@@ -70,7 +73,7 @@ public class ListInstructionsFragment extends Fragment{
}
private void setMethods() {
if (this.methods == null || methods.length()==0) {
new SessionWrapper(new SessionWrapper.iSessionWrapper() {
SessionWrapper.getMethods(new SessionWrapper.iMethodWrapper() {
@Override
public void methods(JSONArray methods) {
if (methods.length()==0) {
......@@ -91,8 +94,7 @@ public class ListInstructionsFragment extends Fragment{
progressDialog.dismiss();
GUITools.show_alert(PCBcontext.getContext(), R.string.session_error, error);
}
}).getMethods();
progressDialog = ProgressDialog.show(getActivity(), getString(R.string.session_instruction), getString(R.string.session_loading));
});
}
else
initAdapters();
......@@ -101,6 +103,8 @@ public class ListInstructionsFragment extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_instructions_session, container, false);
progressDialog = ProgressDialog.show(getActivity(), getString(R.string.session_instruction), getString(R.string.session_loading));
checkStudent();
initMethods(view);
initInstructions(view);
setMethods();
......@@ -108,6 +112,43 @@ public class ListInstructionsFragment extends Fragment{
instructionPosition=-1;
return view;
}
private void checkStudent() {
SessionWrapper.validateStudent(new SessionWrapper.iValidateStudent() {
@Override
public void validLicense(boolean valid_license) {
if (!valid_license) {
GUITools.show_alert(ListInstructionsFragment.this.getContext(), R.string.loginNoLicenseMsg, getString(R.string.server), new GUITools.iOKListener() {
@Override
public void ok() {
ListInstructionsFragment.this.getActivity().finish();
}
});
}
}
@Override
public void lastTryOpen(boolean exists) {
if (exists) {
GUITools.show_alert(ListInstructionsFragment.this.getContext(), R.string.session_notclosed, getString(R.string.server), new GUITools.iOKListener() {
@Override
public void ok() {
ListInstructionsFragment.this.getActivity().finish();
}
});
}
}
@Override
public void error(String message) {
GUITools.show_alert(ListInstructionsFragment.this.getContext(), R.string.session_error, message,new GUITools.iOKListener() {
@Override
public void ok() {
ListInstructionsFragment.this.getActivity().finish();
}
});
}
});
}
private void initMethods(View view) {
this.listview_methods = (ListView) view.findViewById(R.id.methodsListView);
this.listview_methods.setOnItemClickListener(new AdapterView.OnItemClickListener() {
......@@ -118,9 +159,14 @@ public class ListInstructionsFragment extends Fragment{
adapter.clear();
try {
JSONArray instructions = methods.getJSONObject(pos).getJSONArray("instructions");
if (instructionsID==null)
instructionsID=new Hashtable(instructions.length());
else instructionsID.clear();
for (int i = 0; i < instructions.length(); i++) {
JSONObject instruction = instructions.getJSONObject(i);
adapter.add(instruction.getString("name"));
instructionsID.put(instruction.getString("name"),instruction.getInt("id"));
}
} catch (JSONException e) {
e.printStackTrace();
......@@ -138,7 +184,7 @@ public class ListInstructionsFragment extends Fragment{
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = super.getView(position, convertView, parent);
if (ListInstructionsFragment.this.methodPosition == position)
itemView.setBackgroundColor(Color.BLUE);
itemView.setBackgroundColor(Color.LTGRAY);
else
itemView.setBackgroundColor(Color.TRANSPARENT);
return itemView;
......@@ -154,7 +200,8 @@ public class ListInstructionsFragment extends Fragment{
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
ListInstructionsFragment.this.instructionPosition = pos;
((ArrayAdapter<String>) listview_instructions.getAdapter()).notifyDataSetChanged();
listener.instruction_selected(instructionPosition,(String)listview_instructions.getAdapter().getItem(instructionPosition));
int instructionID=ListInstructionsFragment.this.instructionsID.get((String)listview_instructions.getAdapter().getItem(instructionPosition));
listener.instruction_selected(instructionID,(String)listview_instructions.getAdapter().getItem(instructionPosition));
}
});
......@@ -163,7 +210,7 @@ public class ListInstructionsFragment extends Fragment{
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = super.getView(position, convertView, parent);
if (ListInstructionsFragment.this.instructionPosition== position)
itemView.setBackgroundColor(Color.BLUE);
itemView.setBackgroundColor(Color.LTGRAY);
else
itemView.setBackgroundColor(Color.TRANSPARENT);
return itemView;
......
......@@ -32,12 +32,15 @@ class PictoAdapter extends BaseAdapter {
this.currentMsg = currentMsg;
}
public static class Item {
Bitmap img;
String secs;
StringBuilder sentence;
public Item(Bitmap img, String secs) {
this.img=img;
this.secs=secs;
this.sentence=new StringBuilder("");
}
Bitmap getImg() {
return img;
......@@ -45,15 +48,16 @@ class PictoAdapter extends BaseAdapter {
String getTime() {
return secs;
}
public void setImg(Bitmap currmsg) {
public String getMsg() { return sentence.toString();}
public void setImg(Bitmap currmsg, String word) {
this.img=currmsg;
sentence.append(" "+word);
}
}
Context context;
Vector<Item> msg;
int currentMsg=0;
private int currentMsg=0;
final long base_time=new Date().getTime();
private static LayoutInflater inflater = null;
......@@ -62,7 +66,6 @@ public PictoAdapter(Context context) {
this.context = context;
msg=new Vector<>(3);
newMsg();
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
......@@ -107,47 +110,51 @@ public long getItemId(int position) {
return vi;
}
public void addItem(Bitmap bmp) {
Item item=this.msg.get(currentMsg);
public void addItem(Bitmap bmp,String text) {
Item item=this.msg.get(this.msg.size()-1);
Bitmap oldmsg=item.getImg();
// bmp=new BitmapTools(bmp).resize(85,85).get();
bmp=set_text(context,bmp,getTimeDiff(new Date().getTime()));
Bitmap currmsg=combineImages(oldmsg,bmp);
item.setImg(currmsg);
item.setImg(currmsg,text);
}
public void evaluateItem(Bitmap bmp, String evaluation,int position) {
Item item=this.msg.get(position);
Bitmap oldmsg=item.getImg();
float width =context.getResources().getDimension(R.dimen.picto_session_width);
float height = context.getResources().getDimension(R.dimen.picto_session_height);
bmp=new BitmapTools(bmp).resize((int)width ,(int)height).get();
bmp=set_text(context,bmp,getTimeDiff(new Date().getTime()));
Bitmap currmsg=this.currentMsg==this.msg.size()-1 ? combineImages(oldmsg,bmp) : updateImage(oldmsg,bmp);
item.setImg(currmsg,": "+evaluation);
}
public void newMsg() {
public int newMsg() {
Bitmap bmp=BitmapFactory.decodeResource(context.getResources(),
R.drawable.application_online);
bmp=new BitmapTools(bmp).resize(75,75).get();
float width =context.getResources().getDimension(R.dimen.picto_session_width);
float height = context.getResources().getDimension(R.dimen.picto_session_height);
bmp=new BitmapTools(bmp).resize((int)width,(int)height).get();
Calendar calendar = GregorianCalendar.getInstance(); // creates a new calendar instance
calendar.setTime(new Date()); // assigns calendar to given date
String time= calendar.get(Calendar.HOUR)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND);
String time= calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND);
bmp=set_text(context,bmp,time);
if (this.currentMsg==this.msg.size()-1 || this.msg.size()==0) {
this.currentMsg = this.msg.size();
msg.add(new Item(bmp, time));
}
else {
this.currentMsg = this.msg.size() - 1;
notifyDataSetChanged();
}
this.currentMsg = this.msg.size();
msg.add(new Item(bmp, time));
return msg.size()-1;
}
private Bitmap combineImages(Bitmap c, Bitmap s) { // can add a 3rd parameter 'String loc' if you want to save the new image - left some code to do that at the bottom
private Bitmap combineImages(Bitmap c, Bitmap s) {
Bitmap cs = null;
int width, height = 0;
if(c.getWidth() > s.getWidth()) {
width = c.getWidth() + s.getWidth();
height = c.getHeight();
} else {
width = s.getWidth() + s.getWidth();
height = c.getHeight();
}
width = c.getWidth() + s.getWidth();
height = c.getHeight();
cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
......@@ -160,29 +167,45 @@ public long getItemId(int position) {
return cs;
}
static Bitmap set_text(Context context,Bitmap bitmap,String texto) {
private Bitmap updateImage(Bitmap c, Bitmap s) {
Bitmap cs = null;
int width= c.getWidth(), height= c.getHeight();
int cutwidth=c.getWidth()-s.getWidth();
cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas comboImage = new Canvas(cs);
comboImage.drawBitmap(Bitmap.createBitmap(c,0,0,cutwidth,height), 0f, 0f, null);
comboImage.drawBitmap(s, c.getWidth()-s.getWidth(), 0f, null);
return cs;
}
static Bitmap set_text(Context context,Bitmap param_bitmap,String texto) {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
int width = bitmap.getWidth(); //Ancho original
int height = bitmap.getHeight(); //Alto original
float width = param_bitmap.getWidth();
float height=param_bitmap.getHeight();
android.graphics.Bitmap.Config bitmapConfig = param_bitmap.getConfig();
if (bitmapConfig == null) {
bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
}
android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
if (bitmapConfig == null) {
bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
}
Bitmap bitmap = param_bitmap.copy(bitmapConfig, true);
Canvas canvas = new Canvas(bitmap);
bitmap = bitmap.copy(bitmapConfig, true);
Canvas canvas = new Canvas(bitmap);
Bitmap bm = Bitmap.createScaledBitmap(bitmap, (int)Math.round(0.9*width), (int)Math.round(0.9*height), false);
Bitmap bm = Bitmap.createScaledBitmap(bitmap, (int)Math.round(0.8*width), (int)Math.round(0.8*height), false);
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); //Poner en blanco el bitmap original para dibujar encima
canvas.drawBitmap(bm, 0, 0, paint);
TextView textView = new TextView(context);
textView.layout(0, 50, 100, 100);
textView.layout(0, 20, 100, 100);
textView.setPadding(0, 0, 0, 0);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 13);
textView.setTextColor(Color.BLACK);
textView.setBackgroundColor(Color.TRANSPARENT);
textView.setBackgroundColor(Color.LTGRAY);
textView.setWidth(100);
textView.setGravity(Gravity.CENTER_HORIZONTAL);
textView.setMaxLines(1);
......@@ -194,5 +217,11 @@ public long getItemId(int position) {
return bitmap;
}
public int getCurrentPosition() {
return currentMsg;
}
public String getCurrentMsgText() {
return this.getItem(currentMsg).getMsg();
}
}
......@@ -3,74 +3,50 @@ package com.yottacode.pictogram.tabletlibrary.gui.session;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import com.yottacode.pictogram.dao.Picto;
import com.yottacode.pictogram.net.websockets.ActionTalk;
import com.yottacode.pictogram.tabletlibrary.R;
import com.yottacode.pictogram.tools.PCBcontext;
import com.yottacode.tools.BitmapTools;
import java.io.IOException;
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link SessionFragment.OnSessionListener } interface
* to handle interaction events.
* Use the {@link SessionFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class SessionFragment extends Fragment implements ActionTalk.iActionListener {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
interface iSessionFragment {
public void newMsg(int msg_pos);
public void selectedMsg(int msg_pos);
public void play_msg(int msg_pos);
}
private iSessionFragment mListener=null;
ListView list_pictomsg;
PictoAdapter adapter_pictomsg;
private OnSessionListener mListener=null;
private boolean paused=false;
public SessionFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment SessionFragment.
*/
// TODO: Rename and change types and number of parameters
public static SessionFragment newInstance(String param1, String param2) {
SessionFragment fragment = new SessionFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
setRetainInstance(true);
}
@Override
......@@ -85,9 +61,11 @@ public class SessionFragment extends Fragment implements ActionTalk.iActionListe
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
((PictoAdapter)list_pictomsg.getAdapter()).setCurrentMsg(position);
mListener.selectedMsg(position);
((PictoAdapter)list_pictomsg.getAdapter()).notifyDataSetChanged();
}
});
mListener.newMsg(this.adapter_pictomsg.getCount());
return view;
}
......@@ -98,73 +76,90 @@ public class SessionFragment extends Fragment implements ActionTalk.iActionListe
public void onAttach(Activity context) {
super.onAttach(context);
if ( mListener==null)
if (context instanceof OnSessionListener) {
mListener = (OnSessionListener ) context;
PCBcontext.getVocabulary().addActionTalkListener(this);
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
if (context instanceof iSessionFragment ) {
mListener = (iSessionFragment) context;
PCBcontext.getVocabulary().addActionTalkListener(this);
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if ( mListener==null)
if (context instanceof OnSessionListener ) {
mListener = (OnSessionListener ) context;
PCBcontext.getVocabulary().addActionTalkListener(this);
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
if (context instanceof iSessionFragment ) {
mListener = (iSessionFragment) context;
PCBcontext.getVocabulary().addActionTalkListener(this);
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
PCBcontext.getVocabulary().removeActionTalkListener(this);
mListener = null;
}
@Override
public void action(action action, int picto_cat, int picto_id) {
Log.e(this.getClass().getCanonicalName(),"ACTION VOC");
try {
Bitmap bmp=PCBcontext.getVocabulary().get_picto(picto_cat,picto_id).get_bitmap(getContext());
this.adapter_pictomsg.addItem(bmp);
getActivity().runOnUiThread(new Runnable() {
public void run() {
adapter_pictomsg.notifyDataSetChanged();
}});
} catch (IOException e) {
e.printStackTrace();
}
if (action==ActionTalk.iActionListener.action.show) {
if (!paused) {
mListener.play_msg(this.adapter_pictomsg.getCount()-1);
mListener.newMsg(this.adapter_pictomsg.getCount());
}
} else try {
Picto picto=PCBcontext.getVocabulary().get_picto(picto_cat,picto_id);
Bitmap bmp=picto.get_bitmap(getContext());
if (paused) {
bmp=bmp.copy(bmp.getConfig(),true);
new BitmapTools(bmp).paintPause();
}
this.adapter_pictomsg.addItem(bmp,picto.get_translation());
getActivity().runOnUiThread(new Runnable() {
public void run() {
adapter_pictomsg.notifyDataSetChanged();
}});
} catch (IOException e) {
e.printStackTrace();
}
}
public void newMsg(Bitmap bmp) {
Log.e(this.getClass().getCanonicalName(),"ACTION VOC");
this.adapter_pictomsg.addItem(bmp);
this.adapter_pictomsg.newMsg();
public int newMsg() {
int newmsg_position=this.adapter_pictomsg.newMsg();
getActivity().runOnUiThread(new Runnable() {
public void run() {
adapter_pictomsg.notifyDataSetChanged();
}});
return newmsg_position;
}
public void evaluateMsg(Bitmap bmp, String evaluation,int position) {
this.adapter_pictomsg.evaluateItem(bmp, evaluation,position);
getActivity().runOnUiThread(new Runnable() {
public void run() {
adapter_pictomsg.notifyDataSetChanged();
}});
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnSessionListener {
// TODO: Update argument type and name
void onSessionInteraction(Uri uri);
public void paused(boolean isChecked) {
this.paused=isChecked;
}
public int get_current_msg_pos() {
return this.adapter_pictomsg.getCurrentPosition();
}
public String get_current_msg_text() {
return this.adapter_pictomsg.getCurrentMsgText();
}
public int get_last_msg_pos() {
return adapter_pictomsg.getCount()-1;
}
}
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:duration="500"
android:fromXDelta="100%p"
android:toXDelta="0"
android:interpolator="@android:anim/linear_interpolator" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:duration="500"
android:fromXDelta="0"
android:toXDelta="-100%p"
android:interpolator="@android:anim/linear_interpolator" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:duration="500"
android:fromXDelta="100%p"
android:toXDelta="0"
android:interpolator="@android:anim/linear_interpolator" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:duration="500"
android:fromXDelta="0%"
android:toXDelta="-100%"
android:fromYDelta="0%"
android:toYDelta="0%"
android:interpolator="@android:anim/linear_interpolator" />
</set>
......@@ -88,7 +88,8 @@
android:textOff="||"
android:textOn="||"
android:layout_toLeftOf="@+id/sessionOnOffBtn"
android:textColorLink="@color/darkgreen" />
android:textColorLink="@color/darkgreen"
android:layout_marginRight="10px" />
<ToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......@@ -118,7 +119,7 @@
android:id="@+id/sessionFragmentLayout"
android:layout_below="@+id/view"
android:layout_alignParentEnd="true"
android:layout_height="300dp">
android:layout_height="310dp">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
......@@ -136,6 +137,7 @@
android:layout_alignParentEnd="true"
android:layout_marginBottom="16dp" />
<LinearLayout
android:id="@+id/view_session_buttons0"
android:layout_below="@+id/view_as2"
android:orientation="horizontal"
android:layout_width="wrap_content"
......@@ -150,8 +152,7 @@
android:layout_below="@+id/view_as2"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="84dp"
>
android:layout_height="84dp">
<Button style="@style/sessionBtn"
android:id="@+id/btn_correct"
......@@ -170,6 +171,10 @@
android:id="@+id/btn_supervised"
android:background="@drawable/session_supervised"
/>
<Button style="@style/sessionBtn"
android:id="@+id/btn_model"
android:background="@drawable/session_model"
/>
<Button style="@style/sessionBtn"
android:id="@+id/btn_discarded"
......@@ -179,12 +184,32 @@
</LinearLayout>
</LinearLayout>
<ScrollView
android:id="@+id/SCROLLER_ID"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:layout_toLeftOf="@+id/imageView3"
android:layout_toRightOf="@+id/view_session_buttons0"
android:layout_below="@+id/view_as2"
android:layout_alignBottom="@+id/imageView3"
android:layout_alignTop="@+id/imageView3"
android:fillViewport="true">
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:ems="12"
android:id="@+id/session_serverlog"
android:layout_weight="1"
android:background="@color/common_google_signin_btn_text_light_disabled" />
</ScrollView>
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
app:srcCompat="@drawable/pictogram_logo"
android:id="@+id/imageView3"
android:maxLines = "100"
android:background="@drawable/pictogram_logo"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp"
......
......@@ -28,7 +28,7 @@
android:layout_height="match_parent"
android:layout_weight="4">
<TextView
android:text="@string/session_steps"
android:text="@string/session_method"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="normal|bold"
......
......@@ -8,7 +8,7 @@
<ListView
android:id="@+id/session_pictomsg_list"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|start">
</ListView>
......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_width="@dimen/picto_big_width"
android:layout_height="@dimen/picto_big_height"
android:gravity="center_vertical|center|center_horizontal"
android:id="@+id/picto_grid_item_layout_wrapper_big"
android:background="@drawable/picto_grid_item_border"
......@@ -9,7 +9,7 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="@dimen/picto_big_height"
android:layout_height="match_parent"
android:id="@+id/picto_grid_item_layout_big"
android:background="@color/picto_default_background"
>
......
......@@ -4,11 +4,33 @@
<item name="maxInTape_big" type="integer">6</item>
<!---session-->
<string name="session_instruction">"Instrucción"</string>
<string name="session_steps">"Fases"</string>
<string name="session_header">Seleccion instrucción y fase</string>
<string name="session_error">Error recuperando sesiones del servidor</string>
<string name="session_method">Method</string>
<string name="session_instruction">Instruction</string>
<string name="session_header">Seleccion de método e instrucción</string>
<string name="session_error">Error de conexión</string>
<string name="session_noinstructions">Alumno sin ninguna instrucción asignada. Por favor, asigne al menos una instrucción al alumno desde Pictogram Web</string>
<string name="session_loading">Downloading instructions</string>
<string name="session_empty">Student without any method</string>
<string name="session_notclosed">Last session was not closed. Please close from </string>
<string name="session_closed_ok">Session upload ok</string>
<string name="session_closed_fail">Session not uploaded. Please, try it from</string>
<string name="session_pause_error">Pause session failed</string>
<string name="session_log_startingsession">iniciando sesión</string>
<string name="session_log_startsession">sesión iniciada</string>
<string name="session_log_closingsession">cerrando sesión</string>
<string name="session_log_endingsession">finalizando sesión</string>
<string name="session_log_newtry">nuevo ensayo</string>
<string name="session_log_endtry">ensayo finalizado</string>
<string name="session_log_evaluatedtry">ensayo evaluado</string>
<string name="session_log_pausedtry">sesión en pausa</string>
<string name="session_log_continuedtry">sesión retomada</string>
<string name="session_eval_success">ok</string>
<string name="session_eval_fail">fail</string>
<string name="session_eval_spontaneous">spontaneous</string>
<string name="session_eval_supervised">supervised</string>
<string name="session_eval_guide">guided</string>
<string name="session_eval_model">modeled</string>
<string name="session_eval_notevuated">not evaluated</string>
<string name="session_eval_discarded">discarded</string>
</resources>
......@@ -4,11 +4,32 @@
<item name="maxInTape_big" type="integer">6</item>
<!---session-->
<string name="session_instruction">"Instrucción"</string>
<string name="session_steps">"Fases"</string>
<string name="session_header">Seleccion instrucción y fase</string>
<string name="session_error">Error recuperando sesiones del servidor</string>
<string name="session_method">Método</string>
<string name="session_insrtuction">Instrucción</string>
<string name="session_header">Seleccion de método e instrucción</string>
<string name="session_error">Error de conexión</string>
<string name="session_noinstructions">Alumno sin ninguna instrucción asignada. Por favor, asigne al menos una instrucción al alumno desde Pictogram Web</string>
<string name="session_loading">Desargando instrucciones</string>
<string name="session_empty">Este alumno no tiene ningún método asignado. Por favor asigne un método a este alumno en</string>
<string name="session_notclosed">Este alumno tiene una sesión abierta. Por favor cierre la sesión desde Pictogram Tablet en</string>
<string name="session_closed_ok">Sesión grabada correctamente. Hora</string>
<string name="session_closed_fail">Sesión no cerrada. Por favor cierre la sesión en el panel de control de Pictogram Tablet</string>
<string name="session_pause_error">Error pausando la sesión</string>
<string name="session_log_startingsession">iniciando sesión</string>
<string name="session_log_closingsession">cerrando sesión</string>
<string name="session_log_startsession">sesión iniciada</string>
<string name="session_log_endingsession">finalizando sesión</string>
<string name="session_log_newtry">nuevo ensayo</string>
<string name="session_log_endtry">ensayo finalizado</string>
<string name="session_log_evaluatedtry">ensayo evaluado</string>
<string name="session_log_pausedtry">sesión en pausa</string>
<string name="session_log_continuedtry">sesión retomada</string>
<string name="session_eval_success">correcto</string>
<string name="session_eval_fail">incorrecto</string>
<string name="session_eval_spontaneous">espontáneo</string>
<string name="session_eval_supervised">supervisado</string>
<string name="session_eval_guide">guiado</string>
<string name="session_eval_model">modelado</string>
<string name="session_eval_notevuated">no evaluado</string>
<string name="session_eval_discarded">inválido</string>
</resources>
......@@ -6,14 +6,33 @@
<item name="maxInTape_big" type="integer">6</item>
<!---session-->
<string name="session_instruction">"Instrucción"</string>
<string name="session_steps">"Fases"</string>
<string name="session_header">Select instrucion and step</string>
<string name="session_error">Error getting instructions from server</string>
<string name="session_method">Método</string>
<string name="session_instruction">Instrucción</string>
<string name="session_header">Select method and instruction</string>
<string name="session_error">Server Error </string>
<string name="session_noinstructions">Student without any instrucction assigment</string>
<string name="session_loading">Desargando instrucciones</string>
<string name="session_empty">Este alumno no tiene ningún método asignado. Por favor asigne un método a este alumno en</string>
<string name="session_notclosed">Este alumno tiene una sesión abierta. Por favor cierre la sesión en el panel de control de Pictogram Tablet</string>
<string name="session_closed_ok">Sesión grabada correctamente</string>
<string name="session_closed_fail">Sesión no cerrada. Por favor intente cerrarla desde</string>
<string name="session_pause_error">Error pausando la sesión</string>
<string name="session_log_startingsession">iniciando sesión</string>
<string name="session_log_closingsession">cerrando sesión</string>
<string name="session_log_startsession">sesión iniciada</string>
<string name="session_log_endingsession">finalizando sesión</string>
<string name="session_log_newtry">nuevo ensayo</string>
<string name="session_log_endtry">ensayo finalizado</string>
<string name="session_log_evaluatedtry">ensayo evaluado</string>
<string name="session_log_pausedtry">sesión en pausa</string>
<string name="session_log_continuedtry">sesión retomada</string>
<string name="session_eval_success">correcto</string>
<string name="session_eval_fail">incorrecto</string>
<string name="session_eval_spontaneous">espontáneo</string>
<string name="session_eval_supervised">supervisado</string>
<string name="session_eval_guide">guiado</string>
<string name="session_eval_model">modelado</string>
<string name="session_eval_notevuated">no evaluado</string>
<string name="session_eval_discarded">inválido</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources>
......@@ -73,14 +73,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
......@@ -89,6 +81,14 @@
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
......
......@@ -43,6 +43,13 @@
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavorDebug/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavorDebug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavorDebug/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/DefaultFlavor/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/DefaultFlavor/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/assets" type="java-test-resource" />
......@@ -51,13 +58,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/DefaultFlavor/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/DefaultFlavor/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavor/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavor/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavor/assets" type="java-resource" />
......@@ -106,14 +106,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
......@@ -122,6 +114,14 @@
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
......
......@@ -70,7 +70,7 @@
android:name="com.yottacode.pictogram.tabletlibrary.gui.session.SessionActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:launchMode="singleInstance"
android:screenOrientation="landscape" />
</application>
......
......@@ -88,7 +88,7 @@ public class KioskService extends Service {
private void restoreApp() {
// Restart activity
Intent i = new Intent(ctx, com.yottacode.pictogram.tabletlibrary.gui.PictogramActivity.class);
Intent i = new Intent(ctx, com.yottacode.pictogram.tabletlibrary.gui.SerialActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(i);
}
......
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Pictogram Tablet</string>
<string name="ilegal_user">There is not any supervisor named</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Pictogram Tablet</string>
<string name="ilegal_user"> No existe ningún supervisor </string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Pictogram Tablet</string>
<string name="ilegal_user">There is not any supervisor named</string>
</resources>
......@@ -88,7 +88,7 @@ module.exports.policies = {
therapists: ['tokenAuth'],
tutors: ['tokenAuth'],
link_supervisor: ['tokenAuth', 'isSupAdmin'],
pictos: ['tokenAuth', 'isSupervisorOfStudent'],
pictos: ['tokenAuth'],
methods: ['tokenAuth'],
lasttries: ['tokenAuth'],
tries: ['tokenAuth'],
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment