private int getTotalCount() {
   SQLiteDatabase db = app.getDB();
   Cursor cur = db.query(Common.Tables.INSTRUCTION, null, null, null, null, null, null);
   int result = cur.getCount();
   cur.close();
   return result;
 }
 public TaskManager(MobileStudyApplication app) {
   this.app = app;
   int cuurent_inst_id = app.getUserInfo().inst_id;
   Log.v("mark", "TaskManager created with user taskid:" + cuurent_inst_id);
   this.app.setInstructionCount(getTotalCount());
   nextInstruction(false, cuurent_inst_id);
 }
 private void postCorrectVerification() {
   switch (type) {
     case DATABASE:
       {
         SQLiteDatabase db = app.getDB();
         db.beginTransaction();
         ContentValues values = new ContentValues();
         Cursor cur = db.query(table, null, null, null, null, null, null);
         int index = cur.getColumnIndex("new");
         if (index >= 0) {
           values.put("new", 0);
           long result = db.update(table, values, "new = ?", new String[] {"1"});
           Log.v("mark", "postCorrectVerification set new to 0 result:" + result);
         }
         db.setTransactionSuccessful();
         db.endTransaction();
       }
       break;
     case RIGHTDRAWER:
       {
         Activity act = this.app.getCurrentActivity();
         if (act != null) {
           ((FrameActivity) act).clearRightPanel();
         }
       }
       break;
   }
   return;
 }
  public void nextInstruction(boolean isSucessful, int intented_nextId) {
    SQLiteDatabase db = app.getDB();
    db.beginTransaction();
    // deal with current Instruction
    if (current != null) {
      markCurrentInstructionState(
          db, current._id, isSucessful ? Instruction.COMPLETED : Instruction.SKIPPED);
      intented_nextId = current._id + 1;
    }
    Instruction nextInstruction = fetchNextInstruction(db, intented_nextId);
    if (nextInstruction != null) { // check has nextTask
      // check if in the same task
      if (current == null || current.task_id != nextInstruction.task_id) {
        // app.enterNewTask(current, nextInstruction);
        app.enterNewTask(nextInstruction.task_id);
      }
      boolean switchSegment = (current == null) ? false : (nextInstruction.seg_id > current.seg_id);

      current = nextInstruction;
      app.setUserInfomraiton(
          null, nextInstruction._id, nextInstruction.task_id, nextInstruction.seg_id);

      if (switchSegment) app.onChangeSegment();
      //			Log.v("mark", "nextInstruction id:" + nextInstruction);
    } else { // no more instruction
      app.enterNewTask(-1);
      // app.enterNewTask(current, null);
      current = null;
      Log.v("mark", "nextInstruction is null");
      app.onAllTaskFinished();
    }
    db.setTransactionSuccessful();
    db.endTransaction();
  }
 public void onVerification(final int event_obj, final String event) {
   boolean sucessful = false;
   if (current == null) return;
   if (!current.isSameTarget(event_obj, event)) {
     Log.v("mark", "onVerification, is not the targeted object");
     return;
   } else {
     Log.v("mark", "onVerification, is the targeted object");
   }
   String[] answer = retrieveAnswer(current.verif_src);
   Log.v("mark", "retrieved:" + Arrays.toString(answer));
   if (answer == null) {
     sucessful = false;
   } else {
     // String[] filteredAnswer = this.inputFilter(answer);
     sucessful = isCorrectAnswer(answer);
   }
   if (sucessful) {
     Activity act = app.getCurrentActivity();
     Log.v("mark", "onVerification: sucessful");
     this.nextInstruction(true);
     if (act instanceof FrameActivity) {
       ((FrameActivity) act).closeRightDrawer();
       ((FrameActivity) act).closeRightDrawer();
       ((FrameActivity) act).openLeftDrawer();
     }
     postCorrectVerification();
   } else {
     Log.v("mark", "onVerification: failure");
     postWrongVerfication();
     if (this.current.err_msg == null || this.current.err_msg.equals("null")) {
       return;
     }
     Toast toast =
         Toast.makeText(app.getApplicationContext(), this.current.err_msg, Toast.LENGTH_SHORT);
     toast.setGravity(Gravity.TOP, 0, 0);
     toast.show();
   }
 }
  private String[] retrieveAnswer(int type) {
    this.type = type;
    switch (type) {
      case PASS:
        {
          Log.v("mark", "retrieveAnswer all pass");
          return new String[] {};
        }
      case DATABASE:
        {
          Log.v("mark", "retrieveAnswer from databse");
          SQLiteDatabase db = app.getDB();
          ArrayList<String> result = new ArrayList<String>();
          db.beginTransaction();
          String toDepacket = current.verif_com;
          if (toDepacket == null) {
            Log.v("mark", "retrieveAnswer verif_com is null");
            return null;
          }
          /* table;col1,col2,...;selection;arg1,arg2; */
          parts = toDepacket.split(";");
          table = parts[0];
          columns = parts[1].equals("null") ? null : parts[1].split(",");
          selection = parts[2].equals("null") ? null : parts[2];
          args = selection == null ? null : parts[3].split(",");
          Log.v("mark", "" + toDepacket);
          Log.v("mark", "table:" + table);
          Log.v("mark", "columns:" + Arrays.toString(columns));
          Log.v("mark", "selection:" + selection);
          Log.v("mark", "args:" + Arrays.toString(args));
          Cursor cur = db.query(table, columns, selection, args, null, null, null);
          if (cur.moveToFirst()) {
            do {
              StringBuilder sb = new StringBuilder();
              for (int i = 0; i < columns.length; i++) {
                String columnName = columns[i];
                int index = cur.getColumnIndex(columnName);
                if (index < 0) {
                  Log.v("mark", "onVerification: columnName does not exist");
                } else {
                  sb.append(cur.getString(index));
                  if (i < columns.length - 1) {
                    sb.append("><");
                  }
                }
              }
              result.add(sb.toString());
            } while (cur.moveToNext());
            cur.close();
            db.setTransactionSuccessful();
            db.endTransaction();
            return result.toArray(new String[0]);
          } else {
            Log.v("mark", "retrieveAnswer cursor empty");
            cur.close();
            db.setTransactionSuccessful();
            db.endTransaction();
            return null;
          }
        }
      case RIGHTDRAWER:
        {
          Activity act = app.getCurrentActivity();
          Log.v("mark", "retrieveAnswer from rightdrawer:" + act);

          if (act instanceof FrameActivity) {
            return new String[] {((FrameActivity) act).retrieveAnswerOnRightPanel()};
          } else {
            return null;
          }
        }
      case TASPANEL:
        {
          Log.v("mark", "retrieveAnswer from taskpanel");
          Activity act = app.getCurrentActivity();
          if (act instanceof ExperimentActivity) {
            return new String[] {((ExperimentActivity) act).getTaskIconPattern()};
          }
          //			if (act instanceof TaskPanel) { return new String[] { ((TaskPanel.TaskPanelFragment)
          // act).getTaskIconPattern() }; }
          return null;
        }
      case ADDITIONALINFO:
        {
          Log.v("mark", "retrieveAnswer from addionalinfo");
          return new String[] {this.additionalInformation};
        }
      default:
        Log.v("mark", "onVerification: unidentified verif_src");
    }
    return null;
  }