diff options
25 files changed, 1012 insertions, 954 deletions
diff --git a/android/.idea/modules.xml b/android/.idea/modules.xml index 90e9d3fc59f..2f31308dd93 100644 --- a/android/.idea/modules.xml +++ b/android/.idea/modules.xml @@ -17,7 +17,6 @@ <module fileurl="file://$PROJECT_DIR$/test/test.iml" filepath="$PROJECT_DIR$/test/test.iml" /> <module fileurl="file://$PROJECT_DIR$/test/android/testApp.iml" filepath="$PROJECT_DIR$/test/android/testApp.iml" /> <module fileurl="file://$PROJECT_DIR$/test/plugins/testPlugins.iml" filepath="$PROJECT_DIR$/test/plugins/testPlugins.iml" /> - <module fileurl="file://$PROJECT_DIR$/test/src/test_Ice_acm/test_Ice_acm.iml" filepath="$PROJECT_DIR$/test/src/test_Ice_acm/test_Ice_acm.iml" /> </modules> </component> </project> diff --git a/android/demo/chat/build.gradle b/android/demo/chat/build.gradle index acd32e1f7eb..2e7bed06d67 100644 --- a/android/demo/chat/build.gradle +++ b/android/demo/chat/build.gradle @@ -11,6 +11,8 @@ apply plugin: 'com.android.application' apply from: "$rootProject.projectDir/../java/gradle/ice.gradle" apply plugin: 'slice' +project.slice.output = project.file("${project.buildDir}/generated/source/ice") + slice { java { set1 { @@ -60,11 +62,6 @@ clean { delete("src/main/res/raw/client.bks") } -idea.module { - excludeDirs -= file(buildDir) - buildDir.listFiles({d, f ->f != 'generated-src'} as FilenameFilter).each { excludeDirs += it } -} - dependencies { compile localDependency('ice') compile localDependency('glacier2') diff --git a/android/demo/chat/chat.iml b/android/demo/chat/chat.iml index 568a2dbfd66..71b061541f7 100644 --- a/android/demo/chat/chat.iml +++ b/android/demo/chat/chat.iml @@ -50,7 +50,7 @@ <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/build/generated-src" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/ice" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" /> @@ -60,7 +60,6 @@ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" /> - <excludeFolder url="file://$MODULE_DIR$/build/generated-src" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" /> diff --git a/android/demo/chat/src/main/java/com/zeroc/chat/ChatActivity.java b/android/demo/chat/src/main/java/com/zeroc/chat/ChatActivity.java index 68684261cd5..5067ff8fab1 100644 --- a/android/demo/chat/src/main/java/com/zeroc/chat/ChatActivity.java +++ b/android/demo/chat/src/main/java/com/zeroc/chat/ChatActivity.java @@ -14,6 +14,7 @@ import java.util.List; import android.app.AlertDialog; import android.app.Dialog; +import android.app.DialogFragment; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; @@ -31,11 +32,10 @@ import com.zeroc.chat.service.ChatRoomListener; public class ChatActivity extends SessionActivity { - private static final int DIALOG_MESSAGE_TOO_LONG = 2; - private static final int USERS_ID = Menu.FIRST; private static final int LOGOUT_ID = Menu.FIRST + 1; private static final int MAX_MESSAGE_SIZE = 1024; + public static final String MESSAGE_TOO_LONG_TAG = "mtl"; private EditText _text; private ArrayAdapter<String> _adapter; @@ -65,12 +65,12 @@ public class ChatActivity extends SessionActivity public void error() { - showDialog(DIALOG_FATAL); + showDialogFatal(); } public void inactivity() { - showDialog(DIALOG_FATAL); + showDialogFatal(); } private void add(final String msg) @@ -84,6 +84,18 @@ public class ChatActivity extends SessionActivity } }; + public static class MessageTooLongDialogFragment extends DialogFragment + { + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Error") + .setMessage("Message length exceeded, maximum length is " + MAX_MESSAGE_SIZE + " characters."); + return builder.create(); + } + } + @Override ChatRoomListener getChatRoomListener() { @@ -173,20 +185,6 @@ public class ChatActivity extends SessionActivity return super.onOptionsItemSelected(item); } - @Override - protected Dialog onCreateDialog(final int id) - { - if(id == DIALOG_MESSAGE_TOO_LONG) - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Error"); - builder.setMessage("Message length exceeded, maximum length is " + MAX_MESSAGE_SIZE + " characters."); - return builder.create(); - } - - return super.onCreateDialog(id); - } - private void sendText() { String t = _text.getText().toString().trim(); @@ -196,7 +194,8 @@ public class ChatActivity extends SessionActivity } if(t.length() > MAX_MESSAGE_SIZE) { - showDialog(DIALOG_MESSAGE_TOO_LONG); + DialogFragment dialog = new MessageTooLongDialogFragment(); + dialog.show(getFragmentManager(), MESSAGE_TOO_LONG_TAG); return; } _text.setText(""); diff --git a/android/demo/chat/src/main/java/com/zeroc/chat/ChatUtils.java b/android/demo/chat/src/main/java/com/zeroc/chat/ChatUtils.java index cbeaac3c5f6..93a6b7130b4 100644 --- a/android/demo/chat/src/main/java/com/zeroc/chat/ChatUtils.java +++ b/android/demo/chat/src/main/java/com/zeroc/chat/ChatUtils.java @@ -36,17 +36,5 @@ public class ChatUtils dtf.setTimeZone(TimeZone.getDefault()); return dtf.format(new Date(timestamp)); } - - public static String formatUsername(String in) - { - try - { - in = in.substring(0, 1).toUpperCase() + in.substring(1, in.length()).toLowerCase(); - } - catch(IndexOutOfBoundsException ex) - { - } - return in; - } -}; +} diff --git a/android/demo/chat/src/main/java/com/zeroc/chat/LoginActivity.java b/android/demo/chat/src/main/java/com/zeroc/chat/LoginActivity.java index e2ad3c64eff..571bda90060 100644 --- a/android/demo/chat/src/main/java/com/zeroc/chat/LoginActivity.java +++ b/android/demo/chat/src/main/java/com/zeroc/chat/LoginActivity.java @@ -12,6 +12,7 @@ package com.zeroc.chat; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; +import android.app.DialogFragment; import android.content.ComponentName; import android.content.DialogInterface; import android.content.Intent; @@ -24,7 +25,6 @@ import android.text.TextWatcher; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; -import android.os.Build.VERSION; import com.zeroc.chat.service.ChatService; import com.zeroc.chat.service.Service; @@ -32,16 +32,14 @@ import com.zeroc.chat.service.SessionListener; public class LoginActivity extends Activity { - private static final int DIALOG_ERROR = 1; - private static final int DIALOG_CONFIRM = 2; - private static final int DIALOG_INVALID_HOST = 3; - private static final String DEFAULT_HOST = "demo.zeroc.com"; private static final boolean DEFAULT_SECURE = false; private static final String HOSTNAME_KEY = "host"; private static final String USERNAME_KEY = "username"; private static final String PASSWORD_KEY = "password"; private static final String SECURE_KEY = "secure"; + public static final String LOGIN_ERROR_TAG = "loginerror"; + public static final String INVALID_HOST_TAG = "invalidhost"; private Button _login; private EditText _hostname; @@ -54,6 +52,51 @@ public class LoginActivity extends Activity private Service _service; private Intent _chatServiceIntent; + public static class LoginErrorDialogFragment extends DialogFragment + { + public static LoginErrorDialogFragment newInstance(String message) + { + LoginErrorDialogFragment frag = new LoginErrorDialogFragment(); + Bundle args = new Bundle(); + args.putString("message", message); + frag.setArguments(args); + return frag; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setMessage(getArguments().getString("message")) + .setPositiveButton("Ok", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + ((LoginActivity) getActivity()).loginErrorOk(); + } + }); + return builder.create(); + } + } + + public static class InvalidHostDialogFragment extends DialogFragment + { + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Error") + .setMessage("The hostname is invalid.") + .setPositiveButton("Ok", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + } + }); + return builder.create(); + } + } + private SessionListener _listener = new SessionListener() { public void onLoginInProgress() @@ -64,7 +107,6 @@ public class LoginActivity extends Activity public void onConnectConfirm() { - showDialog(DIALOG_CONFIRM); } public void onLogin() @@ -75,7 +117,9 @@ public class LoginActivity extends Activity public void onLoginError() { setLoginState(); - showDialog(DIALOG_ERROR); + DialogFragment dialog = LoginErrorDialogFragment.newInstance( + (_service != null) ? _service.getLoginError() : ""); + dialog.show(getFragmentManager(), LOGIN_ERROR_TAG); } }; @@ -99,6 +143,12 @@ public class LoginActivity extends Activity } }; + private void loginErrorOk() + { + _loginInProgress = false; + setLoginState(); + } + private void setLoginState() { if(_loginInProgress) @@ -128,7 +178,8 @@ public class LoginActivity extends Activity final String ipre = "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"; if(!hostname.matches(hostre) && !hostname.matches(ipre)) { - showDialog(DIALOG_INVALID_HOST); + DialogFragment dialog = new InvalidHostDialogFragment(); + dialog.show(getFragmentManager(), INVALID_HOST_TAG); return; } @@ -150,7 +201,7 @@ public class LoginActivity extends Activity { edit.putBoolean(SECURE_KEY, secure); } - edit.commit(); + edit.apply(); _login.setEnabled(false); @@ -248,55 +299,4 @@ public class LoginActivity extends Activity _chatServiceIntent = new Intent(LoginActivity.this, ChatService.class); startService(_chatServiceIntent); } - - @Override - protected Dialog onCreateDialog(int id) - { - switch (id) - { - case DIALOG_ERROR: - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Error"); - builder.setMessage(""); // Details provided in onPrepareDialog - builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - _loginInProgress = false; - setLoginState(); - } - }); - return builder.create(); - } - - case DIALOG_INVALID_HOST: - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Error"); - builder.setMessage("The hostname is invalid."); - builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - } - }); - return builder.create(); - } - - } - - return null; - } - - @Override - protected void onPrepareDialog(int id, Dialog dialog) - { - super.onPrepareDialog(id, dialog); - if(id == DIALOG_ERROR) - { - AlertDialog alert = (AlertDialog)dialog; - alert.setMessage(_service.getLoginError()); - } - } } diff --git a/android/demo/chat/src/main/java/com/zeroc/chat/SessionActivity.java b/android/demo/chat/src/main/java/com/zeroc/chat/SessionActivity.java index 04346df8d53..32182db6f51 100644 --- a/android/demo/chat/src/main/java/com/zeroc/chat/SessionActivity.java +++ b/android/demo/chat/src/main/java/com/zeroc/chat/SessionActivity.java @@ -9,6 +9,8 @@ package com.zeroc.chat; +import android.app.DialogFragment; +import android.os.Bundle; import com.zeroc.chat.service.ChatRoomListener; import com.zeroc.chat.service.ChatService; import com.zeroc.chat.service.NoSessionException; @@ -26,12 +28,41 @@ import android.os.IBinder; // Base of any activities that use the chat session. public abstract class SessionActivity extends Activity { - protected static final int DIALOG_FATAL = 1; + private static final String FATAL_TAG = "fatal"; protected Service _service; abstract ChatRoomListener getChatRoomListener(); abstract boolean replayEvents(); + public static class FatalDialogFragment extends DialogFragment + { + public static FatalDialogFragment newInstance(String message) + { + FatalDialogFragment frag = new FatalDialogFragment(); + Bundle args = new Bundle(); + args.putString("message", message); + frag.setArguments(args); + return frag; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Error") + .setMessage(getArguments().getString("message")) + .setCancelable(false) + .setPositiveButton("Ok", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + ((SessionActivity) getActivity()).fatalOk(); + } + }); + return builder.create(); + } + } + final private ServiceConnection _connection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) @@ -77,41 +108,16 @@ public abstract class SessionActivity extends Activity } } - @Override - protected Dialog onCreateDialog(final int id) + void showDialogFatal() { - switch(id) - { - case DIALOG_FATAL: - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Error"); - builder.setMessage(""); // Details provided in onPrepareDialog - builder.setCancelable(false); - builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - _service.logout(); - finish(); - } - }); - return builder.create(); - } - - } - - return null; + DialogFragment dialog = FatalDialogFragment.newInstance( + (_service != null) ? _service.getSessionError() : ""); + dialog.show(getFragmentManager(), FATAL_TAG); } - @Override - protected void onPrepareDialog(int id, Dialog dialog) + private void fatalOk() { - super.onPrepareDialog(id, dialog); - if(id == DIALOG_FATAL) - { - AlertDialog alert = (AlertDialog)dialog; - alert.setMessage(_service.getSessionError()); - } + _service.logout(); + finish(); } } diff --git a/android/demo/chat/src/main/java/com/zeroc/chat/UserViewActivity.java b/android/demo/chat/src/main/java/com/zeroc/chat/UserViewActivity.java index 05c1eb5e476..2dde575de64 100644 --- a/android/demo/chat/src/main/java/com/zeroc/chat/UserViewActivity.java +++ b/android/demo/chat/src/main/java/com/zeroc/chat/UserViewActivity.java @@ -48,12 +48,12 @@ public class UserViewActivity extends SessionActivity public void error() { - showDialog(DIALOG_FATAL); + showDialogFatal(); } public void inactivity() { - showDialog(DIALOG_FATAL); + showDialogFatal(); } }; diff --git a/android/demo/chat/src/main/java/com/zeroc/chat/service/ChatService.java b/android/demo/chat/src/main/java/com/zeroc/chat/service/ChatService.java index d13df3cc7aa..2714e04d9b1 100644 --- a/android/demo/chat/src/main/java/com/zeroc/chat/service/ChatService.java +++ b/android/demo/chat/src/main/java/com/zeroc/chat/service/ChatService.java @@ -62,11 +62,11 @@ public class ChatService extends Service implements com.zeroc.chat.service.Servi } @Override - synchronized public void onStart(Intent intent, int startId) + synchronized public int onStartCommand(Intent intent, int flags, int startId) { // Find out if we were started by the alarm manager // to refresh the current session. - if(intent.hasExtra(REFRESH_EXTRA)) + if(intent != null && intent.hasExtra(REFRESH_EXTRA)) { // If there is no associated session, or the refresh failed then // mark the session as destroyed. @@ -75,6 +75,7 @@ public class ChatService extends Service implements com.zeroc.chat.service.Servi sessionDestroyed(); } } + return START_STICKY; } // Called only from the UI thread. @@ -229,9 +230,13 @@ public class ChatService extends Service implements com.zeroc.chat.service.Servi am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, refreshTimeout, sender); // Display a notification that the user is logged in. - Notification notification = new Notification(R.drawable.stat_notify, "Logged In", System.currentTimeMillis()); - PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, ChatActivity.class), 0); - notification.setLatestEventInfo(this, "Chat Demo", "You are logged into " + hostname, contentIntent); + Notification notification = new Notification.Builder(this) + .setSmallIcon(R.drawable.stat_notify) + .setContentText("Logged In") + .setWhen(System.currentTimeMillis()) + .setContentTitle("You are logged into " + hostname) + .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, ChatActivity.class), 0)) + .build(); NotificationManager n = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); n.notify(CHATACTIVE_NOTIFICATION, notification); diff --git a/android/demo/hello/build.gradle b/android/demo/hello/build.gradle index b2c081c0d47..bae1e12a763 100644 --- a/android/demo/hello/build.gradle +++ b/android/demo/hello/build.gradle @@ -11,6 +11,8 @@ apply plugin: 'com.android.application' apply from: "$rootProject.projectDir/../java/gradle/ice.gradle" apply plugin: 'slice' +project.slice.output = project.file("${project.buildDir}/generated/source/ice") + slice { java { set1 { @@ -59,11 +61,6 @@ clean { delete("src/main/res/raw/client.bks") } -idea.module { - excludeDirs -= file(buildDir) - buildDir.listFiles({d, f ->f != 'generated-src'} as FilenameFilter).each { excludeDirs += it } -} - dependencies { compile localDependency('ice') } diff --git a/android/demo/hello/hello.iml b/android/demo/hello/hello.iml index 699fa69f35f..1f729233340 100644 --- a/android/demo/hello/hello.iml +++ b/android/demo/hello/hello.iml @@ -50,7 +50,7 @@ <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/build/generated-src" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/ice" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" /> @@ -60,7 +60,6 @@ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" /> - <excludeFolder url="file://$MODULE_DIR$/build/generated-src" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" /> diff --git a/android/demo/hello/src/main/java/com/zeroc/hello/DeliveryMode.java b/android/demo/hello/src/main/java/com/zeroc/hello/DeliveryMode.java new file mode 100644 index 00000000000..aa48fb7155c --- /dev/null +++ b/android/demo/hello/src/main/java/com/zeroc/hello/DeliveryMode.java @@ -0,0 +1,58 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** +package com.zeroc.hello; + +enum DeliveryMode +{ + TWOWAY, + TWOWAY_SECURE, + ONEWAY, + ONEWAY_BATCH, + ONEWAY_SECURE, + ONEWAY_SECURE_BATCH, + DATAGRAM, + DATAGRAM_BATCH; + + Ice.ObjectPrx apply(Ice.ObjectPrx prx) + { + switch (this) + { + case TWOWAY: + prx = prx.ice_twoway(); + break; + case TWOWAY_SECURE: + prx = prx.ice_twoway().ice_secure(true); + break; + case ONEWAY: + prx = prx.ice_oneway(); + break; + case ONEWAY_BATCH: + prx = prx.ice_batchOneway(); + break; + case ONEWAY_SECURE: + prx = prx.ice_oneway().ice_secure(true); + break; + case ONEWAY_SECURE_BATCH: + prx = prx.ice_batchOneway().ice_secure(true); + break; + case DATAGRAM: + prx = prx.ice_datagram(); + break; + case DATAGRAM_BATCH: + prx = prx.ice_batchDatagram(); + break; + } + return prx; + } + + public boolean isBatch() + { + return this == ONEWAY_BATCH || this == DATAGRAM_BATCH || this == ONEWAY_SECURE_BATCH; + } +} diff --git a/android/demo/hello/src/main/java/com/zeroc/hello/HelloApp.java b/android/demo/hello/src/main/java/com/zeroc/hello/HelloApp.java index f4887ec0030..506ac464f50 100644 --- a/android/demo/hello/src/main/java/com/zeroc/hello/HelloApp.java +++ b/android/demo/hello/src/main/java/com/zeroc/hello/HelloApp.java @@ -9,23 +9,64 @@ package com.zeroc.hello; +import Ice.Communicator; import android.app.Application; import android.os.Build.VERSION; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import java.util.LinkedList; +import java.util.List; public class HelloApp extends Application { - interface CommunicatorCallback + static class MessageReady { - void onWait(); - void onCreate(Ice.Communicator communicator); - void onError(Ice.LocalException ex); + MessageReady(Communicator c, Ice.LocalException e) + { + communicator = c; + ex = e; + } + + Communicator communicator; + Ice.LocalException ex; } - /** Called when the application is starting, before any other application objects have been created. */ @Override public void onCreate() { super.onCreate(); + _uiHandler = new Handler(Looper.getMainLooper()) + { + @Override + public void handleMessage(Message m) + { + if(m.what == MSG_READY) + { + MessageReady ready = (MessageReady)m.obj; + _initialized = true; + _communicator = ready.communicator; + _ex = ready.ex; + } + else if(m.what == MSG_EXCEPTION || m.what == MSG_RESPONSE) + { + _result = null; + } + + Message copy = new Message(); + copy.copyFrom(m); + + if(_handler != null) + { + _handler.sendMessage(copy); + } + else + { + _queue.add(copy); + } + } + }; // SSL initialization can take some time. To avoid blocking the // calling thread, we perform the initialization in a separate thread. @@ -33,7 +74,44 @@ public class HelloApp extends Application { public void run() { - initializeCommunicator(); + try + { + Ice.InitializationData initData = new Ice.InitializationData(); + initData.properties = Ice.Util.createProperties(); + initData.properties.setProperty("Ice.Trace.Network", "3"); + + initData.properties.setProperty("IceSSL.Trace.Security", "3"); + initData.properties.setProperty("IceSSL.KeystoreType", "BKS"); + initData.properties.setProperty("IceSSL.TruststoreType", "BKS"); + initData.properties.setProperty("IceSSL.Password", "password"); + initData.properties.setProperty("Ice.InitPlugins", "0"); + initData.properties.setProperty("Ice.Plugin.IceSSL", "IceSSL.PluginFactory"); + + // SDK versions < 21 only support TLSv1 with SSLEngine. + if(VERSION.SDK_INT < 21) + { + initData.properties.setProperty("IceSSL.Protocols", "tls1_0"); + } + + Ice.Communicator c = Ice.Util.initialize(initData); + IceSSL.Plugin plugin = (IceSSL.Plugin)c.getPluginManager().getPlugin("IceSSL"); + // + // Be sure to pass the same input stream to the SSL plug-in for + // both the keystore and the truststore. This makes startup a + // little faster since the plugin will not initialize + // two keystores. + // + java.io.InputStream certs = getResources().openRawResource(R.raw.client); + plugin.setKeystoreStream(certs); + plugin.setTruststoreStream(certs); + c.getPluginManager().initializePlugins(); + + _uiHandler.sendMessage(Message.obtain(_uiHandler, MSG_READY, new MessageReady(c, null))); + } + catch(Ice.LocalException e) + { + _uiHandler.sendMessage(Message.obtain(_uiHandler, MSG_READY, new MessageReady(null, e))); + } } }).start(); } @@ -55,89 +133,237 @@ public class HelloApp extends Application } } - public void - setCommunicatorCallback(CommunicatorCallback cb) + void setHandler(Handler handler) { - if(_initialized) + // Nothing to do in this case. + if(_handler != handler) { - if(_ex != null) - { - cb.onError(_ex); - } - else + _handler = handler; + + if(_handler != null) { - cb.onCreate(_communicator); + if(!_initialized) + { + _handler.sendMessage(_handler.obtainMessage(MSG_WAIT)); + } + else + { + // Send all the queued messages. + while(!_queue.isEmpty()) + { + _handler.sendMessage(_queue.remove(0)); + } + } } } - else + } + + void setHost(String host) + { + _host = host; + _proxy = null; + } + + void setTimeout(int timeout) + { + _timeout = timeout; + _proxy = null; + } + + void setDeliveryMode(DeliveryMode mode) + { + _mode = mode; + _proxy = null; + } + + void flush() + { + try { - _cb = cb; - _cb.onWait(); + _communicator.begin_flushBatchRequests(); + } + catch(final Ice.LocalException ex) + { + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_EXCEPTION, ex)); } } - private void initializeCommunicator() + void shutdown() { try { - Ice.Communicator communicator; - Ice.InitializationData initData = new Ice.InitializationData(); - initData.properties = Ice.Util.createProperties(); - initData.properties.setProperty("Ice.Trace.Network", "3"); + updateProxy(); + if(_proxy == null) + { + return; + } + _proxy.shutdown(); + } + catch(Ice.LocalException ex) + { + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_EXCEPTION, ex)); + } - initData.properties.setProperty("IceSSL.Trace.Security", "3"); - initData.properties.setProperty("IceSSL.KeystoreType", "BKS"); - initData.properties.setProperty("IceSSL.TruststoreType", "BKS"); - initData.properties.setProperty("IceSSL.Password", "password"); - initData.properties.setProperty("Ice.InitPlugins", "0"); - initData.properties.setProperty("Ice.Plugin.IceSSL", "IceSSL.PluginFactory"); + } - // SDK versions < 21 only support TLSv1 with SSLEngine. - if(VERSION.SDK_INT < 21) + void shutdownAsync() + { + try + { + updateProxy(); + if(_proxy == null || _result != null) { - initData.properties.setProperty("IceSSL.Protocols", "tls1_0"); + return; } - communicator = Ice.Util.initialize(initData); - - IceSSL.Plugin plugin = (IceSSL.Plugin)communicator.getPluginManager().getPlugin("IceSSL"); - // - // Be sure to pass the same input stream to the SSL plug-in for - // both the keystore and the truststore. This makes startup a - // little faster since the plugin will not initialize - // two keystores. - // - java.io.InputStream certs = getResources().openRawResource(R.raw.client); - plugin.setKeystoreStream(certs); - plugin.setTruststoreStream(certs); - communicator.getPluginManager().initializePlugins(); - - synchronized(this) + _resultMode = _mode; + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_SENDING)); + _result = _proxy.begin_shutdown(new Demo.Callback_Hello_shutdown() { - _communicator = communicator; - if(_cb != null) + @Override + synchronized public void exception(final Ice.LocalException ex) + { + _response = true; + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_EXCEPTION, ex)); + } + + @Override + synchronized public void response() + { + _response = true; + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_RESPONSE)); + } + + @Override + synchronized public void sent(boolean sentSynchronously) { - _cb.onCreate(_communicator); + if(!_response) + { + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_SENT, _resultMode)); + } } - _initialized = true; + // There is no ordering guarantee between sent, response/exception. + private boolean _response = false; + }); + } + catch(Ice.LocalException ex) + { + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_EXCEPTION, ex)); + } + } + + void sayHello(int delay) + { + try + { + updateProxy(); + if(_proxy == null || _result != null) + { + return; } + + _proxy.begin_sayHello(delay); } catch(Ice.LocalException ex) { - synchronized(this) + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_EXCEPTION, ex)); + } + } + + void sayHelloAsync(int delay) + { + try + { + updateProxy(); + if(_proxy == null || _result != null) { - if(_cb != null) - { - _cb.onError(ex); - } - _ex = ex; - _initialized = true; + return; } + + _resultMode = _mode; + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_SENDING)); + _result = _proxy.begin_sayHello(delay, + new Demo.Callback_Hello_sayHello() + { + @Override + synchronized public void exception(final Ice.LocalException ex) + { + _response = true; + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_EXCEPTION, ex)); + } + + @Override + synchronized public void response() + { + _response = true; + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_RESPONSE)); + } + + @Override + synchronized public void sent(boolean sentSynchronously) + { + if(!_response) + { + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_SENT, _resultMode)); + } + } + // There is no ordering guarantee between sent, response/exception. + private boolean _response = false; + }); + } + catch(Ice.LocalException ex) + { + _uiHandler.sendMessage(_uiHandler.obtainMessage(MSG_EXCEPTION, ex)); } } - private Ice.Communicator _communicator; + private void updateProxy() + { + if(_proxy != null) + { + return; + } + + String s = "hello:tcp -h " + _host + " -p 10000:ssl -h " + _host + " -p 10001:udp -h " + _host + " -p 10000"; + Ice.ObjectPrx prx = _communicator.stringToProxy(s); + prx = _mode.apply(prx); + if(_timeout != 0) + { + prx = prx.ice_invocationTimeout(_timeout); + } + + _proxy = Demo.HelloPrxHelper.uncheckedCast(prx); + } + + DeliveryMode getDeliveryMode() + { + return _mode; + } + + public static final int MSG_WAIT = 0; + public static final int MSG_READY = 1; + public static final int MSG_EXCEPTION = 2; + public static final int MSG_RESPONSE = 3; + public static final int MSG_SENDING = 4; + public static final int MSG_SENT = 5; + + private List<Message> _queue = new LinkedList<Message>(); + private Handler _uiHandler; + private boolean _initialized; + private Ice.Communicator _communicator; + private Demo.HelloPrx _proxy = null; + + // The current request if any. + private Ice.AsyncResult _result; + // The mode of the current request. + private DeliveryMode _resultMode; + private Ice.LocalException _ex; - private CommunicatorCallback _cb; + private Handler _handler; + + // Proxy settings. + private String _host; + private int _timeout; + private DeliveryMode _mode; } diff --git a/android/demo/hello/src/main/java/com/zeroc/hello/HelloWorld.java b/android/demo/hello/src/main/java/com/zeroc/hello/HelloWorld.java index 0f6f0aa04c7..7a9878526d3 100644 --- a/android/demo/hello/src/main/java/com/zeroc/hello/HelloWorld.java +++ b/android/demo/hello/src/main/java/com/zeroc/hello/HelloWorld.java @@ -9,13 +9,14 @@ package com.zeroc.hello; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.ProgressDialog; +import Ice.LocalException; +import android.app.*; import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; import android.text.Editable; import android.text.TextWatcher; import android.view.View; @@ -32,433 +33,207 @@ import android.widget.SeekBar.OnSeekBarChangeListener; public class HelloWorld extends Activity { - enum DeliveryMode + public static class ErrorDialogFragment extends DialogFragment { - TWOWAY, - TWOWAY_SECURE, - ONEWAY, - ONEWAY_BATCH, - ONEWAY_SECURE, - ONEWAY_SECURE_BATCH, - DATAGRAM, - DATAGRAM_BATCH; - - Ice.ObjectPrx apply(Ice.ObjectPrx prx) - { - switch (this) - { - case TWOWAY: - prx = prx.ice_twoway(); - break; - case TWOWAY_SECURE: - prx = prx.ice_twoway().ice_secure(true); - break; - case ONEWAY: - prx = prx.ice_oneway(); - break; - case ONEWAY_BATCH: - prx = prx.ice_batchOneway(); - break; - case ONEWAY_SECURE: - prx = prx.ice_oneway().ice_secure(true); - break; - case ONEWAY_SECURE_BATCH: - prx = prx.ice_batchOneway().ice_secure(true); - break; - case DATAGRAM: - prx = prx.ice_datagram(); - break; - case DATAGRAM_BATCH: - prx = prx.ice_batchDatagram(); - break; - } - return prx; - } - - public boolean isBatch() - { - return this == ONEWAY_BATCH || this == DATAGRAM_BATCH || this == ONEWAY_SECURE_BATCH; - } - } - - private void updateProxy() - { - if(_communicator == null) - { - return; - } - - String host = _host.getText().toString().trim(); - assert (!host.isEmpty()); - - // Change the preferences if necessary. - if(!_prefs.getString(HOSTNAME_KEY, DEFAULT_HOST).equals(host)) - { - SharedPreferences.Editor edit = _prefs.edit(); - edit.putString(HOSTNAME_KEY, host); - edit.commit(); - } - - String s = "hello:tcp -h " + host + " -p 10000:ssl -h " + host + " -p 10001:udp -h " + host + " -p 10000"; - Ice.ObjectPrx prx = _communicator.stringToProxy(s); - prx = _deliveryMode.apply(prx); - int timeout = _timeout.getProgress(); - if(timeout != 0) - { - prx = prx.ice_timeout(timeout); + public static ErrorDialogFragment newInstance(String message, boolean fatal) + { + ErrorDialogFragment frag = new ErrorDialogFragment(); + Bundle args = new Bundle(); + args.putString("message", message); + args.putBoolean("fatal", fatal); + frag.setArguments(args); + return frag; } - _helloPrx = Demo.HelloPrxHelper.uncheckedCast(prx); - } - - class SayHelloI extends Demo.Callback_Hello_sayHello - { - private boolean _response = false; @Override - synchronized public void exception(final Ice.LocalException ex) + public Dialog onCreateDialog(Bundle savedInstanceState) { - assert (!_response); - _response = true; - - runOnUiThread(new Runnable() - { - public void run() - { - handleException(ex); - } - }); - } - - @Override - synchronized public void sent(boolean sentSynchronously) - { - if(_response) - { - return; - } - runOnUiThread(new Runnable() - { - public void run() - { - if(isFinishing()) - { - return; - } - - if(_deliveryMode == DeliveryMode.TWOWAY || _deliveryMode == DeliveryMode.TWOWAY_SECURE) - { - _status.setText("Waiting for response"); - } - else + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Error") + .setMessage(getArguments().getString("message")) + .setPositiveButton("Ok", new DialogInterface.OnClickListener() { - _status.setText("Ready"); - _activity.setVisibility(View.INVISIBLE); - } - } - }); + public void onClick(DialogInterface dialog, int whichButton) + { + if(getArguments().getBoolean("fatal")) + { + ((HelloWorld) getActivity()).finish(); + } + } + }); + return builder.create(); } + } + public static class InitializeDialogFragment extends DialogFragment + { @Override - synchronized public void response() + public Dialog onCreateDialog(Bundle savedInstanceState) { - assert (!_response); - _response = true; - runOnUiThread(new Runnable() - { - public void run() - { - if(isFinishing()) - { - return; - } + ProgressDialog dialog = new ProgressDialog(getActivity()); + dialog.setTitle("Initializing"); + dialog.setMessage("Please wait while loading..."); + dialog.setIndeterminate(true); + dialog.setCanceledOnTouchOutside(false); - _activity.setVisibility(View.INVISIBLE); - _status.setText("Ready"); - } - }); + setCancelable(false); + return dialog; } } - private void sayHello() - { - if(_helloPrx == null) - { - try - { - updateProxy(); - } - catch(Ice.LocalException e) - { - handleException(e); - return; - } - } - try - { - if(!_deliveryMode.isBatch()) - { - Ice.AsyncResult r = _helloPrx.begin_sayHello(_delay.getProgress(), new SayHelloI()); - if(r.sentSynchronously()) - { - if(_deliveryMode == DeliveryMode.TWOWAY || _deliveryMode == DeliveryMode.TWOWAY_SECURE) - { - _activity.setVisibility(View.VISIBLE); - _status.setText("Waiting for response"); - } - } - else - { - _activity.setVisibility(View.VISIBLE); - _status.setText("Sending request"); - } - } - else - { - _flushButton.setEnabled(true); - _helloPrx.sayHello(_delay.getProgress()); - _status.setText("Queued hello request"); - } - } - catch(Ice.LocalException ex) - { - handleException(ex); - } - } + // These two arrays match. + private final static DeliveryMode DELIVERY_MODES[] = { + DeliveryMode.TWOWAY, + DeliveryMode.TWOWAY_SECURE, + DeliveryMode.ONEWAY, + DeliveryMode.ONEWAY_BATCH, + DeliveryMode.ONEWAY_SECURE, + DeliveryMode.ONEWAY_SECURE_BATCH, + DeliveryMode.DATAGRAM, + DeliveryMode.DATAGRAM_BATCH, + }; + + private final static String DELIVERY_MODE_DESC[] = new String[] { + "Twoway", + "Twoway Secure", + "Oneway", + "Oneway Batch", + "Oneway Secure", + "Oneway Secure Batch", + "Datagram", + "Datagram Batch" + }; - private void handleException(Ice.LocalException ex) + @Override + public void onCreate(Bundle savedInstanceState) { - if(isFinishing()) - { - return; - } + super.onCreate(savedInstanceState); + setContentView(R.layout.main); - _status.setText("Ready"); - _activity.setVisibility(View.INVISIBLE); + final Button sayHelloButton = (Button)findViewById(R.id.sayHello); + final SeekBar delaySeekBar = (SeekBar)findViewById(R.id.delay); + final ProgressBar activityProgressBar = (ProgressBar)findViewById(R.id.activity); + final Button shutdownButton = (Button)findViewById(R.id.shutdown); + final EditText hostEditText = (EditText)findViewById(R.id.host); + final Button flushButton = (Button)findViewById(R.id.flush); + final TextView statusTextView = (TextView)findViewById(R.id.status); + final Spinner modeSpinner = (Spinner)findViewById(R.id.mode); + final TextView delayTextView = (TextView)findViewById(R.id.delayView); + final TextView timeoutTextView = (TextView)findViewById(R.id.timeoutView); + final SeekBar timeoutSeekBar = (SeekBar)findViewById(R.id.timeout); + final SharedPreferences prefs = getPreferences(MODE_PRIVATE); - _lastError = ex.toString(); - showDialog(DIALOG_ERROR); - ex.printStackTrace(); - } + _app = (HelloApp)getApplication(); - private void shutdown() - { - if(_helloPrx == null) - { - try - { - updateProxy(); - } - catch(Ice.LocalException e) - { - handleException(e); - return; - } - } - try + sayHelloButton.setOnClickListener(new OnClickListener() { - if(!_deliveryMode.isBatch()) + public void onClick(android.view.View v) { - _helloPrx.begin_shutdown(new Demo.Callback_Hello_shutdown() + if(_app.getDeliveryMode().isBatch()) { - @Override - public void exception(final Ice.LocalException ex) - { - runOnUiThread(new Runnable() - { - public void run() - { - handleException(ex); - } - }); - } + flushButton.setEnabled(true); + _app.sayHello(delaySeekBar.getProgress()); + statusTextView.setText("Queued hello request"); - @Override - public void response() - { - runOnUiThread(new Runnable() - { - public void run() - { - if(isFinishing()) - { - return; - } - - _activity.setVisibility(View.INVISIBLE); - _status.setText("Ready"); - } - }); - } - }); - if(_deliveryMode == DeliveryMode.TWOWAY || _deliveryMode == DeliveryMode.TWOWAY_SECURE) + } + else { - _activity.setVisibility(View.VISIBLE); - _status.setText("Waiting for response"); + _app.sayHelloAsync(delaySeekBar.getProgress()); } } - else - { - _flushButton.setEnabled(true); - _helloPrx.shutdown(); - _status.setText("Queued shutdown request"); - } - } - catch(Ice.LocalException ex) - { - handleException(ex); - } - } + }); - private void flush() - { - new Thread(new Runnable() + shutdownButton.setOnClickListener(new OnClickListener() { - public void run() + public void onClick(android.view.View v) { - try + if(_app.getDeliveryMode().isBatch()) { - _communicator.flushBatchRequests(); + flushButton.setEnabled(true); + _app.shutdown(); + statusTextView.setText("Queued shutdown request"); } - catch(final Ice.LocalException ex) + else { - runOnUiThread(new Runnable() - { - public void run() - { - handleException(ex); - } - }); + _app.shutdownAsync(); } } - }).start(); - - _flushButton.setEnabled(false); - _status.setText("Flushed batch requests"); - } - - private void changeDeliveryMode(long id) - { - switch ((int)id) - { - case 0: - _deliveryMode = DeliveryMode.TWOWAY; - break; - case 1: - _deliveryMode = DeliveryMode.TWOWAY_SECURE; - break; - case 2: - _deliveryMode = DeliveryMode.ONEWAY; - break; - case 3: - _deliveryMode = DeliveryMode.ONEWAY_BATCH; - break; - case 4: - _deliveryMode = DeliveryMode.ONEWAY_SECURE; - break; - case 5: - _deliveryMode = DeliveryMode.ONEWAY_SECURE_BATCH; - break; - case 6: - _deliveryMode = DeliveryMode.DATAGRAM; - break; - case 7: - _deliveryMode = DeliveryMode.DATAGRAM_BATCH; - break; - } - } - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - setContentView(R.layout.main); - - _sayHelloButton = (Button)findViewById(R.id.sayHello); - _sayHelloButton.setOnClickListener(new OnClickListener() - { - public void onClick(android.view.View v) - { - sayHello(); - } - }); - _shutdownButton = (Button)findViewById(R.id.shutdown); - _shutdownButton.setOnClickListener(new OnClickListener() - { - public void onClick(android.view.View v) - { - shutdown(); - } }); - _host = (EditText)findViewById(R.id.host); - _host.addTextChangedListener(new TextWatcher() + + hostEditText.addTextChangedListener(new TextWatcher() { + @Override public void afterTextChanged(Editable s) { - String host = _host.getText().toString().trim(); + String host = hostEditText.getText().toString().trim(); if(host.isEmpty()) { - _sayHelloButton.setEnabled(false); - _shutdownButton.setEnabled(false); + sayHelloButton.setEnabled(false); + shutdownButton.setEnabled(false); } else { - _sayHelloButton.setEnabled(true); - _shutdownButton.setEnabled(true); + sayHelloButton.setEnabled(true); + shutdownButton.setEnabled(true); + } + + _app.setHost(host); + + // Change the preferences if necessary. + if(!prefs.getString(HOSTNAME_KEY, DEFAULT_HOST).equals(host)) + { + SharedPreferences.Editor edit = prefs.edit(); + edit.putString(HOSTNAME_KEY, host); + edit.apply(); } - _helloPrx = null; } + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + @Override public void onTextChanged(CharSequence s, int start, int count, int after) { } }); - _flushButton = (Button)findViewById(R.id.flush); - _flushButton.setOnClickListener(new OnClickListener() + flushButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { - flush(); + _app.flush(); + flushButton.setEnabled(false); + statusTextView.setText("Flushed batch requests"); } }); - Spinner mode = (Spinner)findViewById(R.id.mode); ArrayAdapter<String> modeAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, - new String[] { "Twoway", "Twoway Secure", "Oneway", "Oneway Batch", "Oneway Secure", - "Oneway Secure Batch", "Datagram", "Datagram Batch" }); - mode.setAdapter(modeAdapter); - mode.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() + DELIVERY_MODE_DESC); + modeSpinner.setAdapter(modeAdapter); + modeSpinner.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() { + @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { - changeDeliveryMode(id); - _helloPrx = null; + _app.setDeliveryMode(DELIVERY_MODES[(int) id]); } - + @Override public void onNothingSelected(AdapterView<?> arg0) { } }); - if(savedInstanceState == null) - { - mode.setSelection(0); - } - changeDeliveryMode(mode.getSelectedItemId()); + modeSpinner.setSelection(0); + _app.setDeliveryMode(DELIVERY_MODES[(int)modeSpinner.getSelectedItemId()]); - final TextView delayView = (TextView)findViewById(R.id.delayView); - _delay = (SeekBar)findViewById(R.id.delay); - _delay.setOnSeekBarChangeListener(new OnSeekBarChangeListener() + delaySeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromThumb) { - delayView.setText(String.format("%.1f", progress / 1000.0)); + delayTextView.setText(String.format("%.1f", progress / 1000.0)); } public void onStartTrackingTouch(SeekBar seekBar) @@ -469,20 +244,13 @@ public class HelloWorld extends Activity { } }); - // BUGFIX: Android doesn't save/restore SeekBar state. - if(savedInstanceState != null) - { - _delay.setProgress(savedInstanceState.getInt(BUNDLE_KEY_DELAY)); - } - final TextView timeoutView = (TextView)findViewById(R.id.timeoutView); - _timeout = (SeekBar)findViewById(R.id.timeout); - _timeout.setOnSeekBarChangeListener(new OnSeekBarChangeListener() + timeoutSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromThumb) { - timeoutView.setText(String.format("%.1f", progress / 1000.0)); - _helloPrx = null; + timeoutTextView.setText(String.format("%.1f", progress / 1000.0)); + _app.setTimeout(progress); } public void onStartTrackingTouch(SeekBar seekBar) @@ -493,167 +261,168 @@ public class HelloWorld extends Activity { } }); - // BUGFIX: Android doesn't save/restore SeekBar state. - if(savedInstanceState != null) - { - _timeout.setProgress(savedInstanceState.getInt(BUNDLE_KEY_TIMEOUT)); - } - - _activity = (ProgressBar)findViewById(R.id.activity); - _activity.setVisibility(View.INVISIBLE); - _status = (TextView)findViewById(R.id.status); + activityProgressBar.setVisibility(View.GONE); // Setup the defaults. - _prefs = getPreferences(MODE_PRIVATE); - if(savedInstanceState == null) - { - _host.setText(_prefs.getString(HOSTNAME_KEY, DEFAULT_HOST)); - _flushButton.setEnabled(false); - } - else - { - _flushButton.setEnabled(savedInstanceState.getBoolean(BUNDLE_KEY_FLUSH_ENABLED)); - _lastError = savedInstanceState.getString(BUNDLE_KEY_LAST_ERROR); - } + hostEditText.setText(prefs.getString(HOSTNAME_KEY, DEFAULT_HOST)); + flushButton.setEnabled(false); - HelloApp app = (HelloApp)getApplication(); - app.setCommunicatorCallback(new HelloApp.CommunicatorCallback() - { - private boolean dismiss = false; + statusTextView.setText("Ready"); - public void onCreate(final Ice.Communicator communicator) + _handler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(Message m) { - runOnUiThread(new Runnable() + switch(m.what) { - public void run() + case HelloApp.MSG_WAIT: { - if(dismiss) + // Show the initializing dialog if it isn't already on the stack. + if(getFragmentManager().findFragmentByTag(INITIALIZE_TAG) == null) { - dismissDialog(DIALOG_INITIALIZING); + DialogFragment dialog = new InitializeDialogFragment(); + dialog.show(getFragmentManager(), INITIALIZE_TAG); } - _status.setText("Ready"); - _communicator = communicator; + break; } - }); - } - public void onError(final Ice.LocalException ex) - { - runOnUiThread(new Runnable() - { - public void run() + case HelloApp.MSG_READY: { - if(dismiss) + // Hide the initializing dialog if it is on the stack. + DialogFragment initDialog = (DialogFragment) getFragmentManager().findFragmentByTag(INITIALIZE_TAG); + if(initDialog != null) { - dismissDialog(DIALOG_INITIALIZING); + initDialog.dismiss(); } - _lastError = ex.toString(); - showDialog(DIALOG_FATAL); + HelloApp.MessageReady ready = (HelloApp.MessageReady) m.obj; + if(ready.ex != null) + { + LocalException ex = (LocalException) m.obj; + DialogFragment dialog = ErrorDialogFragment.newInstance(ex.toString(), true); + dialog.show(getFragmentManager(), ERROR_TAG); + } + statusTextView.setText("Ready"); + break; } - }); - } - public void onWait() - { - // Show the initializing dialog. - dismiss = true; - showDialog(DIALOG_INITIALIZING); + case HelloApp.MSG_EXCEPTION: + { + statusTextView.setText("Ready"); + activityProgressBar.setVisibility(View.GONE); + + LocalException ex = (LocalException) m.obj; + DialogFragment dialog = ErrorDialogFragment.newInstance(ex.toString(), false); + dialog.show(getFragmentManager(), ERROR_TAG); + break; + } + + case HelloApp.MSG_RESPONSE: + { + activityProgressBar.setVisibility(View.GONE); + statusTextView.setText("Ready"); + break; + } + case HelloApp.MSG_SENT: + { + DeliveryMode mode = (DeliveryMode) m.obj; + if(mode == DeliveryMode.TWOWAY || mode == DeliveryMode.TWOWAY_SECURE) + { + activityProgressBar.setVisibility(View.VISIBLE); + statusTextView.setText("Waiting for response"); + } + else + { + statusTextView.setText("Ready"); + activityProgressBar.setVisibility(View.GONE); + } + break; + } + + case HelloApp.MSG_SENDING: + { + activityProgressBar.setVisibility(View.VISIBLE); + statusTextView.setText("Sending request"); + break; + } + } } - }); + }; } @Override - protected void onSaveInstanceState(Bundle outState) + protected void onResume() { - super.onSaveInstanceState(outState); - // BUGFIX: The SeekBar doesn't save/restore state automatically. - outState.putInt(BUNDLE_KEY_DELAY, _delay.getProgress()); - outState.putInt(BUNDLE_KEY_TIMEOUT, _timeout.getProgress()); - outState.putBoolean(BUNDLE_KEY_FLUSH_ENABLED, _flushButton.isEnabled()); - outState.putString(BUNDLE_KEY_LAST_ERROR, _lastError); + super.onResume(); + _app.setHandler(_handler); } @Override - protected Dialog onCreateDialog(int id) + protected void onRestoreInstanceState(Bundle savedInstanceState) { - switch (id) - { - case DIALOG_INITIALIZING: - { - ProgressDialog dialog = new ProgressDialog(this); - dialog.setTitle("Initializing"); - dialog.setMessage("Please wait while loading..."); - dialog.setIndeterminate(true); - dialog.setCancelable(false); - return dialog; - } - - case DIALOG_ERROR: - case DIALOG_FATAL: - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Error"); - builder.setMessage(""); // Initialize to empty string so that we can modify during onPrepareDialog - if(id == DIALOG_FATAL) - { - builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - finish(); - } - }); - } - return builder.create(); - } + super.onRestoreInstanceState(savedInstanceState); + + final SeekBar delaySeekBar = (SeekBar)findViewById(R.id.delay); + final Button flushButton = (Button)findViewById(R.id.flush); + final Spinner modeSpinner = (Spinner)findViewById(R.id.mode); + final SeekBar timeoutSeekBar = (SeekBar)findViewById(R.id.timeout); + final TextView statusTextView = (TextView)findViewById(R.id.status); + final ProgressBar activityProgressBar = (ProgressBar)findViewById(R.id.activity); + + modeSpinner.setSelection(savedInstanceState.getInt(BUNDLE_KEY_MODE)); + flushButton.setEnabled(savedInstanceState.getBoolean(BUNDLE_KEY_FLUSH_ENABLED)); + delaySeekBar.setProgress(savedInstanceState.getInt(BUNDLE_KEY_DELAY)); + timeoutSeekBar.setProgress(savedInstanceState.getInt(BUNDLE_KEY_TIMEOUT)); + statusTextView.setText(savedInstanceState.getString(BUNDLE_KEY_STATUS)); + activityProgressBar.setVisibility( + savedInstanceState.getBoolean(BUNDLE_KEY_PROGRESS) ? View.VISIBLE : View.GONE); + } - } + @Override + protected void onSaveInstanceState(Bundle outState) + { + super.onSaveInstanceState(outState); - return null; + final SeekBar delaySeekBar = (SeekBar)findViewById(R.id.delay); + final Button flushButton = (Button)findViewById(R.id.flush); + final Spinner modeSpinner = (Spinner)findViewById(R.id.mode); + final SeekBar timeoutSeekBar = (SeekBar)findViewById(R.id.timeout); + final TextView statusTextView = (TextView)findViewById(R.id.status); + final ProgressBar activityProgressBar = (ProgressBar)findViewById(R.id.activity); + + outState.putInt(BUNDLE_KEY_MODE, (int)modeSpinner.getSelectedItemId()); + outState.putInt(BUNDLE_KEY_DELAY, delaySeekBar.getProgress()); + outState.putInt(BUNDLE_KEY_TIMEOUT, timeoutSeekBar.getProgress()); + outState.putBoolean(BUNDLE_KEY_FLUSH_ENABLED, flushButton.isEnabled()); + outState.putString(BUNDLE_KEY_STATUS, statusTextView.getText().toString()); + outState.putBoolean(BUNDLE_KEY_PROGRESS, activityProgressBar.getVisibility() == View.VISIBLE); + + // Clear the application handler. We don't want any further messages while + // in the background. + _app.setHandler(null); } - protected void onPrepareDialog(int id, Dialog dialog) + @Override + protected void onDestroy() { - switch (id) - { - case DIALOG_INITIALIZING: - break; - case DIALOG_ERROR: - case DIALOG_FATAL: - { - ((AlertDialog)dialog).setMessage(_lastError); - } - - } + super.onDestroy(); + _app.setHandler(null); } - private static final int DIALOG_INITIALIZING = 1; - private static final int DIALOG_ERROR = 2; - private static final int DIALOG_FATAL = 3; + public static final String INITIALIZE_TAG = "initialize"; + public static final String ERROR_TAG = "error"; private static final String DEFAULT_HOST = ""; private static final String HOSTNAME_KEY = "host"; + private static final String BUNDLE_KEY_PROGRESS = "zeroc:progress"; + private static final String BUNDLE_KEY_STATUS = "zeroc:status"; + private static final String BUNDLE_KEY_MODE = "zeroc:mode"; private static final String BUNDLE_KEY_TIMEOUT = "zeroc:timeout"; private static final String BUNDLE_KEY_DELAY = "zeroc:delay"; private static final String BUNDLE_KEY_FLUSH_ENABLED = "zeroc:flush"; - private static final String BUNDLE_KEY_LAST_ERROR = "zeroc:lastError"; - - private Ice.Communicator _communicator = null; - private DeliveryMode _deliveryMode; - private Demo.HelloPrx _helloPrx = null; - - private Button _sayHelloButton; - private Button _shutdownButton; - private EditText _host; - private TextView _status; - private SeekBar _delay; - private SeekBar _timeout; - private ProgressBar _activity; - private SharedPreferences _prefs; - private Button _flushButton; - - private String _lastError = ""; + + private HelloApp _app; + private Handler _handler; } diff --git a/android/demo/library/build.gradle b/android/demo/library/build.gradle index 97742903cab..b2af86aaf21 100644 --- a/android/demo/library/build.gradle +++ b/android/demo/library/build.gradle @@ -11,6 +11,8 @@ apply plugin: 'com.android.application' apply from: "$rootProject.projectDir/../java/gradle/ice.gradle" apply plugin: 'slice' +project.slice.output = project.file("${project.buildDir}/generated/source/ice") + slice { java { set1 { @@ -60,11 +62,6 @@ clean { delete("src/main/res/raw/client.bks") } -idea.module { - excludeDirs -= file(buildDir) - buildDir.listFiles({d, f ->f != 'generated-src'} as FilenameFilter).each { excludeDirs += it } -} - dependencies { compile localDependency('ice') compile localDependency('glacier2') diff --git a/android/demo/library/library.iml b/android/demo/library/library.iml index 75eeb0736cb..500cfd8119d 100644 --- a/android/demo/library/library.iml +++ b/android/demo/library/library.iml @@ -50,7 +50,7 @@ <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/build/generated-src" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated/source/ice" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" /> @@ -60,7 +60,6 @@ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" /> - <excludeFolder url="file://$MODULE_DIR$/build/generated-src" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" /> diff --git a/android/demo/library/src/main/java/com/zeroc/library/EditActivity.java b/android/demo/library/src/main/java/com/zeroc/library/EditActivity.java index de1b0ace7d2..cdd12d02400 100644 --- a/android/demo/library/src/main/java/com/zeroc/library/EditActivity.java +++ b/android/demo/library/src/main/java/com/zeroc/library/EditActivity.java @@ -14,6 +14,7 @@ import java.util.List; import android.app.AlertDialog; import android.app.Dialog; +import android.app.DialogFragment; import android.content.DialogInterface; import android.os.Bundle; import android.text.Editable; @@ -33,10 +34,9 @@ import com.zeroc.library.controller.QueryModel; public class EditActivity extends SessionActivity { - private static final int DIALOG_DISCARD = DIALOG_NEXT; - private static final int SAVE_ID = Menu.FIRST; private static final int DISCARD_ID = Menu.FIRST + 1; + public static final String DISCARD_TAG = "discard"; private Demo.BookDescription _desc; @@ -47,6 +47,39 @@ public class EditActivity extends SessionActivity private LayoutInflater _inflater; private Button _save; + public static class DiscardDialogFragment extends DialogFragment + { + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Discard changes") + .setMessage("Your changes will be discarded.") + .setPositiveButton("OK", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + ((EditActivity) getActivity()).discardOk(); + + } + }) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + } + }); + return builder.create(); + } + } + + private void + discardOk() + { + setResult(RESULT_CANCELED); + finish(); + } + private void addAuthorView(String author) { final View authorView = _inflater.inflate(R.layout.author, _authorsLayout, false); @@ -131,7 +164,8 @@ public class EditActivity extends SessionActivity { public void onClick(View v) { - showDialog(DIALOG_DISCARD); + DialogFragment dialog = new DiscardDialogFragment(); + dialog.show(getFragmentManager(), DISCARD_TAG); } }); } @@ -170,7 +204,7 @@ public class EditActivity extends SessionActivity public void onError() { - showDialog(DIALOG_ERROR); + showDialogError(); } }); } @@ -202,7 +236,8 @@ public class EditActivity extends SessionActivity return true; case DISCARD_ID: - showDialog(DIALOG_DISCARD); + DialogFragment dialog = new DiscardDialogFragment(); + dialog.show(getFragmentManager(), DISCARD_TAG); return true; } @@ -251,41 +286,5 @@ public class EditActivity extends SessionActivity } } - @Override - protected Dialog onCreateDialog(final int id) - { - Dialog d = super.onCreateDialog(id); - if(d != null) - { - return d; - } - - switch(id) - { - case DIALOG_DISCARD: - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Discard changes"); - builder.setMessage("Your changes will be discarded."); - builder.setPositiveButton("OK", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - setResult(RESULT_CANCELED); - finish(); - } - }); - builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - } - }); - return builder.create(); - } - } - - return null; - } } diff --git a/android/demo/library/src/main/java/com/zeroc/library/LibraryActivity.java b/android/demo/library/src/main/java/com/zeroc/library/LibraryActivity.java index 7349747b058..381444365b8 100644 --- a/android/demo/library/src/main/java/com/zeroc/library/LibraryActivity.java +++ b/android/demo/library/src/main/java/com/zeroc/library/LibraryActivity.java @@ -96,7 +96,7 @@ public class LibraryActivity extends SessionActivity } return text; } - }; + } private LibraryListAdapter _adapter; @@ -111,7 +111,7 @@ public class LibraryActivity extends SessionActivity public void onError() { - showDialog(DIALOG_ERROR); + showDialogError(); } }; diff --git a/android/demo/library/src/main/java/com/zeroc/library/LoginActivity.java b/android/demo/library/src/main/java/com/zeroc/library/LoginActivity.java index 3e4c7b32cc9..764f8a15a3f 100644 --- a/android/demo/library/src/main/java/com/zeroc/library/LoginActivity.java +++ b/android/demo/library/src/main/java/com/zeroc/library/LoginActivity.java @@ -12,10 +12,10 @@ package com.zeroc.library; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; +import android.app.DialogFragment; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; -import android.os.Build.VERSION; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; @@ -34,9 +34,7 @@ public class LoginActivity extends Activity private static final String HOSTNAME_KEY = "host"; private static final String SECURE_KEY = "secure"; private static final String GLACIER2_KEY = "glacier2"; - - private static final int DIALOG_ERROR = 1; - private static final int DIALOG_INVALID_HOST = 2; + private static final String ERROR_TAG = "error"; private Button _login; private EditText _hostname; @@ -71,7 +69,8 @@ public class LoginActivity extends Activity _loginInProgress = false; setLoginState(); - showDialog(DIALOG_ERROR); + DialogFragment dialog = ErrorDialogFragment.newInstance(_loginController.getLoginError()); + dialog.show(getFragmentManager(), ERROR_TAG); } }; @@ -102,7 +101,8 @@ public class LoginActivity extends Activity final String ipre = "^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"; if(!hostname.matches(hostre) && !hostname.matches(ipre)) { - showDialog(DIALOG_INVALID_HOST); + DialogFragment dialog = new InvalidHostDialogFragment(); + dialog.show(getFragmentManager(), "invalid"); return; } @@ -121,7 +121,7 @@ public class LoginActivity extends Activity edit.putBoolean(GLACIER2_KEY, glacier2); } - edit.commit(); + edit.apply(); LibraryApp app = (LibraryApp)getApplication(); _loginController = app.login(hostname, secure, glacier2, _listener); @@ -203,52 +203,53 @@ public class LoginActivity extends Activity } } - @Override - protected Dialog onCreateDialog(int id) + public static class InvalidHostDialogFragment extends DialogFragment { - switch(id) + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { - case DIALOG_ERROR: - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Error"); - builder.setMessage(""); // The message is filled in onPrepareDialog. - builder.setCancelable(false); - builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - // Clean up the login controller upon login failure. - if(_loginController != null) - { - LibraryApp app = (LibraryApp)getApplication(); - app.loginFailure(); - } - } - }); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Error") + .setMessage("The hostname is invalid"); return builder.create(); } + } + public static class ErrorDialogFragment extends DialogFragment + { + public static ErrorDialogFragment newInstance(String message) + { + ErrorDialogFragment frag = new ErrorDialogFragment(); + Bundle args = new Bundle(); + args.putString("message", message); + frag.setArguments(args); + return frag; + } - case DIALOG_INVALID_HOST: + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Error"); - builder.setMessage("The hostname is invalid"); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder .setTitle("Error") + .setMessage(getArguments().getString("message")) + .setCancelable(false) + .setPositiveButton("Ok", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + ((LoginActivity) getActivity()).errorOk(); + } + }); return builder.create(); } - } - - return null; } - @Override - protected void onPrepareDialog(int id, Dialog dialog) + private void errorOk() { - super.onPrepareDialog(id, dialog); - if(id == DIALOG_ERROR) + // Clean up the login controller upon login failure. + if(_loginController != null) { - AlertDialog alert = (AlertDialog)dialog; - alert.setMessage(_loginController.getLoginError()); + LibraryApp app = (LibraryApp)getApplication(); + app.loginFailure(); } } } diff --git a/android/demo/library/src/main/java/com/zeroc/library/SessionActivity.java b/android/demo/library/src/main/java/com/zeroc/library/SessionActivity.java index e89363afb90..e0c3930e665 100644 --- a/android/demo/library/src/main/java/com/zeroc/library/SessionActivity.java +++ b/android/demo/library/src/main/java/com/zeroc/library/SessionActivity.java @@ -9,6 +9,8 @@ package com.zeroc.library; +import android.app.DialogFragment; +import android.os.Bundle; import com.zeroc.library.controller.QueryController; import com.zeroc.library.controller.SessionController; @@ -20,13 +22,77 @@ import android.content.DialogInterface; // The base class of any activity created after a session has been established. public class SessionActivity extends Activity { - protected static final int DIALOG_ERROR = 0; - protected static final int DIALOG_FATAL = 1; - protected static final int DIALOG_NEXT = 2; - + public static final String ERROR_TAG = "error"; + public static final String FATAL_TAG = "fatal"; protected SessionController _sessionController; protected QueryController _queryController; + public static class FatalDialogFragment extends DialogFragment + { + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Error") + .setMessage("The session was lost. Please login again.") + .setCancelable(false) + .setPositiveButton("Ok", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + ((SessionActivity) getActivity()).fatalOk(); + } + }); + return builder.create(); + } + } + public static class ErrorDialogFragment extends DialogFragment + { + public static ErrorDialogFragment newInstance(String message) + { + ErrorDialogFragment frag = new ErrorDialogFragment(); + Bundle args = new Bundle(); + args.putString("message", message); + frag.setArguments(args); + return frag; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Error") + .setMessage(getArguments().getString("message")) + .setCancelable(false) + .setPositiveButton("Ok", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + ((SessionActivity) getActivity()).errorOk(); + } + }); + return builder.create(); + } + } + + private void errorOk() + { + _queryController.clearLastError(); + } + + private void fatalOk() + { + LibraryApp app = (LibraryApp)getApplication(); + app.logout(); + finish(); + } + + void showDialogError() + { + DialogFragment dialog = ErrorDialogFragment.newInstance(_queryController.getLastError()); + dialog.show(getFragmentManager(), SessionActivity.ERROR_TAG); + } + @Override public void onResume() { @@ -44,64 +110,12 @@ public class SessionActivity extends Activity { public void onDestroy() { - showDialog(DIALOG_FATAL); + DialogFragment dialog = new FatalDialogFragment(); + dialog.show(getFragmentManager(), FATAL_TAG); } }); _queryController = _sessionController.getCurrentQuery(); } - @Override - protected Dialog onCreateDialog(final int id) - { - switch (id) - { - case DIALOG_ERROR: - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Error"); - builder.setMessage(""); // Filled in onPrepareDialog. - builder.setCancelable(false); - builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - _queryController.clearLastError(); - } - }); - return builder.create(); - } - - case DIALOG_FATAL: - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Error"); - builder.setMessage("The session was lost. Please login again."); - builder.setCancelable(false); - builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - LibraryApp app = (LibraryApp)getApplication(); - app.logout(); - finish(); - } - }); - return builder.create(); - } - } - - return null; - } - - @Override - protected void onPrepareDialog(int id, Dialog dialog) - { - super.onPrepareDialog(id, dialog); - if(id == DIALOG_ERROR) - { - AlertDialog alert = (AlertDialog)dialog; - alert.setMessage(_queryController.getLastError()); - } - } } diff --git a/android/demo/library/src/main/java/com/zeroc/library/ViewActivity.java b/android/demo/library/src/main/java/com/zeroc/library/ViewActivity.java index 07af0205135..0c1ee8379ee 100644 --- a/android/demo/library/src/main/java/com/zeroc/library/ViewActivity.java +++ b/android/demo/library/src/main/java/com/zeroc/library/ViewActivity.java @@ -11,6 +11,7 @@ package com.zeroc.library; import android.app.AlertDialog; import android.app.Dialog; +import android.app.DialogFragment; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; @@ -31,12 +32,8 @@ public class ViewActivity extends SessionActivity { private static final int EDIT_ID = Menu.FIRST; private static final int DELETE_ID = Menu.FIRST + 1; - - public static final int BOOK_DELETED = RESULT_FIRST_USER; - public static final int BOOK_CHANGED = RESULT_FIRST_USER+1; - - private static final int DIALOG_DELETE = DIALOG_NEXT; - private static final int DIALOG_RENT_BOOK = DIALOG_NEXT+1; + public static final String RENT_TAG = "rent"; + public static final String DELETE_TAG = "delete"; private Demo.BookDescription _desc; private TextView _isbn; @@ -46,6 +43,64 @@ public class ViewActivity extends SessionActivity private TextView _rentedBy; private Button _rent; + public static class RentBookDialogFragment extends DialogFragment + { + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + // This example shows how to add a custom layout to an AlertDialog + LayoutInflater factory = LayoutInflater.from(getActivity()); + final View entryView = factory.inflate(R.layout.rentername, null); + final EditText renter = (EditText)entryView.findViewById(R.id.renter); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Enter Renter") + .setView(entryView) + .setPositiveButton("OK", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + final String r = renter.getText().toString().trim(); + if(r.length() > 0) + { + ((ViewActivity)getActivity()).rentBook(r); + } + } + }) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + } + }); + return builder.create(); + } + } + + public static class DeleteBookDialogFragment extends DialogFragment + { + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder .setTitle("Delete") + .setMessage("This book will be deleted.") + .setPositiveButton("OK", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + ((ViewActivity)getActivity()).deleteBook(); + } + }) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + } + }); + return builder.create(); + } + } + private void updateBookDescription() { // Update the fields. @@ -75,6 +130,17 @@ public class ViewActivity extends SessionActivity } } + private void deleteBook() + { + _queryController.deleteBook(); + } + + private void rentBook(String renter) + { + _rent.setEnabled(false); + _queryController.rentBook(renter); + } + /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) @@ -96,7 +162,8 @@ public class ViewActivity extends SessionActivity { if(_desc.rentedBy.length() == 0) { - showDialog(DIALOG_RENT_BOOK); + DialogFragment dialog = new RentBookDialogFragment(); + dialog.show(getFragmentManager(), RENT_TAG); } else { @@ -132,7 +199,7 @@ public class ViewActivity extends SessionActivity public void onError() { _rent.setEnabled(true); - showDialog(DIALOG_ERROR); + showDialogError(); } }); } @@ -156,74 +223,11 @@ public class ViewActivity extends SessionActivity return true; case DELETE_ID: - showDialog(DIALOG_DELETE); + DialogFragment dialog = new DeleteBookDialogFragment(); + dialog.show(getFragmentManager(), DELETE_TAG); return true; } return super.onOptionsItemSelected(item); } - - @Override - protected Dialog onCreateDialog(final int id) - { - Dialog d = super.onCreateDialog(id); - if(d != null) - { - return d; - } - switch (id) - { - case DIALOG_DELETE: - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Delete"); - builder.setMessage("This book will be deleted."); - builder.setPositiveButton("OK", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - _queryController.deleteBook(); - } - }); - builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - } - }); - return builder.create(); - } - - case DIALOG_RENT_BOOK: - { - // This example shows how to add a custom layout to an AlertDialog - LayoutInflater factory = LayoutInflater.from(this); - final View entryView = factory.inflate(R.layout.rentername, null); - final EditText renter = (EditText)entryView.findViewById(R.id.renter); - AlertDialog.Builder builder = new AlertDialog.Builder(ViewActivity.this); - builder.setTitle("Enter Renter"); - builder.setView(entryView); - builder.setPositiveButton("OK", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - final String r = renter.getText().toString().trim(); - if(r.length() > 0) - { - _rent.setEnabled(false); - _queryController.rentBook(r); - } - } - }); - builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - } - }); - return builder.create(); - } - } - return null; - } } diff --git a/android/test/android/src/main/java/com/zeroc/testsuite/TestApp.java b/android/test/android/src/main/java/com/zeroc/testsuite/TestApp.java index 41fbcc6a55f..3c878151d74 100644 --- a/android/test/android/src/main/java/com/zeroc/testsuite/TestApp.java +++ b/android/test/android/src/main/java/com/zeroc/testsuite/TestApp.java @@ -588,7 +588,7 @@ public class TestApp extends Application setupAddress(args, _ipv6); - if(_testName == "plugin") + if(_testName.equals("plugin")) { try { @@ -862,10 +862,6 @@ public class TestApp extends Application synchronized public void startTest(int position) { - assert !_mode.isSSL() || (_mode.isSSL() && _sslInitialized); - - PrintWriter pw = new PrintWriter(new MyWriter()); - _currentTest = position; _complete = false; _strings.clear(); @@ -987,7 +983,7 @@ public class TestApp extends Application { private SSLContext initializeContext(java.io.InputStream cert) throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, - FileNotFoundException, UnrecoverableKeyException, KeyManagementException + UnrecoverableKeyException, KeyManagementException { SSLContext context = SSLContext.getInstance("TLS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); diff --git a/android/test/android/src/main/java/com/zeroc/testsuite/TestSuite.java b/android/test/android/src/main/java/com/zeroc/testsuite/TestSuite.java index a2154c35742..7787c3ed497 100644 --- a/android/test/android/src/main/java/com/zeroc/testsuite/TestSuite.java +++ b/android/test/android/src/main/java/com/zeroc/testsuite/TestSuite.java @@ -12,10 +12,7 @@ package com.zeroc.testsuite; import java.util.ArrayList; import java.util.List; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.ListActivity; -import android.app.ProgressDialog; +import android.app.*; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; @@ -25,8 +22,9 @@ import android.widget.CompoundButton.OnCheckedChangeListener; public class TestSuite extends ListActivity { - private static final int DIALOG_INITIALIZING = 1; - private static final int DIALOG_SSL_FAILED = 2; + public static final String INITIALIZE_TAG = "initialize"; + public static final String FAILED_TAG = "failed"; + private List<String> _tests = new ArrayList<String>(); @Override @@ -48,7 +46,11 @@ public class TestSuite extends ListActivity { if(dismiss) { - dismissDialog(DIALOG_INITIALIZING); + DialogFragment f= (DialogFragment)getFragmentManager().findFragmentByTag(INITIALIZE_TAG); + if(f != null) + { + f.dismiss(); + } } } @@ -56,16 +58,22 @@ public class TestSuite extends ListActivity { if(dismiss) { - dismissDialog(DIALOG_INITIALIZING); + DialogFragment f= (DialogFragment)getFragmentManager().findFragmentByTag(INITIALIZE_TAG); + if(f != null) + { + f.dismiss(); + } } - showDialog(DIALOG_SSL_FAILED); + DialogFragment dialog = new SSLFailedDialogFragment(); + dialog.show(getFragmentManager(), FAILED_TAG); } public void onWait() { // Show the initializing dialog. dismiss = true; - showDialog(DIALOG_INITIALIZING); + DialogFragment dialog = new InitializeDialogFragment(); + dialog.show(getFragmentManager(), INITIALIZE_TAG); } }); Spinner mode = (Spinner)findViewById(R.id.mode); @@ -109,37 +117,37 @@ public class TestSuite extends ListActivity startActivity(new Intent(this, TestContainer.class)); } - @Override - protected Dialog onCreateDialog(int id) + public static class InitializeDialogFragment extends DialogFragment { - switch (id) - { - case DIALOG_INITIALIZING: + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { - ProgressDialog dialog = new ProgressDialog(this); + ProgressDialog dialog = new ProgressDialog(getActivity()); dialog.setTitle("Initializing"); dialog.setMessage("Please wait while initializing SSL..."); dialog.setIndeterminate(true); dialog.setCancelable(false); return dialog; } + } - case DIALOG_SSL_FAILED: + public static class SSLFailedDialogFragment extends DialogFragment + { + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Error"); - builder.setMessage("SSL Initialization failed"); - builder.setCancelable(false); - builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - finish(); - } - }); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Error") + .setMessage("SSL Initialization failed") + .setCancelable(false) + .setPositiveButton("Ok", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + getActivity().finish(); + } + }); return builder.create(); } - } - return null; } } diff --git a/android/test/android/testApp.iml b/android/test/android/testApp.iml index 299ec77ac2d..981662e19b1 100644 --- a/android/test/android/testApp.iml +++ b/android/test/android/testApp.iml @@ -80,7 +80,6 @@ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" /> <excludeFolder url="file://$MODULE_DIR$/build/outputs" /> - <excludeFolder url="file://$MODULE_DIR$/build/tmp" /> </content> <orderEntry type="jdk" jdkName="Android API 17 Platform" jdkType="Android SDK" /> <orderEntry type="sourceFolder" forTests="false" /> diff --git a/android/test/plugins/testPlugins.iml b/android/test/plugins/testPlugins.iml index f6fbd6b7fec..916e385fd3b 100644 --- a/android/test/plugins/testPlugins.iml +++ b/android/test/plugins/testPlugins.iml @@ -25,7 +25,6 @@ <excludeFolder url="file://$MODULE_DIR$/.gradle" /> <excludeFolder url="file://$MODULE_DIR$/build/classes" /> <excludeFolder url="file://$MODULE_DIR$/build/dependency-cache" /> - <excludeFolder url="file://$MODULE_DIR$/build/libs" /> <excludeFolder url="file://$MODULE_DIR$/build/tmp" /> </content> <content url="file://$MODULE_DIR$/../../../java/test/plugins/src/main/java"> |