/**
   * Logout the current user.
   *
   * @param activity the caller activity
   */
  public static void logout(Activity activity) {
    stopEventStream(activity);

    try {
      ShortcutBadger.setBadge(activity, 0);
    } catch (Exception e) {
    }

    // warn that the user logs out
    Collection<MXSession> sessions = Matrix.getMXSessions(activity);
    for (MXSession session : sessions) {
      // Publish to the server that we're now offline
      MyPresenceManager.getInstance(activity, session).advertiseOffline();
      MyPresenceManager.remove(session);
    }

    // clear the preferences
    PreferenceManager.getDefaultSharedPreferences(activity).edit().clear().commit();

    // clear credentials
    Matrix.getInstance(activity).clearSessions(activity, true);

    // reset the GCM
    Matrix.getInstance(activity).getSharedGcmRegistrationManager().reset();

    // reset the contacts
    PIDsRetriever.getIntance().reset();
    ContactsManager.reset();

    MXMediasCache.clearThumbnailsCache(activity);

    // go to login page
    activity.startActivity(new Intent(activity, LoginActivity.class));
    activity.finish();
  }
  public static void startEventStreamService(Context context) {
    // the events stream service is launched
    // either the application has never be launched
    // or the service has been killed on low memory
    if (EventStreamService.getInstance() == null) {
      ArrayList<String> matrixIds = new ArrayList<String>();
      Collection<MXSession> sessions =
          Matrix.getInstance(context.getApplicationContext()).getSessions();

      if ((null != sessions) && (sessions.size() > 0)) {
        Log.d(LOG_TAG, "restart EventStreamService");

        for (MXSession session : sessions) {
          Boolean isSessionReady = session.getDataHandler().getStore().isReady();

          if (!isSessionReady) {
            session.getDataHandler().getStore().open();
          }

          // session to activate
          matrixIds.add(session.getCredentials().userId);
        }

        Intent intent = new Intent(context, EventStreamService.class);
        intent.putExtra(
            EventStreamService.EXTRA_MATRIX_IDS, matrixIds.toArray(new String[matrixIds.size()]));
        intent.putExtra(
            EventStreamService.EXTRA_STREAM_ACTION,
            EventStreamService.StreamAction.START.ordinal());
        context.startService(intent);
      }
    }
  }
  /** refresh the profile thumbnail */
  private void refreshProfileThumbnail() {
    mThumbnailImageView.setImageResource(R.drawable.ic_contact_picture_holo_light);

    if (mMember.avatarUrl != null) {
      int size = getResources().getDimensionPixelSize(R.dimen.profile_avatar_size);
      Matrix.getInstance(this)
          .getMediasCache()
          .loadAvatarThumbnail(
              mSession.getHomeserverConfig(), mThumbnailImageView, mMember.avatarUrl, size);
    }
  }
  public static void logout(Activity activity, MXSession session, Boolean clearCredentials) {
    if (session.isActive()) {
      // stop the service
      EventStreamService eventStreamService = EventStreamService.getInstance();
      ArrayList<String> matrixIds = new ArrayList<String>();
      matrixIds.add(session.getMyUser().userId);
      eventStreamService.stopAccounts(matrixIds);

      // Publish to the server that we're now offline
      MyPresenceManager.getInstance(activity, session).advertiseOffline();
      MyPresenceManager.remove(session);

      // unregister from the GCM.
      Matrix.getInstance(activity)
          .getSharedGcmRegistrationManager()
          .unregisterSession(session, null);

      // clear credentials
      Matrix.getInstance(activity).clearSession(activity, session, clearCredentials);
    }
  }
  public static void goToOneToOneRoom(
      final MXSession aSession,
      final String otherUserId,
      final Activity fromActivity,
      final ApiCallback<Void> callback) {
    // sanity check
    if (null == otherUserId) {
      return;
    }

    // check first if the 1:1 room already exists
    MXSession session = (aSession == null) ? Matrix.getMXSession(fromActivity, null) : aSession;

    // no session is provided
    if (null == session) {
      // get the default one.
      session = Matrix.getInstance(fromActivity.getApplicationContext()).getDefaultSession();
    }

    // sanity check
    if ((null == session) || !session.isActive()) {
      return;
    }

    final MXSession fSession = session;

    // so, list the existing room, and search the 2 users room with this other users
    String roomId = null;
    Collection<Room> rooms = session.getDataHandler().getStore().getRooms();

    for (Room room : rooms) {
      Collection<RoomMember> members = room.getMembers();

      if (members.size() == 2) {
        for (RoomMember member : members) {
          if (member.getUserId().equals(otherUserId)) {
            roomId = room.getRoomId();
            break;
          }
        }
      }
    }

    // the room already exists -> switch to it
    if (null != roomId) {
      CommonActivityUtils.goToRoomPage(session, roomId, fromActivity, null);

      // everything is ok
      if (null != callback) {
        callback.onSuccess(null);
      }
    } else {
      session.createRoom(
          null,
          null,
          RoomState.VISIBILITY_PRIVATE,
          null,
          new SimpleApiCallback<String>(fromActivity) {

            @Override
            public void onSuccess(String roomId) {
              final Room room = fSession.getDataHandler().getRoom(roomId);

              room.invite(
                  otherUserId,
                  new SimpleApiCallback<Void>(this) {
                    @Override
                    public void onSuccess(Void info) {
                      CommonActivityUtils.goToRoomPage(
                          fSession, room.getRoomId(), fromActivity, null);

                      callback.onSuccess(null);
                    }

                    @Override
                    public void onMatrixError(MatrixError e) {
                      if (null != callback) {
                        callback.onMatrixError(e);
                      }
                    }

                    @Override
                    public void onNetworkError(Exception e) {
                      if (null != callback) {
                        callback.onNetworkError(e);
                      }
                    }

                    @Override
                    public void onUnexpectedError(Exception e) {
                      if (null != callback) {
                        callback.onUnexpectedError(e);
                      }
                    }
                  });
            }

            @Override
            public void onMatrixError(MatrixError e) {
              if (null != callback) {
                callback.onMatrixError(e);
              }
            }

            @Override
            public void onNetworkError(Exception e) {
              if (null != callback) {
                callback.onNetworkError(e);
              }
            }

            @Override
            public void onUnexpectedError(Exception e) {
              if (null != callback) {
                callback.onUnexpectedError(e);
              }
            }
          });
    }
  }
 public static void disconnect(Activity activity) {
   stopEventStream(activity);
   activity.finish();
   Matrix.getInstance(activity).mHasBeenDisconnected = true;
 }
 /**
  * Return the used medias cache. This method can be overridden to use another medias cache
  *
  * @return the used medias cache
  */
 public MXMediasCache getMXMediasCache() {
   return Matrix.getInstance(getActivity()).getMediasCache();
 }