package it.quadrata.android.quad_prox_mob; import java.io.IOException; import java.net.URI; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpGet; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONObject; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.TextView; public class LogStatsActivity extends Activity { // Authentication credentials private static String server; private static String ticket; // Task info private static String id; private static String type; private static String node; private static String status; private static String user; private static String start; private static String upid; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.log_stats_layout); // Task info retrieving Intent logStatsIntent = LogStatsActivity.this.getIntent(); server = logStatsIntent.getStringExtra("server"); ticket = logStatsIntent.getStringExtra("ticket"); node = logStatsIntent.getStringExtra("node"); upid = logStatsIntent.getStringExtra("upid"); updateTaskStats(); } private void updateTaskStats() { final TextView taskNameText = (TextView) findViewById(R.id.taskName); final TextView taskNodeText = (TextView) findViewById(R.id.taskNode); final TextView taskStatusText = (TextView) findViewById(R.id.taskStatus); final TextView taskUserText = (TextView) findViewById(R.id.taskUser); final TextView taskStartText = (TextView) findViewById(R.id.taskStart); final TextView taskProgressText = (TextView) findViewById(R.id.taskProgress); taskProgressText.setText(""); new Thread(new Runnable() { @Override public void run() { try { if (isOnline() == false) { throw new Exception(); } ProxmoxCustomApp httpApp = (ProxmoxCustomApp) getApplication(); HttpClient taskHttpClient = httpApp.getHttpClient(); // Task progress request HttpGet taskProgressRequest = new HttpGet(); URI taskProgressUri = new URI(server + "/api2/json/nodes/" + node + "/tasks/" + upid + "/log"); taskProgressRequest.setURI(taskProgressUri); taskProgressRequest.addHeader("Cookie", "PVEAuthCookie=" + ticket); String progressJson = taskHttpClient.execute( taskProgressRequest, taskResponseHandler); JSONObject progressObject = new JSONObject(progressJson); JSONArray progressArray = progressObject .getJSONArray("data"); final int progressArrayLenght = progressArray.length(); JSONObject progressRowObject = new JSONObject(); for (int i = 0; i <= (progressArrayLenght - 1); i++) { progressRowObject = progressArray.getJSONObject(i); final String progressRow = progressRowObject .getString("t"); taskProgressText.post(new Runnable() { @Override public void run() { taskProgressText.append(progressRow + "\n\n"); } }); } // Task status request HttpGet taskStatusRequest = new HttpGet(); URI taskStatusUri = new URI(server + "/api2/json/nodes/" + node + "/tasks/" + upid + "/status"); taskStatusRequest.setURI(taskStatusUri); taskStatusRequest.addHeader("Cookie", "PVEAuthCookie=" + ticket); String statusJson = taskHttpClient.execute( taskStatusRequest, taskResponseHandler); JSONObject statusObject = new JSONObject(statusJson); JSONObject statusData = statusObject.getJSONObject("data"); id = statusData.optString("id"); if (id.equals("")) { id = "###"; } type = statusData.getString("type"); node = statusData.getString("node"); status = statusData.getString("status"); user = statusData.getString("user"); start = new SimpleDateFormat("MMM dd HH:mm:ss") .format(new Date( statusData.getLong("starttime") * 1000)); LogStatsActivity.this.runOnUiThread(new Runnable() { @Override public void run() { taskNameText.setText(id + " (" + type + ")"); taskNodeText.setText(node); taskStatusText.setText(status); taskUserText.setText(user); taskStartText.setText(start); } }); } catch (Exception e) { if (e.getMessage() != null) { Log.e(e.getClass().getName(), e.getMessage()); } else { Log.e(e.getClass().getName(), "No error message"); } showErrorDialog(); } } }).start(); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater nodesMenu_inflater = getMenuInflater(); nodesMenu_inflater.inflate(R.menu.log_stats_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.updateLogStatsPref: updateTaskStats(); return true; default: return super.onOptionsItemSelected(item); } } private final ResponseHandler<String> taskResponseHandler = new ResponseHandler<String>() { @Override public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException { HttpEntity entity = response.getEntity(); String result = EntityUtils.toString(entity); return result; } }; private void showErrorDialog() { LogStatsActivity.this.runOnUiThread(new Runnable() { @Override public void run() { AlertDialog.Builder builder = new AlertDialog.Builder( LogStatsActivity.this); builder.setTitle("Connection error"); builder.setMessage("Unable to connect. \nDo you want to retry?"); builder.setCancelable(false); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { updateTaskStats(); } }); builder.setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); } }); AlertDialog alertDialog = builder.create(); if (!isFinishing()) { alertDialog.show(); } } }); } public boolean isOnline() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); return (networkInfo != null && networkInfo.isConnected()); } }