First commit
							
								
								
									
										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>
 | 
			
		||||
							
								
								
									
										23
									
								
								app/src/main/res/layout/activity_list_privacy_mechanisms.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,23 @@
 | 
			
		||||
<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.pm.ListPrivacyMechanismsActivity">
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/textView"
 | 
			
		||||
        android:text="@string/hello_world"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:layout_margin="16dp"
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:visibility="gone"/>
 | 
			
		||||
 | 
			
		||||
    <ListView
 | 
			
		||||
        android:id="@+id/listView"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:paddingLeft="@dimen/activity_horizontal_margin"
 | 
			
		||||
        android:paddingRight="@dimen/activity_horizontal_margin"
 | 
			
		||||
        android:scrollbarStyle="outsideOverlay" />
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										95
									
								
								app/src/main/res/layout/activity_privacy_mechanisms.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,95 @@
 | 
			
		||||
<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="com.www.client.pm.PrivacyMechanismsActivity">
 | 
			
		||||
 | 
			
		||||
    <View
 | 
			
		||||
        android:layout_width="1dp"
 | 
			
		||||
        android:layout_height="fill_parent"
 | 
			
		||||
        android:layout_centerHorizontal="true"
 | 
			
		||||
        android:id="@+id/center_vertical" />
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:text="Status"
 | 
			
		||||
        android:id="@+id/status"
 | 
			
		||||
        android:textStyle="bold"
 | 
			
		||||
        android:textAppearance="?android:attr/textAppearanceLarge"
 | 
			
		||||
        android:layout_alignParentTop="true"
 | 
			
		||||
        android:layout_alignParentLeft="true"
 | 
			
		||||
        android:layout_alignParentStart="true"
 | 
			
		||||
        android:layout_alignRight="@+id/comment"
 | 
			
		||||
        android:layout_alignEnd="@+id/comment" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text="Privacy level"
 | 
			
		||||
        android:id="@+id/comment"
 | 
			
		||||
        android:layout_below="@+id/status"
 | 
			
		||||
        android:layout_alignParentLeft="true"
 | 
			
		||||
        android:layout_alignParentStart="true"
 | 
			
		||||
        android:layout_marginTop="16dp"
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:layout_alignRight="@+id/level"
 | 
			
		||||
        android:layout_alignEnd="@+id/level" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text="Level (%)"
 | 
			
		||||
        android:id="@+id/level"
 | 
			
		||||
        android:layout_marginTop="16dp"
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:layout_above="@+id/level_bar"
 | 
			
		||||
        android:layout_alignParentLeft="true"
 | 
			
		||||
        android:layout_alignParentStart="true"
 | 
			
		||||
        android:layout_alignRight="@+id/level_bar"
 | 
			
		||||
        android:layout_alignEnd="@+id/level_bar" />
 | 
			
		||||
 | 
			
		||||
    <SeekBar
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:id="@+id/level_bar"
 | 
			
		||||
        android:layout_centerVertical="true"
 | 
			
		||||
        android:max="100"
 | 
			
		||||
        android:progress="0"
 | 
			
		||||
        android:secondaryProgress="0"
 | 
			
		||||
        android:layout_marginTop="16dp"
 | 
			
		||||
        android:layout_marginBottom="16dp"
 | 
			
		||||
        android:layout_alignParentRight="true"
 | 
			
		||||
        android:layout_alignParentEnd="true"
 | 
			
		||||
        android:layout_alignParentLeft="true"
 | 
			
		||||
        android:layout_alignParentStart="true" />
 | 
			
		||||
 | 
			
		||||
    <Button
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text="OK"
 | 
			
		||||
        android:id="@+id/ok_btn"
 | 
			
		||||
        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:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text="Cancel"
 | 
			
		||||
        android:id="@+id/cancel_btn"
 | 
			
		||||
        android:layout_alignBottom="@+id/center_vertical"
 | 
			
		||||
        android:layout_alignRight="@+id/level_bar"
 | 
			
		||||
        android:layout_alignEnd="@+id/level_bar"
 | 
			
		||||
        android:layout_toRightOf="@+id/center_vertical"
 | 
			
		||||
        android:layout_toEndOf="@+id/center_vertical" />
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										42
									
								
								app/src/main/res/layout/activity_privacy_regions.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,42 @@
 | 
			
		||||
<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.PrivacyRegionsActivity">
 | 
			
		||||
 | 
			
		||||
    <Button
 | 
			
		||||
        android:id="@+id/add_new"
 | 
			
		||||
        android:padding="16dp"
 | 
			
		||||
        android:layout_width="fill_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text="Add new"/>
 | 
			
		||||
 | 
			
		||||
    <ListView
 | 
			
		||||
        android:id="@+id/list"
 | 
			
		||||
        android:layout_below="@id/add_new"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="fill_parent"
 | 
			
		||||
        android:paddingLeft="16dp"
 | 
			
		||||
        android:paddingRight="16dp"
 | 
			
		||||
        android:clipChildren="false"
 | 
			
		||||
        android:clipToPadding="false"
 | 
			
		||||
        android:scrollbarStyle="outsideOverlay" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/info"
 | 
			
		||||
        android:layout_below="@id/add_new"
 | 
			
		||||
        android:text="No privacy regions set yet. Tap on 'Add new' to begin..."
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:padding="16dp"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"/>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/map"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        class="com.google.android.gms.maps.MapFragment" />
 | 
			
		||||
    -->
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										126
									
								
								app/src/main/res/layout/activity_view_privacy_mechanism.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,126 @@
 | 
			
		||||
<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.pm.ViewPrivacyMechanismActivity">
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/message"
 | 
			
		||||
        android:text="@string/hello_world"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:visibility="visible"/>
 | 
			
		||||
 | 
			
		||||
    <ScrollView
 | 
			
		||||
        android:id="@+id/content"
 | 
			
		||||
        android:layout_width="fill_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_alignParentTop="true"
 | 
			
		||||
        android:scrollbarStyle="outsideOverlay">
 | 
			
		||||
 | 
			
		||||
        <LinearLayout
 | 
			
		||||
            android:orientation="vertical"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:paddingLeft="@dimen/activity_horizontal_margin"
 | 
			
		||||
            android:paddingRight="@dimen/activity_horizontal_margin"
 | 
			
		||||
            android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/name"
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textAppearance="?android:attr/textAppearanceLarge"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:text="name" />
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/version"
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:text="version" />
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/user"
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:text="user" />
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/button"
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="New Button"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:layout_centerHorizontal="true" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textAppearance="?android:attr/textAppearanceMedium"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                android:text="Description" />
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/description"
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:text="description" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textAppearance="?android:attr/textAppearanceMedium"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                android:text="Date & time" />
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/date_time"
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:text="date & time" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textAppearance="?android:attr/textAppearanceMedium"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                android:text="Size" />
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/size"
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:text="size" />
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textAppearance="?android:attr/textAppearanceMedium"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:layout_marginTop="16dp"
 | 
			
		||||
                android:text="Identifier" />
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:id="@+id/id"
 | 
			
		||||
                android:layout_width="fill_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:gravity="center"
 | 
			
		||||
                android:layout_marginTop="8dp"
 | 
			
		||||
                android:text="id" />
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        </LinearLayout>
 | 
			
		||||
 | 
			
		||||
    </ScrollView>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										14
									
								
								app/src/main/res/layout/activity_view_privacy_region.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,14 @@
 | 
			
		||||
<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.ViewPrivacyRegionActivity">
 | 
			
		||||
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/region_map"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        class="com.google.android.gms.maps.MapFragment"
 | 
			
		||||
        />
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										14
									
								
								app/src/main/res/layout/item.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,14 @@
 | 
			
		||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:layout_width="fill_parent"
 | 
			
		||||
    android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/text"
 | 
			
		||||
        android:layout_width="fill_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:text="text"
 | 
			
		||||
        android:padding="16dp"
 | 
			
		||||
        android:textAppearance="?android:attr/textAppearanceLarge" />
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										35
									
								
								app/src/main/res/layout/privacy_mechanism_item.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,35 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<RelativeLayout
 | 
			
		||||
    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:orientation="vertical"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
    android:padding="8dp">
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/name"
 | 
			
		||||
        android:layout_width="fill_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text="name"
 | 
			
		||||
        android:layout_alignParentTop="true"
 | 
			
		||||
        android:textAppearance="?android:attr/textAppearanceLarge" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/user"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text="user"
 | 
			
		||||
        android:layout_below="@+id/name"
 | 
			
		||||
        android:layout_alignParentLeft="true"
 | 
			
		||||
        android:layout_alignParentStart="true" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/status"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text="status"
 | 
			
		||||
        android:layout_below="@+id/name"
 | 
			
		||||
        android:layout_alignRight="@+id/name"
 | 
			
		||||
        android:layout_alignEnd="@+id/name" />
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										16
									
								
								app/src/main/res/layout/switch_button.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,16 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:layout_width="fill_parent"
 | 
			
		||||
    android:layout_height="fill_parent"
 | 
			
		||||
    android:orientation="horizontal"
 | 
			
		||||
    android:gravity="center_vertical"
 | 
			
		||||
    android:paddingRight="16dp">
 | 
			
		||||
 | 
			
		||||
    <Switch
 | 
			
		||||
        android:id="@+id/switch_button"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:text=""
 | 
			
		||||
        />
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
							
								
								
									
										7
									
								
								app/src/main/res/menu/activity_client.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,7 @@
 | 
			
		||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/menu_settings"
 | 
			
		||||
        android:showAsAction="always"
 | 
			
		||||
        android:icon="@drawable/ic_settings"
 | 
			
		||||
        android:title="@string/menu_settings"/>
 | 
			
		||||
</menu>
 | 
			
		||||
							
								
								
									
										10
									
								
								app/src/main/res/menu/activity_privacy_regions.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,10 @@
 | 
			
		||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    tools:context="com.www.client.pr.PrivacyRegionsActivity">
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/action_bar_switch"
 | 
			
		||||
        android:showAsAction="always"
 | 
			
		||||
        android:actionLayout="@layout/switch_button"
 | 
			
		||||
        android:gravity="center_vertical"
 | 
			
		||||
        android:title="" />
 | 
			
		||||
</menu>
 | 
			
		||||
							
								
								
									
										12
									
								
								app/src/main/res/menu/add_privacy_region.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,12 @@
 | 
			
		||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
 | 
			
		||||
    <!-- Search, should appear as action button -->
 | 
			
		||||
    <item android:id="@+id/action_ok"
 | 
			
		||||
        android:icon="@drawable/ic_action_accept"
 | 
			
		||||
        android:title="OK"
 | 
			
		||||
        android:showAsAction="always" />
 | 
			
		||||
    <!-- Settings, should always be in the overflow -->
 | 
			
		||||
    <item android:id="@+id/action_cancel"
 | 
			
		||||
        android:icon="@drawable/ic_action_cancel"
 | 
			
		||||
        android:title="Cancel"
 | 
			
		||||
        android:showAsAction="always" />
 | 
			
		||||
</menu>
 | 
			
		||||
							
								
								
									
										12
									
								
								app/src/main/res/menu/edit_privacy_region.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,12 @@
 | 
			
		||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
 | 
			
		||||
    <!-- Search, should appear as action button -->
 | 
			
		||||
    <item android:id="@+id/action_ok"
 | 
			
		||||
        android:icon="@drawable/ic_action_accept"
 | 
			
		||||
        android:title="OK"
 | 
			
		||||
        android:showAsAction="always" />
 | 
			
		||||
    <!-- Settings, should always be in the overflow -->
 | 
			
		||||
    <item android:id="@+id/action_cancel"
 | 
			
		||||
        android:icon="@drawable/ic_action_cancel"
 | 
			
		||||
        android:title="Cancel"
 | 
			
		||||
        android:showAsAction="always" />
 | 
			
		||||
</menu>
 | 
			
		||||
							
								
								
									
										11
									
								
								app/src/main/res/menu/menu_list_privacy_mechanisms.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,11 @@
 | 
			
		||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    tools:context="com.www.client.pm.ListPrivacyMechanismsActivity">
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/get_privacy_mechanism_action_refresh"
 | 
			
		||||
        android:icon="@drawable/ic_refresh"
 | 
			
		||||
        android:title="@string/get_privacy_mechanism_action_refresh"
 | 
			
		||||
        android:orderInCategory="100"
 | 
			
		||||
        android:showAsAction="always" />
 | 
			
		||||
</menu>
 | 
			
		||||
							
								
								
									
										8
									
								
								app/src/main/res/menu/menu_privacy_mechanisms.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,8 @@
 | 
			
		||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    tools:context="com.www.client.pm.PrivacyMechanismsActivity">
 | 
			
		||||
    <item android:id="@+id/privacy_mechanisms_get_list" android:title="@string/privacy_mechanisms_get_list"
 | 
			
		||||
        android:orderInCategory="100"/>
 | 
			
		||||
    <item android:id="@+id/privacy_mechanisms_view_installed" android:title="@string/privacy_mechanisms_view_installed"
 | 
			
		||||
        android:orderInCategory="100"/>
 | 
			
		||||
</menu>
 | 
			
		||||
							
								
								
									
										7
									
								
								app/src/main/res/menu/menu_view_privacy_mechanism.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,7 @@
 | 
			
		||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    tools:context="com.www.client.pm.ViewPrivacyMechanismActivity">
 | 
			
		||||
    <item android:id="@+id/action_settings" android:title="@string/action_settings"
 | 
			
		||||
        android:orderInCategory="100" app:showAsAction="never" />
 | 
			
		||||
</menu>
 | 
			
		||||
							
								
								
									
										12
									
								
								app/src/main/res/menu/view_privacy_region.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,12 @@
 | 
			
		||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
 | 
			
		||||
    <!-- Search, should appear as action button -->
 | 
			
		||||
    <item android:id="@+id/action_edit"
 | 
			
		||||
        android:icon="@drawable/ic_action_edit"
 | 
			
		||||
        android:title="Edit"
 | 
			
		||||
        android:showAsAction="always" />
 | 
			
		||||
    <!-- Settings, should always be in the overflow -->
 | 
			
		||||
    <item android:id="@+id/action_delete"
 | 
			
		||||
        android:icon="@drawable/ic_action_discard"
 | 
			
		||||
        android:title="Delete"
 | 
			
		||||
        android:showAsAction="always" />
 | 
			
		||||
</menu>
 | 
			
		||||
							
								
								
									
										12
									
								
								app/src/main/res/values-v11/styles.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,12 @@
 | 
			
		||||
<resources>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        Base application theme for API 11+. This theme completely replaces
 | 
			
		||||
        AppBaseTheme from res/values/styles.xml on API 11+ devices.
 | 
			
		||||
    -->
 | 
			
		||||
    <style name="AppBaseTheme" parent="android:Theme.Holo">
 | 
			
		||||
        <!-- API 11 theme customizations can go here. -->
 | 
			
		||||
        <item name="android:actionBarStyle">@android:style/Widget.Holo.ActionBar.Solid</item>
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										13
									
								
								app/src/main/res/values-v14/styles.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,13 @@
 | 
			
		||||
<resources>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        Base application theme for API 14+. This theme completely replaces
 | 
			
		||||
        AppBaseTheme from BOTH res/values/styles.xml and
 | 
			
		||||
        res/values-v11/styles.xml on API 14+ devices.
 | 
			
		||||
    -->
 | 
			
		||||
    <style name="AppBaseTheme" parent="android:Theme.Holo">
 | 
			
		||||
        <!-- API 14 theme customizations can go here. -->
 | 
			
		||||
        <item name="android:actionBarStyle">@android:style/Widget.Holo.ActionBar.Solid</item>
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										6
									
								
								app/src/main/res/values-w820dp/dimens.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,6 @@
 | 
			
		||||
<resources>
 | 
			
		||||
    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
 | 
			
		||||
         (such as screen margins) for screens with more than 820dp of available width. This
 | 
			
		||||
         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
 | 
			
		||||
    <dimen name="activity_horizontal_margin">64dp</dimen>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										11
									
								
								app/src/main/res/values/arrays.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,11 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
    <string-array name="listArray">
 | 
			
		||||
        <item>Only when on Wi-Fi</item>
 | 
			
		||||
        <item>On any network</item>
 | 
			
		||||
    </string-array>
 | 
			
		||||
    <string-array name="listValues">
 | 
			
		||||
        <item>Wi-Fi</item>
 | 
			
		||||
        <item>Any</item>
 | 
			
		||||
    </string-array>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										49
									
								
								app/src/main/res/values/colors.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,49 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
 | 
			
		||||
    <item name="black" type="color">#000000</item>
 | 
			
		||||
    <item name="white" type="color">#FFFFFF</item>
 | 
			
		||||
    <item name="blue" type="color">#FF33B5E5</item>
 | 
			
		||||
    <item name="purple" type="color">#FFAA66CC</item>
 | 
			
		||||
    <item name="green" type="color">#FF99CC00</item>
 | 
			
		||||
    <item name="orange" type="color">#FFFFBB33</item>
 | 
			
		||||
    <item name="red" type="color">#FFFF4444</item>
 | 
			
		||||
    <item name="darkblue" type="color">#FF0099CC</item>
 | 
			
		||||
    <item name="darkpurple" type="color">#FF9933CC</item>
 | 
			
		||||
    <item name="darkgreen" type="color">#FF669900</item>
 | 
			
		||||
    <item name="darkorange" type="color">#FFFF8800</item>
 | 
			
		||||
    <item name="darkred" type="color">#FFCC0000</item>
 | 
			
		||||
 | 
			
		||||
    <color name="blue_f">#3B5998</color>
 | 
			
		||||
    <color name="gray_dark">#A8A8A8</color>
 | 
			
		||||
    <color name="gray">#E8E8E8</color>
 | 
			
		||||
    <color name="gray_light">#F8F8F8</color>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!-- transparent -->
 | 
			
		||||
    <color name="black_trans0">#00000000</color>
 | 
			
		||||
    <color name="black_trans1">#1A000000</color>
 | 
			
		||||
    <color name="black_trans2">#33000000</color>
 | 
			
		||||
    <color name="black_trans3">#4D000000</color>
 | 
			
		||||
    <color name="black_trans4">#66000000</color>
 | 
			
		||||
    <color name="black_trans5">#80000000</color>
 | 
			
		||||
    <color name="black_trans6">#99000000</color>
 | 
			
		||||
    <color name="black_trans7">#B3000000</color>
 | 
			
		||||
    <color name="black_trans8">#CC000000</color>
 | 
			
		||||
    <color name="black_trans9">#E6000000</color>
 | 
			
		||||
    <color name="black_trans10">#FF000000</color>
 | 
			
		||||
 | 
			
		||||
    <!-- text -->
 | 
			
		||||
    <color name="title">#333333</color>
 | 
			
		||||
    <color name="subtitle">#777777</color>
 | 
			
		||||
    <color name="text">#777777</color>
 | 
			
		||||
 | 
			
		||||
    <!-- icon -->
 | 
			
		||||
    <color name="ic_title">#aaaaaa</color>
 | 
			
		||||
    <color name="ic_text">#777777</color>
 | 
			
		||||
 | 
			
		||||
    <!-- background -->
 | 
			
		||||
    <color name="background">#e5e5e5</color>
 | 
			
		||||
    <color name="glaucous">#6082b6</color>
 | 
			
		||||
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										5
									
								
								app/src/main/res/values/dimens.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,5 @@
 | 
			
		||||
<resources>
 | 
			
		||||
    <!-- Default screen margins, per the Android Design guidelines. -->
 | 
			
		||||
    <dimen name="activity_horizontal_margin">16dp</dimen>
 | 
			
		||||
    <dimen name="activity_vertical_margin">16dp</dimen>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										50
									
								
								app/src/main/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,50 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
 | 
			
		||||
    <string name="app_name">EasyHarvest</string>
 | 
			
		||||
    <string name="title_activity_client_settings">Client settings</string>
 | 
			
		||||
    <!-- Menu items -->
 | 
			
		||||
    <string name="menu_settings">Settings</string>
 | 
			
		||||
    <!-- Buttons -->
 | 
			
		||||
    <string name="ok">OK</string>
 | 
			
		||||
    <string name="cancel">Cancel</string>
 | 
			
		||||
    <!-- NetworkActivity -->
 | 
			
		||||
    <string name="lost_connection">No connection</string>
 | 
			
		||||
    <string name="wifi_connected">Wi-Fi connected</string>
 | 
			
		||||
    <string name="connection_error">Unable to establish connection</string>
 | 
			
		||||
    <string name="title_activity_privacy_regions">PrivacyRegions</string>
 | 
			
		||||
    <string name="hello_world">Hello world!</string>
 | 
			
		||||
    <string name="action_settings">Settings</string>
 | 
			
		||||
 | 
			
		||||
    <!-- Google Maps -->
 | 
			
		||||
    <!-- MAC -->
 | 
			
		||||
    <!--<string name="maps_api_key">AIzaSyDO6J0VaCqSqRZ-WIyhKomMpZUVnHp-b2s</string>-->
 | 
			
		||||
    <!-- PC -->
 | 
			
		||||
    <string name="maps_api_key">AIzaSyA8-8qOxK_2kmMUJ5jEK5yvtkaZ7vBbcL8</string>
 | 
			
		||||
 | 
			
		||||
    <!-- PrivacyRegions -->
 | 
			
		||||
    <string name="privacy_regions_id">privacy_regions</string>
 | 
			
		||||
    <string name="privacy_regions_title">Privacy regions</string>
 | 
			
		||||
    <string name="privacy_regions_summary">Privacy regions summary</string>
 | 
			
		||||
    <string name="privacy_regions_status">privacyRegionsStatus</string>
 | 
			
		||||
    <string name="title_activity_new_privacy_region">New privacy region</string>
 | 
			
		||||
    <string name="title_activity_view_privacy_region">ViewPrivacyRegionActivity</string>
 | 
			
		||||
    <string name="title_activity_edit_privacy_region">Edit privacy region</string>
 | 
			
		||||
 | 
			
		||||
    <!-- PrivacyMechanisms -->
 | 
			
		||||
    <string name="privacy_mechanisms_id">privacy_mechanisms</string>
 | 
			
		||||
    <string name="privacy_mechanisms_key">privacy_mechanisms_key</string>
 | 
			
		||||
    <string name="privacy_mechanisms_title">Privacy mechanisms</string>
 | 
			
		||||
    <string name="privacy_mechanisms_summary">View and install privacy mechanisms</string>
 | 
			
		||||
    <string name="title_activity_privacy_mechanisms">Privacy mechanisms</string>
 | 
			
		||||
    <!-- Menu -->
 | 
			
		||||
    <string name="privacy_mechanisms_get_list">Available</string>
 | 
			
		||||
    <string name="privacy_mechanisms_view_installed">Installed</string>
 | 
			
		||||
 | 
			
		||||
    <!-- GetPrivacyMechanism -->
 | 
			
		||||
    <string name="title_activity_get_privacy_mechanism">Install a privacy mechanism</string>
 | 
			
		||||
    <!-- Menu -->
 | 
			
		||||
    <string name="get_privacy_mechanism_action_refresh">Refresh</string>
 | 
			
		||||
    <string name="title_activity_view_privacy_mechanism">View privacy mechanism</string>
 | 
			
		||||
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										23
									
								
								app/src/main/res/values/styles.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,23 @@
 | 
			
		||||
<resources>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        Base application theme, dependent on API level. This theme is replaced
 | 
			
		||||
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
 | 
			
		||||
    -->
 | 
			
		||||
    <style name="AppBaseTheme" parent="android:Theme.Holo">
 | 
			
		||||
        <!--
 | 
			
		||||
            Theme customizations available in newer API levels can go in
 | 
			
		||||
            res/values-vXX/styles.xml, while customizations related to
 | 
			
		||||
            backward-compatibility can go here.
 | 
			
		||||
        -->
 | 
			
		||||
        <item name="android:actionBarStyle">@android:style/Widget.Holo.ActionBar.Solid</item>
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
    <!-- Application theme. -->
 | 
			
		||||
    <style name="AppTheme" parent="AppBaseTheme">
 | 
			
		||||
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										37
									
								
								app/src/main/res/xml/preferences.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,37 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
 | 
			
		||||
 | 
			
		||||
    <PreferenceCategory android:title="Network" >
 | 
			
		||||
        <ListPreference
 | 
			
		||||
            android:defaultValue="Wi-Fi"
 | 
			
		||||
            android:entries="@array/listArray"
 | 
			
		||||
            android:entryValues="@array/listValues"
 | 
			
		||||
            android:key="listPref"
 | 
			
		||||
            android:summary="Network connectivity required"
 | 
			
		||||
            android:title="Network communication" />
 | 
			
		||||
    </PreferenceCategory>
 | 
			
		||||
    <PreferenceCategory android:title="Privacy" >
 | 
			
		||||
        <com.www.client.SwitchPref
 | 
			
		||||
            android:id="@+id/privacy_regions_id"
 | 
			
		||||
            android:key="@string/privacy_regions_status"
 | 
			
		||||
            android:title="@string/privacy_regions_title"
 | 
			
		||||
            android:defaultValue="false" >
 | 
			
		||||
        </com.www.client.SwitchPref>
 | 
			
		||||
        <Preference
 | 
			
		||||
            android:id="@+id/privacy_mechanisms_id"
 | 
			
		||||
            android:key="@string/privacy_mechanisms_key"
 | 
			
		||||
            android:summary="@string/privacy_mechanisms_summary"
 | 
			
		||||
            android:title="@string/privacy_mechanisms_title" >
 | 
			
		||||
        </Preference>
 | 
			
		||||
    </PreferenceCategory>
 | 
			
		||||
    <PreferenceCategory android:title="Device" >
 | 
			
		||||
        <Preference
 | 
			
		||||
            android:id="@+id/device_unregister"
 | 
			
		||||
            android:key="device_unregister"
 | 
			
		||||
            android:summary="Unregister device"
 | 
			
		||||
            android:title="Unregister" >
 | 
			
		||||
        </Preference>
 | 
			
		||||
    </PreferenceCategory>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
</PreferenceScreen>
 | 
			
		||||