/*
* Copyright (c) linroid 2015.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.linroid.pushapp.ui.bind;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.CaptureManager;
import com.journeyapps.barcodescanner.CompoundBarcodeView;
import com.linroid.pushapp.BuildConfig;
import com.linroid.pushapp.Constants;
import com.linroid.pushapp.R;
import com.linroid.pushapp.ui.base.BaseActivity;
import java.util.List;
import butterknife.Bind;
import hugo.weaving.DebugLog;
import timber.log.Timber;
public class ScanActivity extends BaseActivity {
public static final String STATE_TORCH = "torch";
public static final int REQ_SCAN_QRCODE = 0x1111;
public static final String ARG_REQUIRE_KEY = "require_key";
public static final String ARG_TIP = "tip";
public static final String EXTRA_QRCODE_KEY = "key";
public static final String EXTRA_QRCODE_VALUE = "value";
@Bind(R.id.scanner)
public CompoundBarcodeView scannerView;
@Bind(R.id.tip_tv)
public TextView tipTV;
private boolean isTorchOn = false;
private CaptureManager capture;
private String requireKey;
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
if (state != null) {
isTorchOn = state.getBoolean(STATE_TORCH);
}
Intent intent = getIntent();
if (intent.hasExtra(ARG_REQUIRE_KEY)) {
requireKey = intent.getStringExtra(ARG_REQUIRE_KEY);
}
String tip;
if (intent.hasExtra(ARG_TIP)) {
tip = intent.getStringExtra(ARG_TIP);
} else {
tip = getString(R.string.msg_scanner, BuildConfig.HOST_URL);
}
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
scannerView.setStatusText(null);
tipTV.setText(tip);
capture = new CaptureManager(this, this.scannerView);
capture.initializeFromIntent(getIntent(), state);
capture.decode();
scannerView.decodeContinuous(new BarcodeCallback() {
@DebugLog
@Override
public void barcodeResult(BarcodeResult barcodeResult) {
Timber.d("扫描到信息:%s", barcodeResult.getText());
Uri uri = Uri.parse(barcodeResult.getText());
List<String> segments = uri.getPathSegments();
if(BuildConfig.HOST.equals(uri.getHost()) && segments.size()==3) {
if (Constants.QRCODE.equals(segments.get(0))) {
String key = segments.get(1);
String value = segments.get(2);
Timber.d("%s => %s", key, value);
if (!TextUtils.isEmpty(requireKey) && requireKey.equals(key)) {
onScanSuccess(key, value);
return;
}
}
}
handleUnknownQrcode(barcodeResult.getText());
}
@Override
public void possibleResultPoints(List<ResultPoint> list) {
}
});
}
/**
* 处理未知的二维码扫描结果
* @param text
*/
private void handleUnknownQrcode(final String text) {
Timber.e("Unknown qrcode content: %s", text);
Uri uri = Uri.parse(text);
// 内容为Uri
if (!TextUtils.isEmpty(uri.getScheme())) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri);
PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
if (activities.size() > 0) {
startActivity(Intent.createChooser(intent, getString(R.string.title_choose_app)));
} else {
handleResultAsPlainText(text);
}
} else {
handleResultAsPlainText(text);
}
}
/**
* 当作纯文本处理
* @param text
*/
private void handleResultAsPlainText(final String text) {
capture.onPause();
new AlertDialog.Builder(this)
.setTitle(R.string.title_dialog_unsupport_qrcode)
.setMessage(text)
.setPositiveButton(R.string.btn_dialog_copy, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
cm.setPrimaryClip(ClipData.newPlainText("qrcode", text));
Snackbar.make(scannerView, "复制成功!", Snackbar.LENGTH_SHORT).show();
capture.onResume();
}
})
.show();
}
private void onScanSuccess(String key, String value) {
Intent intent = getIntent();
intent.putExtra(EXTRA_QRCODE_KEY, key);
intent.putExtra(EXTRA_QRCODE_VALUE, value);
setResult(RESULT_OK, intent);
finish();
}
public static Intent createNewScanIntent(Activity activity, String tip) {
Intent intent = new Intent(activity, ScanActivity.class);
intent.putExtra(ARG_TIP, tip);
return intent;
}
public static Intent createNewScanIntent(Activity activity, String tip, String requireKey) {
Intent intent = new Intent(activity, ScanActivity.class);
intent.putExtra(ARG_REQUIRE_KEY, requireKey);
intent.putExtra(ARG_TIP, tip);
return intent;
}
@Override
protected int provideContentViewId() {
return R.layout.activity_scan;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(STATE_TORCH, isTorchOn);
}
@Override
public void onResume() {
super.onResume();
capture.onResume();
}
@Override
public void onPause() {
super.onPause();
capture.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
capture.onDestroy();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return scannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.scan, menu);
// MenuItem menuItem = menu.findItem(R.id.action_flash);
// if (isTorchOn) {
// menuItem.setTitle(R.string.action_torch_on);
// } else {
// menuItem.setTitle(R.string.action_torch_off);
// }
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// switch (item.getItemId()) {
// case R.id.action_flash:
// if (!isTorchOn) {
// scannerView.setTorchOn();
// } else {
// scannerView.setTorchOff();
// }
// isTorchOn = !isTorchOn;
// item.setTitle(isTorchOn ? R.string.action_torch_on : R.string.action_torch_off);
// return true;
// }
if (item.getItemId() == android.R.id.home) {
setResult(RESULT_CANCELED);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}