package com.marktony.translator.ui;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v7.preference.PreferenceManager;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.marktony.translator.R;
import com.marktony.translator.adapter.SampleAdapter;
import com.marktony.translator.constant.Constants;
import com.marktony.translator.db.DBUtil;
import com.marktony.translator.db.NotebookDatabaseHelper;
import com.marktony.translator.model.BingModel;
import com.marktony.translator.util.NetworkUtil;
import java.util.ArrayList;
import static android.content.Context.CLIPBOARD_SERVICE;
/**
* Created by lizhaotailang on 2016/7/12.
*/
public class TranslateFragment extends Fragment {
private EditText editText;
private TextView textViewClear;
private ProgressBar progressBar;
private TextView textViewResult;
private ImageView imageViewMark;
private View viewResult;
private AppCompatButton button;
private ArrayList<BingModel.Sample> samples;
private RecyclerView recyclerView;
private SampleAdapter adapter;
private NotebookDatabaseHelper dbHelper;
private String result = null;
private BingModel model;
private RequestQueue queue;
private boolean isMarked = false;
private boolean completeWithEnter;
private boolean showSamples;
// empty constructor required
public TranslateFragment(){
}
public static TranslateFragment newInstance() {
return new TranslateFragment();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
queue = Volley.newRequestQueue(getActivity().getApplicationContext());
dbHelper = new NotebookDatabaseHelper(getActivity(),"MyStore.db",null,1);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main,container,false);
initViews(view);
//在这里进行网络连接的判断,如果没有连接,则进行snackbar的提示
//如果有网络连接,则不会有任何的操作
if (!NetworkUtil.isNetworkConnected(getActivity())){
showNoNetwork();
}
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!NetworkUtil.isNetworkConnected(getActivity())) {
showNoNetwork();
} else if (editText.getText() == null || editText.getText().length() == 0) {
Snackbar.make(button, getString(R.string.no_input), Snackbar.LENGTH_SHORT)
.show();
} else {
sendReq(editText.getText().toString());
}
}
});
textViewClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText.setText("");
}
});
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (editText.getEditableText().toString().length() != 0){
textViewClear.setVisibility(View.VISIBLE);
} else {
textViewClear.setVisibility(View.INVISIBLE);
}
// handle the situation when text ends up with enter
// 监听回车事件
if (completeWithEnter) {
if (count == 1 && s.charAt(start) == '\n') {
editText.getText().replace(start, start + 1, "");
sendReq(editText.getEditableText().toString());
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
imageViewMark.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 在没有被收藏的情况下
if (!isMarked){
imageViewMark.setImageResource(R.drawable.ic_grade_white_24dp);
Snackbar.make(button, R.string.add_to_notebook,Snackbar.LENGTH_SHORT)
.show();
isMarked = true;
ContentValues values = new ContentValues();
values.put("input",model.getWord());
values.put("output",result);
DBUtil.insertValue(dbHelper,values);
values.clear();
} else {
imageViewMark.setImageResource(R.drawable.ic_star_border_white_24dp);
Snackbar.make(button,R.string.remove_from_notebook,Snackbar.LENGTH_SHORT)
.show();
isMarked = false;
DBUtil.deleteValue(dbHelper, model.getWord());
}
}
});
viewResult.findViewById(R.id.image_view_share).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND).setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,result);
startActivity(Intent.createChooser(intent,getString(R.string.choose_app_to_share)));
}
});
viewResult.findViewById(R.id.image_view_copy).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ClipboardManager manager = (ClipboardManager) getActivity().getSystemService(CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("text", result);
manager.setPrimaryClip(clipData);
Snackbar.make(button,R.string.copy_done,Snackbar.LENGTH_SHORT)
.show();
}
});
return view;
}
private void initViews(View view) {
editText = (EditText) view.findViewById(R.id.et_main_input);
textViewClear = (TextView) view.findViewById(R.id.tv_clear);
// 初始化清除按钮,当没有输入时是不可见的
textViewClear.setVisibility(View.INVISIBLE);
progressBar = (ProgressBar) view.findViewById(R.id.progress_bar);
viewResult = view.findViewById(R.id.include);
textViewResult = (TextView) view.findViewById(R.id.text_view_output);
imageViewMark = (ImageView) view.findViewById(R.id.image_view_mark_star);
imageViewMark.setImageResource(R.drawable.ic_star_border_white_24dp);
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setNestedScrollingEnabled(false);
button = (AppCompatButton) view.findViewById(R.id.buttonTranslate);
}
private void sendReq(String in){
progressBar.setVisibility(View.VISIBLE);
viewResult.setVisibility(View.INVISIBLE);
// 监听输入面板的情况,如果激活则隐藏
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive()){
imm.hideSoftInputFromWindow(button.getWindowToken(),0);
}
in = inputFormat(in);
String url = Constants.BING_BASE + "?Word=" + in + "&Samples=";
if (showSamples) {
url += "true";
} else {
url += "false";
}
StringRequest request = new StringRequest(Request.Method.GET,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
try {
Gson gson = new Gson();
model = gson.fromJson(s, BingModel.class);
if (model != null) {
result = model.getWord() + "\n";
if (DBUtil.queryIfItemExist(dbHelper, model.getWord())) {
imageViewMark.setImageResource(R.drawable.ic_grade_white_24dp);
isMarked = true;
} else {
imageViewMark.setImageResource(R.drawable.ic_star_border_white_24dp);
isMarked = false;
}
if (model.getPronunciation() != null) {
BingModel.Pronunciation p = model.getPronunciation();
result = result + "\nAmE:" + p.getAmE() + "\nBrE:" + p.getBrE() + "\n";
}
for (BingModel.Definition def : model.getDefs()) {
result = result + def.getPos() + "\n" + def.getDef() + "\n";
}
result = result.substring(0, result.length() - 1);
if (model.getSams() != null && model.getSams().size() != 0) {
if (samples == null) {
samples = new ArrayList<>();
}
samples.clear();
for (BingModel.Sample sample : model.getSams()) {
samples.add(sample);
}
if (adapter == null) {
adapter = new SampleAdapter(getActivity(), samples);
recyclerView.setAdapter(adapter);
} else {
adapter.notifyDataSetChanged();
}
}
progressBar.setVisibility(View.INVISIBLE);
viewResult.setVisibility(View.VISIBLE);
textViewResult.setText(result);
}
} catch (JsonSyntaxException ex) {
showTransError();
}
progressBar.setVisibility(View.GONE);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
progressBar.setVisibility(View.GONE);
showTransError();
}
});
queue.add(request);
}
//去掉输入文本中的回车符号
private String inputFormat(String in){
in = in.replace("\n","");
return in;
}
private void showNoNetwork(){
Snackbar.make(button, R.string.no_network_connection, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.settings, new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(Settings.ACTION_SETTINGS));
}
}).show();
}
private void showTransError() {
Snackbar.make(button, R.string.trans_error, Snackbar.LENGTH_SHORT)
.setAction(R.string.retry, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}).show();
}
@Override
public void onResume() {
super.onResume();
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
completeWithEnter = sp.getBoolean("enter_key", false);
showSamples = sp.getBoolean("samples", true);
if (samples != null) {
samples.clear();
}
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
}