package com.yydcdut.note.presenters.setting.impl;
import android.content.Context;
import android.hardware.Camera;
import com.yydcdut.note.R;
import com.yydcdut.note.aspect.permission.AspectPermission;
import com.yydcdut.note.injector.ContextLife;
import com.yydcdut.note.model.camera.ICameraModel;
import com.yydcdut.note.model.camera.impl.CameraModelImpl;
import com.yydcdut.note.model.rx.RxUser;
import com.yydcdut.note.presenters.setting.ISettingPresenter;
import com.yydcdut.note.utils.AppCompat;
import com.yydcdut.note.utils.Const;
import com.yydcdut.note.utils.LocalStorageUtils;
import com.yydcdut.note.utils.PermissionUtils;
import com.yydcdut.note.utils.YLog;
import com.yydcdut.note.utils.camera.param.Size;
import com.yydcdut.note.utils.permission.Permission;
import com.yydcdut.note.views.IView;
import com.yydcdut.note.views.setting.ISettingView;
import org.json.JSONException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
import rx.android.schedulers.AndroidSchedulers;
/**
* Created by yuyidong on 15/11/13.
*/
public class SettingPresenterImpl implements ISettingPresenter {
private ISettingView mSettingView;
private Context mContext;
private LocalStorageUtils mLocalStorageUtils;
private RxUser mRxUser;
private ICameraModel mCameraModel;
@Inject
public SettingPresenterImpl(@ContextLife("Activity") Context context,
LocalStorageUtils localStorageUtils, RxUser rxUser, CameraModelImpl cameraModel) {
mContext = context;
mLocalStorageUtils = localStorageUtils;
mRxUser = rxUser;
mCameraModel = cameraModel;
}
@Override
public Context getContext() {
return mContext;
}
@Override
public void attachView(IView iView) {
mSettingView = (ISettingView) iView;
mSettingView.initPreferenceSetting();
mSettingView.initAccountSetting();
mSettingView.initCameraSetting(mLocalStorageUtils.getCameraSystem(),
mCameraModel.getCameraNumber(mContext));
if (!AppCompat.AFTER_LOLLIPOP) {
mSettingView.showCamera2Gray();
}
mSettingView.initSyncSetting(false, false);
mSettingView.initAboutSetting();
setStatusBarClickable();
mRxUser.isLoginQQ()
.subscribe(aBoolean -> {
if (aBoolean) {
mRxUser.getQQ()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(iUser -> mSettingView.initQQ(true, iUser.getName(), iUser.getImagePath()),
(throwable -> YLog.e(throwable)));
}
}, (throwable -> YLog.e(throwable)));
mRxUser.isLoginEvernote()
.subscribe(aBoolean -> {
if (aBoolean) {
mRxUser.getEvernote()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(iUser -> mSettingView.initEvernote(true, iUser.getName()),
(throwable -> YLog.e(throwable)));
}
}, (throwable -> YLog.e(throwable)));
}
@Override
public void detachView() {
}
@Override
public void onClickSettingItem(String tag) {
switch (tag) {
case ISettingPresenter.TAG_THEME:
mSettingView.showThemeColorChooser(mLocalStorageUtils.getThemeColor());
break;
case ISettingPresenter.TAG_STATUS_BAR:
mSettingView.showStatusBarStyleChooser();
break;
case ISettingPresenter.TAG_FONT:
mSettingView.showFontChooser();
break;
case ISettingPresenter.TAG_CATEGORY:
mSettingView.jump2EditCategoryActivity();
break;
case ISettingPresenter.TAG_CAMERA_FIX:
adjustCameraWithPermission();
break;
case ISettingPresenter.TAG_CAMERA_SYSTEM:
boolean isSystem = mLocalStorageUtils.getCameraSystem();
mLocalStorageUtils.setCameraSystem(!isSystem);
mSettingView.setCameraSettingClickable(!isSystem,
mCameraModel.getCameraNumber(mContext));
break;
case ISettingPresenter.TAG_CAMERA2:
boolean useSystem = mLocalStorageUtils.getCameraSystem();
if (!AppCompat.AFTER_LOLLIPOP || useSystem) {
return;
}
boolean useCamera2 = mLocalStorageUtils.getCameraAndroidLollipop();
mLocalStorageUtils.setCameraAndroidLollipop(!useCamera2);
mSettingView.setCheckBoxState(ISettingPresenter.TAG_CAMERA2, !useCamera2);
break;
case ISettingPresenter.TAG_CAMERA_SIZE:
if (mLocalStorageUtils.getCameraSystem()) {
break;
}
getPictureSizeWithPermission();
break;
case ISettingPresenter.TAG_CAMERA_SAVE:
if (mLocalStorageUtils.getCameraSystem()) {
break;
}
boolean isSave = mLocalStorageUtils.getCameraSaveSetting();
mLocalStorageUtils.setCameraSaveSetting(!isSave);
mSettingView.setCheckBoxState(ISettingPresenter.TAG_CAMERA_SAVE, !isSave);
break;
case ISettingPresenter.TAG_CAMERA_MIRROR:
// if (mLocalStorageUtils.getCameraSystem()) {
// break;
// }
// boolean open = mLocalStorageUtils.getCameraMirrorOpen();
// mLocalStorageUtils.setCameraMirrorOpen(!open);
// mSettingView.setCheckBoxState(ISettingPresenter.TAG_CAMERA_MIRROR, !open);
mSettingView.showSnackbar(mContext.getString(R.string.toast_not_support));
break;
case ISettingPresenter.TAG_SYNC_AUTO:
case ISettingPresenter.TAG_SYNC_WIFI:
mSettingView.showSnackbar(mContext.getString(R.string.toast_not_support));
break;
case ISettingPresenter.TAG_SPLASH:
boolean splashOpen = mLocalStorageUtils.getSplashOpen();
mLocalStorageUtils.setSplashOpen(!splashOpen);
mSettingView.setCheckBoxState(ISettingPresenter.TAG_SPLASH, splashOpen);
break;
case ISettingPresenter.TAG_FEEDBACK:
mSettingView.jump2FeedbackActivity();
break;
case ISettingPresenter.TAG_ABOUT:
mSettingView.jump2AboutActivity();
break;
}
}
@Override
public void onThemeSelected(int index) {
mLocalStorageUtils.setThemeColor(index);
mSettingView.restartActivity();
}
@Override
public void onUseSystemFontSelected(boolean use) {
mLocalStorageUtils.setSettingFontSystem(use);
}
@Override
public void onStatusBarStyleSelected(boolean translate) {
mLocalStorageUtils.setStatusBarTranslation(translate);
mSettingView.restartActivity();
}
@Override
public void onPictureSizeSelected(String cameraId, int index) {
List<Size> list = null;
try {
list = mLocalStorageUtils.getPictureSizes(cameraId);
Size size = list.get(index);
mLocalStorageUtils.setPictureSize(cameraId, size);
} catch (JSONException e) {
YLog.e(e);
mSettingView.showSnackbar(mContext.getString(R.string.toast_fail));
}
}
@Override
public void onCameraIdsSelected(int index) {
try {
String cameraId = Const.CAMERA_BACK;
List<Size> list = mLocalStorageUtils.getPictureSizes(cameraId);
Size targetSize = mLocalStorageUtils.getPictureSize(cameraId);
switch (index) {
case 0:
cameraId = Const.CAMERA_BACK;
list = mLocalStorageUtils.getPictureSizes(cameraId);
targetSize = mLocalStorageUtils.getPictureSize(cameraId);
break;
case 1:
cameraId = Const.CAMERA_FRONT;
list = mLocalStorageUtils.getPictureSizes(cameraId);
targetSize = mLocalStorageUtils.getPictureSize(cameraId);
break;
}
mSettingView.showPictureSizeChooser(cameraId, list, targetSize);
} catch (JSONException e) {
YLog.e(e);
mSettingView.showSnackbar(mContext.getString(R.string.toast_fail));
}
}
@Override
public boolean getCameraSystem() {
return mLocalStorageUtils.getCameraSystem();
}
@Override
public boolean getCameraAndroidLollipop() {
return mLocalStorageUtils.getCameraAndroidLollipop();
}
@Override
public boolean getCameraSaveSetting() {
return mLocalStorageUtils.getCameraSaveSetting();
}
@Override
public boolean getCameraMirrorOpen() {
return mLocalStorageUtils.getCameraMirrorOpen();
}
@Override
public int getCameraNumber() {
return mCameraModel.getCameraNumber(mContext);
}
@Override
public boolean getSplashOpen() {
return mLocalStorageUtils.getSplashOpen();
}
private void setStatusBarClickable() {
if (!AppCompat.AFTER_LOLLIPOP) {
mSettingView.setStatusBarClickable(false);
} else {
mSettingView.setStatusBarClickable(true);
}
}
/**
* 初始化相机的拍照尺寸、相机个数
*/
private void initCameraNumberAndPictureSize() throws JSONException {
List<Size> initSizeList = mLocalStorageUtils.getPictureSizes(Const.CAMERA_BACK);
if (initSizeList != null) {
return;
}
//暂时用Camera的方法
int total = mCameraModel.getCameraNumber(mContext);
int[] cameraIds;
if (total == 0) {
cameraIds = new int[0];
} else if (total == 1) {
cameraIds = new int[]{0};
} else {
cameraIds = new int[]{0, 1};
}
for (int i = 0; i < cameraIds.length; i++) {
try {
List<Size> sizeList = getPictureSizeJsonArray(cameraIds[i]);
Collections.sort(sizeList, (Size lhs, Size rhs) -> -(lhs.getWidth() * lhs.getHeight() - rhs.getWidth() * rhs.getHeight()));
mLocalStorageUtils.setPictureSizes(String.valueOf(cameraIds[i]), sizeList);
Size suitableSize = sizeList.get(0);
mLocalStorageUtils.setPictureSize(String.valueOf(cameraIds[i]), suitableSize);
} catch (JSONException e) {
YLog.e(e);
}
}
}
/**
* 将List的数据存为JsonArray
*
* @param cameraId
* @return
* @throws JSONException
*/
private List<Size> getPictureSizeJsonArray(int cameraId) throws JSONException {
Camera camera = Camera.open(cameraId);
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> cameraSizeList = parameters.getSupportedPictureSizes();
camera.release();
List<Size> sizeList = new ArrayList<>();
for (Camera.Size size : cameraSizeList) {
sizeList.add(Size.parseSize(size));
}
return sizeList;
}
@Permission(PermissionUtils.CODE_CAMERA)
@AspectPermission(PermissionUtils.CODE_CAMERA)
private void getPictureSizeWithPermission() {
try {
initCameraNumberAndPictureSize();
} catch (JSONException e) {
YLog.e(e);
}
int numbers = mCameraModel.getCameraNumber(mContext);
if (numbers == 2) {
try {
mSettingView.showCameraIdsChooser();
} catch (JSONException e) {
YLog.e(e);
mSettingView.showSnackbar(mContext.getString(R.string.toast_fail));
}
} else {
onCameraIdsSelected(0);
}
}
@Permission(PermissionUtils.CODE_ADJUST_CAMERA)
@AspectPermission(PermissionUtils.CODE_ADJUST_CAMERA)
private void adjustCameraWithPermission() {
try {
initCameraNumberAndPictureSize();
} catch (JSONException e) {
YLog.e(e);
}
mSettingView.jump2CameraFixActivity();
}
}