private boolean isPushNotificationPingNeeded() {
      if (mLastPingDate == null) {
        // first startup
        return false;
      }

      Date now = new Date();
      if (DateTimeUtils.secondsBetween(now, mLastPingDate) >= DEFAULT_TIMEOUT) {
        mLastPingDate = now;
        return true;
      }
      return false;
    }
    @Override
    public void onTrimMemory(final int level) {
      if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
        // We're in the Background
        mIsInBackground = true;
        String lastActivityString = AppPrefs.getLastActivityStr();
        ActivityId lastActivity = ActivityId.getActivityIdFromName(lastActivityString);
        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put("last_visible_screen", lastActivity.toString());
        if (mApplicationOpenedDate != null) {
          Date now = new Date();
          properties.put("time_in_app", DateTimeUtils.secondsBetween(now, mApplicationOpenedDate));
          mApplicationOpenedDate = null;
        }
        AnalyticsTracker.track(AnalyticsTracker.Stat.APPLICATION_CLOSED, properties);
        AnalyticsTracker.endSession(false);
        onAppGoesToBackground();
      } else {
        mIsInBackground = false;
      }

      boolean evictBitmaps = false;
      switch (level) {
        case TRIM_MEMORY_COMPLETE:
        case TRIM_MEMORY_MODERATE:
        case TRIM_MEMORY_RUNNING_MODERATE:
        case TRIM_MEMORY_RUNNING_CRITICAL:
        case TRIM_MEMORY_RUNNING_LOW:
          evictBitmaps = true;
          break;
        default:
          break;
      }

      if (evictBitmaps && mBitmapCache != null) {
        mBitmapCache.evictAll();
      }
    }