com.gqp.duoduo.ui.activity.SearchProductForPrestoreActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.gqp.duoduo.ui.activity.SearchProductForPrestoreActivity.java

Source

package com.gqp.duoduo.ui.activity;

import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.speech.RecognitionListener;
import android.speech.SpeechRecognizer;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.baidu.speech.VoiceRecognitionService;
import com.facebook.drawee.view.SimpleDraweeView;
import com.google.gson.Gson;
import com.gqp.common.adapter.ViewHolderBind;
import com.gqp.common.cache.SpCache;
import com.gqp.common.exception.ErrorMessageException;
import com.gqp.common.http.HttpRequest;
import com.gqp.common.rx.android.schedulers.AndroidSchedulers;
import com.gqp.common.rx.bus.RxBus;
import com.gqp.duoduo.App;
import com.gqp.duoduo.R;
import com.gqp.duoduo.adapter.SearchGoodsResultAdapter;
import com.gqp.duoduo.base.BaseActivity;
import com.gqp.duoduo.base.Constants;
import com.gqp.duoduo.database.DeliverModel;
import com.gqp.duoduo.database.Goods;
import com.gqp.duoduo.database.dao.GoodsDao;
import com.gqp.duoduo.model.GoodsList;
import com.gqp.duoduo.utils.HttpUrl;
import com.gqp.duoduo.utils.StringUtil;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.view.ViewClickEvent;
import com.jakewharton.rxbinding.widget.RxTextView;
import com.jakewharton.rxbinding.widget.TextViewTextChangeEvent;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.Request;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

import rx.Observable;
import rx.Subscriber;
import rx.functions.Action1;

/**
 * Created by admin on 2015/10/29.
 */
public class SearchProductForPrestoreActivity extends BaseActivity implements RecognitionListener {
    //?
    private static final int REQUEST_UI = 1;
    public static final int STATUS_None = 0;
    public static final int STATUS_WaitingReady = 2;
    public static final int STATUS_Ready = 3;
    public static final int STATUS_Speaking = 4;
    public static final int STATUS_Recognition = 5;
    private SpeechRecognizer speechRecognizer;
    private int status = STATUS_None;
    private long speechEndTime = -1;
    private static final int EVENT_ERROR = 11;

    private List<Goods> mList;
    //    private SearchGoodsResultAdapter adapter;
    private TextView searchCommit;
    private EditText searchText;
    private String id;
    private TextView searchOk, search_num;
    private LinearLayout listView;
    private ImageView search_voice;
    private Map<String, Goods> selectMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.search_goods_for_prestore_view);
        id = getIntent().getStringExtra(Constants.PARAM_MARKET_CODE);
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        sp.edit().remove(Constants.EXTRA_INFILE).commit(); // infile?PCM?????
        speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this,
                new ComponentName(this, VoiceRecognitionService.class));
        speechRecognizer.setRecognitionListener(this);
        mList = new ArrayList<>();
        selectMap = new HashMap<>();

        searchText = (EditText) findViewById(R.id.search_edittext);
        searchCommit = (TextView) findViewById(R.id.search_commit);
        search_voice = (ImageView) findViewById(R.id.search_voice);
        searchOk = (TextView) findViewById(R.id.search_result_ok);
        search_num = (TextView) findViewById(R.id.search_num);

        searchCommit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String input = searchText.getText().toString();
                if (App.getNetState()) {
                    getGoodsList(input);

                } else {
                    showToast("???");
                    getLocalData(input);
                }
            }
        });

        searchOk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Gson gson = new Gson();
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("[");
                int count = 0;
                if (selectMap != null && selectMap.size() > 0) {
                    for (Goods goods : selectMap.values()) {
                        String jsonstr = gson.toJson(goods, Goods.class);
                        stringBuilder.append(jsonstr);
                        if (count < selectMap.size() - 1) {
                            stringBuilder.append(",");
                        }
                        count++;
                    }
                }
                stringBuilder.append("]");
                Intent intent = getIntent();
                intent.putExtra(Constants.PARAM_GOODS, stringBuilder.toString());
                setResult(1, intent);
                finish();
            }
        });

        search_voice.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startSearch();
            }
        });

        listView = (LinearLayout) findViewById(R.id.search_result_listview);

        compositeSubscription
                .add(RxView.clickEvents(findViewById(R.id.search_back)).subscribe(new Action1<ViewClickEvent>() {
                    @Override
                    public void call(ViewClickEvent viewClickEvent) {
                        finish();
                    }
                }));

        compositeSubscription.add(RxTextView.textChangeEvents((EditText) findViewById(R.id.search_edittext))
                .throttleLast(2, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<TextViewTextChangeEvent>() {
                    @Override
                    public void call(TextViewTextChangeEvent textViewTextChangeEvent) {

                        String input = textViewTextChangeEvent.text().toString();

                        if (App.getNetState()) {
                            getGoodsList(input);

                        } else {
                            showToast("???");
                            getLocalData(input);
                        }

                    }
                })

        );

        Observable<MainActivity.MainActivityEvent.DeliverEvent> deliverEventObservable = RxBus.getDefault()
                .register(MainActivity.MainActivityEvent.DeliverEvent.class);

        compositeSubscription
                .add(deliverEventObservable.subscribe(new Action1<MainActivity.MainActivityEvent.DeliverEvent>() {
                    @Override
                    public void call(MainActivity.MainActivityEvent.DeliverEvent deliverEvent) {

                        finish();
                    }
                }));

    }

    private void getLocalData(String input) {
        if (TextUtils.isEmpty(input)) {
            return;
        }
        List<Goods> list = App.getDaoSession(this).getGoodsDao().queryBuilder()
                .where(GoodsDao.Properties.Goodsname.like("%" + input + "%")).limit(10).list();
        mList.clear();
        mList.addAll(list);
        listView.removeAllViews();
        if (mList != null && mList.size() > 0) {
            LayoutInflater inflater = LayoutInflater.from(SearchProductForPrestoreActivity.this);
            int index = 0;
            for (Goods entity : mList) {
                View view = inflater.inflate(R.layout.search_goods_view_item, null);
                SearchGoodsViewItemHolder holder = new SearchGoodsViewItemHolder(view);
                holder.bind(entity, index);
                listView.addView(view);

                View divider = new View(SearchProductForPrestoreActivity.this);
                divider.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 2));
                divider.setBackgroundColor(Color.parseColor("#dddddd"));
                listView.addView(divider);

                index++;
            }

        }
    }

    private void getGoodsList(String input) {

        if (TextUtils.isEmpty(input)) {
            return;
        }
        Request request = new Request.Builder().url(HttpUrl.QUERY_GOODS)
                .post(new FormEncodingBuilder().add("customerid", id).add("goodsname", input).add("page", "0")
                        .add("size", "65535").build())
                .addHeader("accept", "application/json").addHeader("dodomobile", String.valueOf(UUID.randomUUID()))
                .tag(System.currentTimeMillis()).build();

        compositeSubscription
                .add(HttpRequest.modelRequest(request, GoodsList.class).subscribe(new Subscriber<GoodsList>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        //                                showToast("");
                        if (e instanceof ErrorMessageException) {
                            if (App.getNetState()) {
                                reLogin();
                            } else {
                                showToast("??");
                            }
                        }
                        showToast(e.getMessage());
                    }

                    @Override
                    public void onNext(GoodsList inventoryList) {
                        mList.clear();
                        mList.addAll(inventoryList.getRows());
                        listView.removeAllViews();
                        if (mList != null && mList.size() > 0) {
                            LayoutInflater inflater = LayoutInflater.from(SearchProductForPrestoreActivity.this);
                            int index = 0;
                            for (Goods entity : mList) {
                                View view = inflater.inflate(R.layout.search_goods_for_prestore_view_item, null);
                                SearchGoodsViewItemHolder holder = new SearchGoodsViewItemHolder(view);
                                holder.bind(entity, index);
                                listView.addView(view);

                                View divider = new View(SearchProductForPrestoreActivity.this);
                                divider.setLayoutParams(
                                        new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 2));
                                divider.setBackgroundColor(Color.parseColor("#dddddd"));
                                listView.addView(divider);

                                index++;
                            }

                        }
                    }
                }));
    }

    public class SearchGoodsViewItemHolder extends ViewHolderBind<Goods> {
        private SimpleDraweeView deliverViewItemIcon;
        private TextView deliverViewItemName;
        private TextView deliverViewItemDate;
        private TextView deliverViewItemNum;
        private CheckBox deliverViewItemCheck;
        private View itemView;

        public SearchGoodsViewItemHolder(View view) {
            super(view);
            this.itemView = view;
            deliverViewItemIcon = (SimpleDraweeView) view.findViewById(R.id.goods_view_item_icon);
            deliverViewItemName = (TextView) view.findViewById(R.id.goods_view_item_name);
            deliverViewItemDate = (TextView) view.findViewById(R.id.goods_view_item_bigitemprice);
            deliverViewItemNum = (TextView) view.findViewById(R.id.goods_view_item_itemprice);
            deliverViewItemCheck = (CheckBox) view.findViewById(R.id.goods_view_item_item_check);
        }

        @Override
        public void bind(final Goods data, int pos) {
            if (!TextUtils.isEmpty(data.getImagpath()) && !data.getImagpath().startsWith(".")) {
                deliverViewItemIcon.setImageURI(Uri.parse(data.getImagpath()));
            }
            this.itemView.setOnClickListener(new MyOnClickListener(pos));
            deliverViewItemName.setText(data.getGoodsname());
            deliverViewItemDate.setText("?" + data.getBigunitnum() + data.getBigunit()
                    + data.getUnitnum() + data.getUnit());
            deliverViewItemNum.setText(
                    "???" + StringUtil.priceFormat(data.getItemprice()) + "/" + data.getUnit());

            deliverViewItemCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                        if (selectMap == null) {
                            selectMap = new HashMap<String, Goods>();
                        }
                        selectMap.put(data.getGoodscode(), data);
                    } else {
                        if (selectMap != null) {
                            selectMap.remove(data.getGoodscode());
                        }
                    }
                }
            });

        }
    }

    public class MyOnClickListener implements View.OnClickListener {
        private int pos;

        public MyOnClickListener(int pos) {
            this.pos = pos;
        }

        @Override
        public void onClick(View v) {
            Gson gson = new Gson();
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("[");
            int count = 0;
            if (selectMap != null && selectMap.size() > 0) {
                for (Goods goods : selectMap.values()) {
                    String jsonstr = gson.toJson(goods, Goods.class);
                    stringBuilder.append("{");
                    stringBuilder.append(jsonstr);
                    stringBuilder.append("}");
                    if (count < selectMap.size() - 1) {
                        stringBuilder.append(",");
                    }
                }
            }
            stringBuilder.append("]");
            Intent intent = getIntent();
            intent.putExtra(Constants.PARAM_GOODS, stringBuilder.toString());
            setResult(1, intent);
            finish();
        }
    }

    public void startSearch() {
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(SearchProductForPrestoreActivity.this);
        boolean api = sp.getBoolean("api", false);
        if (api) {
            switch (status) {
            case STATUS_None:
                start();
                //                    searchVoice.setText("?");
                status = STATUS_WaitingReady;
                break;
            case STATUS_WaitingReady:
                cancel();
                status = STATUS_None;
                //                    searchVoice.setText("");
                break;
            case STATUS_Ready:
                cancel();
                status = STATUS_None;
                //                    searchVoice.setText("");
                break;
            case STATUS_Speaking:
                stop();
                status = STATUS_Recognition;
                //                    searchVoice.setText("");
                break;
            case STATUS_Recognition:
                cancel();
                status = STATUS_None;
                //                    searchVoice.setText("");
                break;
            }
        } else {
            start();
        }
    }

    public void bindParams(Intent intent) {
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        if (sp.getBoolean("tips_sound", true)) {
            intent.putExtra(Constants.EXTRA_SOUND_START, R.raw.bdspeech_recognition_start);
            intent.putExtra(Constants.EXTRA_SOUND_END, R.raw.bdspeech_speech_end);
            intent.putExtra(Constants.EXTRA_SOUND_SUCCESS, R.raw.bdspeech_recognition_success);
            intent.putExtra(Constants.EXTRA_SOUND_ERROR, R.raw.bdspeech_recognition_error);
            intent.putExtra(Constants.EXTRA_SOUND_CANCEL, R.raw.bdspeech_recognition_cancel);
        }
        if (sp.contains(Constants.EXTRA_INFILE)) {
            String tmp = sp.getString(Constants.EXTRA_INFILE, "").replaceAll(",.*", "").trim();
            intent.putExtra(Constants.EXTRA_INFILE, tmp);
        }
        if (sp.getBoolean(Constants.EXTRA_OUTFILE, false)) {
            intent.putExtra(Constants.EXTRA_OUTFILE, "sdcard/outfile.pcm");
        }
        if (sp.contains(Constants.EXTRA_SAMPLE)) {
            String tmp = sp.getString(Constants.EXTRA_SAMPLE, "").replaceAll(",.*", "").trim();
            if (null != tmp && !"".equals(tmp)) {
                intent.putExtra(Constants.EXTRA_SAMPLE, Integer.parseInt(tmp));
            }
        }
        if (sp.contains(Constants.EXTRA_LANGUAGE)) {
            String tmp = sp.getString(Constants.EXTRA_LANGUAGE, "").replaceAll(",.*", "").trim();
            if (null != tmp && !"".equals(tmp)) {
                intent.putExtra(Constants.EXTRA_LANGUAGE, tmp);
            }
        }
        if (sp.contains(Constants.EXTRA_NLU)) {
            String tmp = sp.getString(Constants.EXTRA_NLU, "").replaceAll(",.*", "").trim();
            if (null != tmp && !"".equals(tmp)) {
                intent.putExtra(Constants.EXTRA_NLU, tmp);
            }
        }

        if (sp.contains(Constants.EXTRA_VAD)) {
            String tmp = sp.getString(Constants.EXTRA_VAD, "").replaceAll(",.*", "").trim();
            if (null != tmp && !"".equals(tmp)) {
                intent.putExtra(Constants.EXTRA_VAD, tmp);
            }
        }
        String prop = null;
        if (sp.contains(Constants.EXTRA_PROP)) {
            String tmp = sp.getString(Constants.EXTRA_PROP, "").replaceAll(",.*", "").trim();
            if (null != tmp && !"".equals(tmp)) {
                intent.putExtra(Constants.EXTRA_PROP, Integer.parseInt(tmp));
                prop = tmp;
            }
        }

        // offline asr
        {
            intent.putExtra(Constants.EXTRA_OFFLINE_ASR_BASE_FILE_PATH, "/sdcard/easr/s_1");
            intent.putExtra(Constants.EXTRA_LICENSE_FILE_PATH, "/sdcard/easr/license-tmp-20150530.txt");
            if (null != prop) {
                int propInt = Integer.parseInt(prop);
                if (propInt == 10060) {
                    intent.putExtra(Constants.EXTRA_OFFLINE_LM_RES_FILE_PATH, "/sdcard/easr/s_2_Navi");
                } else if (propInt == 20000) {
                    intent.putExtra(Constants.EXTRA_OFFLINE_LM_RES_FILE_PATH, "/sdcard/easr/s_2_InputMethod");
                }
            }
            intent.putExtra(Constants.EXTRA_OFFLINE_SLOT_DATA, buildTestSlotData());
        }
    }

    private String buildTestSlotData() {
        JSONObject slotData = new JSONObject();
        JSONArray name = new JSONArray().put("?").put("");
        JSONArray song = new JSONArray().put("").put("?");
        JSONArray artist = new JSONArray().put("?").put("?");
        JSONArray app = new JSONArray().put("").put("");
        JSONArray usercommand = new JSONArray().put("?").put("");
        try {
            slotData.put(Constants.EXTRA_OFFLINE_SLOT_NAME, name);
            slotData.put(Constants.EXTRA_OFFLINE_SLOT_SONG, song);
            slotData.put(Constants.EXTRA_OFFLINE_SLOT_ARTIST, artist);
            slotData.put(Constants.EXTRA_OFFLINE_SLOT_APP, app);
            slotData.put(Constants.EXTRA_OFFLINE_SLOT_USERCOMMAND, usercommand);
        } catch (JSONException e) {

        }
        return slotData.toString();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            onResults(data.getExtras());
        }
    }

    private void start() {
        //        txtLog.setText("");
        //        print("?");
        Intent intent = new Intent();
        bindParams(intent);
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        {

            String args = sp.getString("args", "");
            if (null != args) {
                //                print("?" + args);
                intent.putExtra("args", args);
            }
        }
        boolean api = sp.getBoolean("api", false);
        if (api) {
            speechEndTime = -1;
            speechRecognizer.startListening(intent);
        } else {
            intent.setAction("com.baidu.action.RECOGNIZE_SPEECH");
            startActivityForResult(intent, REQUEST_UI);
        }

        //        txtResult.setText("");
    }

    private void stop() {
        speechRecognizer.stopListening();
        //        print("?");
    }

    private void cancel() {
        speechRecognizer.cancel();
        status = STATUS_None;
        //        print("??");
    }

    @Override
    public void onReadyForSpeech(Bundle params) {
        status = STATUS_Ready;
        //        print("??");
    }

    @Override
    public void onBeginningOfSpeech() {
        status = STATUS_Speaking;
        //        searchVoice.setText("");
        //        print("??");
    }

    @Override
    public void onRmsChanged(float rmsdB) {

    }

    @Override
    public void onBufferReceived(byte[] buffer) {

    }

    @Override
    public void onEndOfSpeech() {
        speechEndTime = System.currentTimeMillis();
        status = STATUS_Recognition;
        //        print("???");
        //        searchVoice.setText("");
    }

    @Override
    public void onError(int error) {
        status = STATUS_None;
        StringBuilder sb = new StringBuilder();
        switch (error) {
        case SpeechRecognizer.ERROR_AUDIO:
            sb.append("");
            break;
        case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
            sb.append("");
            break;
        case SpeechRecognizer.ERROR_CLIENT:
            sb.append("");
            break;
        case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
            sb.append("???");
            break;
        case SpeechRecognizer.ERROR_NETWORK:
            sb.append("");
            break;
        case SpeechRecognizer.ERROR_NO_MATCH:
            sb.append("?");
            break;
        case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
            sb.append("");
            break;
        case SpeechRecognizer.ERROR_SERVER:
            sb.append("?");
            break;
        case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
            sb.append("");
            break;
        }
        sb.append(":" + error);
        //        print("" + sb.toString());
        //        searchVoice.setText("");
    }

    @Override
    public void onResults(Bundle results) {
        long end2finish = System.currentTimeMillis() - speechEndTime;
        status = STATUS_None;
        ArrayList<String> nbest = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
        //        print("?" + Arrays.toString(nbest.toArray(new_version String[nbest.size()])));
        System.out.println("" + nbest.get(0));
        //        String json_res = results.getString("origin_result");
        //        try {
        //            print("origin_result=\n" + new_version JSONObject(json_res).toString(4));
        //        } catch (Exception e) {
        //            print("origin_result=[warning: bad json]\n" + json_res);
        //        }
        if (nbest != null && nbest.size() > 0) {
            getGoodsList(nbest.get(0));
        } else {
            showToast("?");
        }
        //        searchVoice.setText("");
        String strEnd2Finish = "";
        if (end2finish < 60 * 1000) {
            strEnd2Finish = "(waited " + end2finish + "ms)";
        }
    }

    @Override
    public void onPartialResults(Bundle partialResults) {
        ArrayList<String> nbest = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
        if (nbest.size() > 0) {
            //            print("~" + Arrays.toString(nbest.toArray(new_version String[0])));
        }
    }

    @Override
    public void onEvent(int eventType, Bundle params) {
        switch (eventType) {
        case EVENT_ERROR:
            String reason = params.get("reason") + "";
            //                print("EVENT_ERROR, " + reason);
            break;
        case VoiceRecognitionService.EVENT_ENGINE_SWITCH:
            int type = params.getInt("engine_type");
            //                print("*?" + (type == 0 ? "" : ""));
            break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (compositeSubscription != null) {
            if (!compositeSubscription.isUnsubscribed()) {
                compositeSubscription.unsubscribe();
            }
            compositeSubscription = null;
        }
    }
}