package com.netease.nim.uikit;
import android.os.Handler;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.Observer;
import com.netease.nimlib.sdk.auth.AuthServiceObserver;
import com.netease.nimlib.sdk.auth.constant.LoginSyncStatus;
import java.util.ArrayList;
import java.util.List;
/**
* 登录
* Created by huangjun on 2015/10/9.
*/
public class LoginSyncDataStatusObserver {
private static final String TAG = LoginSyncDataStatusObserver.class.getSimpleName();
private static final int TIME_OUT_SECONDS = 10;
private Handler uiHandler;
private Runnable timeoutRunnable;
/**
* 状态
*/
private LoginSyncStatus syncStatus = LoginSyncStatus.NO_BEGIN;
/**
* 监听
*/
private List<Observer<Void>> observers = new ArrayList<>();
/**
* 注销时清除状态&监听
*/
public void reset() {
syncStatus = LoginSyncStatus.NO_BEGIN;
observers.clear();
}
/**
* 在App启动时向SDK注册登录后同步数据过程状态的通知
* 调用时机:主进程Application onCreate中
*/
public void registerLoginSyncDataStatus(boolean register) {
LogUtil.i(TAG, "observe login sync data completed event on Application create");
NIMClient.getService(AuthServiceObserver.class).observeLoginSyncDataStatus(loginSyncStatusObserver, register);
}
Observer<LoginSyncStatus> loginSyncStatusObserver = new Observer<LoginSyncStatus>() {
@Override
public void onEvent(LoginSyncStatus status) {
syncStatus = status;
if (status == LoginSyncStatus.BEGIN_SYNC) {
LogUtil.i(TAG, "login sync data begin");
} else if (status == LoginSyncStatus.SYNC_COMPLETED) {
LogUtil.i(TAG, "login sync data completed");
onLoginSyncDataCompleted(false);
}
}
};
/**
* 监听登录后同步数据完成事件,缓存构建完成后自动取消监听
* 调用时机:登录成功后
*
* @param observer 观察者
* @return 返回true表示数据同步已经完成或者不进行同步,返回false表示正在同步数据
*/
public boolean observeSyncDataCompletedEvent(Observer<Void> observer) {
if (syncStatus == LoginSyncStatus.NO_BEGIN || syncStatus == LoginSyncStatus.SYNC_COMPLETED) {
/*
* NO_BEGIN 如果登录后未开始同步数据,那么可能是自动登录的情况:
* PUSH进程已经登录同步数据完成了,此时UI进程启动后并不知道,这里直接视为同步完成
*/
return true;
}
// 正在同步
if (!observers.contains(observer)) {
observers.add(observer);
}
// 超时定时器
if (uiHandler == null) {
uiHandler = new Handler(NimUIKit.getContext().getMainLooper());
}
if (timeoutRunnable == null) {
timeoutRunnable = new Runnable() {
@Override
public void run() {
// 如果超时还处于开始同步的状态,模拟结束
if (syncStatus == LoginSyncStatus.BEGIN_SYNC) {
onLoginSyncDataCompleted(true);
}
}
};
}
uiHandler.removeCallbacks(timeoutRunnable);
uiHandler.postDelayed(timeoutRunnable, TIME_OUT_SECONDS * 1000);
return false;
}
/**
* 登录同步数据完成处理
*/
private void onLoginSyncDataCompleted(boolean timeout) {
LogUtil.i(TAG, "onLoginSyncDataCompleted, timeout=" + timeout);
// 移除超时任务(有可能完成包到来的时候,超时任务都还没创建)
if (timeoutRunnable != null) {
uiHandler.removeCallbacks(timeoutRunnable);
}
// 通知上层
for (Observer<Void> o : observers) {
o.onEvent(null);
}
// 重置状态
reset();
}
/**
* 单例
*/
public static LoginSyncDataStatusObserver getInstance() {
return InstanceHolder.instance;
}
static class InstanceHolder {
final static LoginSyncDataStatusObserver instance = new LoginSyncDataStatusObserver();
}
}