예제 #1
0
  // Visible for testing
  public void deleteExperiment(Experiment experiment2) {
    NotificationCreator nc = NotificationCreator.create(this);
    nc.timeoutNotificationsForExperiment(experiment2.getExperimentDAO().getId());

    createStopEvent(experiment2);

    experimentProviderUtil.deleteExperiment(experiment2.getId());
    if (ExperimentHelper.shouldWatchProcesses(experiment2.getExperimentDAO())) {
      BroadcastTriggerReceiver.initPollingAndLoggingPreference(this);
    }

    new AndroidEsmSignalStore(this)
        .deleteAllSignalsForSurvey(experiment2.getExperimentDAO().getId());

    reloadAdapter();
    startService(new Intent(this, BeeperService.class));
    startService(new Intent(this, ExperimentExpirationManagerService.class));
  }
  @Override
  public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
    if (running) {
      Log.i(PacoConstants.TAG, "Paco App Usage Poller.onStart() -- Already running");
      stopSelf();
      return;
    } else {
      Log.i(PacoConstants.TAG, "Paco App Usage Poller.onStart()");

      UsageStatsManager am = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
      final AppUsageEventsService usageEventsService =
          new AppUsageEventsService(
              am, BroadcastTriggerReceiver.getFrequency(getApplicationContext()));
      if (!usageEventsService.canGetStats()) {
        Log.i(PacoConstants.TAG, "no access to Usage Stats. Please turn on setting.");
        stopSelf();
        return;
      }

      final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
      final PowerManager.WakeLock wl =
          pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Paco App Usage Poller Service wakelock");
      wl.acquire();

      Runnable runnable =
          new Runnable() {
            public void run() {
              running = true;
              LollipopAppUsageMonitor lpcm = createAppUsageMonitor(usageEventsService);

              try {
                while (pm.isScreenOn()
                    && BroadcastTriggerReceiver.shouldWatchProcesses(getApplicationContext())) {
                  synchronized (this) {
                    try {
                      Log.i(
                          PacoConstants.TAG, "polling on: runnable instance = " + this.toString());
                      Log.i(PacoConstants.TAG, "==================================");
                      lpcm.detectUsageEvents();
                      int sleepTime =
                          1000; // BroadcastTriggerReceiver.getFrequency(LollipopProcessMonitorService.this) * 1000;
                      Log.i(PacoConstants.TAG, "sleepTime = " + sleepTime);
                      wait(sleepTime);
                    } catch (Exception e) {
                    }
                  }
                }
                if (!pm.isScreenOn()
                    && BroadcastTriggerReceiver.shouldWatchProcesses(getApplicationContext())) {
                  createScreenOffPacoEvents(getApplicationContext());
                }
                Log.i(
                    PacoConstants.TAG,
                    "polling stopping: instance = "
                        + LollipopProcessMonitorService.this.toString());
              } finally {
                wl.release();
                stopSelf();
                running = false;
              }
            }

            public LollipopAppUsageMonitor createAppUsageMonitor(
                final AppUsageEventsService usageEventsService) {
              ExperimentProviderUtil experimentProviderUtil =
                  new ExperimentProviderUtil(getApplicationContext());
              AppUsageTriggerHelper apmh = new AppUsageTriggerHelper(experimentProviderUtil);
              List<String> appOpenTasks = apmh.getAppStartTasksToWatch();
              List<String> appCloseTasks = apmh.getAppCloseTasksToWatch();
              List<Experiment> experimentsWatchingAppUsage =
                  apmh.initializeExperimentsWatchingAppUsage();

              AppUsageEventLogger pueb =
                  new AppUsageEventLogger(
                      getApplicationContext(), experimentsWatchingAppUsage, experimentProviderUtil);

              LollipopAppUsageMonitor lpcm =
                  new LollipopAppUsageMonitor(
                      appOpenTasks,
                      appCloseTasks,
                      getApplicationContext(),
                      usageEventsService,
                      pueb);
              return lpcm;
            }
          };
      (new Thread(runnable)).start();
    }
  }