├── paho.mqtt.android.example ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── strings.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── values-v21 │ │ │ │ └── styles.xml │ │ │ └── layout │ │ │ │ ├── history_row.xml │ │ │ │ └── activity_scrolling.xml │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── paho │ │ │ └── mqtt │ │ │ └── java │ │ │ └── example │ │ │ └── HistoryAdapter.java │ ├── test │ │ └── java │ │ │ └── paho │ │ │ └── mqtt │ │ │ └── java │ │ │ └── example │ │ │ └── ExampleUnitTest.java │ └── androidTest │ │ └── java │ │ └── paho │ │ └── mqtt │ │ └── java │ │ └── example │ │ └── ApplicationTest.java ├── proguard-rules.pro └── build.gradle ├── org.eclipse.paho.android.sample ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── menu │ │ │ │ ├── menu_main.xml │ │ │ │ ├── menu_connection.xml │ │ │ │ └── menu_edit_connection.xml │ │ │ ├── drawable-hdpi │ │ │ │ ├── ic_add.png │ │ │ │ ├── ic_done.png │ │ │ │ ├── ic_help.png │ │ │ │ ├── ic_delete.png │ │ │ │ ├── ic_topic.png │ │ │ │ ├── ic_cloud_off_dark.png │ │ │ │ └── ic_cloud_done_dark.png │ │ │ ├── drawable-mdpi │ │ │ │ ├── ic_add.png │ │ │ │ ├── ic_done.png │ │ │ │ ├── ic_help.png │ │ │ │ ├── ic_delete.png │ │ │ │ ├── ic_topic.png │ │ │ │ ├── ic_cloud_off_dark.png │ │ │ │ └── ic_cloud_done_dark.png │ │ │ ├── drawable-xhdpi │ │ │ │ ├── ic_add.png │ │ │ │ ├── ic_delete.png │ │ │ │ ├── ic_done.png │ │ │ │ ├── ic_help.png │ │ │ │ ├── ic_topic.png │ │ │ │ ├── ic_cloud_done_dark.png │ │ │ │ └── ic_cloud_off_dark.png │ │ │ ├── drawable-xxhdpi │ │ │ │ ├── ic_add.png │ │ │ │ ├── ic_done.png │ │ │ │ ├── ic_help.png │ │ │ │ ├── ic_topic.png │ │ │ │ ├── ic_delete.png │ │ │ │ ├── ic_cloud_done_dark.png │ │ │ │ └── ic_cloud_off_dark.png │ │ │ ├── drawable │ │ │ │ └── paho_logo_full.png │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── values │ │ │ │ ├── integers.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── text_select_values.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── styles.xml │ │ │ │ └── strings.xml │ │ │ ├── values-w820dp │ │ │ │ └── dimens.xml │ │ │ ├── layout │ │ │ │ ├── toolbar.xml │ │ │ │ ├── switch_layout.xml │ │ │ │ ├── text_select.xml │ │ │ │ ├── text_input_dialog.xml │ │ │ │ ├── fragment_connection.xml │ │ │ │ ├── fragment_subscriptions.xml │ │ │ │ ├── fragment_connection_history.xml │ │ │ │ ├── fragment_home.xml │ │ │ │ ├── nav_drawer_row.xml │ │ │ │ ├── message_list_item.xml │ │ │ │ ├── activity_main.xml │ │ │ │ ├── subscription_dialog.xml │ │ │ │ ├── fragment_manage.xml │ │ │ │ ├── fragment_help.xml │ │ │ │ ├── subscription_list_item.xml │ │ │ │ ├── fragment_navigation_drawer.xml │ │ │ │ └── fragment_publish.xml │ │ │ ├── values-v21 │ │ │ │ └── styles.xml │ │ │ └── values-v17 │ │ │ │ └── styles.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── org │ │ │ │ └── eclipse │ │ │ │ └── paho │ │ │ │ └── android │ │ │ │ └── sample │ │ │ │ ├── components │ │ │ │ ├── ITextSelectCallback.java │ │ │ │ ├── MessageListItemAdapter.java │ │ │ │ ├── SubscriptionListItemAdapter.java │ │ │ │ └── TextSelectComponent.java │ │ │ │ ├── internal │ │ │ │ ├── IReceivedMessageListener.java │ │ │ │ ├── PersistenceException.java │ │ │ │ └── Connections.java │ │ │ │ ├── model │ │ │ │ ├── NavDrawerItem.java │ │ │ │ ├── ReceivedMessage.java │ │ │ │ └── Subscription.java │ │ │ │ ├── activity │ │ │ │ ├── HomeFragment.java │ │ │ │ ├── MessagesFragment.java │ │ │ │ ├── ActivityConstants.java │ │ │ │ ├── MqttTraceCallback.java │ │ │ │ ├── HistoryFragment.java │ │ │ │ ├── Notify.java │ │ │ │ ├── ConnectionFragment.java │ │ │ │ ├── MqttCallbackHandler.java │ │ │ │ ├── ManageConnectionFragment.java │ │ │ │ ├── PublishFragment.java │ │ │ │ ├── HelpFragment.java │ │ │ │ └── SubscriptionFragment.java │ │ │ │ └── adapter │ │ │ │ └── NavigationDrawerAdapter.java │ │ └── AndroidManifest.xml │ └── androidTest │ │ └── java │ │ └── org │ │ └── eclipse │ │ └── paho │ │ └── android │ │ └── sample │ │ └── ApplicationTest.java ├── proguard-rules.pro └── build.gradle ├── org.eclipse.paho.android.service ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ ├── values-v11 │ │ │ │ └── styles.xml │ │ │ └── values-v14 │ │ │ │ └── styles.xml │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── org │ │ │ └── eclipse │ │ │ └── paho │ │ │ └── android │ │ │ └── service │ │ │ ├── Status.java │ │ │ ├── MqttServiceBinder.java │ │ │ ├── MqttTraceHandler.java │ │ │ ├── MqttDeliveryTokenAndroid.java │ │ │ ├── MessageStore.java │ │ │ ├── ParcelableMqttMessage.java │ │ │ ├── MqttServiceConstants.java │ │ │ ├── AlarmPingSender.java │ │ │ └── MqttTokenAndroid.java │ └── androidTest │ │ ├── assets │ │ ├── test.bks │ │ ├── test.properties │ │ └── updatingCertificates.md │ │ ├── java │ │ └── org │ │ │ └── eclipse │ │ │ └── paho │ │ │ └── android │ │ │ ├── TestCaseNotifier.java │ │ │ └── TestProperties.java │ │ └── AndroidManifest.xml ├── proguard-rules.pro ├── .project └── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── waitForEmulator.sh ├── settings.gradle ├── .github ├── PULL_REQUEST_TEMPLATE.md └── ISSUE_TEMPLATE.md ├── .travis.yml ├── gradle.properties ├── org.eclipse.paho.android.iml ├── edl-v10 ├── about.html ├── .gitignore ├── gradlew.bat ├── CONTRIBUTING.md ├── gradlew └── README.md /paho.mqtt.android.example/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Paho Example 3 | 4 | 5 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 180dp 3 | 16dp 4 | 5 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/androidTest/assets/test.bks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.service/src/androidTest/assets/test.bks -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/paho.mqtt.android.example/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/paho.mqtt.android.example/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/paho.mqtt.android.example/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/paho.mqtt.android.example/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_add.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_done.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_help.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_add.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_done.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_help.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_add.png -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/paho.mqtt.android.example/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_delete.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_topic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_topic.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_delete.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_topic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_topic.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_delete.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_done.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_help.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_topic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_topic.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_add.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_done.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_help.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_topic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_topic.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable/paho_logo_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable/paho_logo_full.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_delete.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_cloud_off_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_cloud_off_dark.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_cloud_off_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_cloud_off_dark.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_cloud_done_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-hdpi/ic_cloud_done_dark.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_cloud_done_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-mdpi/ic_cloud_done_dark.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_cloud_done_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_cloud_done_dark.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_cloud_off_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xhdpi/ic_cloud_off_dark.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_cloud_done_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_cloud_done_dark.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_cloud_off_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hellohaptik/paho.mqtt.android/master/org.eclipse.paho.android.sample/src/main/res/drawable-xxhdpi/ic_cloud_off_dark.png -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/java/org/eclipse/paho/android/sample/components/ITextSelectCallback.java: -------------------------------------------------------------------------------- 1 | package org.eclipse.paho.android.sample.components; 2 | 3 | 4 | interface ITextSelectCallback { 5 | void onTextUpdate(String updatedText); 6 | } 7 | -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #9C27B0 4 | #7B1FA2 5 | #7C4DFF 6 | 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Jan 24 11:18:55 GMT 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 7 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/values/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1883 4 | 60 5 | 200 6 | 7 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/java/org/eclipse/paho/android/sample/internal/IReceivedMessageListener.java: -------------------------------------------------------------------------------- 1 | package org.eclipse.paho.android.sample.internal; 2 | 3 | import org.eclipse.paho.android.sample.model.ReceivedMessage; 4 | 5 | public interface IReceivedMessageListener { 6 | 7 | void onMessageReceived(ReceivedMessage message); 8 | } -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 260dp 6 | 7 | -------------------------------------------------------------------------------- /waitForEmulator.sh: -------------------------------------------------------------------------------- 1 | echo Android Home is: $ANDROID_HOME 2 | echo Waiting for Emulator to Boot. 3 | while true; do 4 | str=`$ANDROID_HOME/platform-tools/adb shell getprop init.svc.bootanim 2>&1` 5 | echo -n . 6 | if [[ $str =~ 'stopped' ]]; then 7 | break 8 | fi 9 | sleep 5 10 | done 11 | echo Finished: $str 12 | echo Emulator has booted. 13 | -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | > 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':org.eclipse.paho.android.service',':org.eclipse.paho.android.sample',':paho.mqtt.android.example' 2 | project(':org.eclipse.paho.android.service').projectDir = new File('org.eclipse.paho.android.service') 3 | project(':paho.mqtt.android.example').projectDir = new File('paho.mqtt.android.example') 4 | project(':org.eclipse.paho.android.sample').projectDir = new File('org.eclipse.paho.android.sample') 5 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/main/res/values-v11/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/values/text_select_values.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/androidTest/assets/test.properties: -------------------------------------------------------------------------------- 1 | # This is the server URI which will be set in the constructor of an MQTT Client 2 | # The default is "tcp://:1883" with expressed in IPV4 dotted decimal notation 3 | SERVER_URI=tcp://iot.eclipse.org:1883 4 | SERVER_SSL_URI=ssl://iot.eclipse.org:8883 5 | CLIENT_KEY_STORE=test.bks 6 | CLIENT_KEY_STORE_PASSWORD=mqtttest 7 | WAIT_FOR_COMPLETION_TIME=6000 8 | -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/test/java/paho/mqtt/java/example/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package paho.mqtt.java.example; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * To work on unit tests, switch the Test Artifact in the Build Variants view. 9 | */ 10 | public class ExampleUnitTest { 11 | @Test 12 | public void addition_isCorrect() throws Exception { 13 | assertEquals(4, 2 + 2); 14 | } 15 | } -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/menu/menu_connection.xml: -------------------------------------------------------------------------------- 1 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/main/res/values-v14/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/androidTest/java/org/eclipse/paho/android/sample/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package org.eclipse.paho.android.sample; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #9C27B0 4 | #7B1FA2 5 | 6 | #212121 7 | #727272 8 | #B6B6B6 9 | #7C4DFF 10 | 11 | 12 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/menu/menu_edit_connection.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/layout/toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Please make sure that the following boxes are checked before submitting your Pull Request, thank you! 2 | 3 | - [ ] You have signed the [Eclipse ECA](https://wiki.eclipse.org/ECA) 4 | - [ ] All of your commits have been signed-off with the correct email address (The same one that you used to sign the CLA) 5 | - [ ] If This PR fixes an issue, that you reference the issue below. OR if this is a new issue that you are fixing straight away that you add some Description about the bug and how this will fix it. 6 | - [ ] If this is new functionality, You have added the appropriate Unit tests. 7 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/androidTest/assets/updatingCertificates.md: -------------------------------------------------------------------------------- 1 | # How to Add certificates to the BKS keystore 2 | 3 | ## Getting the certificates 4 | 5 | ```openssl s_client -connect iot.eclipse.org:8883 -showcerts``` 6 | 7 | Notes: you need all certificates in chain (Copy each to a .crt file) 8 | 9 | ## Adding to keystore 10 | 11 | ```keytool -importcert -v -trustcacerts -file "iot.eclipse.org.crt" -alias iot.eclipse.org -keystore "test.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "/home/james/Downloads/bcprov-jdk15on-154.jar" -storetype BKS -storepass mqtttest``` 12 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/layout/switch_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/layout/history_row.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/androidTest/java/org/eclipse/paho/android/TestCaseNotifier.java: -------------------------------------------------------------------------------- 1 | package org.eclipse.paho.android; 2 | 3 | class TestCaseNotifier { 4 | 5 | private Throwable exception; 6 | 7 | public void storeException(Throwable exception) { 8 | this.exception = exception; 9 | } 10 | 11 | public synchronized void waitForCompletion(long timeout) throws Throwable { 12 | 13 | try { 14 | wait(timeout); 15 | } 16 | catch (InterruptedException ignored) {} 17 | 18 | if (exception != null) { 19 | throw exception; 20 | } 21 | 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | jdk: oraclejdk8 3 | android: 4 | components: 5 | - tools 6 | - build-tools-23.0.3 7 | - android-24 8 | - extra-android-support 9 | - extra 10 | 11 | #before_script: 12 | # - echo no | android create avd --force -n test -t android-19 --abi armeabi-v7a 13 | # - emulator -avd test -no-audio -no-window & 14 | # - android-wait-for-emulator 15 | # - adb shell input keyevent 82 & 16 | 17 | script: 18 | - ./gradlew clean 19 | - ./gradlew org.eclipse.paho.android.sample:assemble paho.mqtt.android.example:assemble 20 | # - ./gradlew org.eclipse.paho.android.service:assemble org.eclipse.paho.android.service:connectedCheck 21 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/java/org/eclipse/paho/android/sample/model/NavDrawerItem.java: -------------------------------------------------------------------------------- 1 | package org.eclipse.paho.android.sample.model; 2 | 3 | 4 | import org.eclipse.paho.android.sample.activity.Connection; 5 | 6 | public class NavDrawerItem { 7 | private boolean showNotify; 8 | private String title; 9 | private String handle; 10 | 11 | public NavDrawerItem(Connection connection){ 12 | this.title = connection.getId(); 13 | this.handle = connection.handle(); 14 | } 15 | 16 | public String getTitle(){ 17 | return title; 18 | } 19 | 20 | public String getHandle() { 21 | return handle; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Please fill out the form below before submitting, thank you! 2 | 3 | - [ ] Bug exists Release Version 1.1.1 (Java Repository Master Branch) 4 | - [ ] Bug exists in Snapshot Version 1.1.2-SNAPSHOT (Android Service Repository Master Branch) 5 | - [ ] Bug is just in the Sample Application. 6 | 7 | __Android API Version Bug Seen on:__ 8 | 9 | __Android Version Bug Seen on:__ 10 | 11 | 12 | Please also check that if you have found the bug in the Release version (1.1.1) that you check that it also exists in the Snapshot (1.1.2-SNAPSHOT) before raising a bug. 13 | 14 | 15 | ## Description of Bug: 16 | E.g. Steps to re-create, how often does this happen etc.. 17 | 18 | ## Console Log output (if available): 19 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/layout/text_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 11 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /paho.mqtt.android.example/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /home/james/Android/Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /home/james/Android/Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /home/james/Android/Sdk/tools/proguard/proguard-org.eclipse.paho.android.service.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 14 | 15 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 | 15 | 16 | 25 | 26 | 34 | 35 | 45 | -------------------------------------------------------------------------------- /paho.mqtt.android.example/src/main/res/layout/activity_scrolling.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 17 | 18 | 25 | 26 | 32 | 33 | 34 | 35 | 36 | 37 | 44 | 45 | 53 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/java/org/eclipse/paho/android/sample/components/SubscriptionListItemAdapter.java: -------------------------------------------------------------------------------- 1 | package org.eclipse.paho.android.sample.components; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.NonNull; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ArrayAdapter; 9 | import android.widget.ImageView; 10 | import android.widget.TextView; 11 | 12 | import org.eclipse.paho.android.sample.R; 13 | import org.eclipse.paho.android.sample.model.Subscription; 14 | 15 | import java.util.ArrayList; 16 | 17 | public class SubscriptionListItemAdapter extends ArrayAdapter{ 18 | 19 | private final Context context; 20 | private final ArrayList topics; 21 | private final ArrayList unsubscribeListners = new ArrayList(); 22 | //private final Map topics; 23 | 24 | public SubscriptionListItemAdapter(Context context, ArrayList topics){ 25 | super(context, R.layout.subscription_list_item, topics); 26 | this.context = context; 27 | this.topics = topics; 28 | 29 | } 30 | 31 | @NonNull 32 | @Override 33 | public View getView(final int position, View convertView, @NonNull ViewGroup parent){ 34 | LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 35 | View rowView = inflater.inflate(R.layout.subscription_list_item, parent, false); 36 | TextView topicTextView = (TextView) rowView.findViewById(R.id.message_text); 37 | ImageView topicDeleteButton = (ImageView) rowView.findViewById(R.id.topic_delete_image); 38 | TextView qosTextView = (TextView) rowView.findViewById(R.id.qos_label); 39 | topicTextView.setText(topics.get(position).getTopic()); 40 | String qosString = context.getString(R.string.qos_text, topics.get(position).getQos()); 41 | qosTextView.setText(qosString); 42 | TextView notifyTextView = (TextView) rowView.findViewById(R.id.show_notifications_label); 43 | String notifyString = context.getString(R.string.notify_text, (topics.get(position).isEnableNotifications() ? context.getString(R.string.enabled) : context.getString(R.string.disabled))); 44 | notifyTextView.setText(notifyString); 45 | 46 | topicDeleteButton.setOnClickListener(new View.OnClickListener() { 47 | @Override 48 | public void onClick(View v) { 49 | 50 | for (OnUnsubscribeListner listner : unsubscribeListners) { 51 | listner.onUnsubscribe(topics.get(position)); 52 | } 53 | topics.remove(position); 54 | notifyDataSetChanged(); 55 | } 56 | }); 57 | 58 | return rowView; 59 | } 60 | 61 | public void addOnUnsubscribeListner(OnUnsubscribeListner listner){ 62 | unsubscribeListners.add(listner); 63 | } 64 | 65 | public interface OnUnsubscribeListner{ 66 | void onUnsubscribe(Subscription subscription); 67 | } 68 | 69 | 70 | 71 | } 72 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/java/org/eclipse/paho/android/sample/activity/HistoryFragment.java: -------------------------------------------------------------------------------- 1 | package org.eclipse.paho.android.sample.activity; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.app.Fragment; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.Button; 9 | import android.widget.ListView; 10 | 11 | import org.eclipse.paho.android.sample.R; 12 | import org.eclipse.paho.android.sample.components.MessageListItemAdapter; 13 | import org.eclipse.paho.android.sample.internal.Connections; 14 | import org.eclipse.paho.android.sample.internal.IReceivedMessageListener; 15 | import org.eclipse.paho.android.sample.model.ReceivedMessage; 16 | 17 | import java.util.ArrayList; 18 | import java.util.Map; 19 | 20 | 21 | public class HistoryFragment extends Fragment { 22 | 23 | private MessageListItemAdapter messageListAdapter; 24 | 25 | 26 | private ArrayList messages; 27 | public HistoryFragment() { 28 | 29 | setHasOptionsMenu(true); 30 | 31 | } 32 | 33 | @Override 34 | public void onCreate(Bundle savedInstanceState) { 35 | super.onCreate(savedInstanceState); 36 | Map connections = Connections.getInstance(this.getActivity()) 37 | .getConnections(); 38 | Connection connection = connections.get(this.getArguments().getString(ActivityConstants.CONNECTION_KEY)); 39 | System.out.println("History Fragment: " + connection.getId()); 40 | setHasOptionsMenu(true); 41 | messages = connection.getMessages(); 42 | connection.addReceivedMessageListner(new IReceivedMessageListener() { 43 | @Override 44 | public void onMessageReceived(ReceivedMessage message) { 45 | System.out.println("GOT A MESSAGE in history " + new String(message.getMessage().getPayload())); 46 | System.out.println("M: " + messages.size()); 47 | messageListAdapter.notifyDataSetChanged(); 48 | } 49 | }); 50 | 51 | 52 | 53 | 54 | 55 | } 56 | 57 | @Override 58 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 59 | Bundle savedInstanceState) { 60 | 61 | 62 | View rootView = inflater.inflate(R.layout.fragment_connection_history, container, false); 63 | 64 | messageListAdapter = new MessageListItemAdapter(getActivity(), messages); 65 | ListView messageHistoryListView = (ListView) rootView.findViewById(R.id.history_list_view); 66 | messageHistoryListView.setAdapter(messageListAdapter); 67 | 68 | Button clearButton = (Button) rootView.findViewById(R.id.history_clear_button); 69 | clearButton.setOnClickListener(new View.OnClickListener() { 70 | @Override 71 | public void onClick(View v) { 72 | messages.clear(); 73 | messageListAdapter.notifyDataSetChanged(); 74 | } 75 | }); 76 | 77 | // Inflate the layout for this fragment 78 | return rootView; 79 | 80 | 81 | 82 | 83 | } 84 | 85 | 86 | } 87 | 88 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/layout/fragment_navigation_drawer.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 16 | 17 | 24 | 25 | 26 | 27 | 28 | 33 | 34 | 40 | 41 | 42 | 49 | 52 | 53 | 54 | 67 | 68 | 69 | 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/main/java/org/eclipse/paho/android/service/MessageStore.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 1999, 2014 IBM Corp. 3 | * 4 | * All rights reserved. This program and the accompanying materials 5 | * are made available under the terms of the Eclipse Public License v1.0 6 | * and Eclipse Distribution License v1.0 which accompany this distribution. 7 | * 8 | * The Eclipse Public License is available at 9 | * http://www.eclipse.org/legal/epl-v10.html 10 | * and the Eclipse Distribution License is available at 11 | * http://www.eclipse.org/org/documents/edl-v10.php. 12 | */ 13 | package org.eclipse.paho.android.service; 14 | 15 | import java.util.Iterator; 16 | 17 | import org.eclipse.paho.client.mqttv3.MqttMessage; 18 | 19 | /** 20 | *

21 | * Mechanism for persisting messages until we know they have been received 22 | *

23 | *
    24 | *
  • A Service should store messages as they arrive via 25 | * {@link #storeArrived(String, String, MqttMessage)}. 26 | *
  • When a message has been passed to the consuming entity, 27 | * {@link #discardArrived(String, String)} should be called. 28 | *
  • To recover messages which have not been definitely passed to the 29 | * consumer, {@link MessageStore#getAllArrivedMessages(String)} is used. 30 | *
  • When a clean session is started {@link #clearArrivedMessages(String)} is 31 | * used. 32 | *
33 | */ 34 | interface MessageStore { 35 | 36 | /** 37 | * External representation of a stored message 38 | */ 39 | interface StoredMessage { 40 | /** 41 | * @return the identifier for the message within the store 42 | */ 43 | String getMessageId(); 44 | 45 | /** 46 | * @return the identifier of the client which stored this message 47 | */ 48 | String getClientHandle(); 49 | 50 | /** 51 | * @return the topic on which the message was received 52 | */ 53 | String getTopic(); 54 | 55 | /** 56 | * @return the identifier of the client which stored this message 57 | */ 58 | MqttMessage getMessage(); 59 | } 60 | 61 | /** 62 | * Store a message and return an identifier for it 63 | * 64 | * @param clientHandle 65 | * identifier for the client 66 | * @param message 67 | * message to be stored 68 | * @return a unique identifier for it 69 | */ 70 | String storeArrived(String clientHandle, String Topic, 71 | MqttMessage message); 72 | 73 | /** 74 | * Discard a message - called when we are certain that an arrived message 75 | * has reached the application. 76 | * 77 | * @param clientHandle 78 | * identifier for the client 79 | * @param id 80 | * id of message to be discarded 81 | */ 82 | boolean discardArrived(String clientHandle, String id); 83 | 84 | /** 85 | * Get all the stored messages, usually for a specific client 86 | * 87 | * @param clientHandle 88 | * identifier for the client - if null, then messages for all 89 | * clients are returned 90 | */ 91 | Iterator getAllArrivedMessages(String clientHandle); 92 | 93 | /** 94 | * Discard stored messages, usually for a specific client 95 | * 96 | * @param clientHandle 97 | * identifier for the client - if null, then messages for all 98 | * clients are discarded 99 | */ 100 | void clearArrivedMessages(String clientHandle); 101 | 102 | void close(); 103 | } 104 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/java/org/eclipse/paho/android/sample/activity/Notify.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 1999, 2014 IBM Corp. 3 | * 4 | * All rights reserved. This program and the accompanying materials 5 | * are made available under the terms of the Eclipse Public License v1.0 6 | * and Eclipse Distribution License v1.0 which accompany this distribution. 7 | * 8 | * The Eclipse Public License is available at 9 | * http://www.eclipse.org/legal/epl-v10.html 10 | * and the Eclipse Distribution License is available at 11 | * http://www.eclipse.org/org/documents/edl-v10.php. 12 | */ 13 | package org.eclipse.paho.android.sample.activity; 14 | 15 | import android.app.Notification; 16 | import android.app.NotificationManager; 17 | import android.app.PendingIntent; 18 | import android.content.Context; 19 | import android.content.Intent; 20 | import android.support.v4.app.NotificationCompat.Builder; 21 | import android.widget.Toast; 22 | 23 | import org.eclipse.paho.android.sample.R; 24 | 25 | /** 26 | * Provides static methods for creating and showing notifications to the user. 27 | * 28 | */ 29 | class Notify { 30 | 31 | /** Message ID Counter **/ 32 | private static int MessageID = 0; 33 | 34 | /** 35 | * Displays a notification in the notification area of the UI 36 | * @param context Context from which to create the notification 37 | * @param messageString The string to display to the user as a message 38 | * @param intent The intent which will start the activity when the user clicks the notification 39 | * @param notificationTitle The resource reference to the notification title 40 | */ 41 | static void notifcation(Context context, String messageString, Intent intent, int notificationTitle) { 42 | 43 | //Get the notification manage which we will use to display the notification 44 | String ns = Context.NOTIFICATION_SERVICE; 45 | NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns); 46 | 47 | long when = System.currentTimeMillis(); 48 | 49 | //get the notification title from the application's strings.xml file 50 | CharSequence contentTitle = context.getString(notificationTitle); 51 | 52 | //the message that will be displayed as the ticker 53 | String ticker = contentTitle + " " + messageString; 54 | 55 | //build the pending intent that will start the appropriate activity 56 | PendingIntent pendingIntent = PendingIntent.getActivity(context, 57 | 0, intent, 0); 58 | 59 | //build the notification 60 | Builder notificationCompat = new Builder(context); 61 | notificationCompat.setAutoCancel(true) 62 | .setContentTitle(contentTitle) 63 | .setContentIntent(pendingIntent) 64 | .setContentText(messageString) 65 | .setTicker(ticker) 66 | .setWhen(when) 67 | .setSmallIcon(R.mipmap.ic_launcher); 68 | 69 | Notification notification = notificationCompat.build(); 70 | //display the notification 71 | mNotificationManager.notify(MessageID, notification); 72 | MessageID++; 73 | 74 | } 75 | 76 | /** 77 | * Display a toast notification to the user 78 | * @param context Context from which to create a notification 79 | * @param text The text the toast should display 80 | * @param duration The amount of time for the toast to appear to the user 81 | */ 82 | static void toast(Context context, CharSequence text, @SuppressWarnings("SameParameterValue") int duration) { 83 | Toast toast = Toast.makeText(context, text, duration); 84 | toast.show(); 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/java/org/eclipse/paho/android/sample/activity/ConnectionFragment.java: -------------------------------------------------------------------------------- 1 | package org.eclipse.paho.android.sample.activity; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.app.Fragment; 5 | import android.support.v4.app.FragmentTabHost; 6 | import android.view.LayoutInflater; 7 | import android.view.Menu; 8 | import android.view.MenuInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.widget.CompoundButton; 12 | import android.widget.Switch; 13 | import org.eclipse.paho.android.sample.R; 14 | import org.eclipse.paho.android.sample.internal.Connections; 15 | import java.util.Map; 16 | 17 | 18 | public class ConnectionFragment extends Fragment { 19 | private Connection connection; 20 | private FragmentTabHost mTabHost; 21 | private Switch connectSwitch; 22 | 23 | public ConnectionFragment() { 24 | setHasOptionsMenu(true); 25 | } 26 | 27 | @Override 28 | public void onCreate(Bundle savedInstanceState) { 29 | super.onCreate(savedInstanceState); 30 | Map connections = Connections.getInstance(this.getActivity()) 31 | .getConnections(); 32 | connection = connections.get(this.getArguments().getString(ActivityConstants.CONNECTION_KEY)); 33 | boolean connected = this.getArguments().getBoolean(ActivityConstants.CONNECTED, false); 34 | 35 | setHasOptionsMenu(true); 36 | } 37 | 38 | @Override 39 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 40 | Bundle savedInstanceState) { 41 | 42 | View rootView = inflater.inflate(R.layout.fragment_connection, container, false); 43 | 44 | 45 | 46 | 47 | Bundle bundle = new Bundle(); 48 | bundle.putString(ActivityConstants.CONNECTION_KEY, connection.handle()); 49 | 50 | // Initialise the tab-host 51 | mTabHost = (FragmentTabHost) rootView.findViewById(android.R.id.tabhost); 52 | mTabHost.setup(getActivity(), getChildFragmentManager(), android.R.id.tabcontent); 53 | // Add a tab to the tabHost 54 | mTabHost.addTab(mTabHost.newTabSpec("History").setIndicator("History"), HistoryFragment.class, bundle); 55 | mTabHost.addTab(mTabHost.newTabSpec("Publish").setIndicator("Publish"), PublishFragment.class, bundle); 56 | mTabHost.addTab(mTabHost.newTabSpec("Subscribe").setIndicator("Subscribe"), SubscriptionFragment.class, bundle); 57 | return rootView; 58 | 59 | } 60 | 61 | private void changeConnectedState(boolean state){ 62 | mTabHost.getTabWidget().getChildTabViewAt(1).setEnabled(state); 63 | mTabHost.getTabWidget().getChildTabViewAt(2).setEnabled(state); 64 | connectSwitch.setChecked(state); 65 | } 66 | 67 | @Override 68 | public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater){ 69 | inflater.inflate(R.menu.menu_connection, menu); 70 | 71 | 72 | connectSwitch = (Switch) menu.findItem(R.id.connect_switch).getActionView().findViewById(R.id.switchForActionBar); 73 | 74 | connectSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 75 | @Override 76 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 77 | if (isChecked) { 78 | ((MainActivity) getActivity()).connect(connection); 79 | changeConnectedState(true); 80 | } else { 81 | ((MainActivity) getActivity()).disconnect(connection); 82 | changeConnectedState(false); 83 | } 84 | } 85 | }); 86 | changeConnectedState(connection.isConnected()); 87 | super.onCreateOptionsMenu(menu, inflater); 88 | } 89 | 90 | } 91 | 92 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.service/src/main/java/org/eclipse/paho/android/service/ParcelableMqttMessage.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 1999, 2014 IBM Corp. 3 | * 4 | * All rights reserved. This program and the accompanying materials 5 | * are made available under the terms of the Eclipse Public License v1.0 6 | * and Eclipse Distribution License v1.0 which accompany this distribution. 7 | * 8 | * The Eclipse Public License is available at 9 | * http://www.eclipse.org/legal/epl-v10.html 10 | * and the Eclipse Distribution License is available at 11 | * http://www.eclipse.org/org/documents/edl-v10.php. 12 | */ 13 | package org.eclipse.paho.android.service; 14 | 15 | import org.eclipse.paho.client.mqttv3.MqttMessage; 16 | 17 | import android.os.Parcel; 18 | import android.os.Parcelable; 19 | 20 | /** 21 | *

22 | * A way to flow MqttMessages via Bundles/Intents 23 | *

24 | * 25 | *

26 | * An application will probably use this only when receiving a message from a 27 | * Service in a Bundle - the necessary code will be something like this :- 28 | *

29 | *
 30 |  * 
 31 |  * 	private void messageArrivedAction(Bundle data) {
 32 |  * 		ParcelableMqttMessage message = (ParcelableMqttMessage) data
 33 |  * 			.getParcelable(MqttServiceConstants.CALLBACK_MESSAGE_PARCEL);
 34 |  *		Use the normal {@link MqttMessage} methods on the the message object.
 35 |  * 	}
 36 |  * 
 37 |  * 
 38 |  * 
39 | * 40 | *

41 | * It is unlikely that an application will directly use the methods which are 42 | * specific to this class. 43 | *

44 | */ 45 | 46 | public class ParcelableMqttMessage extends MqttMessage implements Parcelable { 47 | 48 | String messageId = null; 49 | 50 | ParcelableMqttMessage(MqttMessage original) { 51 | super(original.getPayload()); 52 | setQos(original.getQos()); 53 | setRetained(original.isRetained()); 54 | setDuplicate(original.isDuplicate()); 55 | } 56 | 57 | ParcelableMqttMessage(Parcel parcel) { 58 | super(parcel.createByteArray()); 59 | setQos(parcel.readInt()); 60 | boolean[] flags = parcel.createBooleanArray(); 61 | setRetained(flags[0]); 62 | setDuplicate(flags[1]); 63 | messageId = parcel.readString(); 64 | } 65 | 66 | /** 67 | * @return the messageId 68 | */ 69 | public String getMessageId() { 70 | return messageId; 71 | } 72 | 73 | /** 74 | * Describes the contents of this object 75 | */ 76 | @Override 77 | public int describeContents() { 78 | return 0; 79 | } 80 | 81 | /** 82 | * Writes the contents of this object to a parcel 83 | * 84 | * @param parcel 85 | * The parcel to write the data to. 86 | * @param flags 87 | * this parameter is ignored 88 | */ 89 | @Override 90 | public void writeToParcel(Parcel parcel, int flags) { 91 | parcel.writeByteArray(getPayload()); 92 | parcel.writeInt(getQos()); 93 | parcel.writeBooleanArray(new boolean[]{isRetained(), isDuplicate()}); 94 | parcel.writeString(messageId); 95 | } 96 | 97 | /** 98 | * A creator which creates the message object from a parcel 99 | */ 100 | public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 101 | 102 | /** 103 | * Creates a message from the parcel object 104 | */ 105 | @Override 106 | public ParcelableMqttMessage createFromParcel(Parcel parcel) { 107 | return new ParcelableMqttMessage(parcel); 108 | } 109 | 110 | /** 111 | * creates an array of type {@link ParcelableMqttMessage}[] 112 | * 113 | */ 114 | @Override 115 | public ParcelableMqttMessage[] newArray(int size) { 116 | return new ParcelableMqttMessage[size]; 117 | } 118 | }; 119 | } 120 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Paho 2 | 3 | Thanks for your interest in this project! 4 | 5 | You can contribute bugfixes and new features by sending pull requests through GitHub. 6 | 7 | ## Legal 8 | 9 | In order for your contribution to be accepted, it must comply with the Eclipse Foundation IP policy. 10 | 11 | Please read the [Eclipse Foundation policy on accepting contributions via Git](http://wiki.eclipse.org/Development_Resources/Contributing_via_Git). 12 | 13 | 1. Sign the [Eclipse CLA](http://www.eclipse.org/legal/CLA.php) 14 | 1. Register for an Eclipse Foundation User ID. You can register [here](https://dev.eclipse.org/site_login/createaccount.php). 15 | 2. Log into the [Projects Portal](https://projects.eclipse.org/), and click on the '[Eclipse CLA](https://projects.eclipse.org/user/sign/cla)' link. 16 | 2. Go to your [account settings](https://dev.eclipse.org/site_login/myaccount.php#open_tab_accountsettings) and add your GitHub username to your account. 17 | 3. Make sure that you _sign-off_ your Git commits in the following format: 18 | ``` Signed-off-by: John Smith ``` This is usually at the bottom of the commit message. You can automate this by adding the '-s' flag when you make the commits. e.g. ```git commit -s -m "Adding a cool feature"``` 19 | 4. Ensure that the email address that you make your commits with is the same one you used to sign up to the Eclipse Foundation website with. 20 | 21 | ## Contributing a change 22 | 23 | ## Contributing a change 24 | 25 | 1. [Fork the repository on GitHub](https://github.com/eclipse/paho.mqtt.android/fork) 26 | 2. Clone the forked repository onto your computer: ``` git clone https://github.com//paho.mqtt.android.git ``` 27 | 3. Create a new branch from the latest ```develop``` branch with ```git checkout -b YOUR_BRANCH_NAME origin/develop``` 28 | 4. Make your changes 29 | 5. If developing a new feature, make sure to include JUnit tests. 30 | 6. Ensure that all new and existing tests pass. 31 | 7. Commit the changes into the branch: ``` git commit -s ``` Make sure that your commit message is meaningful and describes your changes correctly. 32 | 8. If you have a lot of commits for the change, squash them into a single / few commits. 33 | 9. Push the changes in your branch to your forked repository. 34 | 10. Finally, go to [https://github.com/eclipse/paho.mqtt.android](https://github.com/eclipse/paho.mqtt.android) and create a pull request from your "YOUR_BRANCH_NAME" branch to the ```develop``` one to request review and merge of the commits in your pushed branch. 35 | 36 | 37 | What happens next depends on the content of the patch. If it is 100% authored 38 | by the contributor and is less than 1000 lines (and meets the needs of the 39 | project), then it can be pulled into the main repository. If not, more steps 40 | are required. These are detailed in the 41 | [legal process poster](http://www.eclipse.org/legal/EclipseLegalProcessPoster.pdf). 42 | 43 | 44 | 45 | ## Developer resources: 46 | 47 | 48 | Information regarding source code management, builds, coding standards, and more. 49 | 50 | - [https://projects.eclipse.org/projects/iot.paho/developer](https://projects.eclipse.org/projects/iot.paho/developer) 51 | 52 | Contact: 53 | -------- 54 | 55 | Contact the project developers via the project's development 56 | [mailing list](https://dev.eclipse.org/mailman/listinfo/paho-dev). 57 | 58 | Search for bugs: 59 | ---------------- 60 | 61 | This project uses GitHub Issues here: [github.com/eclipse/paho.mqtt.android/issues](https://github.com/eclipse/paho.mqtt.android/issues) to track ongoing development and issues. 62 | 63 | Create a new bug: 64 | ----------------- 65 | 66 | Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome! 67 | 68 | - [Create new Paho bug](https://github.com/eclipse/paho.mqtt.android/issues/new) 69 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 15 | 16 | 23 | 24 | 33 | 34 | 44 | 45 | 52 | 53 | 62 | 63 | 71 | 72 | 73 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/java/org/eclipse/paho/android/sample/activity/MqttCallbackHandler.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 1999, 2014 IBM Corp. 3 | * 4 | * All rights reserved. This program and the accompanying materials 5 | * are made available under the terms of the Eclipse Public License v1.0 6 | * and Eclipse Distribution License v1.0 which accompany this distribution. 7 | * 8 | * The Eclipse Public License is available at 9 | * http://www.eclipse.org/legal/epl-v10.html 10 | * and the Eclipse Distribution License is available at 11 | * http://www.eclipse.org/org/documents/edl-v10.php. 12 | */ 13 | package org.eclipse.paho.android.sample.activity; 14 | 15 | import android.content.Context; 16 | import android.content.Intent; 17 | import android.util.Log; 18 | 19 | //import org.eclipse.paho.android.sample.Connection.ConnectionStatus; 20 | import org.eclipse.paho.android.sample.R; 21 | import org.eclipse.paho.android.sample.internal.Connections; 22 | import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; 23 | import org.eclipse.paho.client.mqttv3.MqttCallback; 24 | import org.eclipse.paho.client.mqttv3.MqttMessage; 25 | 26 | /** 27 | * Handles call backs from the MQTT Client 28 | * 29 | */ 30 | class MqttCallbackHandler implements MqttCallback { 31 | 32 | /** {@link Context} for the application used to format and import external strings**/ 33 | private final Context context; 34 | /** Client handle to reference the connection that this handler is attached to**/ 35 | private final String clientHandle; 36 | 37 | private static final String TAG = "MqttCallbackHandler"; 38 | private static final String activityClass = "org.eclipse.paho.android.sample.activity.MainActivity"; 39 | 40 | /** 41 | * Creates an MqttCallbackHandler object 42 | * @param context The application's context 43 | * @param clientHandle The handle to a {@link Connection} object 44 | */ 45 | public MqttCallbackHandler(Context context, String clientHandle) 46 | { 47 | this.context = context; 48 | this.clientHandle = clientHandle; 49 | } 50 | 51 | /** 52 | * @see org.eclipse.paho.client.mqttv3.MqttCallback#connectionLost(java.lang.Throwable) 53 | */ 54 | @Override 55 | public void connectionLost(Throwable cause) { 56 | if (cause != null) { 57 | Log.d(TAG, "Connection Lost: " + cause.getMessage()); 58 | Connection c = Connections.getInstance(context).getConnection(clientHandle); 59 | c.addAction("Connection Lost"); 60 | c.changeConnectionStatus(Connection.ConnectionStatus.DISCONNECTED); 61 | 62 | String message = context.getString(R.string.connection_lost, c.getId(), c.getHostName()); 63 | 64 | //build intent 65 | Intent intent = new Intent(); 66 | intent.setClassName(context, activityClass); 67 | intent.putExtra("handle", clientHandle); 68 | 69 | //notify the user 70 | Notify.notifcation(context, message, intent, R.string.notifyTitle_connectionLost); 71 | } 72 | } 73 | 74 | /** 75 | * @see org.eclipse.paho.client.mqttv3.MqttCallback#messageArrived(java.lang.String, org.eclipse.paho.client.mqttv3.MqttMessage) 76 | */ 77 | @Override 78 | public void messageArrived(String topic, MqttMessage message) throws Exception { 79 | 80 | //Get connection object associated with this object 81 | Connection c = Connections.getInstance(context).getConnection(clientHandle); 82 | c.messageArrived(topic, message); 83 | //get the string from strings.xml and format 84 | String messageString = context.getString(R.string.messageRecieved, new String(message.getPayload()), topic+";qos:"+message.getQos()+";retained:"+message.isRetained()); 85 | 86 | Log.i(TAG, messageString); 87 | 88 | //update client history 89 | c.addAction(messageString); 90 | 91 | } 92 | 93 | /** 94 | * @see org.eclipse.paho.client.mqttv3.MqttCallback#deliveryComplete(org.eclipse.paho.client.mqttv3.IMqttDeliveryToken) 95 | */ 96 | @Override 97 | public void deliveryComplete(IMqttDeliveryToken token) { 98 | // Do nothing 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /org.eclipse.paho.android.sample/src/main/res/layout/fragment_publish.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 15 | 16 | 22 | 23 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 41 | 42 | 43 | 44 | 50 | 51 | 57 | 58 | 66 | 67 | 68 | 69 | 70 | 71 | 75 | 76 | 77 | 78 | 84 | 85 | 91 | 92 | 96 | 97 | 98 | 102 | 103 | 109 | 110 |