// Created by plusminus on 21:11:40 - 13.06.2008
package org.androad.ui.settings;
import java.util.ArrayList;
import org.androad.R;
import org.androad.preferences.Preferences;
import org.androad.sys.ors.adt.ORSServer;
import org.androad.ui.AndNavBaseActivity;
import org.androad.ui.common.CommonCallbackAdapter;
import org.androad.ui.common.CommonDialogFactory;
import org.androad.ui.common.OnClickOnFocusChangedListenerAdapter;
import org.androad.ui.common.CommonDialogFactory.CreateORSServerSelectionOptions;
import org.androad.ui.common.adapters.ORSServerListAdapter;
import org.androad.ui.common.adapters.ORSServerListAdapter.ORSServerItem;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class SettingsORSServer extends AndNavBaseActivity {
// ===========================================================
// Final Fields
// ===========================================================
protected static final int CONTEXTMENU_USEITEM = 0;
private static final int MENU_HELP_ID = 0;
private static final int MENU_PINGALL_ID = MENU_HELP_ID + 1;
private static final int DIALOG_SHOW_HELP = 0;
protected static final int DIALOG_SHOW_SERVEROPTIONS = DIALOG_SHOW_HELP + 1;
private static final String STATE_SERVER_ITEMS_ID = "state_server_items_id";
// ===========================================================
// Fields
// ===========================================================
protected Bundle bundleCreatedWith;
protected ListView mServerList;
protected ORSServerItem mSelectedServerItem;
private ArrayList<ORSServerItem> mServerItems = new ArrayList<ORSServerItem>();
private final Runnable mListInvalidationCallback = new Runnable(){
@Override
public void run() {
runOnUiThread(new Runnable(){
@Override
public void run() {
SettingsORSServer.this.mServerList.invalidateViews();
}
});
}
};
// ===========================================================
// Constructors
// ===========================================================
/** Called when the activity is first created. */
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState, false);
Preferences.applySharedSettings(this);
this.setContentView(R.layout.settings_orsserver);
/*
* Save the Extras Bundle of the Intent this Activity was created with,
* because it contains the Information, that will finally be used for a
* GeoCode API.
*/
this.bundleCreatedWith = this.getIntent().getExtras();
this.mServerList = (ListView) this.findViewById(R.id.list_orsservers);
final TextView empty = new TextView(this);
empty.setText(R.string.list_empty);
this.mServerList.setEmptyView(empty);
this.applyTopMenuButtonListeners();
initListView();
if(savedInstanceState == null){ // First start
updateServerListItems();
setServerAdapter();
}
}
private void updateServerListItems() {
final ORSServer[] servers = ORSServer.values();
this.mServerItems = new ArrayList<ORSServerItem>(servers.length);
for(final ORSServer s : servers) {
this.mServerItems.add(new ORSServerItem(s));
}
}
private void pingAllServers(){
for(final ORSServerItem o : this.mServerItems) {
o.updatePingInformation(this.mListInvalidationCallback);
}
Toast.makeText(this, R.string.please_wait_a_moment, Toast.LENGTH_SHORT).show();
}
private void setServerAdapter() {
final ORSServerListAdapter adapter = new ORSServerListAdapter(this);
adapter.setListItems(this.mServerItems);
this.mServerList.setAdapter(adapter);
pingAllServers();
}
protected void initListView() {
this.mServerList.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
SettingsORSServer.this.mSelectedServerItem = (ORSServerItem)parent.getAdapter().getItem(position);
showDialog(DIALOG_SHOW_SERVEROPTIONS);
}
});
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods from SuperClass/Interfaces
// ===========================================================
@Override
public void onSaveInstanceState(final Bundle out) {
out.putParcelableArrayList(STATE_SERVER_ITEMS_ID, this.mServerItems);
}
@Override
protected void onRestoreInstanceState(final Bundle in) {
final ArrayList<ORSServerItem> restoredItems = in.getParcelableArrayList(STATE_SERVER_ITEMS_ID);
if(restoredItems == null){
updateServerListItems();
}else{
this.mServerItems = restoredItems;
setServerAdapter();
}
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
menu.add(0, MENU_HELP_ID, Menu.NONE, R.string.instructions).setIcon(R.drawable.information).setAlphabeticShortcut('i');
menu.add(0, MENU_PINGALL_ID, Menu.NONE, R.string.orsserver_pingall).setIcon(R.drawable.refresh).setAlphabeticShortcut('r');
return super.onCreateOptionsMenu(menu);
}
@Override
protected Dialog onCreateDialog(final int id) {
switch(id){
case DIALOG_SHOW_HELP:
return CommonDialogFactory.createORSServerSelectionInstructionsDialog(this, new CommonCallbackAdapter<Void>(){
@Override
public void onSuccess(final Void result) {
/* Nothing. */
}
});
case DIALOG_SHOW_SERVEROPTIONS:
return CommonDialogFactory.createORSServerSelectionOptionsDialog(this, new CommonCallbackAdapter<CreateORSServerSelectionOptions>(){
@Override
public void onSuccess(final CreateORSServerSelectionOptions result) {
switch(result){
case USE:
Preferences.saveORSServer(SettingsORSServer.this, SettingsORSServer.this.mSelectedServerItem.mORSServer);
Toast.makeText(SettingsORSServer.this, R.string.save, Toast.LENGTH_SHORT).show();
break;
case PING:
Toast.makeText(SettingsORSServer.this, R.string.please_wait_a_moment, Toast.LENGTH_SHORT).show();
SettingsORSServer.this.mSelectedServerItem.updatePingInformation(SettingsORSServer.this.mListInvalidationCallback);
break;
case INFORMATION:
new AlertDialog.Builder(SettingsORSServer.this)
.setIcon(R.drawable.information)
.setTitle(R.string.orsserver_serverinfo_title)
.setMessage(SettingsORSServer.this.mSelectedServerItem.mORSServer.SERVERDESCRIPTION)
.setPositiveButton(R.string.ok, null)
.create()
.show();
break;
}
}
});
default:
return null;
}
}
@Override
public boolean onMenuItemSelected(final int featureId, final MenuItem item) {
switch(item.getItemId()){
case MENU_HELP_ID:
showDialog(DIALOG_SHOW_HELP);
return true;
case MENU_PINGALL_ID:
pingAllServers();
return true;
}
return super.onMenuItemSelected(featureId, item);
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
switch(resultCode){
case SUBACTIVITY_RESULTCODE_CHAINCLOSE_SUCCESS:
this.setResult(SUBACTIVITY_RESULTCODE_CHAINCLOSE_SUCCESS, data);
this.finish();
break;
case SUBACTIVITY_RESULTCODE_CHAINCLOSE_QUITTED:
this.setResult(SUBACTIVITY_RESULTCODE_CHAINCLOSE_QUITTED, data);
this.finish();
break;
}
/* Finally call the super()-method. */
super.onActivityResult(requestCode, resultCode, data);
}
// ===========================================================
// Methods
// ===========================================================
protected void applyTopMenuButtonListeners() {
/* Set Listener for Close-Button. */
new OnClickOnFocusChangedListenerAdapter(this.findViewById(R.id.ibtn_settings_orsserver_close)) {
@Override
public void onBoth(final View me, final boolean focused) {
if (focused && SettingsORSServer.super.mMenuVoiceEnabled) {
MediaPlayer.create(SettingsORSServer.this, R.raw.close).start();
}
}
@Override
public void onClicked(final View me) {
/*
* Set ResultCode that the calling activity knows that we want
* to go back to the Base-Menu
*/
SettingsORSServer.this.setResult(SUBACTIVITY_RESULTCODE_CHAINCLOSE_QUITTED);
SettingsORSServer.this.finish();
}
};
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}