package com.lqr.wechat.ui.activity; import android.content.Context; import android.content.Intent; import android.os.Vibrator; import android.text.TextUtils; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.TextView; import com.lqr.imagepicker.ImagePicker; import com.lqr.imagepicker.bean.ImageItem; import com.lqr.imagepicker.ui.ImageGridActivity; import com.lqr.wechat.R; import com.lqr.wechat.api.ApiRetrofit; import com.lqr.wechat.app.AppConst; import com.lqr.wechat.db.DBManager; import com.lqr.wechat.db.model.Groups; import com.lqr.wechat.model.exception.ServerException; import com.lqr.wechat.model.response.GetGroupInfoResponse; import com.lqr.wechat.model.response.JoinGroupResponse; import com.lqr.wechat.thread.ThreadPoolFactory; import com.lqr.wechat.ui.base.BaseActivity; import com.lqr.wechat.ui.presenter.ScanAtPresenter; import com.lqr.wechat.ui.view.IScanAtView; import com.lqr.wechat.util.LogUtils; import com.lqr.wechat.util.PopupWindowUtils; import com.lqr.wechat.util.UIUtils; import java.util.ArrayList; import butterknife.Bind; import cn.bingoogolapple.qrcode.core.QRCodeView; import cn.bingoogolapple.qrcode.zxing.QRCodeDecoder; import cn.bingoogolapple.qrcode.zxing.ZXingView; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * @创建者 CSDN_LQR * @描述 扫一扫界面 */ public class ScanActivity extends BaseActivity<IScanAtView, ScanAtPresenter> implements IScanAtView, QRCodeView.Delegate { public static final int IMAGE_PICKER = 100; @Bind(R.id.ibToolbarMore) ImageButton mIbToolbarMore; @Bind(R.id.zxingview) ZXingView mZxingview; @Bind(R.id.llSaoma) LinearLayout mLlSaoma; @Bind(R.id.llFengmian) LinearLayout mLlFengmian; @Bind(R.id.llJiejing) LinearLayout mLlJiejing; @Bind(R.id.llFanyi) LinearLayout mLlFanyi; @Bind(R.id.ivSaomaNormal) ImageView mIvSaomaNormal; @Bind(R.id.ivSaomaPress) ImageView mIvSaomaPress; @Bind(R.id.ivFengmianNormal) ImageView mIvFengmianNormal; @Bind(R.id.ivFengmianPress) ImageView mIvFengmianPress; @Bind(R.id.ivJiejingNormal) ImageView mIvJiejingNormal; @Bind(R.id.ivJiejingPress) ImageView mIvJiejingPress; @Bind(R.id.ivFanyiNormal) ImageView mIvFanyiNormal; @Bind(R.id.ivFanyiPress) ImageView mIvFanyiPress; private FrameLayout mView; private PopupWindow mPopupWindow; @Override public void initView() { selectBottomOne(0); mIbToolbarMore.setVisibility(View.VISIBLE); } @Override public void initListener() { mIbToolbarMore.setOnClickListener(v -> showPopupMenu()); mZxingview.setDelegate(this); mLlSaoma.setOnClickListener(v -> selectBottomOne(0)); mLlFengmian.setOnClickListener(v -> selectBottomOne(1)); mLlJiejing.setOnClickListener(v -> selectBottomOne(2)); mLlFanyi.setOnClickListener(v -> selectBottomOne(3)); } @Override protected void onStart() { super.onStart(); mZxingview.startCamera(); mZxingview.startSpotAndShowRect(); } @Override protected void onStop() { super.onStop(); mZxingview.stopCamera(); } @Override protected void onDestroy() { super.onDestroy(); mZxingview.onDestroy(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == ImagePicker.RESULT_CODE_ITEMS) {//返回多张照片 if (data != null) { final ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS); if (images != null && images.size() > 0) { //取第一张照片 ThreadPoolFactory.getNormalPool().execute(new Runnable() { @Override public void run() { String result = QRCodeDecoder.syncDecodeQRCode(images.get(0).path); if (TextUtils.isEmpty(result)) { UIUtils.showToast(UIUtils.getString(R.string.scan_fail)); } else { handleResult(result); } } }); } } } } @Override protected ScanAtPresenter createPresenter() { return new ScanAtPresenter(this); } @Override protected int provideContentViewId() { return R.layout.activity_scan; } @Override public void onScanQRCodeSuccess(String result) { handleResult(result); } @Override public void onScanQRCodeOpenCameraError() { UIUtils.showToast(UIUtils.getString(R.string.open_camera_error)); } public void selectBottomOne(int switchItem) { mIvSaomaPress.setVisibility(View.GONE); mIvFengmianPress.setVisibility(View.GONE); mIvJiejingPress.setVisibility(View.GONE); mIvFanyiPress.setVisibility(View.GONE); switch (switchItem) { case 0: setToolbarTitle(UIUtils.getString(R.string.qr_cord_or_bar_code)); mIvSaomaPress.setVisibility(View.VISIBLE); break; case 1: setToolbarTitle(UIUtils.getString(R.string.cover_or_movie_poster)); mIvFengmianPress.setVisibility(View.VISIBLE); break; case 2: setToolbarTitle(UIUtils.getString(R.string.street_scape)); mIvJiejingPress.setVisibility(View.VISIBLE); break; case 3: setToolbarTitle(UIUtils.getString(R.string.translate)); mIvFanyiPress.setVisibility(View.VISIBLE); break; } } private void showPopupMenu() { if (mView == null) { mView = new FrameLayout(this); mView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mView.setBackgroundColor(UIUtils.getColor(R.color.white)); TextView tv = new TextView(this); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, UIUtils.dip2Px(45)); tv.setLayoutParams(params); tv.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); tv.setPadding(UIUtils.dip2Px(20), 0, 0, 0); tv.setTextColor(UIUtils.getColor(R.color.gray0)); tv.setTextSize(14); tv.setText(UIUtils.getString(R.string.select_qr_code_from_ablum)); mView.addView(tv); tv.setOnClickListener(v -> { mPopupWindow.dismiss(); Intent intent = new Intent(ScanActivity.this, ImageGridActivity.class); startActivityForResult(intent, IMAGE_PICKER); }); } mPopupWindow = PopupWindowUtils.getPopupWindowAtLocation(mView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, getWindow().getDecorView().getRootView(), Gravity.BOTTOM, 0, 0); mPopupWindow.setOnDismissListener(() -> PopupWindowUtils.makeWindowLight(ScanActivity.this)); PopupWindowUtils.makeWindowDark(this); } private void vibrate() { Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(200); } private void handleResult(String result) { LogUtils.sf("扫描结果:" + result); vibrate(); mZxingview.startSpot(); //添加好友 if (result.startsWith(AppConst.QrCodeCommon.ADD)) { String account = result.substring(AppConst.QrCodeCommon.ADD.length()); if (DBManager.getInstance().isMyFriend(account)) { UIUtils.showToast(UIUtils.getString(R.string.this_account_was_your_friend)); return; } Intent intent = new Intent(ScanActivity.this, PostScriptActivity.class); intent.putExtra("userId", account); startActivity(intent); finish(); } //进群 else if (result.startsWith(AppConst.QrCodeCommon.JOIN)) { String groupId = result.substring(AppConst.QrCodeCommon.JOIN.length()); if (DBManager.getInstance().isInThisGroup(groupId)) { UIUtils.showToast(UIUtils.getString(R.string.you_already_in_this_group)); return; } else { ApiRetrofit.getInstance().JoinGroup(groupId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .filter(joinGroupResponse -> joinGroupResponse != null && joinGroupResponse.getCode() == 200) .flatMap(new Func1<JoinGroupResponse, Observable<GetGroupInfoResponse>>() { @Override public Observable<GetGroupInfoResponse> call(JoinGroupResponse joinGroupResponse) { return ApiRetrofit.getInstance().getGroupInfo(groupId);//似乎这里会报错,导致下面subscribe中的逻辑没有执行,不知道为啥。。 } }) .subscribe(getGroupInfoResponse -> { if (getGroupInfoResponse != null && getGroupInfoResponse.getCode() == 200) { GetGroupInfoResponse.ResultEntity resultEntity = getGroupInfoResponse.getResult(); DBManager.getInstance().saveOrUpdateGroup(new Groups(resultEntity.getId(), resultEntity.getName(), null, String.valueOf(0))); Intent intent = new Intent(ScanActivity.this, SessionActivity.class); intent.putExtra("sessionId", resultEntity.getId()); intent.putExtra("sessionType", SessionActivity.SESSION_TYPE_GROUP); jumpToActivity(intent); finish(); } else { Observable.error(new ServerException(UIUtils.getString(R.string.select_group_info_fail_please_restart_app))); } }, this::loadError); } } } private void loadError(Throwable throwable) { LogUtils.sf(throwable.getLocalizedMessage()); UIUtils.showToast(throwable.getLocalizedMessage()); } }