プロジェクト

全般

プロフィール

電話・メール対応/邮件或电话对应 #1994 » QRReadActivity.java

初鹿野 貴淑, 2022/07/01 09:27

 
package com.densowave.barcodetorfid_hitachi.view;

import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;


import com.densowave.barcodetorfid_hitachi.R;
import com.densowave.barcodetorfid_hitachi.util.CommonUtil;
import com.densowave.barcodetorfid_hitachi.util.DataList;
import com.densowave.barcodetorfid_hitachi.util.Globals;
import com.densowave.barcodetorfid_hitachi.util.MasterList;
import com.densowave.barcodetorfid_hitachi.util.ProductList;
import com.densowave.barcodetorfid_hitachi.util.RegisterList;
import com.densowave.scannersdk.Barcode.BarcodeData;
import com.densowave.scannersdk.Barcode.BarcodeDataReceivedEvent;
import com.densowave.scannersdk.Barcode.BarcodeException;
import com.densowave.scannersdk.Barcode.BarcodeScanner;
import com.densowave.scannersdk.Common.CommManager;
import com.densowave.scannersdk.Common.CommScanner;
import com.densowave.scannersdk.Dto.BarcodeScannerSettings;
import com.densowave.scannersdk.Listener.BarcodeDataDelegate;
import com.densowave.scannersdk.Listener.ScannerAcceptStatusListener;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.TreeMap;

/*
*登録画面
*
*/
public class QRReadActivity extends AppCompatActivity implements ScannerAcceptStatusListener, BarcodeDataDelegate {
private Button bt_back,bt_ok,bt_check;
private ImageButton ib_edit_qr,ib_edit_rfid;
private EditText et_barcode,et_tagid,et_product;
private LinearLayout ll_panel;
private TextView tv_store_title,tv_store_name;
private FrameLayout fl_layout;
private TreeMap<String, String> readMap = new TreeMap<>();
private HashMap<String, String> doubleMap = new HashMap<>();
private CommScanner mScanner = null;
public BarcodeScanner mBarcodeScanner;
public static BarcodeScannerSettings mBarcodeScannerSettings;
private List<CommScanner> scanner_list1;
private List<String> list;
private int index = 0;
private boolean bBarcodeOpen;
private final String TAG = "ScannerSample";
private String start_time,store_no,area_no;
private int barcount = 1;
private AlertDialog mDialog;
private CommonUtil common = new CommonUtil();
private List<MasterList> masterList = new ArrayList<MasterList>();
private List<ProductList> productList = new ArrayList<ProductList>();
private List<RegisterList> registerList = new ArrayList<RegisterList>();
private Globals global;
private List<DataList> dataList = new ArrayList<DataList>();
private TreeMap<String,String> barproductMap = new TreeMap<>();
private boolean qr_edit_flg,rfid_edit_flg;
/*
*初回起動ロジック
*
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qrread);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
//Intent intent = getIntent();
//store_no = intent.getStringExtra("STORE_NO");
//area_no = intent.getStringExtra("AREA_NAME");
//マスタ取得
//masterList = common.getMasterRead(this,store_no,area_no);
//productList = common.getProductRead(this);
//マスタの存在チェック
//if(masterList == null || masterList.size()<=0){
// new AlertDialog.Builder(QRReadActivity.this)
// .setMessage(getString(R.string.qr_dialog_dismiss))
// .setCancelable(false)
// .setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// finish();
// }
// })
// .setNegativeButton(getString(R.string.no),null)
// .show();
//}
//else{
tv_store_title = findViewById(R.id.tv_store_title);
tv_store_name = findViewById(R.id.tv_store_name);
//tv_store_title.setText(tv_store_title.getText());
//tv_store_name.setText("(" + masterList.get(0).getStoreName() + ")");
//}
// グローバル変数を扱うクラスを取得する
//global = (Globals) getApplication();
// グローバル変数を扱うクラスを初期化する
//global.init();
// グローバル変数に値をセット
//global.mMaster = masterList;
//global.mProduct = productList;
//for (MasterList row: masterList) {
// barproductMap.put(row.getManagementPlateNo(),row.getProductName());
//}
if (ContextCompat.checkSelfPermission(
this, Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
// 許可されている時の処理
}else{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
}
fl_layout = findViewById(R.id.fl_layout);
//設定ボタンの設定
et_product = findViewById(R.id.et_product);
et_barcode = findViewById(R.id.et_barcode);
et_barcode.setInputType(InputType.TYPE_NULL);
et_barcode.setOnFocusChangeListener(new View.OnFocusChangeListener() {

@Override
public void onFocusChange(View v, boolean hasFocus) {
// EditTextのフォーカスが外れた場合
if (hasFocus == false) {
// ソフトキーボードを非表示にする
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
et_tagid = findViewById(R.id.et_tagid);
et_tagid.setInputType(InputType.TYPE_NULL);
et_tagid.setOnFocusChangeListener(new View.OnFocusChangeListener() {

@Override
public void onFocusChange(View v, boolean hasFocus) {
// EditTextのフォーカスが外れた場合
if (hasFocus == false) {
// ソフトキーボードを非表示にする
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
ib_edit_qr = findViewById(R.id.ib_edit_qr);
ib_edit_qr.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!qr_edit_flg){
qr_edit_flg = true;
ib_edit_qr.setImageResource(R.drawable.edit);
et_barcode.setInputType(InputType.TYPE_CLASS_NUMBER);
}
else{
qr_edit_flg = false;
ib_edit_qr.setImageResource(R.drawable.noedit);
et_barcode.setInputType(InputType.TYPE_NULL);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(et_barcode.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
ib_edit_rfid = findViewById(R.id.ib_edit_rfid);
ib_edit_rfid.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!rfid_edit_flg){
rfid_edit_flg = true;
ib_edit_rfid.setImageResource(R.drawable.edit);
et_tagid.setInputType(InputType.TYPE_CLASS_TEXT);
}
else{
rfid_edit_flg = false;
ib_edit_rfid.setImageResource(R.drawable.noedit);
et_tagid.setInputType(InputType.TYPE_NULL);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(et_tagid.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
bt_ok = findViewById(R.id.bt_ok);
bt_ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addData();
}
});
//終了ボタンの設定
bt_back = findViewById(R.id.bt_back);
bt_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AlertDialog.Builder(QRReadActivity.this)
.setMessage(getString(R.string.dialog_exit))
.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
createCSV();
}
})
.setNegativeButton(getString(R.string.no), null)
.show();
}
});
bt_check = findViewById(R.id.bt_check);
bt_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(doubleMap.size()>0){
showCheckDialog();
}
}
});

et_barcode.setFocusable(true);
et_barcode.requestFocus();
ll_panel = findViewById(R.id.ll_panel);
try {
//ペアリストを取得
scanner_list1 = CommManager.getScanners();
list = new ArrayList<>();
for (int i = 0; i < scanner_list1.size(); ++i) {
Log.d("ExecuteRFIDActivity", "BT Address=" + scanner_list1.get(i).getBTAddress());
Log.d("ExecuteRFIDActivity", "BT LC=" + scanner_list1.get(i).getBTLocalName());
// Bluetoothローカル名を選択
if (scanner_list1.get(i).getBTLocalName().startsWith("SP1-")) {
list.add(scanner_list1.get(i).getBTLocalName());
}
}
//候補の中から接続対象を選択する
if (list.size()>0){
final String[] items = list.toArray(new String[list.size()]);
new AlertDialog.Builder(QRReadActivity.this)
.setTitle(getString(R.string.inventory_connect))
.setCancelable(false)
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// item_which pressed
index = which;
startSP1();
}
})
.show();
}
else{
new AlertDialog.Builder(QRReadActivity.this)
.setMessage(getString(R.string.inventory_not_sp1))
.setCancelable(false)
.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.show();
}
}catch (Exception e){
e.printStackTrace();
}
}
/*
*SP1接続開始処理
*ペアリング済みのSP1一覧から接続対象を選択した際に呼び出される
*接続結果を受信するaddAcceptStatusListenerを設定
*
*/
public void startSP1(){
for (CommScanner row: scanner_list1 ) {
if(row.getBTLocalName().equals(list.get(index))){
mScanner = row;
}
}
//デバイスが取得できた場合、接続する
// Start accept
CommManager.addAcceptStatusListener(this);
CommManager.startAccept();
}
public void createCSV(){
if(dataList.size()>0){
// OK button pressed
//CSV作成処理
if (ContextCompat.checkSelfPermission(
QRReadActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
// 許可されている時の処理
common.CsvCreate(QRReadActivity.this,dataList,store_no,1,true);
}else{
if (ActivityCompat.shouldShowRequestPermissionRationale(QRReadActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
ActivityCompat.requestPermissions(QRReadActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},0);
} else {
Toast.makeText(QRReadActivity.this, getString(R.string.permission_error), Toast.LENGTH_LONG).show();
finish();
}
}
}
if (mScanner != null) {
try {
mScanner.close();
}
catch (Exception e){
e.printStackTrace();
}
}
finish();
}
/*
*バーコード初回立ち上げ処理
*
*/
@Override
public void OnScannerAppeared(CommScanner commScanner) {
Log.d("ExecuteConnectActivity", " OnScannerAppeared ");
Log.d("ExecuteConnectActivity", "BT Address=" + commScanner.getBTAddress()) ;
try {
CommManager.endAccept();
CommManager.removeAcceptStatusListener(this);

mScanner = commScanner;
mScanner.claim();
openbarcode();
}catch (Exception e){
e.printStackTrace();
}
}

/**
* バーコードスキャン設定
*
*/
private void openbarcode() {
if (bBarcodeOpen == false) {
try {
if(mScanner != null){
mBarcodeScanner = mScanner.getBarcodeScanner();
mBarcodeScanner.setDataDelegate(this);
// get scanner settings
mBarcodeScannerSettings = mBarcodeScanner.getSettings();
mBarcodeScanner.setSettings(common.setSettingsBarcodeScanner(mBarcodeScannerSettings));
}
if(mBarcodeScanner != null){
// open
mBarcodeScanner.openReader();
bBarcodeOpen = true;
}
} catch (BarcodeException e) {
e.printStackTrace();
Log.d("LightTag", "Error3");
}
}
}
/*
*バーコードデータ受信処理
*
*/
@Override
public void onBarcodeDataReceived(CommScanner commScanner, BarcodeDataReceivedEvent barcodeDataReceivedEvent) {
List<BarcodeData> barcodeDataList = barcodeDataReceivedEvent.getBarcodeData();
try{
for (BarcodeData data : barcodeDataList) {
runOnUiThread(new Runnable() {
// Apply data to UI
String denso = "";
String data = "";

Runnable setData(String _denso, String _data) {
denso = _denso;
data = _data;
return this;
}

@Override
public void run() {
try {
View current = QRReadActivity.this.getCurrentFocus();
switch (current.getId()) {
case R.id.et_tagid:
et_tagid.setText(data);
bt_ok.setFocusable(true);
bt_ok.requestFocus();
break;
case R.id.et_barcode:
et_barcode.setText(data);
et_tagid.setFocusable(true);
et_tagid.requestFocus();
break;
default:
et_tagid.setFocusable(true);
et_tagid.setFocusableInTouchMode(true);
et_tagid.requestFocus();
break;
}
} catch (Exception e) {
}
}
}.setData(data.getSymbologyDenso(), new String(data.getData(), "Shift-JIS"))
);
}
}catch (Exception e){
e.printStackTrace();
}
}
/*
*画面復帰時処理
*
*/
@Override
public void onRestart() {
super.onRestart();
}
/**
* 画面終了処理
*/
@Override
protected void onDestroy(){
super.onDestroy();
try{
CommManager.endAccept();
CommManager.removeAcceptStatusListener(this);
}catch (Exception e){
//未接続状態で切断する際にエラー発生
e.printStackTrace();
}
Log.v("LifeCycle", "onDestroy");
}
/*
*戻るボタン押下時処理
*
*/
@Override
public void onBackPressed() {
new AlertDialog.Builder(QRReadActivity.this)
.setMessage(getString(R.string.dialog_exit))
.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
createCSV();
}
})
.setNegativeButton(getString(R.string.no), null)
.show();
}
/*
*画面終了時処理
*
*/
@Override
protected void onPause() {
super.onPause();
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
/*
*確定処理
*
*/
public void addData(){
final DateFormat df = new SimpleDateFormat("yyyyMMddHHmm");
final Date date = new Date(System.currentTimeMillis());
DataList rowdata = new DataList();
final String bar = et_barcode.getText().toString();
final String tag = et_tagid.getText().toString();
final String pro = et_product.getText().toString();
//if(bar.trim().length()<=0){
// new AlertDialog.Builder(QRReadActivity.this)
// .setMessage(getString(R.string.qr_error_barcode))
// .setPositiveButton(getString(R.string.yes), null)
// .show();
// return;
//}
if(tag.trim().length()<=0){
new AlertDialog.Builder(QRReadActivity.this)
.setMessage(getString(R.string.qr_error_tagid))
.setPositiveButton(getString(R.string.yes), null)
.show();
return;
}
if(pro.trim().length()<=0){
new AlertDialog.Builder(QRReadActivity.this)
.setMessage(getString(R.string.qr_error_product))
.setPositiveButton(getString(R.string.yes), null)
.show();
return;
}
//タグ番号が重複するかチェック(重複時登録不可)
if(doubleMap.size() > 0 ) {
if (doubleMap.containsValue(tag) == false) {
//バーコード番号が重複するかチェック(重複時上書き確認
if (bar.length()>0 && doubleMap.containsKey(bar) == true) {
//上書き確認ダイアログを表示し「OK」であれば上書き登録
new AlertDialog.Builder(QRReadActivity.this)
.setMessage(getString(R.string.rf_dialog))
.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// OK button pressed
DataList rowdata = new DataList();
rowdata.setDateTime(df.format(date));
rowdata.setBarcode(bar);
rowdata.setTagID(tag);
rowdata.setProductName(pro);
doubleMap.remove(bar);
doubleMap.put(bar, tag);
//重複しているデータを削除する
for (int i = 0; i < dataList.size(); i++) {
if (dataList.get(i).getBarcode().equals(bar)) {
dataList.remove(i);
}
}
//新規で追加
dataList.add(rowdata);
//ダイアログ表示
ShowDialog();
refresh();
}
})
.setNegativeButton(getString(R.string.no), null)
.show();
} else {
//何も重複が発生していないので、そのまま登録
//新規追加データ
rowdata.setDateTime(df.format(date));
rowdata.setBarcode(bar);
rowdata.setTagID(tag);
rowdata.setProductName(pro);
if(bar.length()==0){
doubleMap.put(String.valueOf(barcount), tag);
barcount++;
}else{
doubleMap.put(bar, tag);
}
dataList.add(rowdata);
//ダイアログ表示
ShowDialog();
refresh();
}
} else {
//タグIDが重複している場合は登録不可
//重複先のバーコード情報を直してもらうよう誘導
String barcorde = "";
for (String row : doubleMap.keySet()) {
if (doubleMap.get(row).equals(tag)) {
barcorde = row;
}
}
//登録不可ダイアログ
new AlertDialog.Builder(QRReadActivity.this)
.setMessage(getString(R.string.rf_dialog_ng) + "\n(" + barcorde + ")\n"+getString(R.string.rf_dialog_ng2))
.setPositiveButton(getString(R.string.yes), null)
.show();
}
}else{
//1件もマスタに存在しない場合はそのまま保存
//新規追加データ
rowdata.setDateTime(df.format(date));
rowdata.setBarcode(bar);
rowdata.setTagID(tag);
rowdata.setProductName(pro);
if(bar.length()==0){
doubleMap.put(String.valueOf(barcount), tag);
barcount++;
}else{
doubleMap.put(bar, tag);
}
dataList.add(rowdata);
//ダイアログ表示
ShowDialog();
refresh();
}
}
/*
*画面項目のリフレッシュ
* 登録完了するたびに実行
*
*/
public void refresh(){
et_barcode.setText("");
et_tagid.setText("");
et_product.setText("");
et_barcode.requestFocus();
}
/*
*登録完了メッセージ出力
*
*/
public void ShowDialog(){
boolean show_flg = false;
if(mDialog == null){
show_flg = true;
}else if(!mDialog.isShowing()){
show_flg = true;
}
if(show_flg){
AlertDialog.Builder builder = null;
builder = new AlertDialog.Builder(this, R.style.MyAlertDialogStyle);
builder.setMessage(getString(R.string.qr_commit));
builder.setCancelable(false);
mDialog = builder.create();
Handler handler = new Handler();
Runnable dialogDismiss = new Runnable() {
public void run() {
mDialog.dismiss();
}
};
mDialog.show();
TextView textView = (TextView) mDialog.findViewById(android.R.id.message);
textView.setTextSize(30.0f);
handler.postDelayed(dialogDismiss, 500);
}
}
public void showCheckDialog() {
List<String> listdata = new ArrayList<>();
List<String> keylist = new ArrayList<>();
for(String row:doubleMap.keySet()){
listdata.add("【管理プレートNo】\n"+row+"\n【タグ番号】\n"+doubleMap.get(row)+"\n");
keylist.add(row);
}
final List<String> keyList = keylist;
final String[] array = listdata.toArray(new String[listdata.size()]);
AlertDialog.Builder builder = new AlertDialog.Builder(QRReadActivity.this)
.setItems(array, null) // これだとアイテム選択で閉じる
.setTitle("登録一覧です。問題なければOKで保存して終了")
.setNegativeButton(android.R.string.cancel,null)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
createCSV();
}
});
final AlertDialog dlg = builder.create();
dlg.getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
String key = keyList.get(position);
String tag = doubleMap.get(key);
doubleMap.remove(key);
for(int i = 0; i<dataList.size();i++){
if(dataList.get(i).getTagID().equals(tag)){
dataList.remove(i);
}
}
dlg.dismiss();
Toast.makeText(QRReadActivity.this,getString(R.string.qr_delete_result),Toast.LENGTH_SHORT).show();
return false;
}
});
dlg.show();
}
}
(1-1/17)