javaandroidhttphttphandlerhttpserver

When request to httpserver in android app wait the click listener for button in alertdialog and return response for client


When the http server (on AndroidApp) receives a request, I show an alert dialog to the user about this request. After the user responds to this alert dialog, I want it to return to the client (Browser).

I also want to add a 10 second timeout in case the user doesn't press any button.

Create HttpServer

`

private HttpServerManager() {
    try {
        InetSocketAddress address = new InetSocketAddress(8080);
        httpServer = HttpServer.create(address, 0);

        httpServer.createContext("/getDeviceRegister", new EchoGetHandlerForDeviceRegister());

        httpServer.setExecutor(null);
        httpServer.start();

        Log.i(TAG, "HttpServer Start");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

`

HttpHandler for -> EchoGetHandlerForDeviceRegister

`


class EchoGetHandlerForDeviceRegister implements HttpHandler {

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override

    public void handle(HttpExchange he) throws IOException {
        // parse request
        Map<String, Object> parameters = new HashMap<String, Object>();
        URI requestedUri = he.getRequestURI();
        String query = requestedUri.getRawQuery();

        HttpServerManager.parseQuery(query, parameters);

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
//SHOW DIALOG HERE
                TestApplication.instance().showAdminRegisterDialog(he.getRemoteAddress());

            }
        });

        // send response
        String response = "<h1>Device Register</h1>";
        for (String key : parameters.keySet())
            response += key + " = " + parameters.get(key) + "\n";
        he.sendResponseHeaders(200, response.length());
        OutputStream os = he.getResponseBody();
        os.write(response.toString().getBytes());

        os.close();
    }
}

`

ShowDialog Method

`

public void showAdminRegisterDialog(InetSocketAddress clientAdress){
    Log.i(TAG, "showAdminRegisterDialog()");
    if (adminRegisterDialog != null)
        adminRegisterDialog.cancel();

    Context context = MainActivity.instance();

    AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.NewDialog2);
    builder = new AlertDialog.Builder(context);

    LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            adminRegisterView = li.inflate(R.layout.register_dialog, null);


    builder.setView(adminRegisterView);
    builder.setCancelable(false);

    TextView deviceNameText = adminRegisterView.findViewById(R.id.deviceNameText);
    TextView infoText = adminRegisterView.findViewById(R.id.infoText);

    deviceNameText.setText(clientAdress.toString());
    infoText.setText(R.string.register_admin_allow_text);

    AppCompatButton allowButton = adminRegisterView.findViewById(R.id.allowButton);
    AppCompatButton notAllowButton = adminRegisterView.findViewById(R.id.notAllowButton);


    allowButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Log.i(TAG,"allowButton");



            adminRegisterDialog.dismiss();
        }
    });

    notAllowButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Log.i(TAG,"not allowButton");

            adminRegisterDialog.dismiss();

        }
    });

    adminRegisterDialog = builder.create();
    adminRegisterDialog.show();
    adminRegisterDialog.getWindow().setLayout(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);

}

`

-I tried using AsyncTask but I couldn't because it was too complicated. -Thread.sleep didn't work as it stopped all processes.


Solution

  • I solved the problem as follows: I am using Alertdialog in class where I defined HttpServer. I keep it in a while loop until the user responds when the alertdialog is shown. After the user click alertdialog button, I finish the while loop and send a response to the client.

    boolean isClick = false;
    
    //SHOW ALERT DIALOG HERE
    
    
    //ALERT DILOG CLICK LISTENER
      result.getAllowButton().setOnClickListener(new View.OnClickListener() {
        isClick = true;
     });
    
    
    
    while (!isClick) {
        Log.i(TAG, "in while loop");
    }
    
    Log.i(TAG, "out while loop");
            isClick = false;
    
          // send response
            String response = "<h1>Alert Dialog Clicked</h1>";
            for (String key : parameters.keySet())
                response += key + " = " + parameters.get(key) + "\n";
            he.sendResponseHeaders(200, response.length());
            OutputStream os = he.getResponseBody();
            os.write(response.toString().getBytes());
            os.close();