First commit
1
.idea/.name
generated
Normal file
@ -0,0 +1 @@
|
||||
EasyHarvestClient
|
22
.idea/compiler.xml
generated
Normal file
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<resourceExtensions />
|
||||
<wildcardResourcePatterns>
|
||||
<entry name="!?*.java" />
|
||||
<entry name="!?*.form" />
|
||||
<entry name="!?*.class" />
|
||||
<entry name="!?*.groovy" />
|
||||
<entry name="!?*.scala" />
|
||||
<entry name="!?*.flex" />
|
||||
<entry name="!?*.kt" />
|
||||
<entry name="!?*.clj" />
|
||||
<entry name="!?*.aj" />
|
||||
</wildcardResourcePatterns>
|
||||
<annotationProcessing>
|
||||
<profile default="true" name="Default" enabled="false">
|
||||
<processorPath useClasspath="true" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
</component>
|
||||
</project>
|
3
.idea/copyright/profiles_settings.xml
generated
Normal file
@ -0,0 +1,3 @@
|
||||
<component name="CopyrightManager">
|
||||
<settings default="" />
|
||||
</component>
|
6
.idea/encodings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="PROJECT" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
18
.idea/gradle.xml
generated
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="gradleJvm" value="1.8" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
<option value="$PROJECT_DIR$/app" />
|
||||
</set>
|
||||
</option>
|
||||
</GradleProjectSettings>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
10
.idea/libraries/android_maps_utils_0_4.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="android-maps-utils-0.4">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.maps.android/android-maps-utils/0.4/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.maps.android/android-maps-utils/0.4/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
15
.idea/libraries/appcompat_v7_22_2_0.xml
generated
Normal file
@ -0,0 +1,15 @@
|
||||
<component name="libraryTable">
|
||||
<library name="appcompat-v7-22.2.0">
|
||||
<ANNOTATIONS>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.2.0/annotations.zip!/" />
|
||||
</ANNOTATIONS>
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.2.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.2.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://C:/Program Files (x86)/Android/android-sdk/extras/android/m2repository/com/android/support/appcompat-v7/22.2.0/appcompat-v7-22.2.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
9
.idea/libraries/commons_io_2_4.xml
generated
Normal file
@ -0,0 +1,9 @@
|
||||
<component name="libraryTable">
|
||||
<library name="commons-io-2.4">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/libs/commons-io-2.4.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
9
.idea/libraries/httpclient_4_2_5.xml
generated
Normal file
@ -0,0 +1,9 @@
|
||||
<component name="libraryTable">
|
||||
<library name="httpclient-4.2.5">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/libs/httpclient-4.2.5.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
9
.idea/libraries/httpcore_4_2_4.xml
generated
Normal file
@ -0,0 +1,9 @@
|
||||
<component name="libraryTable">
|
||||
<library name="httpcore-4.2.4">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/libs/httpcore-4.2.4.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
16
.idea/libraries/mediarouter_v7_22_2_0.xml
generated
Normal file
@ -0,0 +1,16 @@
|
||||
<component name="libraryTable">
|
||||
<library name="mediarouter-v7-22.2.0">
|
||||
<ANNOTATIONS>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/mediarouter-v7/22.2.0/annotations.zip!/" />
|
||||
</ANNOTATIONS>
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/mediarouter-v7/22.2.0/jars/libs/internal_impl-22.2.0.jar!/" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/mediarouter-v7/22.2.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/mediarouter-v7/22.2.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://C:/Program Files (x86)/Android/android-sdk/extras/android/m2repository/com/android/support/mediarouter-v7/22.2.0/mediarouter-v7-22.2.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services/7.8.0/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services/7.8.0/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_ads_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-ads-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-ads/7.8.0/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-ads/7.8.0/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_analytics_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-analytics-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-analytics/7.8.0/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-analytics/7.8.0/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_appindexing_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-appindexing-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-appindexing/7.8.0/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-appindexing/7.8.0/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_appinvite_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-appinvite-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-appinvite/7.8.0/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-appinvite/7.8.0/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_appstate_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-appstate-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-appstate/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-appstate/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_base_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-base-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-base/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-base/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_cast_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-cast-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-cast/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-cast/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_drive_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-drive-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-drive/7.8.0/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-drive/7.8.0/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_fitness_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-fitness-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-fitness/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-fitness/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_games_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-games-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-games/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-games/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_gcm_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-gcm-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-gcm/7.8.0/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-gcm/7.8.0/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_identity_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-identity-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-identity/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-identity/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_location_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-location-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-location/7.8.0/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-location/7.8.0/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_maps_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-maps-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-maps/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-maps/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_nearby_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-nearby-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-nearby/7.8.0/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-nearby/7.8.0/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_panorama_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-panorama-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-panorama/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-panorama/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_plus_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-plus-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-plus/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-plus/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_safetynet_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-safetynet-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-safetynet/7.8.0/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-safetynet/7.8.0/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_vision_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-vision-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-vision/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-vision/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_wallet_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-wallet-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-wallet/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-wallet/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
10
.idea/libraries/play_services_wearable_7_8_0.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="libraryTable">
|
||||
<library name="play-services-wearable-7.8.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-wearable/7.8.0/jars/classes.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.google.android.gms/play-services-wearable/7.8.0/res" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
11
.idea/libraries/support_annotations_23_0_1.xml
generated
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="libraryTable">
|
||||
<library name="support-annotations-23.0.1">
|
||||
<CLASSES>
|
||||
<root url="jar://C:/Program Files (x86)/Android/android-sdk/extras/android/m2repository/com/android/support/support-annotations/23.0.1/support-annotations-23.0.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://C:/Program Files (x86)/Android/android-sdk/extras/android/m2repository/com/android/support/support-annotations/23.0.1/support-annotations-23.0.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
16
.idea/libraries/support_v4_23_0_1.xml
generated
Normal file
@ -0,0 +1,16 @@
|
||||
<component name="libraryTable">
|
||||
<library name="support-v4-23.0.1">
|
||||
<ANNOTATIONS>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-v4/23.0.1/annotations.zip!/" />
|
||||
</ANNOTATIONS>
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-v4/23.0.1/jars/libs/internal_impl-23.0.1.jar!/" />
|
||||
<root url="file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-v4/23.0.1/res" />
|
||||
<root url="jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.android.support/support-v4/23.0.1/jars/classes.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://C:/Program Files (x86)/Android/android-sdk/extras/android/m2repository/com/android/support/support-v4/23.0.1/support-v4-23.0.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
62
.idea/misc.xml
generated
Normal file
@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="EntryPointsManager">
|
||||
<entry_points version="2.0" />
|
||||
</component>
|
||||
<component name="NullableNotNullManager">
|
||||
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
|
||||
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
|
||||
<option name="myNullables">
|
||||
<value>
|
||||
<list size="4">
|
||||
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
|
||||
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
|
||||
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
|
||||
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
<option name="myNotNulls">
|
||||
<value>
|
||||
<list size="4">
|
||||
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
|
||||
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
|
||||
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
|
||||
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
|
||||
<OptionsSetting value="true" id="Add" />
|
||||
<OptionsSetting value="true" id="Remove" />
|
||||
<OptionsSetting value="true" id="Checkout" />
|
||||
<OptionsSetting value="true" id="Update" />
|
||||
<OptionsSetting value="true" id="Status" />
|
||||
<OptionsSetting value="true" id="Edit" />
|
||||
<ConfirmationsSetting value="0" id="Add" />
|
||||
<ConfirmationsSetting value="0" id="Remove" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
<option name="id" value="Android" />
|
||||
</component>
|
||||
<component name="masterDetails">
|
||||
<states>
|
||||
<state key="ProjectJDKs.UI">
|
||||
<settings>
|
||||
<last-edited>1.8</last-edited>
|
||||
<splitter-proportions>
|
||||
<option name="proportions">
|
||||
<list>
|
||||
<option value="0.2" />
|
||||
</list>
|
||||
</option>
|
||||
</splitter-proportions>
|
||||
</settings>
|
||||
</state>
|
||||
</states>
|
||||
</component>
|
||||
</project>
|
9
.idea/modules.xml
generated
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/EasyHarvestClient.iml" filepath="$PROJECT_DIR$/EasyHarvestClient.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
12
.idea/runConfigurations.xml
generated
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RunConfigurationProducerService">
|
||||
<option name="ignoredProducers">
|
||||
<set>
|
||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
|
||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
|
||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="" />
|
||||
</component>
|
||||
</project>
|
2124
.idea/workspace.xml
generated
Normal file
19
EasyHarvestClient.iml
Normal file
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id="EasyHarvestClient" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="java-gradle" name="Java-Gradle">
|
||||
<configuration>
|
||||
<option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
|
||||
<option name="BUILDABLE" value="false" />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
148
app/app.iml
Normal file
@ -0,0 +1,148 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="EasyHarvestClient" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="android-gradle" name="Android-Gradle">
|
||||
<configuration>
|
||||
<option name="GRADLE_PROJECT_PATH" value=":app" />
|
||||
</configuration>
|
||||
</facet>
|
||||
<facet type="android" name="Android">
|
||||
<configuration>
|
||||
<option name="SELECTED_BUILD_VARIANT" value="debug" />
|
||||
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
|
||||
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
|
||||
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
|
||||
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
|
||||
<option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
|
||||
<afterSyncTasks>
|
||||
<task>generateDebugAndroidTestSources</task>
|
||||
<task>generateDebugSources</task>
|
||||
</afterSyncTasks>
|
||||
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
||||
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
|
||||
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
|
||||
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
|
||||
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
|
||||
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
|
||||
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||
<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$/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" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
|
||||
<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/intermediates/assets" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.2.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/mediarouter-v7/22.2.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/23.0.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-ads/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-analytics/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-appindexing/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-appinvite/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-appstate/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-base/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-cast/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-drive/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-fitness/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-games/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-gcm/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-identity/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-location/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-maps/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-nearby/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-panorama/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-plus/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-safetynet/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-vision/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-wallet/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-wearable/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services/7.8.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.maps.android/android-maps-utils/0.4/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
|
||||
<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 23 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" exported="" name="mediarouter-v7-22.2.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-cast-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-gcm-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="commons-io-2.4" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-games-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-wallet-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-drive-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-ads-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="appcompat-v7-22.2.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-analytics-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-appindexing-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-appinvite-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-safetynet-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="android-maps-utils-0.4" level="project" />
|
||||
<orderEntry type="library" exported="" name="httpclient-4.2.5" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-v4-23.0.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-base-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-annotations-23.0.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-fitness-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-vision-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="httpcore-4.2.4" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-nearby-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-location-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-appstate-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-wearable-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-identity-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-panorama-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-plus-7.8.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="play-services-maps-7.8.0" level="project" />
|
||||
</component>
|
||||
</module>
|
33
app/build.gradle
Normal file
@ -0,0 +1,33 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion 23
|
||||
buildToolsVersion "23.0.1"
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.www.client"
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 23
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
debuggable true
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
|
||||
}
|
||||
}
|
||||
|
||||
packagingOptions {
|
||||
exclude 'META-INF/LICENSE.txt'
|
||||
exclude 'META-INF/NOTICE.txt'
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile 'com.android.support:support-v4:+'
|
||||
compile 'com.google.maps.android:android-maps-utils:+'
|
||||
compile 'com.google.android.gms:play-services:+'
|
||||
|
||||
compile fileTree(dir: 'libs', include: '*.jar')
|
||||
}
|
BIN
app/libs/commons-io-2.4.jar
Normal file
BIN
app/libs/httpclient-4.2.5.jar
Normal file
BIN
app/libs/httpcore-4.2.4.jar
Normal file
3
app/lint.xml
Normal file
@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<lint>
|
||||
</lint>
|
215
app/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1,215 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.www.client"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="16"
|
||||
android:targetSdkVersion="22" />
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
||||
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
|
||||
<uses-permission android:name="android.permission.BATTERY_STATS" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||||
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
|
||||
<uses-permission android:name="android.permission.CALL_PHONE" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
|
||||
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
|
||||
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
|
||||
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
|
||||
<uses-permission android:name="android.permission.FLASHLIGHT" />
|
||||
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
|
||||
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
|
||||
<uses-permission android:name="android.permission.GET_TASKS" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
|
||||
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />
|
||||
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
|
||||
<uses-permission android:name="android.permission.READ_CALENDAR" />
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.READ_HISTORY_BOOKMARKS" />
|
||||
<uses-permission android:name="android.permission.READ_LOGS" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.READ_SMS" />
|
||||
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
|
||||
<uses-permission android:name="android.permission.READ_SYNC_STATS" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_MMS" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_SMS" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||
<uses-permission android:name="android.permission.REORDER_TASKS" />
|
||||
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
|
||||
<uses-permission android:name="android.permission.SEND_SMS" />
|
||||
<uses-permission android:name="android.permission.SET_ALARM" />
|
||||
<uses-permission android:name="android.permission.SET_ALWAYS_FINISH" />
|
||||
<uses-permission android:name="android.permission.SET_ANIMATION_SCALE" />
|
||||
<uses-permission android:name="android.permission.SET_DEBUG_APP" />
|
||||
<uses-permission android:name="android.permission.SET_PROCESS_LIMIT" />
|
||||
<uses-permission android:name="android.permission.SET_TIME_ZONE" />
|
||||
<uses-permission android:name="android.permission.SET_WALLPAPER" />
|
||||
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
|
||||
<uses-permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES" />
|
||||
<uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_READ" />
|
||||
<uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE" />
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
|
||||
<uses-permission android:name="android.permission.USE_SIP" />
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
|
||||
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS" />
|
||||
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
|
||||
<uses-permission android:name="android.permission.WRITE_SMS" />
|
||||
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
|
||||
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
|
||||
<uses-permission android:name="android.permission.PERSISTENT_ACTIVITY" />
|
||||
<uses-permission android:name="android.permission.READ_CALL_LOG" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" />
|
||||
<uses-permission android:name="android.permission.READ_PROFILE" />
|
||||
<uses-permission android:name="android.permission.READ_SOCIAL_STREAM" />
|
||||
<uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
|
||||
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
|
||||
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
|
||||
<uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS" />
|
||||
<uses-permission android:name="android.permission.WRITE_PROFILE" />
|
||||
<uses-permission android:name="android.permission.WRITE_SOCIAL_STREAM" />
|
||||
<uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
|
||||
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
|
||||
|
||||
<uses-feature
|
||||
android:glEsVersion="0x00020000"
|
||||
android:required="true" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:debuggable="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/AppTheme" >
|
||||
<meta-data
|
||||
android:name="com.google.android.maps.v2.API_KEY"
|
||||
android:value="@string/maps_api_key" />
|
||||
<meta-data
|
||||
android:name="com.google.android.gms.version"
|
||||
android:value="@integer/google_play_services_version" />
|
||||
|
||||
<activity
|
||||
android:name=".ClientActivity"
|
||||
android:label="@string/app_name" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<service
|
||||
android:name=".TaskService"
|
||||
android:enabled="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name" >
|
||||
</service>
|
||||
|
||||
<receiver
|
||||
android:name=".BootReceiver"
|
||||
android:enabled="false" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED" >
|
||||
</action>
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
<receiver android:name=".TimeReceiver" >
|
||||
</receiver>
|
||||
|
||||
<activity
|
||||
android:name=".SettingsActivity"
|
||||
android:label="@string/title_activity_client_settings"
|
||||
android:parentActivityName=".ClientActivity" >
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="com.www.client.ClientActivity" />
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".pr.PrivacyRegionsActivity"
|
||||
android:label="@string/title_activity_privacy_regions"
|
||||
android:parentActivityName=".SettingsActivity" >
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="com.www.client.SettingsActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".pr.AddPrivacyRegionActivity"
|
||||
android:label="@string/title_activity_new_privacy_region"
|
||||
android:parentActivityName=".pr.PrivacyRegionsActivity" >
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".pr.PrivacyRegionsActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".pr.ViewPrivacyRegionActivity"
|
||||
android:label="@string/title_activity_view_privacy_region"
|
||||
android:parentActivityName=".pr.PrivacyRegionsActivity" >
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".pr.PrivacyRegionsActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".pr.EditPrivacyRegionActivity"
|
||||
android:label="@string/title_activity_edit_privacy_region"
|
||||
android:parentActivityName=".pr.PrivacyRegionsActivity" >
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".pr.PrivacyRegionsActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".pm.PrivacyMechanismsActivity"
|
||||
android:label="@string/title_activity_privacy_mechanisms"
|
||||
android:parentActivityName=".SettingsActivity" >
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="com.www.client.SettingsActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".pm.ListPrivacyMechanismsActivity"
|
||||
android:label="@string/title_activity_get_privacy_mechanism"
|
||||
android:parentActivityName=".pm.PrivacyMechanismsActivity" >
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="com.www.client.pm.PrivacyMechanismsActivity" />
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".pm.ViewPrivacyMechanismActivity"
|
||||
android:label="@string/title_activity_view_privacy_mechanism"
|
||||
android:parentActivityName=".pm.PrivacyMechanismsActivity" >
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="com.www.client.pm.PrivacyMechanismsActivity" />
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
BIN
app/src/main/ic_launcher-web.png
Normal file
After Width: | Height: | Size: 25 KiB |
@ -0,0 +1,18 @@
|
||||
package com.www.client;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
public class AppendingObjectOutputStream extends ObjectOutputStream {
|
||||
|
||||
public AppendingObjectOutputStream(OutputStream out) throws IOException {
|
||||
super(out);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeStreamHeader() throws IOException {
|
||||
reset();
|
||||
}
|
||||
|
||||
}
|
21
app/src/main/java/com/www/client/BootReceiver.java
Normal file
@ -0,0 +1,21 @@
|
||||
package com.www.client;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
public class BootReceiver extends BroadcastReceiver {
|
||||
private static final String TAG = "BootReceiver";
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
Log.i(TAG, "onReceive: " + "...");
|
||||
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
|
||||
//context.startService(new Intent(context, TaskService.class));
|
||||
context.startService(new Intent(context, TaskService.class));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
329
app/src/main/java/com/www/client/ClientActivity.java
Normal file
@ -0,0 +1,329 @@
|
||||
package com.www.client;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningServiceInfo;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Color;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.NetworkInfo;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.Button;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.www.client.pm.EasyPrivacy;
|
||||
import com.www.client.pm.PrivacyMechanism;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
public class ClientActivity extends Activity implements SeekBar.OnSeekBarChangeListener {
|
||||
private static final String SDCARD_DIR = Environment.getExternalStorageDirectory().getPath();
|
||||
public static final String CLIENT_DIR = SDCARD_DIR + "/Client";
|
||||
private static Context context;
|
||||
private static ConnectivityManager connectivityManager;
|
||||
public static boolean restartService = false;
|
||||
SeekBar seekBar;
|
||||
TextView statusText;
|
||||
TextView levelText;
|
||||
TextView commentText;
|
||||
public static SharedPreferences sharedPref = null;
|
||||
public static SharedPreferences.Editor editor = null;
|
||||
|
||||
PrivacyMechanism pm;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
String TAG = getClass().getName() + "@onCreate: ";
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
setContentView(R.layout.activity_client);
|
||||
ClientActivity.context = getApplicationContext();
|
||||
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
editor = sharedPref.edit();
|
||||
seekBar = (SeekBar) findViewById(R.id.levelService);
|
||||
seekBar.setOnSeekBarChangeListener(this);
|
||||
statusText = (TextView) findViewById(R.id.status);
|
||||
levelText = (TextView) findViewById(R.id.level);
|
||||
commentText = (TextView) findViewById(R.id.comment);
|
||||
Button ok = (Button) findViewById(R.id.okButton);
|
||||
Button cancel = (Button) findViewById(R.id.cancelButton);
|
||||
ok.setOnClickListener(okListener);
|
||||
cancel.setOnClickListener(cancelListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
String TAG = getClass().getName() + "@onStart: ";
|
||||
|
||||
super.onStart();
|
||||
Log.wtf(TAG, "onStart: " + "...");
|
||||
|
||||
if (sharedPref.getString("username", null) == null) {
|
||||
mkdirs();
|
||||
editor.putInt("serviceLevel", 0);
|
||||
editor.commit();
|
||||
statusText.setTextColor(Color.rgb(255, 0, 0));
|
||||
statusText.setText("OFF");
|
||||
commentText.setTextColor(Color.rgb(100, 100, 100));
|
||||
commentText.setText("Slide the bar right to turn the service on & set the desired level of activity...");
|
||||
} else {
|
||||
seekBar.setProgress(sharedPref.getInt("serviceLevel", 0));
|
||||
seekBar.setSecondaryProgress(sharedPref.getInt("serviceLevel", 0));
|
||||
if (sharedPref.getInt("serviceLevel", 0) > 0) {
|
||||
statusText.setTextColor(Color.rgb(0, 255, 0));
|
||||
statusText.setText("ON");
|
||||
commentText.setTextColor(Color.rgb(255, 255, 255));
|
||||
commentText.setText("The service will download tasks from the server, execute them & send the results back.");
|
||||
if (!isServiceRunning()) {
|
||||
Log.wtf(TAG, "onStart: Restarting...");
|
||||
startService(new Intent(ClientActivity.this, TaskService.class));
|
||||
}
|
||||
} else {
|
||||
statusText.setTextColor(Color.rgb(255, 0, 0));
|
||||
statusText.setText("OFF");
|
||||
commentText.setTextColor(Color.rgb(100, 100, 100));
|
||||
commentText.setText("Nothing to do.");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not comment out!
|
||||
*/
|
||||
onTest();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
onResume();
|
||||
}
|
||||
|
||||
private void onTest() {
|
||||
String TAG = getClass().getName() + "@onTest: ";
|
||||
|
||||
editor.putString("username", "emkatsom");
|
||||
|
||||
// editor.putString("taskID", "1");
|
||||
|
||||
/**/
|
||||
// editor.putBoolean(Globals.easy_privacy, false);
|
||||
editor.putBoolean(Globals.easy_privacy, true);
|
||||
|
||||
// editor.putString("deviceID", "1234");
|
||||
//
|
||||
// editor.putString(Globals.pm_id, "13");
|
||||
// editor.putInt(Globals.privacy_level, 24);
|
||||
/**/
|
||||
|
||||
editor.commit();
|
||||
|
||||
// startActivity(new Intent(getBaseContext(), SettingsActivity.class));
|
||||
|
||||
// startActivity(new Intent(getBaseContext(), PrivacyRegionsActivity.class));
|
||||
// startActivity(new Intent(getBaseContext(), AddPrivacyRegionActivity.class));
|
||||
|
||||
// startActivity(new Intent(getBaseContext(), com.www.client.pm.PrivacyMechanismsActivity.class));
|
||||
// startActivity(new Intent(getBaseContext(), com.www.client.pm.ListPrivacyMechanismsActivity.class));
|
||||
|
||||
}
|
||||
|
||||
private OnClickListener okListener = new OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
/**/
|
||||
if (seekBar.getProgress() > 0 && sharedPref.getInt("serviceLevel", 0) == 0) {
|
||||
SharedPreferences.Editor editor = sharedPref.edit();
|
||||
editor.putInt("serviceLevel", seekBar.getProgress());
|
||||
editor.commit();
|
||||
seekBar.setSecondaryProgress(seekBar.getProgress());
|
||||
enableBootReceiver();
|
||||
startService(new Intent(ClientActivity.this, TaskService.class));
|
||||
} else if (seekBar.getProgress() == 0) {
|
||||
SharedPreferences.Editor editor = sharedPref.edit();
|
||||
editor.putInt("serviceLevel", seekBar.getProgress());
|
||||
editor.commit();
|
||||
seekBar.setSecondaryProgress(seekBar.getProgress());
|
||||
disableBootReceiver();
|
||||
stopService(new Intent(ClientActivity.this, TaskService.class));
|
||||
} else {
|
||||
SharedPreferences.Editor editor = sharedPref.edit();
|
||||
editor.putInt("serviceLevel", seekBar.getProgress());
|
||||
editor.commit();
|
||||
seekBar.setSecondaryProgress(seekBar.getProgress());
|
||||
}
|
||||
/**/
|
||||
|
||||
/*
|
||||
if(pm != null) {
|
||||
// pm.onStart();
|
||||
} else {
|
||||
pm = new PrivacyMechanism(
|
||||
getApplicationContext(),
|
||||
Integer.valueOf(sharedPref.getString(Globals.pm_id, "0")),
|
||||
Integer.valueOf(sharedPref.getString(Globals.st_id, "0")));
|
||||
// pm.onStart();
|
||||
}
|
||||
/**/
|
||||
}
|
||||
};
|
||||
|
||||
private OnClickListener cancelListener = new OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
seekBar.setProgress(sharedPref.getInt("serviceLevel", 0));
|
||||
seekBar.setSecondaryProgress(sharedPref.getInt("serviceLevel", 0));
|
||||
levelText.setText(null);
|
||||
|
||||
/*
|
||||
if(pm != null) {
|
||||
pm.onStop();
|
||||
pm = null;
|
||||
}
|
||||
/**/
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.activity_client, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.menu_settings:
|
||||
Intent i = new Intent(this, SettingsActivity.class);
|
||||
startActivity(i);
|
||||
return true;
|
||||
default:
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
|
||||
int c = (int) (100 + arg0.getProgress() * 1.55);
|
||||
levelText.setTextColor(Color.rgb(c, c, c));
|
||||
levelText.setText(arg0.getProgress() + "%");
|
||||
if (arg1 == 0) {
|
||||
statusText.setTextColor(Color.rgb(255, 0, 0));
|
||||
statusText.setText("OFF");
|
||||
commentText.setTextColor(Color.rgb(100, 100, 100));
|
||||
commentText.setText("Nothing to do.");
|
||||
} else {
|
||||
statusText.setTextColor(Color.rgb(0, 255, 0));
|
||||
statusText.setText("ON");
|
||||
commentText.setTextColor(Color.rgb(255, 255, 255));
|
||||
commentText.setText("The service will download tasks from the server, execute them & send the results back.");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartTrackingTouch(SeekBar arg0) {
|
||||
int c = (int) (100 + arg0.getProgress() * 1.55);
|
||||
levelText.setTextColor(Color.rgb(c, c, c));
|
||||
levelText.setText(arg0.getProgress() + "%");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopTrackingTouch(SeekBar arg0) {
|
||||
levelText.setText(null);
|
||||
}
|
||||
|
||||
private void enableBootReceiver() {
|
||||
ComponentName receiver = new ComponentName(context, BootReceiver.class);
|
||||
PackageManager pm = context.getPackageManager();
|
||||
pm.setComponentEnabledSetting(receiver,
|
||||
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
|
||||
PackageManager.DONT_KILL_APP);
|
||||
}
|
||||
|
||||
private void disableBootReceiver() {
|
||||
ComponentName receiver = new ComponentName(context, BootReceiver.class);
|
||||
PackageManager pm = context.getPackageManager();
|
||||
pm.setComponentEnabledSetting(receiver,
|
||||
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
|
||||
PackageManager.DONT_KILL_APP);
|
||||
}
|
||||
|
||||
public static Context getContext() {
|
||||
return ClientActivity.context;
|
||||
}
|
||||
|
||||
public static boolean isOnline() {
|
||||
Boolean wifiConnected, mobileConnected;
|
||||
NetworkInfo activeInfo = connectivityManager.getActiveNetworkInfo();
|
||||
if (activeInfo != null && activeInfo.isConnected()) {
|
||||
wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI;
|
||||
mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE;
|
||||
} else {
|
||||
wifiConnected = false;
|
||||
mobileConnected = false;
|
||||
}
|
||||
if (((ClientActivity.sharedPref.getString("listPref", "Wi-Fi").equals("Any")) && (wifiConnected || mobileConnected))
|
||||
|| ((ClientActivity.sharedPref.getString("listPref", "Wi-Fi").equals("Wi-Fi")) && (wifiConnected))) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isServiceRunning() {
|
||||
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
||||
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
|
||||
if (TaskService.class.getName().equals(service.service.getClassName())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void mkdirs() {
|
||||
String TAG = getClass().getName() + "@mkdirs: ";
|
||||
|
||||
File clientDir = new File(CLIENT_DIR);
|
||||
File settingsDir = new File(CLIENT_DIR + "/Settings");
|
||||
File pmsDir = new File(CLIENT_DIR + "/PMs");
|
||||
|
||||
Utils.delete(clientDir);
|
||||
Utils.delete(settingsDir);
|
||||
Utils.delete(pmsDir);
|
||||
|
||||
if(clientDir.mkdir()) {
|
||||
Log.wtf(TAG, "Created " + clientDir.getPath());
|
||||
} else {
|
||||
Log.wtf(TAG, "Could not create Client directory.");
|
||||
}
|
||||
|
||||
if(settingsDir.mkdir()) {
|
||||
Log.wtf(TAG, "Created " + settingsDir.getPath());
|
||||
} else {
|
||||
Log.wtf(TAG, "Could not create Settings directory.");
|
||||
}
|
||||
|
||||
if(pmsDir.mkdir()) {
|
||||
Log.wtf(TAG, "Created " + pmsDir.getPath());
|
||||
} else {
|
||||
Log.wtf(TAG, "Could not create PMs directory.");
|
||||
}
|
||||
}
|
||||
}
|
82
app/src/main/java/com/www/client/Globals.java
Normal file
@ -0,0 +1,82 @@
|
||||
package com.www.client;
|
||||
|
||||
import android.os.Environment;
|
||||
|
||||
public class Globals {
|
||||
/**
|
||||
* Evaluation
|
||||
*/
|
||||
// public static boolean eval_status = true;
|
||||
public static boolean eval_status = false;
|
||||
|
||||
// Beauty
|
||||
// public static String eval_dev = "MID7188";
|
||||
// public static String eval_ip = "192.168.49.1";
|
||||
|
||||
// Nexus
|
||||
// public static String eval_dev = "occam";
|
||||
// public static String eval_ip = "192.168.49.75";
|
||||
|
||||
/**
|
||||
* Description: device URLS.
|
||||
* Changelog : - .
|
||||
*/
|
||||
public static String sdcard_dir = Environment.getExternalStorageDirectory().getPath();
|
||||
public static String client_dir = sdcard_dir + "/Client";
|
||||
public static String pms_dir = client_dir + "/PMs";
|
||||
|
||||
/**
|
||||
* Description: URLS.
|
||||
* Changelog : - .
|
||||
*/
|
||||
public static String server_url = "http://83.212.109.118:8080/Server/webresources";
|
||||
// public static String server_url = "http://192.168.2.2:8084/Server/webresources";
|
||||
// public static String server_url = "http://10.64.83.194:8084/Server/webresources";
|
||||
|
||||
public static String devs_url = server_url + "/devs";
|
||||
public static String tasks_url = server_url + "/tasks";
|
||||
|
||||
public static String pms_url = server_url + "/pms";
|
||||
public static int pm_port = 4545;
|
||||
|
||||
/**
|
||||
* Description: Time latency in ms.
|
||||
* Changelog : - .
|
||||
*/
|
||||
public static int task_latency = 10 * 100 * 1000;
|
||||
public static int pm_latency = 1 * 100 * 1000;
|
||||
|
||||
/**
|
||||
* Description: EasyHarvest client shared preferences labels.
|
||||
* Changelog : - .
|
||||
*/
|
||||
public static String shr_user = "username"; // string
|
||||
public static String shr_dev_id = "deviceID"; // string
|
||||
|
||||
/**
|
||||
* Description: Sensing tasks shared preferences labels.
|
||||
* Changelog : - .
|
||||
*/
|
||||
public static String st_id = "taskID"; // string
|
||||
|
||||
|
||||
/**
|
||||
* Description: Privacy mechanisms shared preferences labels.
|
||||
* Changelog : - .
|
||||
*/
|
||||
public static String easy_privacy = "EasyPrivacy"; // boolean
|
||||
|
||||
public static String privacy_level = "privacyLevel"; // integer
|
||||
|
||||
public static String pm_name = "pmName"; // string
|
||||
public static String pm_clss = "pmClss"; //
|
||||
public static String pm_id = "pmID"; //
|
||||
public static String pm_vers = "pmVersion"; //
|
||||
public static String pm_st_id = "pmTaskId"; //
|
||||
public static String pm_user = "pmUser"; //
|
||||
public static String pm_desc = "pmDescription"; //
|
||||
public static String pm_date = "pmDate"; //
|
||||
public static String pm_time = "pmTime"; //
|
||||
public static String pm_size = "pmSize"; //
|
||||
|
||||
}
|
36
app/src/main/java/com/www/client/Item.java
Normal file
@ -0,0 +1,36 @@
|
||||
package com.www.client;
|
||||
|
||||
public class Item {
|
||||
String text = "";
|
||||
int image = 0;
|
||||
|
||||
public Item(String text, int image) {
|
||||
this.text = text;
|
||||
this.image = image;
|
||||
}
|
||||
|
||||
public Item(String text) {
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
public int getImage() {
|
||||
return image;
|
||||
}
|
||||
|
||||
public void setImage(int image) {
|
||||
this.image = image;
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return text;
|
||||
}
|
||||
|
||||
public void setText(String text) {
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return text;
|
||||
}
|
||||
}
|
56
app/src/main/java/com/www/client/ItemArrayAdapter.java
Normal file
@ -0,0 +1,56 @@
|
||||
package com.www.client;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ItemArrayAdapter extends ArrayAdapter<JSONObject> {
|
||||
|
||||
private static final String TAG = "ItemArrayAdapter";
|
||||
Context context;
|
||||
|
||||
public ItemArrayAdapter(Context context, int resourceId, List<JSONObject> items) {
|
||||
super(context, resourceId, items);
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
/*private view holder class*/
|
||||
private class ViewHolder {
|
||||
TextView textView;
|
||||
ImageView imageView;
|
||||
}
|
||||
|
||||
public View getView(int position, View view, ViewGroup group) {
|
||||
ViewHolder holder = null;
|
||||
JSONObject item = getItem(position);
|
||||
|
||||
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
|
||||
if (view == null) {
|
||||
view = inflater.inflate(R.layout.item, null);
|
||||
holder = new ViewHolder();
|
||||
holder.textView = (TextView) view.findViewById(R.id.text);
|
||||
view.setTag(holder);
|
||||
}
|
||||
else {
|
||||
holder = (ViewHolder) view.getTag();
|
||||
}
|
||||
|
||||
try {
|
||||
holder.textView.setText(item.getString("label"));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return view;
|
||||
}
|
||||
}
|
244
app/src/main/java/com/www/client/SettingsActivity.java
Normal file
@ -0,0 +1,244 @@
|
||||
package com.www.client;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningServiceInfo;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.preference.Preference;
|
||||
import android.preference.Preference.OnPreferenceClickListener;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.preference.PreferenceScreen;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.www.client.pm.PrivacyMechanismsActivity;
|
||||
import com.www.client.pr.PrivacyRegionsActivity;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.impl.client.DefaultHttpClient;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener, OnPreferenceClickListener, Preference.OnPreferenceChangeListener {
|
||||
private static final String TAG = "SettingsActivity";
|
||||
|
||||
public static PreferenceScreen prefScreen = null;
|
||||
public static SharedPreferences sp = null;
|
||||
public static SharedPreferences.Editor spEditor = null;
|
||||
|
||||
SwitchPref privacyRegions = null;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
//Log.wtf(TAG, "onCreate");
|
||||
super.onCreate(savedInstanceState);
|
||||
addPreferencesFromResource(R.xml.preferences);
|
||||
|
||||
/*
|
||||
* Privacy regions switch listener.
|
||||
*/
|
||||
privacyRegions = (SwitchPref) findPreference(getResources().getString((R.string.privacy_regions_status)));
|
||||
privacyRegions.setOnPreferenceClickListener(this);
|
||||
privacyRegions.setOnPreferenceChangeListener(this);
|
||||
|
||||
/*
|
||||
* Set preference item listeners.
|
||||
*/
|
||||
findPreference(getResources().getString((R.string.privacy_mechanisms_key))).setOnPreferenceClickListener(this);
|
||||
|
||||
findPreference("device_unregister").setOnPreferenceClickListener(this);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
//Log.wtf(TAG, "onResume");
|
||||
super.onResume();
|
||||
if (sp == null) {
|
||||
//Log.wtf(TAG, "onResume: " + "sp == null");
|
||||
sp = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
spEditor = sp.edit();
|
||||
sp.registerOnSharedPreferenceChangeListener(this);
|
||||
} else {
|
||||
//Log.wtf(TAG, "onResume: " + "sp != null");
|
||||
}
|
||||
privacyRegions.setChecked(sp.getBoolean(getResources().getString((R.string.privacy_regions_status)), false));
|
||||
//this.onContentChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
//Log.wtf(TAG, "onPause");
|
||||
super.onPause();
|
||||
if (sp != null) {
|
||||
sp.unregisterOnSharedPreferenceChangeListener(this);
|
||||
sp = null;
|
||||
}
|
||||
}/**/
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
//Log.wtf(TAG, "onStop");
|
||||
super.onStop();
|
||||
if (sp != null) {
|
||||
sp.unregisterOnSharedPreferenceChangeListener(this);
|
||||
sp = null;
|
||||
}
|
||||
//finish();
|
||||
}/**/
|
||||
|
||||
/*@Override
|
||||
protected void onDestroy() {
|
||||
Log.wtf(TAG, "onDestroy");
|
||||
super.onDestroy();
|
||||
sp.unregisterOnSharedPreferenceChangeListener(this);
|
||||
sp = null;
|
||||
}/**/
|
||||
|
||||
/*@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
Log.wtf(TAG, "onConfigurationChanged");
|
||||
super.onConfigurationChanged(newConfig);
|
||||
//onResume();
|
||||
}*/
|
||||
|
||||
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||
// Toast.makeText(getApplicationContext(), "onSharedPreferenceChanged: " + key, Toast.LENGTH_SHORT).show();
|
||||
Log.wtf(TAG, "onSharedPreferenceChanged: " + sharedPreferences.getAll());
|
||||
if (key.equals("listPref") || key.equals(getResources().getString((R.string.privacy_regions_status)))) {
|
||||
// ClientActivity.restartService = true;
|
||||
Toast.makeText(getApplicationContext(), "Restarting...", Toast.LENGTH_SHORT).show();
|
||||
if (isServiceRunning()) {
|
||||
Log.wtf(TAG, "onSharedPreferenceChanged: " + "Restarting service...");
|
||||
stopService(new Intent(this, TaskService.class));
|
||||
startService(new Intent(this, TaskService.class));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Control action when a preference is clicked.
|
||||
*/
|
||||
@Override
|
||||
public boolean onPreferenceClick(Preference preference) {
|
||||
// Toast.makeText(getApplicationContext(), "onPreferenceClick: " + preference.getKey(), Toast.LENGTH_SHORT).show();
|
||||
|
||||
/*
|
||||
* Launch Privacy Regions activity.
|
||||
*/
|
||||
if (getResources().getString((R.string.privacy_regions_status)).equals(preference.getKey())) {
|
||||
// Toast.makeText(ClientActivity.getContext(), "onPreferenceClick: " + preference.getKey(), Toast.LENGTH_SHORT).show();
|
||||
Intent i = new Intent(this, PrivacyRegionsActivity.class);
|
||||
startActivity(i);
|
||||
}
|
||||
|
||||
/*
|
||||
* Launch Privacy Mechanisms activity.
|
||||
*/
|
||||
if (getResources().getString((R.string.privacy_mechanisms_key)).equals(preference.getKey())) {
|
||||
// Toast.makeText(ClientActivity.getContext(), "onPreferenceClick: " + preference.getKey(), Toast.LENGTH_SHORT).show();
|
||||
Intent i = new Intent(this, PrivacyMechanismsActivity.class);
|
||||
startActivity(i);
|
||||
}
|
||||
|
||||
/*
|
||||
* Unregister the device.
|
||||
*/
|
||||
if ("device_unregister".equals(preference.getKey())) {
|
||||
Toast.makeText(ClientActivity.getContext(), "Unregistering...", Toast.LENGTH_SHORT).show();
|
||||
String deviceID = ClientActivity.sharedPref.getString("deviceID", null);
|
||||
if (deviceID != null) {
|
||||
if (ClientActivity.isOnline()) {
|
||||
Log.wtf(TAG, "deviceUnregister: " + "Online.");
|
||||
String url = Globals.devs_url + "/" + deviceID + "/unregister";
|
||||
Log.wtf(TAG, "deviceUnregister: " + "" + deviceID + "/unregister");
|
||||
new DeviceUnregister().execute(url);
|
||||
} else {
|
||||
Log.wtf(TAG, "deviceUnregister: " + "Offline.");
|
||||
Toast.makeText(ClientActivity.getContext(), "No internet connection", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(ClientActivity.getContext(), "Not registered", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object o) {
|
||||
//Toast.makeText(getApplicationContext(), "onPreferenceChange: " + preference.getKey(), Toast.LENGTH_SHORT).show();
|
||||
if ("privacyRegionsStatus".equals(preference.getKey())) {
|
||||
//Toast.makeText(getApplicationContext(), "onPreferenceChange: " + preference.getKey() + " = " + o.toString(), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private class DeviceUnregister extends AsyncTask<String, Void, String> {
|
||||
private static final String TAG = "DeviceUnregister";
|
||||
private HttpClient client;
|
||||
|
||||
@Override
|
||||
protected String doInBackground(String... urls) {
|
||||
Log.wtf(TAG, "doInBackground: " + "...");
|
||||
client = new DefaultHttpClient();
|
||||
HttpGet request = new HttpGet(urls[0]);
|
||||
HttpResponse response = null;
|
||||
String result = "oops";
|
||||
try {
|
||||
response = client.execute(request);
|
||||
} catch (Exception e) {
|
||||
//e.printStackTrace();
|
||||
}
|
||||
if (response != null) {
|
||||
try {
|
||||
result = Utils.writeToString(response.getEntity().getContent());
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
protected void onPostExecute(String result) {
|
||||
Log.wtf(TAG, "onPostExecute: " + result + ".");
|
||||
if (result.equals("OK") || result.equals("Not registered")) {
|
||||
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
|
||||
stopService(new Intent(getApplicationContext(), TaskService.class));
|
||||
spEditor.putInt("serviceLevel", 0);
|
||||
spEditor.putString("deviceID", null);
|
||||
spEditor.putString("username", null);
|
||||
spEditor.putString("serviceStatus", "get");
|
||||
spEditor.putString("getStatus", "getTaskInfo");
|
||||
spEditor.commit();
|
||||
try {
|
||||
FileUtils.cleanDirectory(new File(ClientActivity.CLIENT_DIR));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(getApplicationContext(), "Oops!", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isServiceRunning() {
|
||||
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
||||
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
|
||||
if (TaskService.class.getName().equals(service.service.getClassName())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
25
app/src/main/java/com/www/client/SwitchPref.java
Normal file
@ -0,0 +1,25 @@
|
||||
package com.www.client;
|
||||
|
||||
import android.content.Context;
|
||||
import android.preference.SwitchPreference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
public class SwitchPref extends SwitchPreference {
|
||||
|
||||
public SwitchPref(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
public SwitchPref(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public SwitchPref(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onClick() {
|
||||
//super.onClick();
|
||||
}
|
||||
}
|
2254
app/src/main/java/com/www/client/TaskService.java
Normal file
23
app/src/main/java/com/www/client/TimeReceiver.java
Normal file
@ -0,0 +1,23 @@
|
||||
package com.www.client;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
public class TimeReceiver extends BroadcastReceiver {
|
||||
private static final String TAG = "TimeReceiver";
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
Log.i(TAG, "onReceive: " + "...");
|
||||
if (intent.getAction().equals("TASK_SERVICE_ON")) {
|
||||
context.startService(new Intent(context, TaskService.class));
|
||||
}
|
||||
else if (intent.getAction().equals("TASK_SERVICE_OFF")) {
|
||||
context.startService(new Intent(context, TaskService.class));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
533
app/src/main/java/com/www/client/Utils.java
Normal file
@ -0,0 +1,533 @@
|
||||
package com.www.client;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.NameValuePair;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.impl.client.DefaultHttpClient;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.Closeable;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Utils {
|
||||
private static final String TAG = "Utils";
|
||||
|
||||
public static HttpResponse response(String url, String task) {
|
||||
HttpClient client = new DefaultHttpClient();
|
||||
HttpResponse response = null;
|
||||
try {
|
||||
if("get".equals(task)) {
|
||||
response = client.execute(new HttpGet(url));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Log.e(TAG, e.getLocalizedMessage(), e);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
public static HttpResponse httpResponse(String url, ArrayList<NameValuePair> params) {
|
||||
Log.i(TAG, "response: " + params);
|
||||
HttpClient httpClient = new DefaultHttpClient();
|
||||
HttpResponse httpResponse = null;
|
||||
try {
|
||||
HttpPost httppost = new HttpPost(url);
|
||||
httppost.setEntity(new UrlEncodedFormEntity(params));
|
||||
httpResponse = httpClient.execute(httppost);
|
||||
}
|
||||
catch (Exception e) {
|
||||
Log.e(TAG, e.getLocalizedMessage(), e);
|
||||
}
|
||||
return httpResponse;
|
||||
}
|
||||
|
||||
|
||||
public static File returnFileFrom(String url, String type) {
|
||||
String TAG = "Utils.returnFileFrom: ";
|
||||
|
||||
Log.wtf(TAG, url + " with type " + type);
|
||||
|
||||
File folder = new File(url);
|
||||
String fileName;
|
||||
File file = null;
|
||||
if (folder.exists()) {
|
||||
File[] listOfFiles = folder.listFiles();
|
||||
for (int i = 0; i < listOfFiles.length; i++) {
|
||||
if (listOfFiles[i].isFile()) {
|
||||
fileName = listOfFiles[i].getName();
|
||||
if (fileName.endsWith(type)) {
|
||||
file = new File(url + "/" + fileName);
|
||||
Log.wtf(TAG, "found " + fileName);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
public static void returnPart(RandomAccessFile input, OutputStream output, long start) throws IOException {
|
||||
int read;
|
||||
byte[] buffer = new byte[1024];
|
||||
input.seek(start);
|
||||
while ((read = input.read(buffer)) > 0) {
|
||||
output.write(buffer, 0, read);
|
||||
}
|
||||
close(output);
|
||||
close(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Description: Read an input stream and covert it to readable string.
|
||||
* Parameters : - InputStream: The stream to convert to string.
|
||||
* Changelog : - 150615: Remove throws clause and add appropriate log.
|
||||
*/
|
||||
public static String writeToString(InputStream input) {
|
||||
String TAG = Utils.class.getName() + "@writeToString: ";
|
||||
InputStreamReader isr = new InputStreamReader(input);
|
||||
BufferedReader br = new BufferedReader(isr);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String line;
|
||||
try {
|
||||
while ((line = br.readLine()) != null) {
|
||||
sb.append(line);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, e.getMessage());
|
||||
}
|
||||
String result = sb.toString();
|
||||
close(br);
|
||||
close(isr);
|
||||
close(input);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void writeToFile(InputStream input, String url) {
|
||||
File file = new File(url);
|
||||
long seek = file.length();
|
||||
RandomAccessFile output = null;
|
||||
/*long skip = 0;
|
||||
skip += input.skip(seek);
|
||||
Log.i(TAG, "writeToFile: before " + skip + " - " + seek);
|
||||
while(skip < seek) {
|
||||
skip += input.skip(1);
|
||||
}
|
||||
Log.i(TAG, "writeToFile: after " + skip);/**/
|
||||
try {
|
||||
output = new RandomAccessFile(file, "rw");
|
||||
output.seek(seek);
|
||||
int read = 0;
|
||||
byte[] buffer = new byte[1024];
|
||||
while((read = input.read(buffer)) > 0) {
|
||||
output.write(buffer, 0, read);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//e.printStackTrace();
|
||||
}
|
||||
close(output);
|
||||
close(input);/**/
|
||||
}
|
||||
|
||||
public static void delete(File file) {
|
||||
if(file.exists()) {
|
||||
if(file.isDirectory()){
|
||||
if(file.list().length==0){
|
||||
file.delete();
|
||||
}
|
||||
else {
|
||||
String files[] = file.list();
|
||||
for (String temp : files) {
|
||||
File fileDelete = new File(file, temp);
|
||||
delete(fileDelete);
|
||||
}
|
||||
if(file.list().length==0){
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONtoFile(JSONObject json, File file) {
|
||||
FileWriter fw = null;
|
||||
try {
|
||||
if (file.exists()) {
|
||||
fw = new FileWriter(file, true);
|
||||
//json.put("id", countLines(file));
|
||||
}
|
||||
else {
|
||||
fw = new FileWriter(file);
|
||||
//json.put("id", 0);
|
||||
}
|
||||
fw.write(json.toString() + "\n");
|
||||
close(fw);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
//System.out.println("json: " + json);
|
||||
//System.out.println("string: " + json.toString());
|
||||
//System.out.println("file: " + FileUtils.readFileToString(file));
|
||||
}
|
||||
|
||||
public static void overwriteJSONtoFile(ArrayList<JSONObject> arrayList, File file) {
|
||||
FileWriter fw = null;
|
||||
try {
|
||||
fw = new FileWriter(file);
|
||||
for (JSONObject jsonObject : arrayList) {
|
||||
fw.write(jsonObject.toString() + "\n");
|
||||
}
|
||||
close(fw);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static int countLines(File file) {
|
||||
int lines = 0;
|
||||
try {
|
||||
lines = countLines(FileUtils.readFileToString(file));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return lines;
|
||||
}
|
||||
|
||||
public static int countLines(String str){
|
||||
String[] lines = str.split("\r\n|\r|\n");
|
||||
return lines.length;
|
||||
}
|
||||
|
||||
public static ArrayList<JSONObject> fileToJSON(File file) {
|
||||
ArrayList<JSONObject> arrayList = new ArrayList<JSONObject>();
|
||||
if (file.exists()) {
|
||||
BufferedReader br = null;
|
||||
try {
|
||||
br = new BufferedReader(new FileReader(file));
|
||||
String line;
|
||||
while ((line = br.readLine()) != null) {
|
||||
//System.out.println("line: " + line);
|
||||
arrayList.add(new JSONObject(line));
|
||||
}
|
||||
close(br);
|
||||
//System.out.println("array: " + arrayList.toString());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return arrayList;
|
||||
}
|
||||
|
||||
public static void removePM(Context c, int id) {
|
||||
String TAG = Utils.class.getName() + "@removePM: ";
|
||||
|
||||
Log.wtf(TAG, "Removing PM " + id + "...");
|
||||
|
||||
delete(new File(Globals.pms_dir + "/" + id));
|
||||
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(c);
|
||||
SharedPreferences.Editor ed = sp.edit();
|
||||
|
||||
ed.putString(Globals.pm_id, null);
|
||||
ed.putString(Globals.pm_name, null);
|
||||
ed.putString(Globals.pm_vers, null);
|
||||
//
|
||||
// class name
|
||||
ed.putString(Globals.pm_clss, null);
|
||||
//
|
||||
// sensing task id
|
||||
ed.putString(Globals.pm_st_id, null);
|
||||
//
|
||||
ed.putString(Globals.pm_desc, null);
|
||||
ed.putString(Globals.pm_user, null);
|
||||
ed.putString(Globals.pm_date, null);
|
||||
ed.putString(Globals.pm_time, null);
|
||||
ed.putString(Globals.pm_size, null);
|
||||
|
||||
ed.commit();
|
||||
}
|
||||
|
||||
public static void close(Closeable resource) {
|
||||
if (resource != null) {
|
||||
try {
|
||||
resource.close();
|
||||
} catch (IOException ignore) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Data related functions
|
||||
//
|
||||
//
|
||||
public static boolean saveData(List data, String taskID) {
|
||||
String TAG = "Utils@saveData: ";
|
||||
|
||||
String ext = ".dat";
|
||||
String url = Globals.client_dir + "/" + taskID + "/" + taskID;
|
||||
|
||||
int i = 1;
|
||||
File file = new File(url + ext);
|
||||
// while(file.exists() || new File(url + ".dat").exists()) {
|
||||
// TODO: EVAL
|
||||
/*
|
||||
if (file.exists() || new File(url + ".dat").exists()) {
|
||||
url = Globals.client_dir + "/" + taskID + "/" + taskID + "(" + i + ")";
|
||||
file = new File(url + ext);
|
||||
i++;
|
||||
}
|
||||
*/
|
||||
// /TODO: EVAL
|
||||
url += ext;
|
||||
|
||||
FileOutputStream fos;
|
||||
ObjectOutputStream oos;
|
||||
|
||||
try {
|
||||
Log.wtf(TAG, "Saving data to " + url);
|
||||
List<Object> oldData = Utils.getData(url);
|
||||
if (!oldData.isEmpty()) {
|
||||
oldData.addAll(data);
|
||||
data = oldData;
|
||||
}
|
||||
fos = new FileOutputStream(url);
|
||||
oos = new ObjectOutputStream(fos);
|
||||
|
||||
oos.writeObject(data);
|
||||
|
||||
close(oos);
|
||||
close(fos);
|
||||
|
||||
} catch (Exception ex) {
|
||||
Log.wtf(TAG, ex.getMessage());
|
||||
return false;
|
||||
}
|
||||
Log.wtf(TAG, "OK");
|
||||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
public static void mergeData(String dataSrc, String dataDst) {
|
||||
String TAG = "Utils@mergeData: ";
|
||||
|
||||
if(new File(dataDst).exists()) {
|
||||
Log.wtf(TAG, "Merging data with " + dataDst);
|
||||
|
||||
List<Object> oldData = Utils.getData(dataDst);
|
||||
List<Object> newData = Utils.getData(dataSrc);
|
||||
oldData.addAll(newData);
|
||||
|
||||
new File(dataSrc).delete();
|
||||
new File(dataDst).delete();
|
||||
|
||||
try {
|
||||
FileOutputStream fos = new FileOutputStream(dataDst);
|
||||
ObjectOutputStream oos = new ObjectOutputStream(fos);
|
||||
|
||||
oos.writeObject(oldData);
|
||||
|
||||
close(oos);
|
||||
close(fos);
|
||||
} catch (Exception ex) {
|
||||
Log.wtf(TAG, ex.getMessage());
|
||||
}
|
||||
} else {
|
||||
Log.wtf(TAG, "Moving data to " + dataDst);
|
||||
new File(dataSrc).renameTo(new File(dataDst));
|
||||
new File(dataSrc).delete();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
public static List<Object> getData(String url) {
|
||||
String TAG = "Utils@getData: ";
|
||||
|
||||
FileInputStream fis;
|
||||
ObjectInputStream ois;
|
||||
|
||||
List<Object> data = new ArrayList<>();
|
||||
|
||||
try {
|
||||
Log.wtf(TAG, "Returning data " + url);
|
||||
if (new File(url).exists()) {
|
||||
fis = new FileInputStream(url);
|
||||
ois = new ObjectInputStream(fis);
|
||||
|
||||
data = (List<Object>) ois.readObject();
|
||||
|
||||
close(ois);
|
||||
close(fis);
|
||||
} else {
|
||||
Log.wtf(TAG, "File does not exist");
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
Log.wtf(TAG, ex.getMessage());
|
||||
}
|
||||
Log.wtf(TAG, "OK");
|
||||
return data;
|
||||
}
|
||||
|
||||
public static ObjectInputStream getData(List<Object> data) {
|
||||
String TAG = "Utils@getDataFrom: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
ObjectInputStream ois = null;
|
||||
try {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
ObjectOutputStream oos = new ObjectOutputStream(baos);
|
||||
|
||||
oos.writeObject(data);
|
||||
|
||||
Utils.close(oos);
|
||||
|
||||
InputStream is = new ByteArrayInputStream(baos.toByteArray());
|
||||
ois = new ObjectInputStream(is);
|
||||
|
||||
} catch (IOException e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
return ois;
|
||||
}
|
||||
|
||||
//
|
||||
public static ObjectOutputStream putData (String url) {
|
||||
String TAG = "Utils@putDataTo: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
FileOutputStream fos;
|
||||
ObjectOutputStream oos = null;
|
||||
|
||||
try {
|
||||
// Log.wtf(TAG, "Saving data to " + url);
|
||||
|
||||
fos = new FileOutputStream(url);
|
||||
oos = new ObjectOutputStream(fos);
|
||||
} catch (Exception ex) {
|
||||
Log.wtf(TAG, ex.getMessage());
|
||||
}
|
||||
return oos;
|
||||
}
|
||||
|
||||
// TODO
|
||||
public static String getNewDataPath (int stId) {
|
||||
String TAG = "Utils@getNewDataPath: ";
|
||||
|
||||
String ext = ".dat";
|
||||
String url = Globals.client_dir + "/" + stId + "/" + stId;
|
||||
|
||||
int i = 1;
|
||||
File file = new File(url + ext);
|
||||
while(file.exists() || new File(url + ".dat").exists()) {
|
||||
url = Globals.client_dir + "/" + stId + "/" + stId + "(" + i + ")";
|
||||
file = new File(url + ext);
|
||||
i++;
|
||||
}
|
||||
|
||||
file = new File(url + ext + ".tmp");
|
||||
while(file.exists() || new File(url + ".dat" + ".tmp").exists()) {
|
||||
url = Globals.client_dir + "/" + stId + "/" + stId + "(" + i + ")";
|
||||
file = new File(url + ext);
|
||||
i++;
|
||||
}
|
||||
|
||||
url += ext + ".tmp";
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// State related functions
|
||||
//
|
||||
// getStateFrom the pm directory
|
||||
public static ObjectInputStream getStateFrom (int id) {
|
||||
final String TAG = "Utils@getStateFrom: ";
|
||||
|
||||
FileInputStream fis;
|
||||
ObjectInputStream ois = null;
|
||||
|
||||
String url = Globals.pms_dir + "/" + id + "/" + id + ".sav";
|
||||
|
||||
Log.wtf(TAG, "" + url);
|
||||
|
||||
if(new File(url).exists()) {
|
||||
Log.wtf(TAG, "" + "OK");
|
||||
try {
|
||||
fis = new FileInputStream(url);
|
||||
ois = new ObjectInputStream(fis);
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
} else {
|
||||
Log.wtf(TAG, "No saved state found");
|
||||
}
|
||||
return ois;
|
||||
}
|
||||
|
||||
// putStateTo the pm directory
|
||||
public static ObjectOutputStream putStateTo (String url) {
|
||||
String TAG = "Utils@putStateTo: ";
|
||||
|
||||
Log.wtf(TAG, url);
|
||||
|
||||
FileOutputStream fos;
|
||||
ObjectOutputStream oos = null;
|
||||
|
||||
try {
|
||||
fos = new FileOutputStream(url);
|
||||
oos = new ObjectOutputStream(fos);
|
||||
} catch (Exception ex) {
|
||||
Log.wtf(TAG, ex.getMessage());
|
||||
}
|
||||
return oos;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
336
app/src/main/java/com/www/client/pm/EasyPrivacy.java
Normal file
@ -0,0 +1,336 @@
|
||||
package com.www.client.pm;
|
||||
|
||||
import com.www.client.Globals;
|
||||
import com.www.client.R;
|
||||
|
||||
import android.content.*;
|
||||
import android.net.NetworkInfo;
|
||||
import android.net.wifi.p2p.*;
|
||||
import android.net.wifi.p2p.WifiP2pManager.*;
|
||||
import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.*;
|
||||
|
||||
public class EasyPrivacy
|
||||
extends BroadcastReceiver
|
||||
implements PeerListListener, ConnectionInfoListener {
|
||||
|
||||
Context context;
|
||||
|
||||
public static SharedPreferences shrPrf = null;
|
||||
|
||||
private final IntentFilter intentFilter;
|
||||
Channel channel;
|
||||
WifiP2pManager manager;
|
||||
private boolean wiFiP2pStatus;
|
||||
private List<Object> peers;
|
||||
|
||||
private ServerSocket serverSocket;
|
||||
private ServerSocket clientSocket;
|
||||
|
||||
public EasyPrivacy(Context c) {
|
||||
String TAG = getClass().getName() + "@EasyPrivacy: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
context = c;
|
||||
shrPrf = PreferenceManager.getDefaultSharedPreferences(c);
|
||||
|
||||
intentFilter = new IntentFilter();
|
||||
|
||||
// Indicates a change in the Wi-Fi P2P status.
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
|
||||
|
||||
// Indicates a change in the list of available peers.
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
|
||||
|
||||
// Indicates the state of Wi-Fi P2P connectivity has changed.
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
|
||||
|
||||
// Indicates this device's details have changed.
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
|
||||
|
||||
manager = (WifiP2pManager) c.getSystemService(Context.WIFI_P2P_SERVICE);
|
||||
channel = manager.initialize(c, c.getMainLooper(), null);
|
||||
|
||||
peers = new ArrayList<>();
|
||||
|
||||
Log.wtf(TAG, "OK");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public void onStart() {
|
||||
String TAG = getClass().getName() + "@onStart: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
context.registerReceiver(this, intentFilter);
|
||||
|
||||
// Detect available peers that are in range. The call to this function is
|
||||
// asynchronous and a success or failure is communicated to the application
|
||||
// with onSuccess() and onFailure(). The onSuccess() method only notifies you
|
||||
// that the discovery process succeeded and does not provide any information
|
||||
// about the actual peers that it discovered, if any.
|
||||
manager.discoverPeers(channel, new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
// Command successful! Code isn't necessarily needed here,
|
||||
// Unless you want to update the UI or add logging statements.
|
||||
String TAG = getClass().getName() + "@onSuccess: ";
|
||||
|
||||
Log.wtf(TAG, "OK");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int arg0) {
|
||||
// Command failed. Check for P2P_UNSUPPORTED, ERROR, or BUSY
|
||||
String TAG = getClass().getName() + "@onFailure: ";
|
||||
|
||||
Log.wtf(TAG, "Oops!");
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
Log.wtf(TAG, "OK");
|
||||
|
||||
}
|
||||
|
||||
public void onStop() {
|
||||
String TAG = getClass().getName() + "@onStop: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
context.unregisterReceiver(this);
|
||||
|
||||
Log.wtf(TAG, "OK");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Register the PM service
|
||||
// TODO to be called in PrivacyMecanism() if pm is collaborative
|
||||
// Create a string map containing information about your service.
|
||||
// Map record = new HashMap();
|
||||
// record.put("listenport", String.valueOf(SERVER_PORT));
|
||||
// record.put("buddyname", "John Doe" + (int) (Math.random() * 1000));
|
||||
// record.put("available", "visible");
|
||||
// public void startRegistration(Map record) {
|
||||
public void startRegistration() {
|
||||
|
||||
// Create a string map containing information about your service.
|
||||
// TODO pass it as a parameter
|
||||
Map record = new HashMap();
|
||||
|
||||
// record.put("listenport", String.valueOf(SERVER_PORT));
|
||||
|
||||
try {
|
||||
serverSocket = new ServerSocket(0);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
record.put("port", String.valueOf(serverSocket.getLocalPort()));
|
||||
|
||||
// record.put("buddyname", "John Doe" + (int) (Math.random() * 1000));
|
||||
|
||||
record.put("usr", shrPrf.getString(Globals.shr_user, "user") + shrPrf.getString(Globals.shr_dev_id, "0"));
|
||||
record.put("dev", shrPrf.getString(Globals.shr_dev_id, "0"));
|
||||
record.put("pm", shrPrf.getString(Globals.pm_id, "0"));
|
||||
record.put("prv", shrPrf.getString(Globals.privacy_level, "0"));
|
||||
|
||||
// record.put("available", "visible");
|
||||
|
||||
// Service information. Pass it an instance name, service type
|
||||
// _protocol._transportlayer , and the map containing
|
||||
// information other devices will want once they connect to this one.
|
||||
WifiP2pDnsSdServiceInfo serviceInfo =
|
||||
WifiP2pDnsSdServiceInfo.newInstance("_test", "_presence._tcp", record);
|
||||
|
||||
// Add the local service, sending the service info, network channel,
|
||||
// and listener that will be used to indicate success or failure of
|
||||
// the request.
|
||||
manager.addLocalService(channel, serviceInfo, new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
// Command successful! Code isn't necessarily needed here,
|
||||
// Unless you want to update the UI or add logging statements.
|
||||
String TAG = getClass().getName() + "@onSuccess: ";
|
||||
|
||||
Log.wtf(TAG, "OK");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int arg0) {
|
||||
// Command failed. Check for P2P_UNSUPPORTED, ERROR, or BUSY
|
||||
String TAG = getClass().getName() + "@onFailure: ";
|
||||
|
||||
Log.wtf(TAG, "Oops!");
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Get notified about WifiP2P network changes.
|
||||
// - Peers have changed
|
||||
// -> Request the new peer list
|
||||
// (get it at onPeersAvailable)
|
||||
// - A connection has been established
|
||||
// -> Request connection info
|
||||
// (get it at onConnectionInfoAvailable)
|
||||
@Override
|
||||
public void onReceive(Context c, Intent intent) {
|
||||
String TAG = getClass().getName() + "@onReceive: ";
|
||||
|
||||
String action = intent.getAction();
|
||||
|
||||
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
|
||||
// Determine if Wifi P2P mode is enabled or not, alert the Activity.
|
||||
Log.wtf(TAG, "WifP2P state changed...");
|
||||
|
||||
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
|
||||
|
||||
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
|
||||
Log.wtf(TAG, "WifiP2P enabled");
|
||||
|
||||
this.setWiFiP2pStatus(true);
|
||||
|
||||
} else {
|
||||
Log.wtf(TAG, "WifiP2P disabled");
|
||||
|
||||
this.setWiFiP2pStatus(false);
|
||||
|
||||
}
|
||||
|
||||
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
|
||||
// The peer list has changed! We should probably do something about that.
|
||||
Log.wtf(TAG, "WifiP2P peers changed...");
|
||||
|
||||
// Request available peers from the wifi p2p manager. This is an
|
||||
// asynchronous call and the calling activity is notified with a
|
||||
// callback on PeerListListener.onPeersAvailable()
|
||||
if (manager != null) {
|
||||
manager.requestPeers(channel, this);
|
||||
}
|
||||
|
||||
} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
|
||||
// Connection state changed! We should probably do something about that.
|
||||
Log.wtf(TAG, "WifiP2P connection changed...");
|
||||
|
||||
if (manager != null) {
|
||||
NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
|
||||
|
||||
if (networkInfo.isConnected()) {
|
||||
// We are connected with the other device, request connection
|
||||
// info to find group owner IP
|
||||
Log.wtf(TAG, "Connected");
|
||||
|
||||
manager.requestConnectionInfo(channel, this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
|
||||
Log.wtf(TAG, "WifiP2P this device changed...");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Tne WifiP2pManager.requestPeers(Channel, PeerListListener) returns the new
|
||||
// WifiP2pDeviceList.
|
||||
//
|
||||
// Updates the:
|
||||
// - Peers list
|
||||
// - Service (PM) list
|
||||
@Override
|
||||
public void onPeersAvailable(WifiP2pDeviceList peers) {
|
||||
String TAG = getClass().getName() + "@onPeersAvailable: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
// Out with the old, in with the new.
|
||||
this.peers.clear();
|
||||
|
||||
// TODO
|
||||
// Update the peer list
|
||||
this.peers.addAll(peers.getDeviceList());
|
||||
// TODO
|
||||
|
||||
// If an AdapterView is backed by this data, notify it
|
||||
// of the change. For instance, if you have a ListView of available
|
||||
// peers, trigger an update.
|
||||
|
||||
if (this.peers.size() == 0) {
|
||||
Log.wtf(TAG, "No devices found");
|
||||
} else {
|
||||
Log.wtf(TAG, this.peers.toString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Tne WifiP2pManager.requestConnectionInfo(Channel, ConnectionInfoListener)
|
||||
// returns connection info.
|
||||
@Override
|
||||
public void onConnectionInfoAvailable(WifiP2pInfo info) {
|
||||
String TAG = getClass().getName() + "@onConnectionInfoAvailable: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
// InetAddress from WifiP2pInfo struct.
|
||||
// InetAddress groupOwnerAddress = info.groupOwnerAddress.getHostAddress();
|
||||
|
||||
// After the group negotiation, we can determine the group owner.
|
||||
if (info.groupFormed && info.isGroupOwner) {
|
||||
// Do whatever tasks are specific to the group owner.
|
||||
// One common case is creating a server thread and accepting
|
||||
// incoming connections.
|
||||
} else if (info.groupFormed) {
|
||||
// The other device acts as the client. In this case,
|
||||
// you'll want to create a client thread that connects to the group
|
||||
// owner.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private void setWiFiP2pStatus(boolean status) {
|
||||
wiFiP2pStatus = status;
|
||||
}
|
||||
|
||||
private boolean isWiFiP2pEnabled(boolean status) {
|
||||
return wiFiP2pStatus;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,223 @@
|
||||
package com.www.client.pm;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.www.client.ClientActivity;
|
||||
import com.www.client.Globals;
|
||||
import com.www.client.R;
|
||||
import com.www.client.Utils;
|
||||
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.impl.client.DefaultHttpClient;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.json.JSONArray;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ListPrivacyMechanismsActivity extends Activity implements AdapterView.OnItemClickListener {
|
||||
|
||||
SharedPreferences sp;
|
||||
SharedPreferences.Editor spEditor;
|
||||
|
||||
TextView textView;
|
||||
|
||||
ListView listView;
|
||||
List<String> list;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
String TAG = ListPrivacyMechanismsActivity.class.getName() + "@onCreate: ";
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_list_privacy_mechanisms);
|
||||
|
||||
sp = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
spEditor = sp.edit();
|
||||
|
||||
// getList();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
//Log.i(TAG, "onResume: ...");
|
||||
super.onResume();
|
||||
getList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
getMenuInflater().inflate(R.menu.menu_list_privacy_mechanisms, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
// Handle action bar item clicks here. The action bar will
|
||||
// automatically handle clicks on the Home/Up button, so long
|
||||
// as you specify a parent activity in AndroidManifest.xml.
|
||||
int id = item.getItemId();
|
||||
|
||||
//noinspection SimplifiableIfStatement
|
||||
if (id == R.id.get_privacy_mechanism_action_refresh) {
|
||||
// Toast.makeText(getApplicationContext(), "refresh", Toast.LENGTH_SHORT).show();
|
||||
|
||||
getList();
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
String TAG = getClass().getName() + "@onItemClick: ";
|
||||
JSONObject choice = null;
|
||||
try {
|
||||
choice = new JSONObject(list.get(position));
|
||||
|
||||
// Toast.makeText(getApplicationContext(), choice.toString(), Toast.LENGTH_SHORT).show();
|
||||
// Log.wtf(TAG, choice.toString());
|
||||
|
||||
Intent intent = new Intent(this, ViewPrivacyMechanismActivity.class);
|
||||
intent.putExtra("intent", "get");
|
||||
|
||||
intent.putExtra("id", choice.getJSONArray("id").getString(0));
|
||||
intent.putExtra("name", choice.getJSONArray("name").getString(0));
|
||||
// class name
|
||||
intent.putExtra("class", choice.getJSONArray("class").getString(0));
|
||||
//
|
||||
intent.putExtra("version", choice.getJSONArray("version").getString(0));
|
||||
intent.putExtra("description", choice.getJSONArray("description").getString(0));
|
||||
intent.putExtra("user", choice.getJSONArray("user").getString(0));
|
||||
intent.putExtra("date", choice.getJSONArray("date").getString(0));
|
||||
intent.putExtra("time", choice.getJSONArray("time").getString(0));
|
||||
intent.putExtra("size", choice.getJSONArray("size").getString(0));
|
||||
|
||||
startActivity(intent);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void getList() {
|
||||
String TAG = getClass().getName() + "@getList: ";
|
||||
// Toast.makeText(getApplicationContext(), "Getting list...", Toast.LENGTH_SHORT).show();
|
||||
|
||||
listView = (ListView) findViewById(R.id.listView);
|
||||
listView.setVisibility(View.INVISIBLE);
|
||||
list = new ArrayList<>();
|
||||
|
||||
textView = (TextView) findViewById(R.id.textView);
|
||||
textView.setText("Please wait...");
|
||||
textView.setVisibility(View.VISIBLE);
|
||||
|
||||
String stID = sp.getString("taskID", null);
|
||||
String deviceID = sp.getString("deviceID", null);
|
||||
|
||||
if (deviceID != null && stID != null) {
|
||||
if (ClientActivity.isOnline()) {
|
||||
String url = Globals.pms_url + "/getlist/" + stID + "/" + deviceID;
|
||||
Log.wtf(TAG, url);
|
||||
// Toast.makeText(getApplicationContext(), url, Toast.LENGTH_SHORT).show();
|
||||
new GetList().execute(url);
|
||||
} else {
|
||||
Log.wtf(TAG, "Offline.");
|
||||
// Toast.makeText(getApplicationContext(), "Offline", Toast.LENGTH_SHORT).show();
|
||||
textView.setText("No network connection");
|
||||
}
|
||||
} else {
|
||||
Log.wtf(TAG, "Not registered yet");
|
||||
// Toast.makeText(getApplicationContext(), "Not registered yet", Toast.LENGTH_SHORT).show();
|
||||
textView.setText("Not registered yet");
|
||||
}
|
||||
}
|
||||
|
||||
private class GetList extends AsyncTask<String, Void, String> {
|
||||
@Override
|
||||
protected String doInBackground(String... params) {
|
||||
String TAG = GetList.class.getName() + "@doInBackground: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
HttpClient client = new DefaultHttpClient();
|
||||
HttpGet request = new HttpGet(params[0]);
|
||||
HttpResponse response = null;
|
||||
String result = "Oops!";
|
||||
|
||||
try {
|
||||
response = client.execute(request);
|
||||
if (response != null) {
|
||||
result = Utils.writeToString(response.getEntity().getContent());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, e.getMessage());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
protected void onPostExecute(String result) {
|
||||
String TAG = GetList.class.getName() + "@onPostExecute: ";
|
||||
|
||||
try {
|
||||
JSONArray jsonArray = new JSONArray(result);
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
list.add(jsonArray.getString(i));
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
Log.e(TAG, ex.getMessage());
|
||||
}
|
||||
|
||||
Log.wtf(TAG, result);
|
||||
|
||||
boolean error = true;
|
||||
try {
|
||||
if (list.size() > 0) {
|
||||
JSONObject o = new JSONObject(list.get(0));
|
||||
o.getJSONArray("Error").getString(0);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
error = false;
|
||||
}
|
||||
|
||||
|
||||
if ("Oops!".equals(result)) {
|
||||
textView.setText("Oops, something went wrong");
|
||||
} else if (list.size() == 0) {
|
||||
textView.setText("There are no privacy mechanisms available");
|
||||
|
||||
} else if (error) {
|
||||
textView.setText("Not registered yet");
|
||||
} else {
|
||||
textView.setVisibility(View.INVISIBLE);
|
||||
|
||||
/*
|
||||
* List
|
||||
*/
|
||||
PrivacyMechanismArrayAdapter adapter = new PrivacyMechanismArrayAdapter(getApplicationContext(), R.layout.item, list);
|
||||
listView.setAdapter(adapter);
|
||||
listView.setOnItemClickListener(ListPrivacyMechanismsActivity.this);
|
||||
listView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
88
app/src/main/java/com/www/client/pm/PmBroadcastReceiver.java
Normal file
@ -0,0 +1,88 @@
|
||||
package com.www.client.pm;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.NetworkInfo;
|
||||
import android.net.wifi.p2p.*;
|
||||
import android.net.wifi.p2p.WifiP2pManager.*;
|
||||
import android.util.Log;
|
||||
|
||||
public class PmBroadcastReceiver extends BroadcastReceiver {
|
||||
|
||||
WifiP2pManager manager;
|
||||
Channel channel;
|
||||
PmP2p pmP2p;
|
||||
|
||||
//
|
||||
public PmBroadcastReceiver(WifiP2pManager manager, Channel channel, PmP2p pmP2p) {
|
||||
this.manager = manager;
|
||||
this.channel = channel;
|
||||
this.pmP2p = pmP2p;
|
||||
}
|
||||
|
||||
// Get notified about WifiP2P network changes.
|
||||
// - Peers have changed
|
||||
// -> Request the new peer list
|
||||
// (get it @PmP2p.onPeersAvailable)
|
||||
// - A connection has been established
|
||||
// -> Request connection info
|
||||
// (get it @PmP2p.onConnectionInfoAvailable)
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
String TAG = getClass().getName() + "@onReceive: ";
|
||||
|
||||
String action = intent.getAction();
|
||||
|
||||
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
|
||||
// Determine if Wifi P2P mode is enabled or not, alert the Activity.
|
||||
Log.wtf(TAG, "WifP2P state changed...");
|
||||
|
||||
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
|
||||
|
||||
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
|
||||
Log.wtf(TAG, "WifiP2P enabled");
|
||||
pmP2p.setWifiP2pStatus(true);
|
||||
} else {
|
||||
Log.wtf(TAG, "WifiP2P disabled");
|
||||
pmP2p.setWifiP2pStatus(false);
|
||||
}
|
||||
|
||||
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
|
||||
// The peer list has changed! We should probably do something about that.
|
||||
Log.wtf(TAG, "WifiP2P peers changed...");
|
||||
|
||||
// Request available peers from the wifi p2p manager. This is an
|
||||
// asynchronous call and the calling activity is notified with a
|
||||
// callback on PeerListListener.onPeersAvailable()
|
||||
if (manager != null) {
|
||||
manager.requestPeers(channel, pmP2p);
|
||||
}
|
||||
|
||||
} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
|
||||
// Connection state changed! We should probably do something about that.
|
||||
Log.wtf(TAG, "WifiP2P connection changed...");
|
||||
|
||||
if (manager != null) {
|
||||
NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
|
||||
|
||||
if (networkInfo.isConnected()) {
|
||||
// We are connected with the other device, request connection
|
||||
// info to find group owner IP
|
||||
Log.wtf(TAG, "Connected");
|
||||
|
||||
manager.requestConnectionInfo(channel, pmP2p);
|
||||
} else {
|
||||
Log.wtf(TAG, "Disconnected");
|
||||
|
||||
pmP2p.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
|
||||
Log.wtf(TAG, "WifiP2P this device changed...");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
141
app/src/main/java/com/www/client/pm/PmClient.java
Normal file
@ -0,0 +1,141 @@
|
||||
package com.www.client.pm;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
import android.util.Log;
|
||||
|
||||
import com.www.client.Globals;
|
||||
import com.www.client.Utils;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.util.Map;
|
||||
|
||||
//public class PmClient extends AsyncTask {
|
||||
|
||||
public class PmClient implements Runnable {
|
||||
|
||||
|
||||
Map<String, String> peer;
|
||||
PrivacyMechanism pm;
|
||||
|
||||
public PmClient(Map<String, String> peer, PrivacyMechanism privacyMechanism) {
|
||||
this.peer = peer;
|
||||
this.pm = privacyMechanism;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
String TAG = getClass().getName() + "@doInBackground: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
Socket socket = new Socket();
|
||||
|
||||
Log.wtf(TAG, peer.toString());
|
||||
|
||||
try {
|
||||
socket.bind(null);
|
||||
socket.connect((new InetSocketAddress(peer.get("ip"),
|
||||
// Integer.valueOf(peer.get("port")))), 500);
|
||||
Globals.pm_port)), 500);
|
||||
|
||||
OutputStream os = socket.getOutputStream();
|
||||
|
||||
File data = new File(Globals.pms_dir + "/" + pm.getId() + "/" + peer.get("dev") + ".dat");
|
||||
|
||||
if(data.exists()) {
|
||||
Log.wtf(TAG, "Sending " + data.getPath());
|
||||
|
||||
RandomAccessFile raf = new RandomAccessFile(data, "r");
|
||||
Utils.returnPart(raf, os, 0);
|
||||
|
||||
Utils.close(os);
|
||||
Utils.close(raf);
|
||||
|
||||
data.delete();
|
||||
} else {
|
||||
Log.wtf(TAG, "No data " + data.getPath());
|
||||
}
|
||||
|
||||
} catch (FileNotFoundException e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
} catch (IOException e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
} finally {
|
||||
if (socket != null) {
|
||||
if (socket.isConnected()) {
|
||||
try {
|
||||
Log.wtf(TAG, "Closing socket...");
|
||||
socket.close();
|
||||
} catch (IOException e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// @Override
|
||||
// protected Object doInBackground(Object[] params) {
|
||||
// String TAG = getClass().getName() + "@doInBackground: ";
|
||||
//
|
||||
// Log.wtf(TAG, "...");
|
||||
//
|
||||
// Socket socket = new Socket();
|
||||
//
|
||||
// Log.wtf(TAG, peer.toString());
|
||||
//
|
||||
// try {
|
||||
// socket.bind(null);
|
||||
// socket.connect((new InetSocketAddress(peer.get("ip"),
|
||||
// Integer.valueOf(peer.get("port")))), 500);
|
||||
//
|
||||
// OutputStream os = socket.getOutputStream();
|
||||
//
|
||||
//// String dir = Globals.pms_dir + "/" + pm.getId();
|
||||
//// File data = null;
|
||||
//// for(File file : new File(dir).listFiles()) {
|
||||
//// if(file.getName().endsWith(".dat.tmp")) {
|
||||
//// data = file;
|
||||
//// break;
|
||||
//// }
|
||||
//// }
|
||||
//
|
||||
// File data = new File(Globals.pms_dir + "/" + pm.getId() + "/" + peer.get("dev") + ".dat");
|
||||
//
|
||||
// if(data.exists()) {
|
||||
// Log.wtf(TAG, "Sending " + data.getPath());
|
||||
//
|
||||
// RandomAccessFile raf = new RandomAccessFile(data, "r");
|
||||
// Utils.returnPart(raf, os, 0);
|
||||
//
|
||||
// Utils.close(os);
|
||||
// Utils.close(raf);
|
||||
//
|
||||
// data.delete();
|
||||
// } else {
|
||||
// Log.wtf(TAG, "No data " + data.getPath());
|
||||
// }
|
||||
//
|
||||
// } catch (FileNotFoundException e) {
|
||||
// Log.wtf(TAG, e.getMessage());
|
||||
// } catch (IOException e) {
|
||||
// Log.wtf(TAG, e.getMessage());
|
||||
// }
|
||||
//
|
||||
// finally {
|
||||
// if (socket != null) {
|
||||
// if (socket.isConnected()) {
|
||||
// try {
|
||||
// socket.close();
|
||||
// } catch (IOException e) {
|
||||
// Log.wtf(TAG, e.getMessage());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return null;
|
||||
// }
|
||||
|
||||
}
|
660
app/src/main/java/com/www/client/pm/PmP2p.java
Normal file
@ -0,0 +1,660 @@
|
||||
package com.www.client.pm;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.SharedPreferences;
|
||||
import android.net.wifi.WpsInfo;
|
||||
import android.net.wifi.p2p.*;
|
||||
import android.net.wifi.p2p.WifiP2pManager.*;
|
||||
import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo;
|
||||
import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest;
|
||||
import android.os.Build;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.*;
|
||||
|
||||
import com.www.client.Globals;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
public class PmP2p implements PeerListListener, ConnectionInfoListener {
|
||||
|
||||
Context context;
|
||||
PrivacyMechanism pm;
|
||||
|
||||
private SharedPreferences shrPrf;
|
||||
|
||||
private PmBroadcastReceiver receiver;
|
||||
private IntentFilter intentFilter;
|
||||
private Channel channel;
|
||||
private WifiP2pManager manager;
|
||||
private WifiP2pDnsSdServiceInfo serviceInfo;
|
||||
|
||||
private boolean wifiP2pStatus;
|
||||
private boolean connectionStatus;
|
||||
|
||||
private List<Map<String, String>> peers;
|
||||
|
||||
// ServerSocket serverSocket;
|
||||
Map<String, String> serverPeer;
|
||||
Thread server, client;
|
||||
|
||||
//
|
||||
public PmP2p(Context context, PrivacyMechanism pm) {
|
||||
String TAG = getClass().getName() + "@PmP2p: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
this.context = context;
|
||||
this.pm = pm;
|
||||
|
||||
Log.wtf(TAG, "1/8");
|
||||
|
||||
shrPrf = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
|
||||
Log.wtf(TAG, "2/8");
|
||||
|
||||
// Create the intent filter
|
||||
intentFilter = new IntentFilter();
|
||||
// Indicates a change in the Wi-Fi P2P status.
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
|
||||
// Indicates a change in the list of available peers.
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
|
||||
// Indicates the state of Wi-Fi P2P connectivity has changed.
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
|
||||
// Indicates this device's details have changed.
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
|
||||
|
||||
Log.wtf(TAG, "3/8");
|
||||
|
||||
// WifiP2pManager
|
||||
manager = (WifiP2pManager) context.getSystemService(Context.WIFI_P2P_SERVICE);
|
||||
channel = manager.initialize(context, context.getMainLooper(), null);
|
||||
|
||||
Log.wtf(TAG, "4/8");
|
||||
|
||||
// Detect available peers that are in range.
|
||||
// get the list @onPeersAvailable
|
||||
peers = new ArrayList<>();
|
||||
serverPeer = new HashMap<>();
|
||||
manager.discoverPeers(channel, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
// Command successful! Code isn't necessarily needed here,
|
||||
// Unless you want to update the UI or add logging statements.
|
||||
String TAG = getClass().getName() + "discoverPeers@onSuccess: ";
|
||||
|
||||
Log.wtf(TAG, "OK");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int arg0) {
|
||||
// Command failed. Check for P2P_UNSUPPORTED, ERROR, or BUSY
|
||||
String TAG = getClass().getName() + "discoverPeers@onFailure: ";
|
||||
|
||||
Log.wtf(TAG, "Oops!");
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
Log.wtf(TAG, "5/8");
|
||||
|
||||
registerService();
|
||||
|
||||
Log.wtf(TAG, "6/8");
|
||||
|
||||
discoverService();
|
||||
|
||||
Log.wtf(TAG, "7/8");
|
||||
|
||||
// BroadcastReceiver
|
||||
receiver = new PmBroadcastReceiver(manager, channel, this);
|
||||
context.registerReceiver(receiver, intentFilter);
|
||||
|
||||
Log.wtf(TAG, "8/8");
|
||||
|
||||
// TODO
|
||||
// try {
|
||||
// server = new Thread(new PmServer(this.pm));
|
||||
// server.start();
|
||||
// } catch (IOException e) {
|
||||
// Log.wtf(TAG, e.getMessage());
|
||||
// }
|
||||
// TODO
|
||||
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
//
|
||||
public void onStop() {
|
||||
String TAG = getClass().getName() + "@onStop: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
disconnect();
|
||||
//// TODO
|
||||
// if(server != null) {
|
||||
// Log.wtf(TAG, "server");
|
||||
// server.cancel(true);
|
||||
// server = null;
|
||||
//
|
||||
//// serverSocket = null;
|
||||
//
|
||||
// }
|
||||
|
||||
manager.stopPeerDiscovery(channel, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
String TAG = getClass().getName() + "stopPeerDiscovery@onSuccess: ";
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
String TAG = getClass().getName() + "stopPeerDiscovery@onFailure: ";
|
||||
Log.wtf(TAG, "Oops!");
|
||||
}
|
||||
});
|
||||
|
||||
manager.cancelConnect(channel, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
String TAG = getClass().getName() + "cancelConnect@onSuccess: ";
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
String TAG = getClass().getName() + "cancelConnect@onFailure: ";
|
||||
Log.wtf(TAG, "Oops!");
|
||||
}
|
||||
});
|
||||
manager.removeGroup(channel, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
String TAG = getClass().getName() + "removeGroup@onSuccess: ";
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
String TAG = getClass().getName() + "removeGroup@onFailure: ";
|
||||
Log.wtf(TAG, "Oops!");
|
||||
}
|
||||
});
|
||||
|
||||
if (serviceInfo != null) {
|
||||
manager.removeLocalService(channel, serviceInfo, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
String TAG = getClass().getName() + "removeLocalService@onSuccess: ";
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
String TAG = getClass().getName() + "removeLocalService@onFailure: ";
|
||||
Log.wtf(TAG, "Oops!");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
manager.clearServiceRequests(channel, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
String TAG = getClass().getName() + "clearServiceRequests@onSuccess: ";
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
String TAG = getClass().getName() + "clearServiceRequests@onFailure: ";
|
||||
Log.wtf(TAG, "Oops!");
|
||||
}
|
||||
});
|
||||
manager.clearLocalServices(channel, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
String TAG = getClass().getName() + "clearLocalServices@onSuccess: ";
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
String TAG = getClass().getName() + "clearLocalServices@onFailure: ";
|
||||
Log.wtf(TAG, "Oops!");
|
||||
}
|
||||
});
|
||||
|
||||
context.unregisterReceiver(receiver);
|
||||
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
// Register the PM service
|
||||
private void registerService() {
|
||||
String TAG = getClass().getName() + "@registerService: ";
|
||||
|
||||
Map record = new HashMap();
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
// try {
|
||||
// serverSocket = new ServerSocket(0);
|
||||
// serverSocket = new ServerSocket(Globals.pm_port);
|
||||
|
||||
// serverSocket = new ServerSocket(); // <-- create an unbound socket first
|
||||
// serverSocket.setReuseAddress(true);
|
||||
// serverSocket.bind(new InetSocketAddress(Globals.pm_port)); // <-- now bind it
|
||||
|
||||
// Log.wtf(TAG, serverSocket.toString());
|
||||
|
||||
// record.put("port", String.valueOf(serverSocket.getLocalPort()));
|
||||
record.put("usr", shrPrf.getString(Globals.shr_user, "user"));
|
||||
record.put("dev", shrPrf.getString(Globals.shr_dev_id, "0"));
|
||||
record.put("pm", String.valueOf(pm.getId()));
|
||||
record.put("pref", String.valueOf(pm.getPreferences()));
|
||||
|
||||
Log.wtf(TAG, record.toString());
|
||||
|
||||
// } catch (IOException e) {
|
||||
// Log.wtf(TAG, e.getMessage());
|
||||
// }
|
||||
|
||||
// Service information. Pass it an instance name, service type
|
||||
// _protocol._transportlayer , and the map containing
|
||||
// information other devices will want once they connect to this one.
|
||||
serviceInfo = WifiP2pDnsSdServiceInfo.newInstance("_eh", "_ftp._tcp", record);
|
||||
|
||||
|
||||
Log.wtf(TAG, "Adding service...");
|
||||
|
||||
// Add the local service, sending the service info, network channel,
|
||||
// and listener that will be used to indicate success or failure of
|
||||
// the request.
|
||||
manager.addLocalService(channel, serviceInfo, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
String TAG = getClass().getName() + "addLocalService@onSuccess: ";
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
String TAG = getClass().getName() + "addLocalService@onFailure: ";
|
||||
Log.wtf(TAG, "Oops!");
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
private void discoverService() {
|
||||
/**
|
||||
* Register listeners for DNS-SD services. These are callbacks invoked
|
||||
* by the system when a service is actually discovered.
|
||||
*/
|
||||
manager.setDnsSdResponseListeners(channel,
|
||||
new DnsSdServiceResponseListener() {
|
||||
@Override
|
||||
public void onDnsSdServiceAvailable(String name, String type, WifiP2pDevice device) {
|
||||
// A service has been discovered. Is this our app?
|
||||
String TAG = getClass().getName() + "@onDnsSdServiceAvailable: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
Log.wtf(TAG, name + "" + type + "" + device.toString());
|
||||
|
||||
}
|
||||
}, new DnsSdTxtRecordListener() {
|
||||
// A new TXT record is available. Pick up the advertised name.
|
||||
@Override
|
||||
public void onDnsSdTxtRecordAvailable(String domain, Map<String, String> record, WifiP2pDevice device) {
|
||||
String TAG = getClass().getName() + "@onDnsSdTxtRecordAvailable: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
Log.wtf(TAG, "Found " + domain.toString() + record.toString() + device.toString());
|
||||
|
||||
if (record.containsKey("pm") && record.get("pm") != null &&
|
||||
String.valueOf(pm.getId()).equals(record.get("pm"))) {
|
||||
|
||||
Map<String, String> m = new HashMap<>();
|
||||
m.put("mac", device.deviceAddress);
|
||||
m.putAll(record);
|
||||
|
||||
Log.wtf(TAG, "Checking " + m);
|
||||
|
||||
if (!peers.contains(m)) {
|
||||
for (Map p : peers) {
|
||||
if (p.get("dev").equals(m.get("dev"))) {
|
||||
Log.wtf(TAG, "Updating " + m);
|
||||
p.putAll(m);
|
||||
return;
|
||||
}
|
||||
}
|
||||
Log.wtf(TAG, "Adding " + m);
|
||||
peers.add(m);
|
||||
}
|
||||
|
||||
pm.onPeersChanged(peers);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* After attaching listeners, create a service request and initiate
|
||||
* discovery.
|
||||
*/
|
||||
WifiP2pDnsSdServiceRequest serviceRequest = WifiP2pDnsSdServiceRequest.newInstance();
|
||||
manager.addServiceRequest(channel, serviceRequest, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
String TAG = getClass().getName() + "addServiceRequest@onSuccess: ";
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
String TAG = getClass().getName() + "addServiceRequest@onFailure: ";
|
||||
Log.wtf(TAG, "Oops!");
|
||||
}
|
||||
});
|
||||
manager.discoverServices(channel, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
String TAG = getClass().getName() + "discoverServices@onSuccess: ";
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
String TAG = getClass().getName() + "discoverServices@onFailure: ";
|
||||
Log.wtf(TAG, "Oops!");
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Read an input stream and covert it to readable string.
|
||||
*
|
||||
* @param deviceAddress the MAC address of the peer.
|
||||
*/
|
||||
public void sendToPeer(String deviceAddress) {
|
||||
String TAG = getClass().getName() + "@sendToPeer: ";
|
||||
|
||||
Log.wtf(TAG, deviceAddress);
|
||||
|
||||
Map<String, String> peer = getPeer(deviceAddress);
|
||||
|
||||
if (isConnected() && peer != null) {
|
||||
Log.wtf(TAG, peer.toString());
|
||||
serverPeer.putAll(peer);
|
||||
Log.wtf(TAG, serverPeer.toString());
|
||||
|
||||
// client = new PmClient(serverPeer, pm);
|
||||
// client.execute();
|
||||
|
||||
client = new Thread(new PmClient(serverPeer, this.pm));
|
||||
client.start();
|
||||
} else {
|
||||
connect(deviceAddress);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public void connect(String deviceAddress) {
|
||||
String TAG = getClass().getName() + "@connect: ";
|
||||
|
||||
Log.wtf(TAG, "Connecting to " + deviceAddress);
|
||||
|
||||
WifiP2pConfig config = new WifiP2pConfig();
|
||||
config.deviceAddress = deviceAddress;
|
||||
config.wps.setup = WpsInfo.PBC;
|
||||
|
||||
Log.wtf(TAG, "Config " + config.toString());
|
||||
|
||||
Map<String, String> peer = getPeer(deviceAddress);
|
||||
|
||||
if (peer != null) {
|
||||
serverPeer.putAll(peer);
|
||||
|
||||
Log.wtf(TAG, "serverPeer == " + serverPeer.toString());
|
||||
manager.connect(channel, config, new ActionListener() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
String TAG = getClass().getName() + "@connect: ";
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
String TAG = getClass().getName() + "@connect: ";
|
||||
Log.wtf(TAG, "error" + reason);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public void disconnect() {
|
||||
String TAG = getClass().getName() + "@disconnect: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
setConnectionStatus(false);
|
||||
|
||||
if (client != null) {
|
||||
Log.wtf(TAG, "client");
|
||||
client.interrupt();
|
||||
client = null;
|
||||
|
||||
// serverPeer = null;
|
||||
|
||||
}
|
||||
|
||||
if (server != null) {
|
||||
Log.wtf(TAG, "server");
|
||||
server.interrupt();
|
||||
server = null;
|
||||
|
||||
// serverSocket = null;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public void setWifiP2pStatus(boolean status) {
|
||||
wifiP2pStatus = status;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public boolean isWifiP2pEnabled() {
|
||||
return wifiP2pStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public void setConnectionStatus(boolean status) {
|
||||
this.connectionStatus = status;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public boolean isConnected() {
|
||||
return this.connectionStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tne WifiP2pManager.requestConnectionInfo(Channel, ConnectionInfoListener)
|
||||
* returns connection info.
|
||||
*/
|
||||
@Override
|
||||
public void onConnectionInfoAvailable(WifiP2pInfo info) {
|
||||
String TAG = getClass().getName() + "@onConnectionInfoAvailable: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
Log.wtf(TAG, info.toString());
|
||||
|
||||
setConnectionStatus(true);
|
||||
|
||||
// TODO: EVAL
|
||||
if (info.isGroupOwner) {
|
||||
// if(Build.PRODUCT.equals(Globals.eval_dev)) {
|
||||
// TODO: /EVAL
|
||||
Log.wtf(TAG, "Connected as server");
|
||||
|
||||
/*
|
||||
if (serverSocket != null) {
|
||||
Log.wtf(TAG, "Executing server...");
|
||||
server = new PmServer(serverSocket, pm);
|
||||
server = new PmServer(pm);
|
||||
server.execute();
|
||||
} else {
|
||||
Log.wtf(TAG, "No server socket");
|
||||
}
|
||||
*/
|
||||
|
||||
server = new Thread(new PmServer(this.pm));
|
||||
server.start();
|
||||
} else {
|
||||
Log.wtf(TAG, "Connected as client");
|
||||
|
||||
/*
|
||||
if (serverPeer != null) {
|
||||
Log.wtf(TAG, "Executing client...");
|
||||
serverPeer.put("ip", info.groupOwnerAddress.getHostAddress());
|
||||
Log.wtf(TAG, "serverPeer " + serverPeer.toString());
|
||||
sendToPeer(info.groupOwnerAddress.getHostAddress());
|
||||
} else {
|
||||
Log.wtf(TAG, "No server peer");
|
||||
}
|
||||
*/
|
||||
|
||||
if (serverPeer != null) {
|
||||
Log.wtf(TAG, "Executing client...");
|
||||
// TODO: EVAL
|
||||
serverPeer.put("ip", info.groupOwnerAddress.getHostAddress()); //
|
||||
// serverPeer.put("ip", Globals.eval_ip);
|
||||
Log.wtf(TAG, "serverPeer " + serverPeer.toString());
|
||||
sendToPeer(info.groupOwnerAddress.getHostAddress()); //
|
||||
// sendToPeer(serverPeer.get("ip"));
|
||||
// TODO: /EVAL
|
||||
} else {
|
||||
Log.wtf(TAG, "No server peer");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Tne WifiP2pManager.requestPeers(Channel, PeerListListener) returns the new
|
||||
* WifiP2pDeviceList.
|
||||
* <p/>
|
||||
* Updates the:
|
||||
* - Peers list
|
||||
* - Service (PM) list
|
||||
*/
|
||||
@Override
|
||||
public void onPeersAvailable(WifiP2pDeviceList peers) {
|
||||
String TAG = getClass().getName() + "@onPeersAvailable: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
boolean update = false;
|
||||
|
||||
if (peers.getDeviceList().size() == 0) {
|
||||
Log.wtf(TAG, "No devices found");
|
||||
this.peers = new ArrayList<>();
|
||||
update = true;
|
||||
} else {
|
||||
// Update the peers list
|
||||
for (Map m : this.peers) {
|
||||
boolean remove = true;
|
||||
for (WifiP2pDevice d : peers.getDeviceList()) {
|
||||
Log.wtf(TAG, m.get("mac") + " - " + d.deviceAddress);
|
||||
if (m.get("mac").equals(d.deviceAddress)) {
|
||||
Log.wtf(TAG, "Validated " + m);
|
||||
remove = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (remove) {
|
||||
Log.wtf(TAG, "Removing " + m);
|
||||
this.peers.remove(m);
|
||||
update = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (update) {
|
||||
Log.wtf(TAG, "Going to update peers...");
|
||||
pm.onPeersChanged(this.peers);
|
||||
} else {
|
||||
Log.wtf(TAG, "Nothing changed");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
public String getPeerAddress(int id) {
|
||||
String TAG = getClass().getName() + "@getPeerAddress: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
for (Map m : this.peers) {
|
||||
|
||||
Log.wtf(TAG, m.get("dev") + " - " + id);
|
||||
|
||||
if (Integer.parseInt((String) m.get("dev")) == id) {
|
||||
|
||||
Log.wtf(TAG, m.get("mac").toString());
|
||||
|
||||
return m.get("mac").toString();
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
//
|
||||
public Map<String, String> getPeer(String deviceAddress) {
|
||||
String TAG = getClass().getName() + "@getPeer: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
Log.wtf(TAG, "Finding peer with address " + deviceAddress);
|
||||
|
||||
for (Map m : this.peers) {
|
||||
Log.wtf(TAG, "" + deviceAddress + " - " + m.get("mac"));
|
||||
if (m.get("mac").equals(deviceAddress)) {
|
||||
Log.wtf(TAG, "Returning " + m.toString());
|
||||
return m;
|
||||
}
|
||||
}
|
||||
|
||||
Log.wtf(TAG, "Could not find peer with address " + deviceAddress);
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
92
app/src/main/java/com/www/client/pm/PmServer.java
Normal file
@ -0,0 +1,92 @@
|
||||
package com.www.client.pm;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Handler;
|
||||
import android.util.Log;
|
||||
|
||||
import com.www.client.Globals;
|
||||
import com.www.client.Utils;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
//public class PmServer extends AsyncTask {
|
||||
|
||||
public class PmServer implements Runnable {
|
||||
ServerSocket ss;
|
||||
PrivacyMechanism pm;
|
||||
|
||||
public PmServer(PrivacyMechanism pm) {
|
||||
String TAG = getClass().getName() + "";
|
||||
this.pm = pm;
|
||||
try {
|
||||
this.ss = new ServerSocket(Globals.pm_port);
|
||||
Log.wtf(TAG, "Socket opened");
|
||||
} catch (IOException e) {
|
||||
// Log.wtf(TAG, e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
String TAG = getClass().getName() + "@run";
|
||||
|
||||
while (!Thread.currentThread().isInterrupted()) {
|
||||
try {
|
||||
Log.wtf(TAG, "Waiting for client...");
|
||||
|
||||
Socket s = ss.accept();
|
||||
|
||||
try {
|
||||
// Read from the InputStream
|
||||
Log.wtf(TAG, "1/6");
|
||||
|
||||
InputStream is = s.getInputStream();
|
||||
|
||||
Log.wtf(TAG, "2/6");
|
||||
|
||||
pm.aggregateData(is);
|
||||
|
||||
Log.wtf(TAG, "3/6");
|
||||
|
||||
Utils.close(is);
|
||||
|
||||
Log.wtf(TAG, "4/6");
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
s.close();
|
||||
|
||||
Log.wtf(TAG, "5/6");
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
try {
|
||||
|
||||
Log.wtf(TAG, "6/6");
|
||||
|
||||
if (ss != null && !ss.isClosed()) {
|
||||
ss.close();
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
e.printStackTrace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
458
app/src/main/java/com/www/client/pm/PrivacyMechanism.java
Normal file
@ -0,0 +1,458 @@
|
||||
package com.www.client.pm;
|
||||
|
||||
import com.www.client.Globals;
|
||||
import com.www.client.Utils;
|
||||
|
||||
import android.content.*;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.preference.*;
|
||||
import android.util.Log;
|
||||
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.*;
|
||||
|
||||
import dalvik.system.*;
|
||||
|
||||
public class PrivacyMechanism implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
|
||||
private static Context context;
|
||||
private static SharedPreferences sp;
|
||||
private static SharedPreferences.OnSharedPreferenceChangeListener spLsnr;
|
||||
|
||||
private int stId, pmId, pmPreferences;
|
||||
|
||||
private String pmClssName;
|
||||
private Class<Object> pmClss;
|
||||
private Object pmInst;
|
||||
private Method pmMthd;
|
||||
|
||||
PmP2p pmP2p;
|
||||
|
||||
public PrivacyMechanism (Context c, int pm, int st) {
|
||||
final String TAG = getClass().getName() + "@PrivacyMechanism: ";
|
||||
|
||||
context = c;
|
||||
|
||||
sp = PreferenceManager.getDefaultSharedPreferences(c);
|
||||
|
||||
pmId = pm;
|
||||
stId = st;
|
||||
|
||||
String pmDir = Globals.pms_dir + "/" + pmId;
|
||||
String stDir = Globals.client_dir + "/" + stId;
|
||||
|
||||
/**/
|
||||
pmClssName = sp.getString(Globals.pm_clss, null);
|
||||
String pmZipUrl = pmDir + "/" + pmId + ".zip";
|
||||
File dex = c.getDir("dex", 0);
|
||||
|
||||
DexClassLoader classLoader = new DexClassLoader(pmZipUrl, dex.getAbsolutePath(), null, this.getClass().getClassLoader());
|
||||
try {
|
||||
if (pmClss == null) {
|
||||
Log.wtf(TAG, "Instantiating PM " + pmId + " with class '" + pmClssName + "' for ST " + stId + " from " + pmZipUrl);
|
||||
pmClss = (Class<Object>) classLoader.loadClass(pmClssName);
|
||||
pmInst = pmClss.newInstance();
|
||||
} else {
|
||||
Log.wtf(TAG, "PM " + pmId + " with class '" + pmClssName + "' for ST " + stId + " already instantiated.");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
/**/
|
||||
}
|
||||
|
||||
/**
|
||||
* PrivacyMechanism functions
|
||||
*/
|
||||
|
||||
/**
|
||||
* void onStart (Context, int, ObjectInputStream)
|
||||
*/
|
||||
public void onStart () {
|
||||
final String TAG = getClass().getName() + "@onStart: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
sp.registerOnSharedPreferenceChangeListener(this);
|
||||
|
||||
pmPreferences = sp.getInt(Globals.privacy_level, 0);
|
||||
|
||||
try {
|
||||
|
||||
ObjectInputStream ois = Utils.getStateFrom(getId());
|
||||
|
||||
// void onStart (Context, int, ObjectInputStream)
|
||||
pmMthd = pmClss.getMethod(
|
||||
"onStart",
|
||||
Context.class,
|
||||
int.class,
|
||||
ObjectInputStream.class);
|
||||
|
||||
pmMthd.invoke(
|
||||
pmInst,
|
||||
context,
|
||||
sp.getInt(Globals.privacy_level, 0),
|
||||
ois);
|
||||
|
||||
Utils.close(ois);
|
||||
|
||||
// Collaborative staff
|
||||
/**/
|
||||
try {
|
||||
// void onPeersChanged (List<Map<String, String>>
|
||||
pmClss.getMethod("onPeersChanged",
|
||||
List.class);
|
||||
|
||||
pmP2p = new PmP2p(context, this);
|
||||
|
||||
} catch (NoSuchMethodException e) {
|
||||
Log.wtf(TAG, "Could not find " + e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
// boolean aggregateData (ObjectInputStream, ObjectOutputStream)
|
||||
pmClss.getMethod("aggregateData",
|
||||
ObjectInputStream.class,
|
||||
ObjectOutputStream.class);
|
||||
|
||||
if(pmP2p == null) {
|
||||
pmP2p = new PmP2p(context, this);
|
||||
}
|
||||
|
||||
} catch (NoSuchMethodException e) {
|
||||
Log.wtf(TAG, "Could not find " + e.getMessage());
|
||||
}
|
||||
/**/
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* void onStop ()
|
||||
*/
|
||||
public void onStop () {
|
||||
final String TAG = getClass().getName() + "@onStop: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
if(pmP2p != null) {
|
||||
pmP2p.onStop();
|
||||
pmP2p = null;
|
||||
}
|
||||
|
||||
/**/
|
||||
sp.unregisterOnSharedPreferenceChangeListener(this);
|
||||
|
||||
// save state
|
||||
saveState();
|
||||
|
||||
// stop
|
||||
try {
|
||||
// void onStop ()
|
||||
pmMthd = pmClss.getMethod(
|
||||
"onStop");
|
||||
pmMthd.invoke(
|
||||
pmInst);
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
|
||||
pmClss = null;
|
||||
/**/
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* int processData (ObjectInputStream, ObjectOutputStream)
|
||||
* @param data
|
||||
*/
|
||||
public void processData (List<Object> data) {
|
||||
String TAG = getClass().getName() + "@processData: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
/*
|
||||
* process data
|
||||
*/
|
||||
int devId = 0;
|
||||
String dataPath = Utils.getNewDataPath(getStId());
|
||||
|
||||
Log.wtf(TAG, "Saving data to " + dataPath);
|
||||
|
||||
ObjectInputStream ois = Utils.getData(data);
|
||||
ObjectOutputStream oos = Utils.putData(dataPath);
|
||||
|
||||
try {
|
||||
// int processData (ObjectInputStream, ObjectOutputStream)
|
||||
pmMthd = pmClss.getMethod(
|
||||
"processData",
|
||||
ObjectInputStream.class,
|
||||
ObjectOutputStream.class);
|
||||
|
||||
devId = (int) pmMthd.invoke(
|
||||
pmInst,
|
||||
ois,
|
||||
oos);
|
||||
|
||||
Utils.close(oos);
|
||||
Utils.close(ois);
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
|
||||
// saveState(getId());
|
||||
|
||||
/**
|
||||
* Send to server or aggregator
|
||||
*/
|
||||
Log.wtf(TAG, "devId == " + devId);
|
||||
if (devId == 0) {
|
||||
Log.wtf(TAG, "1");
|
||||
// Log.wtf(TAG, "Renaming data to " + new File(FilenameUtils.removeExtension(dataPath)).getPath());
|
||||
// new File(dataPath).renameTo(new File(FilenameUtils.removeExtension(dataPath)));
|
||||
Utils.saveData(Utils.getData(dataPath), String.valueOf(getStId()));
|
||||
new File(dataPath).delete();
|
||||
} else if (devId < 0) {
|
||||
Log.wtf(TAG, "2");
|
||||
Log.wtf(TAG, "Deleting data " + dataPath);
|
||||
new File(dataPath).delete();
|
||||
} else {
|
||||
Log.wtf(TAG, "3");
|
||||
|
||||
String address = pmP2p.getPeerAddress(devId);
|
||||
if(pmP2p.isWifiP2pEnabled() && !address.isEmpty()) {
|
||||
Log.wtf(TAG, "Sending data to " + devId);
|
||||
Utils.mergeData(dataPath, Globals.pms_dir + "/" + pmId + "/" + devId + ".dat");
|
||||
pmP2p.sendToPeer(address);
|
||||
} else {
|
||||
Log.wtf(TAG, pmP2p.isWifiP2pEnabled() + " | " + address);
|
||||
Utils.saveData(Utils.getData(dataPath), String.valueOf(getStId()));
|
||||
new File(dataPath).delete();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* boolean saveState (ObjectOutputStream)
|
||||
* Called in:
|
||||
* - onStop
|
||||
* - processData
|
||||
* - aggregateData
|
||||
*/
|
||||
private void saveState() {
|
||||
String TAG = getClass().getName() + "@saveState: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
String url = Globals.pms_dir + "/" + getId() + "/" + getId() + ".sav";
|
||||
|
||||
Log.wtf(TAG, url);
|
||||
|
||||
try {
|
||||
ObjectOutputStream oos = Utils.putStateTo(url);
|
||||
// boolean saveState (ObjectOutputStream)
|
||||
pmMthd = pmClss.getMethod(
|
||||
"saveState",
|
||||
ObjectOutputStream.class);
|
||||
|
||||
boolean flag = (boolean) pmMthd.invoke(
|
||||
pmInst,
|
||||
oos);
|
||||
|
||||
Utils.close(oos);
|
||||
|
||||
if (flag) {
|
||||
Log.wtf(TAG, "OK");
|
||||
} else {
|
||||
Log.wtf(TAG, "No state saved");
|
||||
new File(url).delete();
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* void onPreferenceChanged (int)
|
||||
* Monitor if user changes the privacy level and inform the PM
|
||||
* @param sharedPreferences
|
||||
* @param key
|
||||
*/
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||
final String TAG = getClass().getName() + "@onSharedPreferenceChanged: ";
|
||||
|
||||
if (Globals.privacy_level.equals(key)) {
|
||||
Log.wtf(TAG, "new privacy level " + sp.getInt(Globals.privacy_level, 0));
|
||||
|
||||
pmPreferences = sp.getInt(Globals.privacy_level, 0);
|
||||
/*
|
||||
* Call onPreferencesChanged
|
||||
*/
|
||||
try {
|
||||
// void onPreferenceChanged (int)
|
||||
pmMthd = pmClss.getMethod(
|
||||
"onPreferenceChanged",
|
||||
int.class);
|
||||
|
||||
pmMthd.invoke(
|
||||
pmInst,
|
||||
sp.getInt(Globals.privacy_level, 0));
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, "" + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* void onPeersChanged (List<Map<String, String>>)
|
||||
* @param peers
|
||||
*/
|
||||
void onPeersChanged (List<Map<String, String>> peers) {
|
||||
String TAG = getClass().getName() + "@onPeersChanged: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
List<Map<String, String>> list = new ArrayList<>();
|
||||
|
||||
for (Map<String, String> p : peers) {
|
||||
Map<String, String> m = new HashMap<>();
|
||||
m.put("id", p.get("dev"));
|
||||
m.put("pref", p.get("pref"));
|
||||
list.add(m);
|
||||
}
|
||||
|
||||
Log.wtf(TAG, list.toString());
|
||||
|
||||
try {
|
||||
// void onPeersChanged (List<Map<String, String>>)
|
||||
pmMthd = pmClss.getMethod(
|
||||
"onPeersChanged",
|
||||
List.class);
|
||||
|
||||
pmMthd.invoke(
|
||||
pmInst,
|
||||
list);
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* boolean aggregateData (ObjectInputStream, ObjectOutputStream)
|
||||
* Called by PmP2p > connect > onConnectionInfoAvailable > PmServer
|
||||
* @param is
|
||||
*/
|
||||
public void aggregateData(InputStream is) {
|
||||
String TAG = getClass().getName() + "@aggregateData: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
try {
|
||||
|
||||
Log.wtf(TAG, "1");
|
||||
|
||||
ObjectInputStream ois = new ObjectInputStream(is);
|
||||
|
||||
Log.wtf(TAG, "2");
|
||||
|
||||
String dataPath = Utils.getNewDataPath(getStId());
|
||||
|
||||
Log.wtf(TAG, "3");
|
||||
|
||||
ObjectOutputStream oos = Utils.putData(dataPath);
|
||||
|
||||
Log.wtf(TAG, "4");
|
||||
|
||||
boolean flag = false;
|
||||
|
||||
try {
|
||||
// boolean aggregateData (ObjectInputStream, ObjectOutputStream)
|
||||
pmMthd = pmClss.getMethod(
|
||||
"aggregateData",
|
||||
ObjectInputStream.class,
|
||||
ObjectOutputStream.class);
|
||||
|
||||
Log.wtf(TAG, "5");
|
||||
|
||||
flag = (boolean) pmMthd.invoke(
|
||||
pmInst,
|
||||
ois,
|
||||
oos);
|
||||
|
||||
Log.wtf(TAG, "6");
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
|
||||
Log.wtf(TAG, "7");
|
||||
|
||||
Utils.close(oos);
|
||||
Utils.close(ois);
|
||||
Utils.close(is);
|
||||
|
||||
Log.wtf(TAG, "8");
|
||||
|
||||
if (flag) {
|
||||
Utils.saveData(Utils.getData(dataPath), String.valueOf(getStId()));
|
||||
}
|
||||
|
||||
Log.wtf(TAG, "9");
|
||||
|
||||
new File(dataPath).delete();
|
||||
|
||||
Log.wtf(TAG, "10");
|
||||
|
||||
saveState();
|
||||
|
||||
Log.wtf(TAG, "11");
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, e.getMessage());
|
||||
}
|
||||
|
||||
Log.wtf(TAG, "OK");
|
||||
}
|
||||
|
||||
/**
|
||||
* Misc.
|
||||
*/
|
||||
|
||||
public int getId () {
|
||||
final String TAG = getClass().getName() + "@getId: ";
|
||||
return pmId;
|
||||
}
|
||||
|
||||
public int getVersion() {
|
||||
//TODO
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int getPreferences() {
|
||||
String TAG = getClass().getName() + "@getPreferences: ";
|
||||
return pmPreferences;
|
||||
}
|
||||
|
||||
public int getStId () {
|
||||
String TAG = getClass().getName() + "@getStId: ";
|
||||
return stId;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
package com.www.client.pm;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.www.client.ClientActivity;
|
||||
import com.www.client.R;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PrivacyMechanismArrayAdapter extends ArrayAdapter<String> {
|
||||
|
||||
private static final String TAG = "PrivacyMechanismArrayAdapter";
|
||||
Context context;
|
||||
|
||||
public PrivacyMechanismArrayAdapter(Context context, int resourceId, List<String> items) {
|
||||
super(context, resourceId, items);
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
/*private view holder class*/
|
||||
private class ViewHolder {
|
||||
TextView nameView;
|
||||
TextView userView;
|
||||
TextView statusView;
|
||||
}
|
||||
|
||||
public View getView(int position, View view, ViewGroup group) {
|
||||
ViewHolder holder = null;
|
||||
JSONObject item = null;
|
||||
try {
|
||||
item = new JSONObject(getItem(position));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
|
||||
if (view == null) {
|
||||
view = inflater.inflate(R.layout.privacy_mechanism_item, null);
|
||||
holder = new ViewHolder();
|
||||
holder.nameView = (TextView) view.findViewById(R.id.name);
|
||||
holder.userView = (TextView) view.findViewById(R.id.user);
|
||||
holder.statusView = (TextView) view.findViewById(R.id.status);
|
||||
view.setTag(holder);
|
||||
}
|
||||
else {
|
||||
holder = (ViewHolder) view.getTag();
|
||||
}
|
||||
|
||||
try {
|
||||
if (item != null) {
|
||||
holder.nameView.setText(item.getJSONArray("name").getString(0));
|
||||
holder.userView.setText("by " + item.getJSONArray("user").getString(0));
|
||||
if(ClientActivity.sharedPref.getString("pmID", null) != null &&
|
||||
item.getJSONArray("id").getString(0).equals(ClientActivity.sharedPref.getString("pmID", null))) {
|
||||
holder.statusView.setText("INSTALLED");
|
||||
} else {
|
||||
holder.statusView.setText(" ");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return view;
|
||||
}
|
||||
}
|
@ -0,0 +1,184 @@
|
||||
package com.www.client.pm;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Color;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.www.client.Globals;
|
||||
import com.www.client.R;
|
||||
|
||||
|
||||
public class PrivacyMechanismsActivity extends Activity implements SeekBar.OnSeekBarChangeListener {
|
||||
private static final String TAG = "PrivacyMechanismsActivity";
|
||||
|
||||
private static final String SDCARD = Environment.getExternalStorageDirectory().getPath();
|
||||
public static final String CLIENT = SDCARD + "/Client";
|
||||
|
||||
private static ConnectivityManager cm;
|
||||
|
||||
public static SharedPreferences sp = null;
|
||||
public static SharedPreferences.Editor spEditor = null;
|
||||
|
||||
SeekBar seekBar;
|
||||
TextView statusText;
|
||||
TextView levelText;
|
||||
TextView commentText;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_privacy_mechanisms);
|
||||
|
||||
cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
|
||||
sp = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
spEditor = sp.edit();
|
||||
|
||||
statusText = (TextView) findViewById(R.id.status);
|
||||
statusText.setText("LOW");
|
||||
statusText.setTextColor(Color.rgb(255, 0, 0));
|
||||
levelText = (TextView) findViewById(R.id.level);
|
||||
commentText = (TextView) findViewById(R.id.comment);
|
||||
|
||||
seekBar = (SeekBar) findViewById(R.id.level_bar);
|
||||
seekBar.setOnSeekBarChangeListener(this);
|
||||
seekBar.setProgress(sp.getInt(Globals.privacy_level, 0));
|
||||
seekBar.setSecondaryProgress(sp.getInt(Globals.privacy_level, 0));
|
||||
|
||||
levelText.setText("");
|
||||
|
||||
/*
|
||||
* Buttons
|
||||
*/
|
||||
findViewById(R.id.ok_btn).setOnClickListener(okListener);
|
||||
findViewById(R.id.cancel_btn).setOnClickListener(cancelListener);;
|
||||
|
||||
// install
|
||||
// Button getListBtn = (Button)findViewById(R.id.get_list_btn);
|
||||
// getListBtn.setOnClickListener(new View.OnClickListener() {
|
||||
// public void onClick(View v) {
|
||||
//// startActivity(new Intent(getBaseContext(), AddPrivacyRegionActivity.class));
|
||||
// Toast.makeText(getApplicationContext(), "list", Toast.LENGTH_SHORT).show();
|
||||
// }
|
||||
// });
|
||||
|
||||
// view installed
|
||||
// Button viewBtn = (Button)findViewById(R.id.view_btn);
|
||||
// viewBtn.setOnClickListener(new View.OnClickListener() {
|
||||
// public void onClick(View v) {
|
||||
//// startActivity(new Intent(getBaseContext(), AddPrivacyRegionActivity.class));
|
||||
// Toast.makeText(getApplicationContext(), "view", Toast.LENGTH_SHORT).show();
|
||||
// }
|
||||
// });
|
||||
}
|
||||
|
||||
/*
|
||||
* Action bar menu methods
|
||||
*/
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
getMenuInflater().inflate(R.menu.menu_privacy_mechanisms, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
// Handle action bar item clicks here. The action bar will
|
||||
// automatically handle clicks on the Home/Up button, so long
|
||||
// as you specify a parent activity in AndroidManifest.xml.
|
||||
int id = item.getItemId();
|
||||
|
||||
//noinspection SimplifiableIfStatement
|
||||
if (id == R.id.privacy_mechanisms_get_list) {
|
||||
// Toast.makeText(getApplicationContext(), "list", Toast.LENGTH_SHORT).show();
|
||||
Intent i = new Intent(this, ListPrivacyMechanismsActivity.class);
|
||||
startActivity(i);
|
||||
return true;
|
||||
}
|
||||
if (id == R.id.privacy_mechanisms_view_installed) {
|
||||
// Toast.makeText(getApplicationContext(), "in", Toast.LENGTH_SHORT).show();
|
||||
Intent i = new Intent(this, ViewPrivacyMechanismActivity.class);
|
||||
i.putExtra("intent", "view");
|
||||
startActivity(i);
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
/*
|
||||
* Seekbar methods
|
||||
*/
|
||||
@Override
|
||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||
int r = (255 * (100 - progress)) / 100;
|
||||
int g = (255 * progress) / 100;
|
||||
int b = 0;
|
||||
|
||||
levelText.setTextColor(Color.rgb(r, g, b));
|
||||
levelText.setText(progress + "%");
|
||||
|
||||
statusText.setTextColor(Color.rgb(r, g, b));
|
||||
|
||||
if (progress < 33) {
|
||||
statusText.setText("LOW");
|
||||
} else if (progress >= 33 && progress <66) {
|
||||
statusText.setText("MEDIUM");
|
||||
} else {
|
||||
statusText.setText("HIGH");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||
levelText.setText("");
|
||||
}
|
||||
|
||||
private void updateContentView(int i) {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Buttons
|
||||
*/
|
||||
private View.OnClickListener okListener = new View.OnClickListener() {
|
||||
|
||||
// OK button
|
||||
public void onClick(View v) {
|
||||
String TAG = getClass().getName() + "@onClick: ";
|
||||
|
||||
seekBar.setSecondaryProgress(seekBar.getProgress());
|
||||
spEditor.putInt(Globals.privacy_level, seekBar.getProgress());
|
||||
spEditor.commit();
|
||||
|
||||
Log.wtf(TAG, Globals.privacy_level + " -> " + seekBar.getProgress());
|
||||
}
|
||||
};
|
||||
|
||||
private View.OnClickListener cancelListener = new View.OnClickListener() {
|
||||
// Cancel button
|
||||
public void onClick(View v) {
|
||||
seekBar.setProgress(sp.getInt(Globals.privacy_level, 0));
|
||||
seekBar.setSecondaryProgress(sp.getInt(Globals.privacy_level, 0));
|
||||
levelText.setText("");
|
||||
}
|
||||
};
|
||||
}
|
@ -0,0 +1,333 @@
|
||||
package com.www.client.pm;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Environment;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.ListView;
|
||||
import android.widget.ScrollView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.www.client.ClientActivity;
|
||||
import com.www.client.Globals;
|
||||
import com.www.client.R;
|
||||
import com.www.client.Utils;
|
||||
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.impl.client.DefaultHttpClient;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ViewPrivacyMechanismActivity extends Activity {
|
||||
|
||||
String sdcard = Environment.getExternalStorageDirectory().getPath();
|
||||
String clientDir = sdcard + "/Client";
|
||||
String pmsDir = clientDir + "/PMs";
|
||||
|
||||
SharedPreferences sp = null;
|
||||
SharedPreferences.Editor spEditor = null;
|
||||
|
||||
String parentActivity = "";
|
||||
|
||||
TextView textView;
|
||||
Button button;
|
||||
ScrollView scrollView;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
String TAG = ViewPrivacyMechanismActivity.class.getName() + "@onCreate: ";
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_view_privacy_mechanism);
|
||||
|
||||
sp = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
spEditor = sp.edit();
|
||||
|
||||
final Intent i = getIntent();
|
||||
|
||||
button = (Button)findViewById(R.id.button);
|
||||
button.setText("Install");
|
||||
button.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
button.setEnabled(false);
|
||||
if("Install".equals(button.getText())) {
|
||||
button.setText("Installing...");
|
||||
|
||||
Toast.makeText(getApplicationContext(), "Installing...", Toast.LENGTH_SHORT).show();
|
||||
|
||||
/*
|
||||
* Remove previous PM
|
||||
*/
|
||||
if(sp.getString("pmID", null) != null) {
|
||||
removePM(sp.getString("pmID", null));
|
||||
}
|
||||
|
||||
spEditor.putString("pmID", i.getStringExtra("id"));
|
||||
spEditor.putString("pmName", i.getStringExtra("name"));
|
||||
spEditor.putString("pmVersion", i.getStringExtra("version"));
|
||||
//
|
||||
// class name
|
||||
//
|
||||
spEditor.putString(Globals.pm_clss, i.getStringExtra("class"));
|
||||
//
|
||||
// st id
|
||||
//
|
||||
spEditor.putString(Globals.pm_st_id, sp.getString(Globals.st_id, "0"));
|
||||
//
|
||||
//
|
||||
//
|
||||
spEditor.putString("pmDescription", i.getStringExtra("description"));
|
||||
spEditor.putString("pmUser", i.getStringExtra("user"));
|
||||
spEditor.putString("pmDate", i.getStringExtra("date"));
|
||||
spEditor.putString("pmTime", i.getStringExtra("time"));
|
||||
spEditor.putString("pmSize", i.getStringExtra("size"));
|
||||
spEditor.commit();
|
||||
|
||||
getPM();
|
||||
|
||||
// Toast.makeText(getApplicationContext(), "Done", Toast.LENGTH_SHORT).show();
|
||||
// button.setText("Uninstall");
|
||||
} else {
|
||||
button.setText("Uninstalling...");
|
||||
Toast.makeText(getApplicationContext(), "Uninstalling...", Toast.LENGTH_SHORT).show();
|
||||
|
||||
removePM(sp.getString("pmID", null));
|
||||
|
||||
Toast.makeText(getApplicationContext(), "Done", Toast.LENGTH_SHORT).show();
|
||||
// button.setText("Install");
|
||||
|
||||
// returnToParent();
|
||||
finish();
|
||||
}
|
||||
// button.setEnabled(true);
|
||||
}
|
||||
});
|
||||
|
||||
if("get".equals(i.getStringExtra("intent"))) {
|
||||
// Came here from the list
|
||||
|
||||
parentActivity = "ListPrivacyMechanismsActivity";
|
||||
|
||||
textView = (TextView) findViewById(R.id.message);
|
||||
textView.setVisibility(View.INVISIBLE);
|
||||
|
||||
if(i.getStringExtra("id").equals(sp.getString("pmID", null))) {
|
||||
button.setText("Uninstall");
|
||||
}
|
||||
|
||||
textView = (TextView) findViewById(R.id.name);
|
||||
textView.setText(i.getStringExtra("name"));
|
||||
setTitle(i.getStringExtra("name"));
|
||||
|
||||
textView = (TextView) findViewById(R.id.version);
|
||||
textView.setText("version " + i.getStringExtra("version") + ".0");
|
||||
|
||||
textView = (TextView) findViewById(R.id.user);
|
||||
textView.setText("by " + i.getStringExtra("user"));
|
||||
|
||||
textView = (TextView) findViewById(R.id.description);
|
||||
textView.setText(i.getStringExtra("description"));
|
||||
|
||||
textView = (TextView) findViewById(R.id.date_time);
|
||||
textView.setText(i.getStringExtra("date") + "\n" + i.getStringExtra("time"));
|
||||
|
||||
textView = (TextView) findViewById(R.id.size);
|
||||
// textView.setText(i.getStringExtra("size") + "b");
|
||||
textView.setText(String.format( "%.2f", Float.valueOf(i.getStringExtra("size")) /1000) + " KB");
|
||||
|
||||
textView = (TextView) findViewById(R.id.id);
|
||||
textView.setText(i.getStringExtra("id"));
|
||||
} else {
|
||||
// Came here from the PM settings
|
||||
|
||||
parentActivity = "PrivacyMechanismsActivity";
|
||||
|
||||
if(sp.getString("pmID", null) != null) {
|
||||
textView = (TextView) findViewById(R.id.message);
|
||||
textView.setVisibility(View.INVISIBLE);
|
||||
|
||||
button.setText("Uninstall");
|
||||
|
||||
textView = (TextView) findViewById(R.id.name);
|
||||
textView.setText(sp.getString("pmName", ""));
|
||||
setTitle(sp.getString("pmName", ""));
|
||||
|
||||
textView = (TextView) findViewById(R.id.version);
|
||||
textView.setText("version " + sp.getString("pmVersion", "") + ".0");
|
||||
|
||||
textView = (TextView) findViewById(R.id.user);
|
||||
textView.setText("by " + sp.getString("pmUser", ""));
|
||||
|
||||
textView = (TextView) findViewById(R.id.description);
|
||||
textView.setText(sp.getString("pmDescription", ""));
|
||||
|
||||
textView = (TextView) findViewById(R.id.date_time);
|
||||
textView.setText(sp.getString("pmDate", "") + "\n" + sp.getString("pm_time", ""));
|
||||
|
||||
textView = (TextView) findViewById(R.id.size);
|
||||
textView.setText(String.format( "%.2f", Float.valueOf(sp.getString("pmSize", "0"))/1000) + " KB");
|
||||
|
||||
textView = (TextView) findViewById(R.id.id);
|
||||
textView.setText(sp.getString("pmID", ""));
|
||||
} else {
|
||||
scrollView = (ScrollView) findViewById(R.id.content);
|
||||
scrollView.setVisibility(View.INVISIBLE);
|
||||
|
||||
textView = (TextView) findViewById(R.id.message);
|
||||
textView.setText("No privacy mechanism installed");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
// getMenuInflater().inflate(R.menu.menu_view_privacy_mechanism, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
// Handle action bar item clicks here. The action bar will
|
||||
// automatically handle clicks on the Home/Up button, so long
|
||||
// as you specify a parent activity in AndroidManifest.xml.
|
||||
int id = item.getItemId();
|
||||
|
||||
// Respond to the action bar's Up/Home button
|
||||
if (id == android.R.id.home) {
|
||||
returnToParent();
|
||||
}
|
||||
|
||||
//noinspection SimplifiableIfStatement
|
||||
if (id == R.id.action_settings) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
private boolean returnToParent() {
|
||||
Intent i = null;
|
||||
try {
|
||||
i = new Intent(this, Class.forName("com.www.client.pm." + parentActivity));
|
||||
startActivity(i);
|
||||
finish();
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void getPM() {
|
||||
String TAG = ViewPrivacyMechanismActivity.class.getName() + "@getPM: ";
|
||||
// Toast.makeText(getApplicationContext(), "Getting list...", Toast.LENGTH_SHORT).show();
|
||||
|
||||
String deviceID = sp.getString("deviceID", null);
|
||||
String pmID = sp.getString("pmID", null);
|
||||
|
||||
if (deviceID != null && pmID != null) {
|
||||
if (ClientActivity.isOnline()) {
|
||||
String url = Globals.pms_url + "/" + pmID + "/getbin/" + deviceID;
|
||||
Log.wtf(TAG, url);
|
||||
// Toast.makeText(getApplicationContext(), url, Toast.LENGTH_SHORT).show();
|
||||
new GetPM().execute(url);
|
||||
} else {
|
||||
Log.wtf(TAG, "Offline.");
|
||||
Toast.makeText(getApplicationContext(), "No network connection", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
} else {
|
||||
Log.wtf(TAG, "Not registered yet");
|
||||
Toast.makeText(getApplicationContext(), "Not registered yet", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
private class GetPM extends AsyncTask<String, Void, String> {
|
||||
@Override
|
||||
protected String doInBackground(String... params) {
|
||||
String TAG = GetPM.class.getName() + "@doInBackground: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
HttpClient client = new DefaultHttpClient();
|
||||
HttpGet request = new HttpGet(params[0]);
|
||||
HttpResponse response = null;
|
||||
String result = "Oops!";
|
||||
|
||||
try {
|
||||
response = client.execute(request);
|
||||
if (response != null) {
|
||||
String dir = pmsDir + "/" + sp.getString("pmID", null);
|
||||
Log.wtf(TAG, dir);
|
||||
new File(dir).mkdir();
|
||||
String url = dir + "/" + sp.getString("pmID", null) + ".zip";
|
||||
Log.wtf(TAG, url);
|
||||
Utils.writeToFile(response.getEntity().getContent(), url);
|
||||
Log.wtf(TAG, Long.toString(new File(url).length()) + " == " + sp.getString("pmSize", null));
|
||||
if(new File(url).length() == Long.valueOf(sp.getString("pmSize", null))) {
|
||||
result = "OK";
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, e.getMessage());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
protected void onPostExecute(String result) {
|
||||
String TAG = GetPM.class.getName() + "@onPostExecute: ";
|
||||
|
||||
Log.wtf(TAG, result);
|
||||
|
||||
if(!"OK".equals(result)) {
|
||||
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
|
||||
removePM(sp.getString("pmID", null));
|
||||
button.setText("Install");
|
||||
button.setEnabled(true);
|
||||
} else {
|
||||
Toast.makeText(getApplicationContext(), "Done", Toast.LENGTH_SHORT).show();
|
||||
// returnToParent();
|
||||
finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void removePM(String id) {
|
||||
Utils.delete(new File(pmsDir + "/" + id.toString()));
|
||||
|
||||
spEditor.putString("pmID", null);
|
||||
spEditor.putString("pmName", null);
|
||||
spEditor.putString("pmVersion", null);
|
||||
//
|
||||
// class name
|
||||
spEditor.putString(Globals.pm_clss, null);
|
||||
//
|
||||
// sensing task id
|
||||
spEditor.putString(Globals.pm_st_id, null);
|
||||
//
|
||||
spEditor.putString("pmDescription", null);
|
||||
spEditor.putString("pmUser", null);
|
||||
spEditor.putString("pmDate", null);
|
||||
spEditor.putString("pmTime", null);
|
||||
spEditor.putString("pmSize", null);
|
||||
spEditor.commit();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,152 @@
|
||||
package com.www.client.pr;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.android.gms.maps.GoogleMap;
|
||||
import com.google.android.gms.maps.GoogleMapOptions;
|
||||
import com.google.android.gms.maps.MapFragment;
|
||||
import com.google.android.gms.maps.model.LatLngBounds;
|
||||
import com.www.client.R;
|
||||
import com.www.client.Utils;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
public class AddPrivacyRegionActivity extends Activity {
|
||||
private static final String TAG = "AddPrivacyRegionActivity";
|
||||
|
||||
private GoogleMap regionMap = null;
|
||||
private EditText region_label = null;
|
||||
|
||||
private static final String SDCARD = Environment.getExternalStorageDirectory().getPath();
|
||||
public static final String CLIENT = SDCARD + "/Client";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_add_privacy_region);
|
||||
|
||||
GoogleMapOptions mapOptions = new GoogleMapOptions();
|
||||
regionMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.region_map)).getMap();
|
||||
|
||||
region_label = (EditText) findViewById(R.id.region_label);
|
||||
//region_label.setImeActionLabel("OK", EditorInfo.IME_ACTION_DONE);
|
||||
region_label.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
region_label.setError(null);
|
||||
}
|
||||
});/**/
|
||||
/*region_label.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {}
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
|
||||
region_label.setError(null);
|
||||
}
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {}
|
||||
});
|
||||
/*region_label.setOnEditorActionListener(new TextView.OnEditorActionListener() {
|
||||
@Override
|
||||
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
|
||||
if (actionId == EditorInfo.IME_ACTION_DONE) {
|
||||
addPrivacyRegion();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});/**/
|
||||
//region_label.setImeActionLabel("OK", KeyEvent.KEYCODE_ENTER);
|
||||
|
||||
final TextView info = (TextView) findViewById(R.id.info);
|
||||
info.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
info.setVisibility(View.GONE);
|
||||
}
|
||||
});/**/
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
getMenuInflater().inflate(R.menu.add_privacy_region, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
// Handle action bar item clicks here. The action bar will
|
||||
// automatically handle clicks on the Home/Up button, so long
|
||||
// as you specify a parent activity in AndroidManifest.xml.
|
||||
int id = item.getItemId();
|
||||
if (id == R.id.action_ok) {
|
||||
//Toast.makeText(getApplicationContext(), "onOptionsItemSelected: " + "OK", Toast.LENGTH_SHORT).show();
|
||||
addPrivacyRegion();
|
||||
|
||||
return true;
|
||||
}/**/
|
||||
if (id == R.id.action_cancel) {
|
||||
//Toast.makeText(getApplicationContext(), "onOptionsItemSelected: " + "CANCEL", Toast.LENGTH_SHORT).show();
|
||||
finish();
|
||||
return true;
|
||||
}/**/
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
public void addPrivacyRegion() {
|
||||
if(region_label.getText().toString().trim().equals("")) {
|
||||
region_label.setError("Region label is required!");
|
||||
}
|
||||
else {
|
||||
region_label.setError(null);
|
||||
LatLngBounds bounds = regionMap.getProjection().getVisibleRegion().latLngBounds;
|
||||
String label = region_label.getText().toString();
|
||||
|
||||
/*Toast.makeText(getApplicationContext(), region_label.getText().toString() + "\n"
|
||||
+ bounds.northeast.latitude + " - " + bounds.northeast.longitude + "\n"
|
||||
+ bounds.southwest.latitude + " - " + bounds.southwest.longitude, Toast.LENGTH_SHORT).show();/**/
|
||||
|
||||
JSONObject region = new JSONObject();
|
||||
try {
|
||||
region.put("label", label);
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd_HHmmss");
|
||||
region.put("id", sdf.format(new Date()));
|
||||
region.put("ne_lat", bounds.northeast.latitude);
|
||||
region.put("ne_lng", bounds.northeast.longitude);
|
||||
region.put("sw_lat", bounds.southwest.latitude);
|
||||
region.put("sw_lng", bounds.southwest.longitude);
|
||||
Log.i(TAG, "addPrivacyRegion: " + region.toString());
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
Utils.writeJSONtoFile(region, new File(CLIENT + "/" + "Settings" + "/" + "PrivacyRegions"));
|
||||
|
||||
try {
|
||||
Toast.makeText(getApplicationContext(), "\"" + region.getString("label") + "\" " + " has been added.", Toast.LENGTH_SHORT).show();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
/**/
|
||||
startActivity(new Intent(getBaseContext(), PrivacyRegionsActivity.class));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
142
app/src/main/java/com/www/client/pr/Demo.java
Normal file
@ -0,0 +1,142 @@
|
||||
package com.www.client.pr;
|
||||
|
||||
import java.util.*;
|
||||
import java.io.*;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.*;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public class Demo {
|
||||
|
||||
private Context context;
|
||||
private int pref;
|
||||
private List <Object> state;
|
||||
private List<Map<String, String>> peers;
|
||||
|
||||
public void onStart (Context c, int i, ObjectInputStream ois) throws Exception {
|
||||
String TAG = getClass().getName() + "@onStart: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
// get application context
|
||||
context = c;
|
||||
|
||||
// get privacy preferences
|
||||
pref = i;
|
||||
|
||||
// restore state
|
||||
if (ois != null) {
|
||||
Log.wtf(TAG, "Restoring state...");
|
||||
state = (List<Object>) ois.readObject();
|
||||
} else {
|
||||
Log.wtf(TAG, "Initializing state...");
|
||||
state = new ArrayList<>();
|
||||
}
|
||||
|
||||
peers = new ArrayList<>();
|
||||
|
||||
}
|
||||
|
||||
public void onStop () {
|
||||
String TAG = getClass().getName() + "@onStop: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
}
|
||||
|
||||
public void onPreferenceChanged (int i) {
|
||||
String TAG = getClass().getName() + "@onPreferenceChanged: ";
|
||||
|
||||
Log.wtf(TAG, "" + i);
|
||||
|
||||
pref = i;
|
||||
|
||||
}
|
||||
|
||||
public boolean saveState (ObjectOutputStream oos) {
|
||||
String TAG = getClass().getName() + "@saveState: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
// s.writeObject(state);
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
public int processData (ObjectInputStream ois, ObjectOutputStream oos) throws Exception {
|
||||
String TAG = getClass().getName() + "@processData: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
// get list of data
|
||||
List <Object> list = (List<Object>) ois.readObject();
|
||||
|
||||
// edit each data entry of the data list
|
||||
for (Object o : list) {
|
||||
|
||||
Map data = (Map) o;
|
||||
data.put("device", data.get("device"));
|
||||
data.put("task", data.get("task"));
|
||||
data.put("sensor", data.get("sensor"));
|
||||
data.put("values", data.get("values"));
|
||||
|
||||
float min = -1;
|
||||
float max = 1;
|
||||
|
||||
Random r = new Random();
|
||||
float d = min + (max - min) * r.nextFloat(); // -1 < d < 1
|
||||
|
||||
long var = (long) (((float) pref / 10) * d * 3600000000000L); // (pref/10) * random * (1hr)
|
||||
|
||||
data.put("timestamp", (Long) data.get("timestamp") + var);
|
||||
|
||||
}
|
||||
|
||||
oos.writeObject(list);
|
||||
|
||||
// If a peer is present
|
||||
Log.wtf(TAG, "Returning...");
|
||||
if(!peers.isEmpty()) {
|
||||
// Collaborate
|
||||
Log.wtf(TAG, peers.get(0).get("id"));
|
||||
return Integer.parseInt(peers.get(0).get("id"));
|
||||
}
|
||||
Log.wtf(TAG, "No peers");
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Collaborative stuff
|
||||
*/
|
||||
/**/
|
||||
public void onPeersChanged (List<Map<String, String>> peers) {
|
||||
String TAG = getClass().getName() + "@onPeersChanged: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
this.peers = peers;
|
||||
|
||||
Log.wtf(TAG, peers.toString());
|
||||
|
||||
}
|
||||
|
||||
public boolean aggregateData (ObjectInputStream ois, ObjectOutputStream oos) throws Exception {
|
||||
String TAG = getClass().getName() + "@aggregateData: ";
|
||||
|
||||
Log.wtf(TAG, "...");
|
||||
|
||||
// Read input stream
|
||||
List <Object> data = (List<Object>) ois.readObject();
|
||||
|
||||
// Write to output stream
|
||||
oos.writeObject(data);
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
/**/
|
||||
|
||||
}
|
@ -0,0 +1,188 @@
|
||||
package com.www.client.pr;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.EditText;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.android.gms.maps.CameraUpdateFactory;
|
||||
import com.google.android.gms.maps.GoogleMap;
|
||||
import com.google.android.gms.maps.MapFragment;
|
||||
import com.google.android.gms.maps.model.LatLng;
|
||||
import com.google.android.gms.maps.model.LatLngBounds;
|
||||
import com.www.client.R;
|
||||
import com.www.client.Utils;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
public class EditPrivacyRegionActivity extends Activity {
|
||||
private static final String TAG = "EditPrivacyRegionActivity";
|
||||
|
||||
private JSONObject privacyRegion = null;
|
||||
|
||||
private GoogleMap regionMap = null;
|
||||
private EditText region_label = null;
|
||||
|
||||
private static final String SDCARD = Environment.getExternalStorageDirectory().getPath();
|
||||
public static final String CLIENT = SDCARD + "/Client";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_edit_privacy_region);
|
||||
|
||||
try {
|
||||
privacyRegion = new JSONObject((String) getIntent().getSerializableExtra("privacyRegion"));
|
||||
//Log.i(TAG, privacyRegion.toString());
|
||||
setTitle(privacyRegion.getString("label"));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
regionMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.region_map)).getMap();
|
||||
final View mapView = getFragmentManager().findFragmentById(R.id.region_map).getView();
|
||||
|
||||
LatLngBounds.Builder bounds;
|
||||
bounds = new LatLngBounds.Builder();
|
||||
|
||||
if (mapView.getViewTreeObserver().isAlive()) {
|
||||
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
@SuppressLint("NewApi") // We check which build version we are using.
|
||||
@Override
|
||||
public void onGlobalLayout() {
|
||||
|
||||
LatLngBounds bounds = null;
|
||||
try {
|
||||
bounds = new LatLngBounds.Builder()
|
||||
.include(new LatLng(privacyRegion.getDouble("ne_lat"), privacyRegion.getDouble("ne_lng")))
|
||||
.include(new LatLng(privacyRegion.getDouble("sw_lat"), privacyRegion.getDouble("sw_lng")))
|
||||
.build();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
|
||||
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
|
||||
} else {
|
||||
mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
||||
}
|
||||
regionMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
region_label = (EditText) findViewById(R.id.region_label);
|
||||
try {
|
||||
region_label.setText(privacyRegion.getString("label"));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
//region_label.setImeActionLabel("OK", EditorInfo.IME_ACTION_DONE);
|
||||
region_label.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
region_label.setError(null);
|
||||
}
|
||||
});/**/
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
getMenuInflater().inflate(R.menu.edit_privacy_region, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
// Handle action bar item clicks here. The action bar will
|
||||
// automatically handle clicks on the Home/Up button, so long
|
||||
// as you specify a parent activity in AndroidManifest.xml.
|
||||
int id = item.getItemId();
|
||||
if (id == R.id.action_ok) {
|
||||
//Toast.makeText(getApplicationContext(), "onOptionsItemSelected: " + "OK", Toast.LENGTH_SHORT).show();
|
||||
editPrivacyRegion();
|
||||
return true;
|
||||
}/**/
|
||||
if (id == R.id.action_cancel) {
|
||||
//Toast.makeText(getApplicationContext(), "onOptionsItemSelected: " + "CANCEL", Toast.LENGTH_SHORT).show();
|
||||
finish();
|
||||
return true;
|
||||
}/**/
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
public void editPrivacyRegion() {
|
||||
if(region_label.getText().toString().trim().equals("")) {
|
||||
region_label.setError("Region label is required!");
|
||||
}
|
||||
else {
|
||||
region_label.setError(null);
|
||||
LatLngBounds bounds = regionMap.getProjection().getVisibleRegion().latLngBounds;
|
||||
String label = region_label.getText().toString();
|
||||
|
||||
/*Toast.makeText(getApplicationContext(), region_label.getText().toString() + "\n"
|
||||
+ bounds.northeast.latitude + " - " + bounds.northeast.longitude + "\n"
|
||||
+ bounds.southwest.latitude + " - " + bounds.southwest.longitude, Toast.LENGTH_SHORT).show();/**/
|
||||
|
||||
JSONObject region = new JSONObject();
|
||||
try {
|
||||
region.put("label", label);
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd_HHmmss");
|
||||
region.put("id", sdf.format(new Date()));
|
||||
region.put("ne_lat", bounds.northeast.latitude);
|
||||
region.put("ne_lng", bounds.northeast.longitude);
|
||||
region.put("sw_lat", bounds.southwest.latitude);
|
||||
region.put("sw_lng", bounds.southwest.longitude);
|
||||
//Log.i(TAG, "editPrivacyRegion: " + region.toString());
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
ArrayList<JSONObject> privacyRegions = new ArrayList<JSONObject>();
|
||||
privacyRegions = Utils.fileToJSON(new File(CLIENT + "/" + "Settings" + "/" + "PrivacyRegions"));
|
||||
|
||||
int i = 0;
|
||||
for (JSONObject jsonObject : privacyRegions) {
|
||||
try {
|
||||
if (jsonObject.getString("id").equals(privacyRegion.getString("id"))
|
||||
&& jsonObject.getString("label").equals(privacyRegion.getString("label"))) {
|
||||
//Toast.makeText(getApplicationContext(), jsonObject.getString("label"), Toast.LENGTH_SHORT).show();
|
||||
privacyRegions.set(i, region);
|
||||
break;
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
Utils.overwriteJSONtoFile(privacyRegions, new File(CLIENT + "/" + "Settings" + "/" + "PrivacyRegions"));
|
||||
|
||||
try {
|
||||
Toast.makeText(getApplicationContext(), "\"" + privacyRegion.getString("label") + "\" " + "has been edited.", Toast.LENGTH_SHORT).show();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
finish();
|
||||
/*Intent intent = new Intent(this, ViewPrivacyRegionActivity.class);
|
||||
intent.putExtra("privacyRegion", region.toString());
|
||||
startActivity(intent);/**/
|
||||
}
|
||||
}
|
||||
}
|
174
app/src/main/java/com/www/client/pr/PrivacyRegionsActivity.java
Normal file
@ -0,0 +1,174 @@
|
||||
package com.www.client.pr;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.ActivityManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.Button;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.ListView;
|
||||
import android.widget.Switch;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.www.client.ClientActivity;
|
||||
import com.www.client.ItemArrayAdapter;
|
||||
import com.www.client.R;
|
||||
import com.www.client.TaskService;
|
||||
import com.www.client.Utils;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class PrivacyRegionsActivity extends Activity implements CompoundButton.OnCheckedChangeListener, AdapterView.OnItemClickListener {
|
||||
private static final String TAG = "PrivacyRegionsActivity";
|
||||
|
||||
private static final String SDCARD = Environment.getExternalStorageDirectory().getPath();
|
||||
public static final String CLIENT = SDCARD + "/Client";
|
||||
|
||||
public static SharedPreferences sp = null;
|
||||
public static SharedPreferences.Editor spEditor = null;
|
||||
|
||||
Switch actionBarSwitch;
|
||||
|
||||
ArrayList<JSONObject> privacyRegions = null;
|
||||
|
||||
ListView listView;
|
||||
TextView textView;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_privacy_regions);
|
||||
setTitle(getResources().getString((R.string.privacy_regions_title)));
|
||||
|
||||
sp = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
spEditor = sp.edit();
|
||||
|
||||
Button addNewButton = (Button)findViewById(R.id.add_new);
|
||||
addNewButton.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v){
|
||||
startActivity(new Intent(getBaseContext(), AddPrivacyRegionActivity.class));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
//Log.i(TAG, "onResume: ...");
|
||||
super.onResume();
|
||||
loadList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
onResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
getMenuInflater().inflate(R.menu.activity_privacy_regions, menu);
|
||||
|
||||
actionBarSwitch = (Switch)menu.findItem(R.id.action_bar_switch).getActionView().findViewById(R.id.switch_button);
|
||||
actionBarSwitch.setChecked(sp.getBoolean(getResources().getString((R.string.privacy_regions_status)), false));
|
||||
actionBarSwitch.setOnCheckedChangeListener(this);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
// Handle action bar item clicks here. The action bar will
|
||||
// automatically handle clicks on the Home/Up button, so long
|
||||
// as you specify a parent activity in AndroidManifest.xml.
|
||||
int id = item.getItemId();
|
||||
|
||||
switch (item.getItemId()) {
|
||||
case R.id.switch_button:
|
||||
Toast.makeText(ClientActivity.getContext(), "onOptionsItemSelected: " + item.toString(), Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
default:return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
|
||||
//Toast.makeText(getApplicationContext(), "onCheckedChanged: " + compoundButton, Toast.LENGTH_SHORT).show();
|
||||
if (compoundButton == actionBarSwitch) {
|
||||
//Toast.makeText(getApplicationContext(), "onCheckedChanged: " + compoundButton + " = " + b, Toast.LENGTH_SHORT).show();
|
||||
spEditor.putBoolean(getResources().getString((R.string.privacy_regions_status)), b);
|
||||
spEditor.commit();
|
||||
//Log.i(TAG, "onCheckedChanged: " + sp.getAll());
|
||||
//restart service
|
||||
//Toast.makeText(getApplicationContext(), "Restarting...", Toast.LENGTH_SHORT).show();
|
||||
if(isServiceRunning()) {
|
||||
Log.i(TAG, "onCheckedChanged: " + "Restarting service...");
|
||||
stopService(new Intent(this, TaskService.class));
|
||||
startService(new Intent(this, TaskService.class));
|
||||
}/**/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
||||
JSONObject choice = privacyRegions.get(i);
|
||||
//Toast.makeText(getApplicationContext(), choice.toString(), Toast.LENGTH_SHORT).show();
|
||||
//Log.i(TAG, choice.toString());
|
||||
Intent intent = new Intent(this, ViewPrivacyRegionActivity.class);
|
||||
intent.putExtra("privacyRegion", choice.toString());
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
private void loadList() {
|
||||
//Log.i(TAG, "loadList: ... ");
|
||||
privacyRegions = Utils.fileToJSON(new File(CLIENT + "/" + "Settings" + "/" + "PrivacyRegions"));
|
||||
textView = (TextView) findViewById(R.id.info);
|
||||
listView = (ListView) findViewById(R.id.list);
|
||||
//Log.i(TAG, "loadList: " + privacyRegions.toString());
|
||||
|
||||
if (privacyRegions.isEmpty()) {
|
||||
//Log.i(TAG, "privacyRegions is empty");
|
||||
listView.setVisibility(View.GONE);
|
||||
textView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
else {
|
||||
//Log.i(TAG, "privacyRegions not empty");
|
||||
textView.setVisibility(View.GONE);
|
||||
/*for (JSONObject privacyRegion : privacyRegions) {
|
||||
Log.i(TAG, "loadList: " + privacyRegion.toString());
|
||||
}/**/
|
||||
|
||||
listView = (ListView) findViewById(R.id.list);
|
||||
|
||||
ItemArrayAdapter adapter = new ItemArrayAdapter(this, R.layout.item, privacyRegions);
|
||||
listView.setAdapter(adapter);
|
||||
listView.setOnItemClickListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isServiceRunning() {
|
||||
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
||||
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
|
||||
if (TaskService.class.getName().equals(service.service.getClassName())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -0,0 +1,142 @@
|
||||
package com.www.client.pr;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.android.gms.maps.CameraUpdateFactory;
|
||||
import com.google.android.gms.maps.GoogleMap;
|
||||
import com.google.android.gms.maps.MapFragment;
|
||||
import com.google.android.gms.maps.model.LatLng;
|
||||
import com.google.android.gms.maps.model.LatLngBounds;
|
||||
import com.www.client.R;
|
||||
import com.www.client.Utils;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
||||
public class ViewPrivacyRegionActivity extends Activity {
|
||||
private static final String TAG = "ViewPrivacyRegionActivity";
|
||||
|
||||
private JSONObject privacyRegion = null;
|
||||
|
||||
private GoogleMap regionMap = null;
|
||||
|
||||
private static final String SDCARD = Environment.getExternalStorageDirectory().getPath();
|
||||
public static final String CLIENT = SDCARD + "/Client";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_view_privacy_region);
|
||||
|
||||
try {
|
||||
privacyRegion = new JSONObject((String) getIntent().getSerializableExtra("privacyRegion"));
|
||||
//Log.i(TAG, privacyRegion.toString());
|
||||
setTitle(privacyRegion.getString("label"));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
regionMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.region_map)).getMap();
|
||||
final View mapView = getFragmentManager().findFragmentById(R.id.region_map).getView();
|
||||
|
||||
regionMap.getUiSettings().setZoomControlsEnabled(false);
|
||||
regionMap.getUiSettings().setCompassEnabled(false);
|
||||
regionMap.getUiSettings().setAllGesturesEnabled(false);
|
||||
regionMap.getUiSettings().setMyLocationButtonEnabled(false);/**/
|
||||
|
||||
LatLngBounds.Builder bounds;
|
||||
bounds = new LatLngBounds.Builder();
|
||||
|
||||
if (mapView.getViewTreeObserver().isAlive()) {
|
||||
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
@SuppressLint("NewApi") // We check which build version we are using.
|
||||
@Override
|
||||
public void onGlobalLayout() {
|
||||
|
||||
LatLngBounds bounds = null;
|
||||
try {
|
||||
bounds = new LatLngBounds.Builder()
|
||||
.include(new LatLng(privacyRegion.getDouble("ne_lat"), privacyRegion.getDouble("ne_lng")))
|
||||
.include(new LatLng(privacyRegion.getDouble("sw_lat"), privacyRegion.getDouble("sw_lng")))
|
||||
.build();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
|
||||
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
|
||||
} else {
|
||||
mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
||||
}
|
||||
regionMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
getMenuInflater().inflate(R.menu.view_privacy_region, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
// Handle action bar item clicks here. The action bar will
|
||||
// automatically handle clicks on the Home/Up button, so long
|
||||
// as you specify a parent activity in AndroidManifest.xml.
|
||||
int id = item.getItemId();
|
||||
if (id == R.id.action_edit) {
|
||||
Intent intent = new Intent(this, EditPrivacyRegionActivity.class);
|
||||
intent.putExtra("privacyRegion", privacyRegion.toString());
|
||||
startActivity(intent);
|
||||
return true;
|
||||
}
|
||||
if (id == R.id.action_delete) {
|
||||
//Toast.makeText(getApplicationContext(), "onOptionsItemSelected: " + "DELETE", Toast.LENGTH_SHORT).show();
|
||||
ArrayList<JSONObject> privacyRegions = new ArrayList<JSONObject>();
|
||||
privacyRegions = Utils.fileToJSON(new File(CLIENT + "/" + "Settings" + "/" + "PrivacyRegions"));
|
||||
|
||||
for (JSONObject jsonObject : privacyRegions) {
|
||||
try {
|
||||
if (jsonObject.getString("id").equals(privacyRegion.getString("id"))
|
||||
&& jsonObject.getString("label").equals(privacyRegion.getString("label"))) {
|
||||
//Toast.makeText(getApplicationContext(), jsonObject.getString("label"), Toast.LENGTH_SHORT).show();
|
||||
privacyRegions.remove(jsonObject);
|
||||
break;
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
Utils.overwriteJSONtoFile(privacyRegions, new File(CLIENT + "/" + "Settings" + "/" + "PrivacyRegions"));
|
||||
|
||||
try {
|
||||
Toast.makeText(getApplicationContext(), "\"" + privacyRegion.getString("label") + "\" " + " has been deleted.", Toast.LENGTH_SHORT).show();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
BIN
app/src/main/res/drawable-hdpi/ic_action_accept.png
Normal file
After Width: | Height: | Size: 401 B |
BIN
app/src/main/res/drawable-hdpi/ic_action_cancel.png
Normal file
After Width: | Height: | Size: 353 B |
BIN
app/src/main/res/drawable-hdpi/ic_action_discard.png
Normal file
After Width: | Height: | Size: 450 B |
BIN
app/src/main/res/drawable-hdpi/ic_action_edit.png
Normal file
After Width: | Height: | Size: 765 B |
BIN
app/src/main/res/drawable-hdpi/ic_refresh.png
Normal file
After Width: | Height: | Size: 506 B |
BIN
app/src/main/res/drawable-hdpi/ic_settings.png
Normal file
After Width: | Height: | Size: 505 B |
BIN
app/src/main/res/drawable-mdpi/ic_action_accept.png
Normal file
After Width: | Height: | Size: 246 B |
BIN
app/src/main/res/drawable-mdpi/ic_action_cancel.png
Normal file
After Width: | Height: | Size: 272 B |
BIN
app/src/main/res/drawable-mdpi/ic_action_discard.png
Normal file
After Width: | Height: | Size: 324 B |
BIN
app/src/main/res/drawable-mdpi/ic_action_edit.png
Normal file
After Width: | Height: | Size: 522 B |
BIN
app/src/main/res/drawable-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
app/src/main/res/drawable-mdpi/ic_refresh.png
Normal file
After Width: | Height: | Size: 297 B |
BIN
app/src/main/res/drawable-mdpi/ic_settings.png
Normal file
After Width: | Height: | Size: 313 B |
BIN
app/src/main/res/drawable-xhdpi/ic_action_accept.png
Normal file
After Width: | Height: | Size: 475 B |
BIN
app/src/main/res/drawable-xhdpi/ic_action_discard.png
Normal file
After Width: | Height: | Size: 543 B |
BIN
app/src/main/res/drawable-xhdpi/ic_action_edit.png
Normal file
After Width: | Height: | Size: 994 B |
BIN
app/src/main/res/drawable-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
app/src/main/res/drawable-xhdpi/ic_refresh.png
Normal file
After Width: | Height: | Size: 637 B |
BIN
app/src/main/res/drawable-xhdpi/ic_settings.png
Normal file
After Width: | Height: | Size: 645 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
app/src/main/res/drawable-xxhdpi/ic_refresh.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
app/src/main/res/drawable-xxhdpi/ic_settings.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
69
app/src/main/res/layout/activity_add_privacy_region.xml
Normal file
@ -0,0 +1,69 @@
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context="com.www.client.pr.AddPrivacyRegionActivity">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/region_map"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
class="com.google.android.gms.maps.MapFragment"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/info"
|
||||
android:text="Select the privacy region, type a label and then tap to save or cancel your preferences."
|
||||
android:gravity="center"
|
||||
android:padding="16dp"
|
||||
android:background="@color/black_trans5"
|
||||
android:textColor="@color/white"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/region_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:textColor="@color/black"
|
||||
android:hint="Type privacy region label..."
|
||||
android:layout_marginBottom="32dp"
|
||||
android:layout_marginLeft="2dp"
|
||||
android:layout_marginRight="60dp"
|
||||
android:singleLine="true"
|
||||
/>
|
||||
|
||||
|
||||
<!--
|
||||
<Button
|
||||
android:id="@+id/okButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_alignLeft="@+id/text"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignRight="@+id/mid"
|
||||
android:text="@string/ok" />
|
||||
<LinearLayout
|
||||
android:id="@+id/mid"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:gravity="center" >
|
||||
</LinearLayout>
|
||||
<Button
|
||||
android:id="@+id/cancelButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_alignLeft="@+id/mid"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignRight="@+id/text"
|
||||
android:text="@string/cancel" />
|
||||
-->
|
||||
|
||||
</RelativeLayout>
|
89
app/src/main/res/layout/activity_client.xml
Normal file
@ -0,0 +1,89 @@
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||
android:paddingTop="@dimen/activity_vertical_margin"
|
||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||
tools:context=".ClientActivity" >
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textview"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_centerVertical="true" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignLeft="@+id/comment"
|
||||
android:layout_alignRight="@+id/comment"
|
||||
android:gravity="center"
|
||||
android:textStyle="bold"
|
||||
android:text="Status"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||
/>
|
||||
<TextView
|
||||
android:id="@+id/comment"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignLeft="@+id/levelService"
|
||||
android:layout_alignRight="@+id/levelService"
|
||||
android:layout_below="@+id/status"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="Comment"
|
||||
android:gravity="center" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/level"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_above="@+id/levelService"
|
||||
android:layout_alignLeft="@+id/levelService"
|
||||
android:layout_alignRight="@+id/levelService"
|
||||
android:gravity="center" />
|
||||
<SeekBar
|
||||
android:id="@+id/levelService"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:max="100"
|
||||
android:progress="0"
|
||||
android:secondaryProgress="0"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignRight="@+id/textview"
|
||||
android:layout_alignEnd="@+id/textview" />
|
||||
|
||||
<View
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:id="@+id/center_vertical" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/okButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/ok"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_toLeftOf="@+id/center_vertical"
|
||||
android:layout_toStartOf="@+id/center_vertical" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/cancelButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/cancel"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignRight="@+id/textview"
|
||||
android:layout_alignEnd="@+id/textview"
|
||||
android:layout_toRightOf="@+id/center_vertical"
|
||||
android:layout_toEndOf="@+id/center_vertical" />
|
||||
|
||||
</RelativeLayout>
|
27
app/src/main/res/layout/activity_edit_privacy_region.xml
Normal file
@ -0,0 +1,27 @@
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context="com.www.client.pr.EditPrivacyRegionActivity">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/region_map"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
class="com.google.android.gms.maps.MapFragment"
|
||||
/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/region_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:textColor="@color/black"
|
||||
android:hint="Type privacy region label..."
|
||||
android:layout_marginBottom="32dp"
|
||||
android:layout_marginLeft="2dp"
|
||||
android:layout_marginRight="60dp"
|
||||
android:singleLine="true"
|
||||
/>
|
||||
|
||||
</RelativeLayout>
|