From 7629c2b722f0b78facba58e188903152566ed4e8 Mon Sep 17 00:00:00 2001 From: rin2401 Date: Wed, 13 Jan 2021 01:51:03 +0700 Subject: [PATCH] Update README.md --- README.md | 6 ++++++ android/app/src/main/java/com/rin2401/r3ach/Moon.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e980bb3..5c3dbc5 100755 --- a/README.md +++ b/README.md @@ -9,3 +9,9 @@ - [x] Crawl Google Search get link and desciption using BeautifulSoup. - [x] Crawl from link from before. - [ ] Search to choose right answer. + +## Android +- [x] Capture and cut screen +- [x] Firebase OCR +- [x] Search answer on mobile +- [x] Send message use Websocket \ No newline at end of file diff --git a/android/app/src/main/java/com/rin2401/r3ach/Moon.java b/android/app/src/main/java/com/rin2401/r3ach/Moon.java index 8db8896..90260a6 100644 --- a/android/app/src/main/java/com/rin2401/r3ach/Moon.java +++ b/android/app/src/main/java/com/rin2401/r3ach/Moon.java @@ -1 +1 @@ -package com.rin2401.r3ach; import android.app.Service; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.PixelFormat; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; import android.media.Image; import android.media.ImageReader; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionManager; import android.os.AsyncTask; import android.os.CountDownTimer; import android.os.Handler; import android.os.IBinder; import androidx.core.internal.view.SupportMenu; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.internal.view.SupportMenu; import com.github.nkzawa.emitter.Emitter; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.ml.vision.FirebaseVision; import com.google.firebase.ml.vision.common.FirebaseVisionImage; import com.google.firebase.ml.vision.text.FirebaseVisionText; import com.google.firebase.ml.vision.text.FirebaseVisionText.TextBlock; import com.google.firebase.ml.vision.text.FirebaseVisionTextRecognizer; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.jsoup.Jsoup; import org.jsoup.Connection.Method; import com.github.nkzawa.socketio.client.IO; import com.github.nkzawa.socketio.client.Socket; import java.nio.ByteBuffer; import java.text.Normalizer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; public class Moon extends Service { private int resultCode; private String host, username; private Intent data; private WindowManager windowManager; private MediaProjectionManager mediaProjectionManager; private MediaProjection mediaProjection; private VirtualDisplay virtualDisplay; private View moon, collapse, expand; private DisplayMetrics metrics; private LayoutParams params; private FirebaseVisionTextRecognizer textRecognizer; private Socket socket; private CountDownTimer timer; private TextView timerText; private int[] numId = {R.id.num0, R.id.num1, R.id.num2}; private int[] ansId = {R.id.ans0, R.id.ans1, R.id.ans2}; public Moon() { timer = new CountDownTimer(8500, 100) { public void onTick(long tick) { timerText.setText(String.format("%02d : %02d", tick/1000, tick/100)); if (tick <= 3000) { timerText.setTextColor(SupportMenu.CATEGORY_MASK); } } public void onFinish() { timerText.setText("00 : 00"); } }; textRecognizer = FirebaseVision.getInstance().getOnDeviceTextRecognizer(); // textRecognizer = FirebaseVision.getInstance().getCloudTextRecognizer(); } @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent.getAction() == null) { resultCode = intent.getIntExtra("resultCode", 1337); host = intent.getStringExtra("host"); username = intent.getStringExtra("username"); data = intent.getParcelableExtra("data"); } try { Log.e("Host", host); socket = IO.socket(host); socket.connect(); socket.emit("add user", username); } catch (Exception e) { Log.e("Socket", "Not connect"); } return Service.START_NOT_STICKY; } @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); moon = LayoutInflater.from(this).inflate(R.layout.moon, null); params = new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, LayoutParams.TYPE_PHONE, LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); metrics = getResources().getDisplayMetrics(); params.gravity = Gravity.TOP | Gravity.LEFT; params.x = 0; params.y = 0; params.width = metrics.widthPixels; params.height = metrics.heightPixels / 2; windowManager.addView(moon, params); collapse = moon.findViewById(R.id.collapse_view); expand = moon.findViewById(R.id.expand_view); timerText = moon.findViewById(R.id.timer); moon.findViewById(R.id.close_collapse_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { stopSelf(); } }); moon.findViewById(R.id.close_expand_btn).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Moon.this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); stopSelf(); } }); moon.findViewById(R.id.capture_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startCapture(); } }); moon.findViewById(R.id.search_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(Moon.this, "Search answer.", Toast.LENGTH_LONG).show(); startCapture(); } }); moon.findViewById(R.id.expand_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { collapse.setVisibility(View.GONE); expand.setVisibility(View.VISIBLE); } }); moon.findViewById(R.id.collapse_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { expand.setVisibility(View.GONE); collapse.setVisibility(View.VISIBLE); } }); moon.findViewById(R.id.plus_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { params.height += 10; windowManager.updateViewLayout(moon, params); } }); moon.findViewById(R.id.minus_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { params.height -= 10; windowManager.updateViewLayout(moon, params); } }); moon.findViewById(R.id.root_container).setOnTouchListener(new View.OnTouchListener() { private int initialX; private int initialY; private float initialTouchX; private float initialTouchY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: initialX = params.x; initialY = params.y; initialTouchX = event.getRawX(); initialTouchY = event.getRawY(); return true; case MotionEvent.ACTION_MOVE: params.x = initialX + (int) (event.getRawX() - initialTouchX); params.y = initialY + (int) (event.getRawY() - initialTouchY); windowManager.updateViewLayout(moon, params); return true; } return false; } }); } public void startCapture() { timer.start(); resetText(moon.findViewById(R.id.expand_main)); Toast.makeText(Moon.this, "Start capture.", Toast.LENGTH_LONG).show(); final int width = metrics.widthPixels; final int height = metrics.heightPixels; int density = metrics.densityDpi; final ImageReader imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 1); final Handler handler = new Handler(); int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; try { mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data); virtualDisplay = mediaProjection.createVirtualDisplay("screen", width, height, density, flags, imageReader.getSurface(), null, handler); } catch (Exception e) { Toast.makeText(Moon.this, e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { try { Image image = reader.acquireLatestImage(); if (image != null) { Image.Plane[] planes = image.getPlanes(); ByteBuffer buffer = planes[0].getBuffer(); Log.e("Image", String.format("%d %d %d %d", width, height, planes[0].getRowStride(), planes[0].getPixelStride())); Bitmap bitmap = Bitmap.createBitmap(planes[0].getRowStride() / planes[0].getPixelStride(), height, Bitmap.Config.ARGB_8888); bitmap.copyPixelsFromBuffer(buffer); resizeImage(bitmap); image.close(); } } catch (Exception e) { e.printStackTrace(); } finally { imageReader.close(); stopCapture(); collapse.setVisibility(View.GONE); params.x = 0; params.y = 0; windowManager.updateViewLayout(moon, params); expand.setVisibility(View.VISIBLE); } } }, handler); } public void stopCapture() { Toast.makeText(Moon.this, "Stop capture.", Toast.LENGTH_LONG).show(); if (mediaProjection != null) { mediaProjection.stop(); virtualDisplay.release(); mediaProjection = null; } } public void resizeImage(Bitmap bitmap) { int[] location = new int[2]; LinearLayout capture = moon.findViewById(R.id.capture_area); capture.getLocationOnScreen(location); bitmap = Bitmap.createBitmap(bitmap, location[0], location[1], capture.getWidth(), capture.getHeight()); startDetect(bitmap); } public void startDetect(Bitmap bitmap) { textRecognizer.processImage(FirebaseVisionImage.fromBitmap(bitmap)) .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(FirebaseVisionText result) { List blocks = result.getTextBlocks(); String question = ""; ArrayList answers = new ArrayList(); if (blocks.size() > 0) { question = blocks.get(0).getText().replace("\n", " "); for (int i = 1; i < blocks.size(); i++) { if(blocks.get(i).getBoundingBox().left < params.width / 2) answers.addAll(Arrays.asList(blocks.get(i).getText().split("\n"))); } Log.e("OCR-question", question); Log.e("OCR-answers", answers.toString()); } else { question = "Con gà có mấy chân"; answers.add("2"); answers.add("3"); answers.add("4"); } for (int i = 0; i < ansId.length; i++){ try { // answers.set(i, removeAccent(answers.get(i))); ((TextView) moon.findViewById(ansId[i])).setText(answers.get(i)); } catch (Exception e) { Log.e("OCR", e.getMessage()); } } ((TextView) moon.findViewById(R.id.question)).setText(question); // startSearch(question, answers); emitQuestion(question, answers); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.e("OCR", "Error"); } }); } public void emitQuestion(String question, ArrayList answers) { try { JSONObject data = new JSONObject() .put("q", question) .put("a", new JSONArray(answers)) .put("u", username); socket.emit("question", data); } catch (Exception e) { Log.e("emitQuestion", e.getMessage()); } } public void startSearch(String question, ArrayList answer){ AsyncTask search = new AsyncTask() { @Override public JSONObject doInBackground(JSONObject[] values) { try { Log.e("JSON", values[0].toString()); // socket.emit("question", values[0]); String res = Jsoup.connect(host + "/count") .header("Content-Type", "application/json") .requestBody(values[0].toString()) .userAgent("Mozilla") .method(Method.POST) .ignoreContentType(true) .execute() .body(); JSONObject json = new JSONObject(res); JSONObject count = json.getJSONObject("count"); publishProgress(count); System.out.println(json.getDouble("time")); } catch (Exception e) { Log.e("Search", e.getMessage()); } return null; } @Override public void onProgressUpdate(JSONObject... values) { showCount(values[0]); } }; try { JSONObject data = new JSONObject() .put("q", question) .put("a", new JSONArray(answer)) .put("u", username); search.execute(data); } catch (Exception e) { Log.e("Search", e.getMessage()); } } public void showCount(JSONObject value) { System.out.println(value); ((TextView) moon.findViewById(R.id.text)).setText(value.toString()); try { JSONArray num = value.getJSONArray("num"); for (int i = 0; i < numId.length; i++) { ((TextView) moon.findViewById(numId[i])).setText(num.get(i).toString()); } } catch (Exception e) { Log.e("Count", "Parse error"); e.printStackTrace(); } } private boolean isViewCollapsed() { return moon == null || moon.findViewById(R.id.collapse_view).getVisibility() == View.VISIBLE; } public String removeAccent(String str) { return Pattern.compile("\\p{InCombiningDiacriticalMarks}+").matcher(Normalizer.normalize(str, Normalizer.Form.NFD)).replaceAll("").replaceAll("đ", "d").replaceAll("Đ", "D"); } public void resetText(View view) { if (view instanceof TextView) { ((TextView)view).setText(""); return; } else if (view instanceof ViewGroup) { ViewGroup group = (ViewGroup) view; for (int i = 0; i < group.getChildCount(); ++i) { resetText(group.getChildAt(i)); } } } @Override public void onDestroy() { super.onDestroy(); stopCapture(); if (moon != null) windowManager.removeView(moon); } } \ No newline at end of file +package com.rin2401.r3ach; import android.app.Service; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.PixelFormat; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; import android.media.Image; import android.media.ImageReader; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionManager; import android.os.AsyncTask; import android.os.CountDownTimer; import android.os.Handler; import android.os.IBinder; import androidx.core.internal.view.SupportMenu; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.internal.view.SupportMenu; import com.github.nkzawa.emitter.Emitter; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.ml.vision.FirebaseVision; import com.google.firebase.ml.vision.common.FirebaseVisionImage; import com.google.firebase.ml.vision.text.FirebaseVisionText; import com.google.firebase.ml.vision.text.FirebaseVisionText.TextBlock; import com.google.firebase.ml.vision.text.FirebaseVisionTextRecognizer; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.jsoup.Jsoup; import org.jsoup.Connection.Method; import com.github.nkzawa.socketio.client.IO; import com.github.nkzawa.socketio.client.Socket; import java.nio.ByteBuffer; import java.text.Normalizer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; public class Moon extends Service { private int resultCode; private String host, username; private Intent data; private WindowManager windowManager; private MediaProjectionManager mediaProjectionManager; private MediaProjection mediaProjection; private VirtualDisplay virtualDisplay; private View moon, collapse, expand; private DisplayMetrics metrics; private LayoutParams params; private FirebaseVisionTextRecognizer textRecognizer; private Socket socket; private CountDownTimer timer; private TextView timerText; private int[] numId = {R.id.num0, R.id.num1, R.id.num2}; private int[] ansId = {R.id.ans0, R.id.ans1, R.id.ans2}; public Moon() { timer = new CountDownTimer(8500, 100) { public void onTick(long tick) { timerText.setText(String.format("%02d : %02d", tick/1000, tick/100)); if (tick <= 3000) { timerText.setTextColor(SupportMenu.CATEGORY_MASK); } } public void onFinish() { timerText.setText("00 : 00"); } }; textRecognizer = FirebaseVision.getInstance().getOnDeviceTextRecognizer(); // textRecognizer = FirebaseVision.getInstance().getCloudTextRecognizer(); } @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent.getAction() == null) { resultCode = intent.getIntExtra("resultCode", 1337); host = intent.getStringExtra("host"); username = intent.getStringExtra("username"); data = intent.getParcelableExtra("data"); } try { Log.e("Host", host); socket = IO.socket(host); socket.connect(); socket.emit("add user", username); } catch (Exception e) { Log.e("Socket", "Not connect"); } return Service.START_NOT_STICKY; } @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); moon = LayoutInflater.from(this).inflate(R.layout.moon, null); params = new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, LayoutParams.TYPE_PHONE, LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); metrics = getResources().getDisplayMetrics(); params.gravity = Gravity.TOP | Gravity.LEFT; params.x = 0; params.y = 0; params.width = metrics.widthPixels; params.height = metrics.heightPixels / 2; windowManager.addView(moon, params); collapse = moon.findViewById(R.id.collapse_view); expand = moon.findViewById(R.id.expand_view); timerText = moon.findViewById(R.id.timer); moon.findViewById(R.id.close_collapse_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { stopSelf(); } }); moon.findViewById(R.id.close_expand_btn).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Moon.this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); stopSelf(); } }); moon.findViewById(R.id.capture_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startCapture(); } }); moon.findViewById(R.id.search_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(Moon.this, "Search answer.", Toast.LENGTH_LONG).show(); startCapture(); } }); moon.findViewById(R.id.expand_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { collapse.setVisibility(View.GONE); expand.setVisibility(View.VISIBLE); } }); moon.findViewById(R.id.collapse_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { expand.setVisibility(View.GONE); collapse.setVisibility(View.VISIBLE); } }); moon.findViewById(R.id.plus_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { params.height += 10; windowManager.updateViewLayout(moon, params); } }); moon.findViewById(R.id.minus_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { params.height -= 10; windowManager.updateViewLayout(moon, params); } }); moon.findViewById(R.id.root_container).setOnTouchListener(new View.OnTouchListener() { private int initialX; private int initialY; private float initialTouchX; private float initialTouchY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: initialX = params.x; initialY = params.y; initialTouchX = event.getRawX(); initialTouchY = event.getRawY(); return true; case MotionEvent.ACTION_MOVE: params.x = initialX + (int) (event.getRawX() - initialTouchX); params.y = initialY + (int) (event.getRawY() - initialTouchY); windowManager.updateViewLayout(moon, params); return true; } return false; } }); } public void startCapture() { timer.start(); resetText(moon.findViewById(R.id.expand_main)); Toast.makeText(Moon.this, "Start capture.", Toast.LENGTH_LONG).show(); final int width = metrics.widthPixels; final int height = metrics.heightPixels; int density = metrics.densityDpi; final ImageReader imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 1); final Handler handler = new Handler(); int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; try { mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data); virtualDisplay = mediaProjection.createVirtualDisplay("screen", width, height, density, flags, imageReader.getSurface(), null, handler); } catch (Exception e) { Toast.makeText(Moon.this, e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { try { Image image = reader.acquireLatestImage(); if (image != null) { Image.Plane[] planes = image.getPlanes(); ByteBuffer buffer = planes[0].getBuffer(); Log.e("Image", String.format("%d %d %d %d", width, height, planes[0].getRowStride(), planes[0].getPixelStride())); Bitmap bitmap = Bitmap.createBitmap(planes[0].getRowStride() / planes[0].getPixelStride(), height, Bitmap.Config.ARGB_8888); bitmap.copyPixelsFromBuffer(buffer); resizeImage(bitmap); image.close(); } } catch (Exception e) { e.printStackTrace(); } finally { imageReader.close(); stopCapture(); collapse.setVisibility(View.GONE); params.x = 0; params.y = 0; windowManager.updateViewLayout(moon, params); expand.setVisibility(View.VISIBLE); } } }, handler); } public void stopCapture() { Toast.makeText(Moon.this, "Stop capture.", Toast.LENGTH_LONG).show(); if (mediaProjection != null) { mediaProjection.stop(); virtualDisplay.release(); mediaProjection = null; } } public void resizeImage(Bitmap bitmap) { int[] location = new int[2]; LinearLayout capture = moon.findViewById(R.id.capture_area); capture.getLocationOnScreen(location); bitmap = Bitmap.createBitmap(bitmap, location[0], location[1], capture.getWidth(), capture.getHeight()); startDetect(bitmap); } public void startDetect(Bitmap bitmap) { textRecognizer.processImage(FirebaseVisionImage.fromBitmap(bitmap)) .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(FirebaseVisionText result) { List blocks = result.getTextBlocks(); String question = ""; ArrayList answers = new ArrayList(); if (blocks.size() > 0) { question = blocks.get(0).getText().replace("\n", " "); for (int i = 1; i < blocks.size(); i++) { if(blocks.get(i).getBoundingBox().left < params.width / 2) answers.addAll(Arrays.asList(blocks.get(i).getText().split("\n"))); } Log.e("OCR-question", question); Log.e("OCR-answers", answers.toString()); } else { question = "Con gà có mấy chân"; answers.add("2"); answers.add("3"); answers.add("4"); } for (int i = 0; i < ansId.length; i++){ try { // answers.set(i, removeAccent(answers.get(i))); ((TextView) moon.findViewById(ansId[i])).setText(answers.get(i)); } catch (Exception e) { Log.e("OCR", e.getMessage()); } } ((TextView) moon.findViewById(R.id.question)).setText(question); startSearch(question, answers); // emitQuestion(question, answers); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.e("OCR", "Error"); } }); } public void emitQuestion(String question, ArrayList answers) { try { JSONObject data = new JSONObject() .put("q", question) .put("a", new JSONArray(answers)) .put("u", username); socket.emit("question", data); } catch (Exception e) { Log.e("emitQuestion", e.getMessage()); } } public void startSearch(String question, ArrayList answer){ AsyncTask search = new AsyncTask() { @Override public JSONObject doInBackground(JSONObject[] values) { try { Log.e("JSON", values[0].toString()); // socket.emit("question", values[0]); String res = Jsoup.connect(host + "/count") .header("Content-Type", "application/json") .requestBody(values[0].toString()) .userAgent("Mozilla") .method(Method.POST) .ignoreContentType(true) .execute() .body(); JSONObject json = new JSONObject(res); JSONObject count = json.getJSONObject("count"); publishProgress(count); System.out.println(json.getDouble("time")); } catch (Exception e) { Log.e("Search", e.getMessage()); } return null; } @Override public void onProgressUpdate(JSONObject... values) { showCount(values[0]); } }; try { JSONObject data = new JSONObject() .put("q", question) .put("a", new JSONArray(answer)) .put("u", username); search.execute(data); } catch (Exception e) { Log.e("Search", e.getMessage()); } } public void showCount(JSONObject value) { System.out.println(value); ((TextView) moon.findViewById(R.id.text)).setText(value.toString()); try { JSONArray num = value.getJSONArray("num"); for (int i = 0; i < numId.length; i++) { ((TextView) moon.findViewById(numId[i])).setText(num.get(i).toString()); } } catch (Exception e) { Log.e("Count", "Parse error"); e.printStackTrace(); } } private boolean isViewCollapsed() { return moon == null || moon.findViewById(R.id.collapse_view).getVisibility() == View.VISIBLE; } public String removeAccent(String str) { return Pattern.compile("\\p{InCombiningDiacriticalMarks}+").matcher(Normalizer.normalize(str, Normalizer.Form.NFD)).replaceAll("").replaceAll("đ", "d").replaceAll("Đ", "D"); } public void resetText(View view) { if (view instanceof TextView) { ((TextView)view).setText(""); return; } else if (view instanceof ViewGroup) { ViewGroup group = (ViewGroup) view; for (int i = 0; i < group.getChildCount(); ++i) { resetText(group.getChildAt(i)); } } } @Override public void onDestroy() { super.onDestroy(); stopCapture(); if (moon != null) windowManager.removeView(moon); } } \ No newline at end of file