package it.quadrata.android.quad_prox_mob; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.text.Editable; import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; public class WidgetConfigActivity extends Activity { private static final String TAG = "it.quadrata.android.quad_prox_mob.WidgetConfigActivity"; private int widgetId = AppWidgetManager.INVALID_APPWIDGET_ID; private Button savePrefsButton; private EditText fontSizeInput; private EditText intervalInput; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setResult(RESULT_CANCELED); setContentView(R.layout.widget_config_layout); Intent intent = getIntent(); Bundle extras = intent.getExtras(); if (extras != null) { widgetId = extras.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } // If they gave us an intent without the widget id, just bail. if (widgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish(); } fontSizeInput = (EditText) findViewById(R.id.fontSize); intervalInput = (EditText) findViewById(R.id.interval); SharedPreferences widgetPrefs = getSharedPreferences("WidgetPrefs_" + widgetId, Context.MODE_PRIVATE); try { int fontSize = Integer.valueOf(widgetPrefs.getString("fontSize", WidgetPrefsActivity.defaultFontSize)); int interval = Integer.valueOf(widgetPrefs.getString("interval", WidgetPrefsActivity.defaultUpdateInterval)); fontSizeInput.setText(String.valueOf(fontSize)); intervalInput.setText(String.valueOf(interval)); } catch (Exception e) { if (e.getMessage() == null) { Log.i(TAG, "Null pointer Exception"); } else { Log.i(TAG, e.getMessage()); } } // Retrieving of login preferences Context context = WidgetConfigActivity.this; String cluster = getClusterName(context); if (cluster == null || cluster.length() == 0) { cluster = "No Name"; } String[] items = new String[] {cluster}; Spinner spinner = (Spinner) findViewById(R.id.cluster); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); savePrefsButton = (Button) findViewById(R.id.savePrefsButton); savePrefsButton.setOnClickListener(savePrefsButtonOnClickListener); } protected Intent get_ACTION_APPWIDGET_UPDATE_Intent(Context context) { ComponentName thisAppWidget = new ComponentName(context.getPackageName(), WidgetProvider.class.getName()); int[] appWidgetIds = AppWidgetManager.getInstance(context).getAppWidgetIds(thisAppWidget); Intent intent = new Intent(context, WidgetProvider.class); intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); return intent; } public static String getClusterName(final Context context) { final AtomicReference<String> clusterName = new AtomicReference<String>(); Thread t = new Thread(new Runnable() { SharedPreferences authPref = context.getSharedPreferences("AuthPref", Context.MODE_PRIVATE); final String server = authPref.getString("server", ""); final String username = authPref.getString("username", ""); final String realm = authPref.getString("realm", ""); final String password = authPref.getString("password", ""); @Override public void run() { try { ProxmoxCustomApp httpApp = (ProxmoxCustomApp) context.getApplicationContext(); HttpClient serverHttpClient = httpApp.getHttpClient(); // Proxmox ticket request HttpPost authRequest = new HttpPost(server + "/api2/json/access/ticket"); List<NameValuePair> authParameters = new ArrayList<NameValuePair>(); authParameters.add(new BasicNameValuePair("username", username + "@" + realm)); authParameters.add(new BasicNameValuePair("password", password)); HttpEntity authEntity = new UrlEncodedFormEntity( authParameters); authRequest.setEntity(authEntity); String authResponse = serverHttpClient.execute(authRequest, serverResponseHandler); // Ticket and token extraction from authentication // json string JSONObject authObject = new JSONObject(authResponse); JSONObject data = authObject.getJSONObject("data"); String ticket = data.getString("ticket"); //String token = data.getString("CSRFPreventionToken"); // Cluster info request HttpGet clusterRequest = new HttpGet(server + "/api2/json/cluster/status"); clusterRequest.addHeader("Cookie", "PVEAuthCookie=" + ticket); String clusterResponse = serverHttpClient.execute( clusterRequest, serverResponseHandler); JSONObject clusterObject = new JSONObject(clusterResponse); JSONArray clusterDataArray = clusterObject .getJSONArray("data"); JSONObject clusterInfo = (JSONObject) clusterDataArray.get(0); clusterName.set(clusterInfo.optString("name")); } catch (JSONException e) { if (e.getMessage() != null) { Log.e(TAG, e.getMessage()); } else { Log.e(TAG, "null"); } } catch (IOException e) { if (e.getMessage() != null) { Log.e(TAG, e.getMessage()); } else { Log.e(TAG, "null"); } } catch (RuntimeException e) { if (e.getMessage() != null) { Log.e(TAG, e.getMessage()); } else { Log.e(TAG, "null"); } } } }); try { t.start(); t.join(); } catch (InterruptedException e) { if (e.getMessage() != null) { Log.e(TAG, e.getMessage()); } else { Log.e(TAG, "null"); } } return clusterName.get(); } private static ResponseHandler<String> serverResponseHandler = new ResponseHandler<String>() { @Override public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException { HttpEntity entity = response.getEntity(); String result = EntityUtils.toString(entity); return result; } }; private Button.OnClickListener savePrefsButtonOnClickListener = new Button.OnClickListener(){ private boolean error = true; @Override public void onClick(View v) { int duration = 0; Editable fontSize = fontSizeInput.getText(); Editable interval = intervalInput.getText(); SharedPreferences widgetPrefs = getSharedPreferences("WidgetPrefs_" + widgetId, Context.MODE_PRIVATE); SharedPreferences.Editor widgetPrefsEditor = widgetPrefs.edit(); try { int fontsize = Integer.parseInt(fontSize.toString()); if (fontsize > 0) { error = false; widgetPrefsEditor.putString("fontSize", Integer.toString(fontsize)); } else { fontSize.clear(); fontSizeInput.setError("Error: Number < 1"); } } catch (NumberFormatException nfe) { fontSize.clear(); fontSizeInput.setError("Error: Not number"); } try { duration = Integer.parseInt(interval.toString()); if (duration > 0) { error = false; widgetPrefsEditor.putString("interval", Integer.toString(duration)); } else { interval.clear(); intervalInput.setError("Error: Number < 1"); } } catch (NumberFormatException nfe) { interval.clear(); intervalInput.setError("Error: Not number"); } if (error == false) { widgetPrefsEditor.commit(); final Context context = WidgetConfigActivity.this; AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); Uri uriData = Uri.withAppendedPath( Uri.parse(WidgetProvider.URI_SCHEME + "://widget/id/"), String.valueOf(widgetId)); // First update ComponentName thisAppWidget = new ComponentName(context.getPackageName(), WidgetConfigActivity.class.getName()); Intent firstUpdate = new Intent(WidgetConfigActivity.this, WidgetProvider.class); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget); firstUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE/*"android.appwidget.action.APPWIDGET_UPDATE"*/); firstUpdate.setData(uriData); firstUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); //Put the ID of our widget to identify it later. firstUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); context.sendBroadcast(firstUpdate); Intent intentUpdate = new Intent(context, WidgetProvider.class); intentUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); intentUpdate.setData(uriData);//One Alarm per instance. //We will need the exact instance to identify the intent. intentUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); WidgetProvider.addUri(widgetId, uriData); PendingIntent pendingIntentAlarm = PendingIntent.getBroadcast( WidgetConfigActivity.this, 0, intentUpdate, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (duration * 60 * 1000), (duration * 60 * 1000), pendingIntentAlarm); Log.d(TAG, "Created Alarm. Action URI = " + uriData.toString() + " Minuts = " + duration); //Return the original widget ID, found in onCreate(). Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); setResult(RESULT_OK, resultValue); finish(); } } }; }