Prima versione usabile
38
AndroidManifest.xml
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="net.indivia.hacklabbo.statusreader"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0" >
|
||||||
|
<!-- check per la rete -->
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||||
|
<!-- accedere alla rete -->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<!-- scrivere su sd (download) -->
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
|
||||||
|
<uses-sdk
|
||||||
|
android:minSdkVersion="8"
|
||||||
|
android:targetSdkVersion="22" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@drawable/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:theme="@style/AppTheme" >
|
||||||
|
<service android:name=".Downloader" />
|
||||||
|
<service android:name=".CheckUpdate" />
|
||||||
|
<service android:name=".StatusUpdate" />
|
||||||
|
<activity
|
||||||
|
android:name="net.indivia.hacklabbo.statusreader.MainActivity"
|
||||||
|
android:label="@string/app_name" >
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity android:name="net.indivia.hacklabbo.statusreader.PrefScreen" />
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
12
README.md
|
@ -1,4 +1,14 @@
|
||||||
StatusReader
|
StatusReader
|
||||||
============
|
============
|
||||||
|
|
||||||
Aggiorna lo stato dell'Activity leggendo un file in formato JSON.
|
Aggiorna lo stato dell'Activity leggendo un file in formato JSON da una pagina web con il seguente formato:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
{"open":true,"date":"2015-04-03T00:43:18+02:00"}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Sono settabili:
|
||||||
|
- Da quale url deve essere preso il file JSON
|
||||||
|
- Se l'applicazione deve aggiornare lo stato in background
|
||||||
|
- Ogni quanto tempo il servizio in background deve verificare il cambiamento di stato
|
||||||
|
- Se l'applicazione deve informare all'avvio che ci sono degli aggiornamenti di se stessa
|
||||||
|
|
38
bin/AndroidManifest.xml
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="net.indivia.hacklabbo.statusreader"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0" >
|
||||||
|
<!-- check per la rete -->
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||||
|
<!-- accedere alla rete -->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<!-- scrivere su sd (download) -->
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
|
||||||
|
<uses-sdk
|
||||||
|
android:minSdkVersion="8"
|
||||||
|
android:targetSdkVersion="22" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@drawable/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:theme="@style/AppTheme" >
|
||||||
|
<service android:name=".Downloader" />
|
||||||
|
<service android:name=".CheckUpdate" />
|
||||||
|
<service android:name=".StatusUpdate" />
|
||||||
|
<activity
|
||||||
|
android:name="net.indivia.hacklabbo.statusreader.MainActivity"
|
||||||
|
android:label="@string/app_name" >
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity android:name="net.indivia.hacklabbo.statusreader.PrefScreen" />
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
BIN
bin/StatusReader.apk
Normal file
BIN
bin/classes.dex
Normal file
5
bin/jarlist.cache
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# cache for current jar dependency. DO NOT EDIT.
|
||||||
|
# format is <lastModified> <length> <SHA-1> <path>
|
||||||
|
# Encoding is UTF-8
|
||||||
|
1427838941000 1074044 33b27a8d2a5b87e6eb6c60e87a5374ffbfeacc3a /weight/Code/appcompat_v7/libs/android-support-v4.jar
|
||||||
|
1427839433000 1074044 33b27a8d2a5b87e6eb6c60e87a5374ffbfeacc3a /weight/Code/StatusReader/libs/android-support-v4.jar
|
BIN
bin/res/crunch/drawable-hdpi/green_btn.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
bin/res/crunch/drawable-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
bin/res/crunch/drawable-hdpi/ic_menu_refresh.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
bin/res/crunch/drawable-hdpi/ic_menu_settings.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
bin/res/crunch/drawable-hdpi/red_btn.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
bin/res/crunch/drawable-hdpi/software.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
bin/res/crunch/drawable-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
bin/res/crunch/drawable-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
bin/res/crunch/drawable-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
bin/resources.ap_
Normal file
1001
gen/android/support/v7/appcompat/R.java
Normal file
6
gen/net/indivia/hacklabbo/statusreader/BuildConfig.java
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
/** Automatically generated file. DO NOT MODIFY */
|
||||||
|
package net.indivia.hacklabbo.statusreader;
|
||||||
|
|
||||||
|
public final class BuildConfig {
|
||||||
|
public final static boolean DEBUG = true;
|
||||||
|
}
|
6348
gen/net/indivia/hacklabbo/statusreader/R.java
Normal file
BIN
ic_launcher-web.png
Normal file
After Width: | Height: | Size: 102 KiB |
20
proguard-project.txt
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# To enable ProGuard in your project, edit project.properties
|
||||||
|
# to define the proguard.config property as described in that file.
|
||||||
|
#
|
||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the ProGuard
|
||||||
|
# include property in project.properties.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
15
project.properties
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system edit
|
||||||
|
# "ant.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
#
|
||||||
|
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||||
|
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||||
|
|
||||||
|
# Project target.
|
||||||
|
target=android-22
|
||||||
|
android.library.reference.1=../appcompat_v7
|
BIN
res/drawable-hdpi/green_btn.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
res/drawable-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 9 KiB |
BIN
res/drawable-hdpi/ic_menu_refresh.png
Executable file
After Width: | Height: | Size: 2.7 KiB |
BIN
res/drawable-hdpi/ic_menu_settings.png
Executable file
After Width: | Height: | Size: 4.5 KiB |
BIN
res/drawable-hdpi/red_btn.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
res/drawable-hdpi/software.png
Executable file
After Width: | Height: | Size: 2.4 KiB |
BIN
res/drawable-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
res/drawable-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
res/drawable-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 28 KiB |
98
res/layout/activity_main.xml
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
<LinearLayout 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:background="#ffffff"
|
||||||
|
android:orientation="vertical" >
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/status_btn"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:background="#ffffff"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false"
|
||||||
|
android:focusableInTouchMode="false"
|
||||||
|
android:longClickable="false"
|
||||||
|
android:paddingTop="5dp"
|
||||||
|
android:scaleType="center"
|
||||||
|
android:src="@drawable/red_btn" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/server_label"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:paddingTop="2dp"
|
||||||
|
android:text="Server:"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:textStyle="italic" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/server_value"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingBottom="10dp"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:text="http://isopen.hacklabbo.indivia.net/hacklabbo/state.json"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/status_label"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:paddingTop="2dp"
|
||||||
|
android:text="Status:"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:textStyle="italic" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/status_value"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingBottom="10dp"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:text="@string/close"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/last_status_change_label"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:paddingTop="2dp"
|
||||||
|
android:text="Last Change:"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:textStyle="italic" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/last_status_change_value"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingBottom="10dp"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:text="@string/mai"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/last_refresh_label"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:paddingTop="2dp"
|
||||||
|
android:text="Last Refresh:"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||||
|
android:textStyle="italic" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/last_refresh_value"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingBottom="10dp"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:text="@string/mai"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
19
res/menu/main.xml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<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="net.indivia.hacklabbo.statusreader.MainActivity" >
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_settings"
|
||||||
|
android:orderInCategory="100"
|
||||||
|
android:title="@string/menu_action_settings"
|
||||||
|
android:icon="@drawable/ic_menu_settings"
|
||||||
|
app:showAsAction="never"/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_refresh"
|
||||||
|
android:orderInCategory="99"
|
||||||
|
android:icon="@drawable/ic_menu_refresh"
|
||||||
|
android:title="@string/menu_action_refresh"
|
||||||
|
app:showAsAction="never"/>
|
||||||
|
</menu>
|
11
res/values-v11/styles.xml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<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="Theme.AppCompat.Light">
|
||||||
|
<!-- API 11 theme customizations can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
12
res/values-v14/styles.xml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<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="Theme.AppCompat.Light.DarkActionBar">
|
||||||
|
<!-- API 14 theme customizations can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
10
res/values-w820dp/dimens.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<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>
|
7
res/values/dimens.xml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||||
|
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||||
|
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||||
|
|
||||||
|
</resources>
|
12
res/values/keys.xml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="key_refresh_service">service</string>
|
||||||
|
<string name="key_refresh_status_time">refresh_time</string>
|
||||||
|
<string name="key_server_name">server_name</string>
|
||||||
|
|
||||||
|
<string name="key_states">states</string>
|
||||||
|
<string name="key_status">status</string>
|
||||||
|
<string name="key_last_refresh">last_refresh</string>
|
||||||
|
<string name="key_status_changed">status_changed</string>
|
||||||
|
<string name="key_update_service">update</string>
|
||||||
|
</resources>
|
21
res/values/prefs.xml
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="prefs_refresh_category">Refresh</string>
|
||||||
|
|
||||||
|
<string name="prefs_refresh_service_title">Refresh automatico</string>
|
||||||
|
<string name="prefs_refresh_service_summary">Aggiornamento dello status mediante service in background</string>
|
||||||
|
|
||||||
|
<string name="prefs_refresh_status_time_title">Refresh time</string>
|
||||||
|
|
||||||
|
<string name="prefs_refresh_status_time_dialogTitle">Scegli un intervallo:</string>
|
||||||
|
<string name="prefs_refresh_status_time_summary">Tempo di attesa per il refresh dello status</string>
|
||||||
|
|
||||||
|
<string name="prefs_app_category">Applicazione</string>
|
||||||
|
|
||||||
|
<string name="prefs_server_name_title">Server Name</string>
|
||||||
|
<string name="prefs_server_name_summary">Url dal quale fare il GET dello status</string>
|
||||||
|
|
||||||
|
<string name="prefs_update_title">Update Service</string>
|
||||||
|
<string name="prefs_update_summary">All\'avvio vengono verificati se ci sono aggiornamenti per l\'applicazione</string>
|
||||||
|
|
||||||
|
</resources>
|
17
res/values/prefs_arrays.xml
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string-array name="prefs_refresh_time">
|
||||||
|
<item>3 minuti</item>
|
||||||
|
<item>5 minuti</item>
|
||||||
|
<item>10 minuti</item>
|
||||||
|
<item>15 minuti</item>
|
||||||
|
<item>30 minuti</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="prefs_refresh_time_value">
|
||||||
|
<item>180</item>
|
||||||
|
<item>300</item>
|
||||||
|
<item>600</item>
|
||||||
|
<item>900</item>
|
||||||
|
<item>2400</item>
|
||||||
|
</string-array>
|
||||||
|
</resources>
|
11
res/values/strings.xml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">StatusReader</string>
|
||||||
|
<string name="open">Open</string>
|
||||||
|
<string name="close">Close</string>
|
||||||
|
<string name="mai">Mai</string>
|
||||||
|
<string name="menu_action_settings">Settings</string>
|
||||||
|
<string name="menu_action_refresh">Refresh</string>
|
||||||
|
<string name="app_update_notify_title">Aggiornamento</string>
|
||||||
|
<string name="app_update_new_version">Nuova versione di StatusReader</string>
|
||||||
|
</resources>
|
20
res/values/styles.xml
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<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="Theme.AppCompat.Light">
|
||||||
|
<!--
|
||||||
|
Theme customizations available in newer API levels can go in
|
||||||
|
res/values-vXX/styles.xml, while customizations related to
|
||||||
|
backward-compatibility can go here.
|
||||||
|
-->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- Application theme. -->
|
||||||
|
<style name="AppTheme" parent="AppBaseTheme">
|
||||||
|
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
38
res/xml/prefs.xml
Executable file
|
@ -0,0 +1,38 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<PreferenceCategory android:title="@string/prefs_refresh_category">
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:title="@string/prefs_refresh_service_title"
|
||||||
|
android:key="@string/key_refresh_service"
|
||||||
|
android:persistent="true"
|
||||||
|
android:summary="@string/prefs_refresh_service_summary"
|
||||||
|
/>
|
||||||
|
<ListPreference
|
||||||
|
android:entryValues="@array/prefs_refresh_time_value"
|
||||||
|
android:persistent="true"
|
||||||
|
android:entries="@array/prefs_refresh_time"
|
||||||
|
android:title="@string/prefs_refresh_status_time_title"
|
||||||
|
android:dialogTitle="@string/prefs_refresh_status_time_dialogTitle"
|
||||||
|
android:key="@string/key_refresh_status_time"
|
||||||
|
android:summary="@string/prefs_refresh_status_time_summary"
|
||||||
|
android:dependency="service"
|
||||||
|
android:defaultValue="600"
|
||||||
|
/>
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory android:title="@string/prefs_app_category">
|
||||||
|
<EditTextPreference
|
||||||
|
android:title="@string/prefs_server_name_title"
|
||||||
|
android:summary="@string/prefs_server_name_summary"
|
||||||
|
android:key="@string/key_server_name"
|
||||||
|
android:persistent="true"
|
||||||
|
android:defaultValue="isopen.hacklabbo.indivia.net/hacklabbo/state.json"
|
||||||
|
/>
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:title="@string/prefs_update_title"
|
||||||
|
android:key="@string/key_update_service"
|
||||||
|
android:persistent="true"
|
||||||
|
android:summary="@string/prefs_update_summary"
|
||||||
|
/>
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
145
src/net/indivia/hacklabbo/statusreader/CheckUpdate.java
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
|
||||||
|
package net.indivia.hacklabbo.statusreader;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.app.Notification;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.provider.Settings;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
public class CheckUpdate extends Service {
|
||||||
|
/*private final static String app_site = "http://isopen.hacklabbo.indivia.net/";*/
|
||||||
|
private final static String LOG_TAG = "CheckUpdate";
|
||||||
|
private final static String app_apk = "net.indivia.hacklabbo.statusreader";
|
||||||
|
private final static String app_site = "http://ginex.indivia.net/";
|
||||||
|
private final static String app_www_current_apk = "latest.apk";
|
||||||
|
private final static String app_www_current_version = "update.json";
|
||||||
|
//DEBUG:
|
||||||
|
private final static String app_www_current_version_fail = "update-fail.json";
|
||||||
|
private final static String app_www_current_version_true = "update-true.json";
|
||||||
|
|
||||||
|
public final static int NOTIFY_APP_UPDATE = 2;
|
||||||
|
|
||||||
|
private BgThread bgThread;
|
||||||
|
private NotificationManager notificationManager;
|
||||||
|
private Notification notification;
|
||||||
|
private PendingIntent pIntent;
|
||||||
|
private int notificationNumber;
|
||||||
|
private Resources res;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
res = getResources();
|
||||||
|
|
||||||
|
bgThread = new BgThread();
|
||||||
|
bgThread.start();
|
||||||
|
|
||||||
|
|
||||||
|
Intent intent = new Intent(this, Downloader.class);
|
||||||
|
String app_uri = app_site + app_www_current_apk;
|
||||||
|
intent.putExtra("checkUpdate", NOTIFY_APP_UPDATE);
|
||||||
|
intent.setData(Uri.parse(app_uri));
|
||||||
|
intent.putExtra("urlpath", app_uri);
|
||||||
|
|
||||||
|
pIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT );
|
||||||
|
|
||||||
|
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
notifyBuilder();
|
||||||
|
else
|
||||||
|
getNotify();
|
||||||
|
|
||||||
|
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||||
|
notification.flags |= Notification.FLAG_AUTO_CANCEL;
|
||||||
|
|
||||||
|
Log.i(LOG_TAG, "Service Created");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
public void notifyBuilder(){
|
||||||
|
notification = new Notification.Builder(this)
|
||||||
|
.setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
|
||||||
|
.setContentTitle(getString(R.string.app_update_notify_title))
|
||||||
|
.setContentText(getString(R.string.app_update_new_version))
|
||||||
|
.setLights(0xFFFF0000, 500, 500)
|
||||||
|
.setSmallIcon(R.drawable.software)
|
||||||
|
.setContentIntent(pIntent)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void getNotify(){
|
||||||
|
notification = new Notification(
|
||||||
|
R.drawable.software,
|
||||||
|
getString(R.string.app_update_notify_title),
|
||||||
|
System.currentTimeMillis());
|
||||||
|
notification.flags |= Notification.FLAG_AUTO_CANCEL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void sendNotification(int newVersion) {
|
||||||
|
notification.number=++notificationNumber;
|
||||||
|
notification.setLatestEventInfo (this,
|
||||||
|
res.getString(R.string.app_update_notify_title),
|
||||||
|
res.getString(R.string.app_update_new_version),
|
||||||
|
pIntent);
|
||||||
|
|
||||||
|
notificationManager.notify(NOTIFY_APP_UPDATE, notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final class BgThread extends Thread {
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
//String json = SNetwork.GET(app_site + app_www_current_version);
|
||||||
|
String json = SNetwork.GET(app_site + app_www_current_version_true);
|
||||||
|
JSONObject jObject = new JSONObject(json);
|
||||||
|
|
||||||
|
int newVersion = jObject.getInt("version");
|
||||||
|
int curVersion = getPackageManager().getPackageInfo(app_apk, 0).versionCode;
|
||||||
|
//Log.d(LOG_TAG,"cur:"+curVersion+" new:"+newVersion);
|
||||||
|
|
||||||
|
if (newVersion > curVersion){
|
||||||
|
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
notificationManager.notify(0, notification);
|
||||||
|
else
|
||||||
|
sendNotification(newVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
stopSelf();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
|
Log.i(LOG_TAG, "Service Started");
|
||||||
|
return super.onStartCommand(intent, flags, startId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
Log.i(LOG_TAG, "Service Destroyed");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
97
src/net/indivia/hacklabbo/statusreader/Downloader.java
Executable file
|
@ -0,0 +1,97 @@
|
||||||
|
package net.indivia.hacklabbo.statusreader;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.IntentService;
|
||||||
|
import android.app.ProgressDialog;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Message;
|
||||||
|
import android.os.Messenger;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class Downloader extends IntentService {
|
||||||
|
private static final String LOG_TAG = "Downloader";
|
||||||
|
public static final int UPDATE_PROGRESS = 8344;
|
||||||
|
private int resultDownload = Activity.RESULT_CANCELED;
|
||||||
|
private File file;
|
||||||
|
public ProgressDialog mProgressDialog;
|
||||||
|
|
||||||
|
public Downloader() {
|
||||||
|
super(LOG_TAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendNotification(Intent i) {
|
||||||
|
Bundle extras = i.getExtras();
|
||||||
|
if (extras != null) {
|
||||||
|
Messenger messenger = (Messenger) extras.get("messenger");
|
||||||
|
Message msg = Message.obtain();
|
||||||
|
msg.arg1 = resultDownload;
|
||||||
|
msg.obj = file.getAbsolutePath();
|
||||||
|
try {
|
||||||
|
messenger.send(msg);
|
||||||
|
} catch (android.os.RemoteException e1) {
|
||||||
|
Log.w(getClass().getName(), "Exception sending message", e1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onHandleIntent(Intent intent) {
|
||||||
|
try {
|
||||||
|
Log.d(LOG_TAG, "onHandIntent");
|
||||||
|
int cu = intent.getIntExtra("checkUpdate", 0);
|
||||||
|
String urlfile = intent.getStringExtra("urlpath");
|
||||||
|
URL url = new URL(urlfile);
|
||||||
|
|
||||||
|
file = SUtility.getFile(urlfile,"");
|
||||||
|
if (cu != CheckUpdate.NOTIFY_APP_UPDATE){
|
||||||
|
Log.d(LOG_TAG,"file exist & cu != 2 - STOP");
|
||||||
|
resultDownload = Activity.RESULT_FIRST_USER;
|
||||||
|
sendNotification(intent);
|
||||||
|
} else {
|
||||||
|
if (file.exists()) {
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
URLConnection c = (HttpURLConnection) url.openConnection();
|
||||||
|
c.connect();
|
||||||
|
|
||||||
|
InputStream input = new BufferedInputStream(c.getInputStream());
|
||||||
|
OutputStream output = new FileOutputStream(file);
|
||||||
|
byte data[] = new byte[1024];
|
||||||
|
int count;
|
||||||
|
while ((count = input.read(data)) != -1) {
|
||||||
|
output.write(data, 0, count);
|
||||||
|
}
|
||||||
|
output.flush();
|
||||||
|
output.close();
|
||||||
|
input.close();
|
||||||
|
|
||||||
|
Intent i = new Intent(Intent.ACTION_VIEW);
|
||||||
|
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
i.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
|
||||||
|
startActivity(i);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.getStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
Log.i(LOG_TAG, "Service Destroyed");
|
||||||
|
}
|
||||||
|
}
|
130
src/net/indivia/hacklabbo/statusreader/MainActivity.java
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
package net.indivia.hacklabbo.statusreader;
|
||||||
|
|
||||||
|
import android.support.v7.app.ActionBarActivity;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.widget.ImageButton;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
public class MainActivity extends ActionBarActivity {
|
||||||
|
private static final String LOG_TAG = "MainActivity";
|
||||||
|
private SharedPreferences prefs;
|
||||||
|
public final static int
|
||||||
|
MENU_SETTINGS_ID = 10,
|
||||||
|
MENU_REFRESH_ID = 11;
|
||||||
|
private static ImageButton ibStatusBtn;
|
||||||
|
private static TextView
|
||||||
|
tvStatusValue,tvServerValue,tvLastRefreshValue,tvLastStatusValue;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
|
||||||
|
prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
|
ibStatusBtn = (ImageButton) findViewById(R.id.status_btn);
|
||||||
|
tvStatusValue = (TextView) findViewById(R.id.status_value);
|
||||||
|
tvServerValue = (TextView) findViewById(R.id.server_value);
|
||||||
|
tvLastRefreshValue = (TextView) findViewById(R.id.last_refresh_value);
|
||||||
|
tvLastStatusValue = (TextView) findViewById(R.id.last_status_change_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume(){
|
||||||
|
super.onResume();
|
||||||
|
LoadPreferences();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadPreferences(){
|
||||||
|
//le preferenze relative ai servizi
|
||||||
|
Boolean refresh_service =prefs.getBoolean(getString(R.string.key_refresh_service), false);
|
||||||
|
Boolean update_service = prefs.getBoolean("update", false);
|
||||||
|
|
||||||
|
//setto il display
|
||||||
|
setDisplay(null,null,null);
|
||||||
|
|
||||||
|
//avvio il service che verifica se ci sono update del software
|
||||||
|
if (update_service)
|
||||||
|
startService(new Intent(this, CheckUpdate.class));
|
||||||
|
|
||||||
|
//avvio il service che verifica se ci sono update dello stato
|
||||||
|
//TODO: se il service è già avviato?
|
||||||
|
if (refresh_service)
|
||||||
|
startService(setUpdateStatusIntent(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Intent setUpdateStatusIntent(Boolean isCicleService){
|
||||||
|
Intent intent = new Intent(this, StatusUpdate.class);
|
||||||
|
|
||||||
|
String serverName = prefs.getString(getString(R.string.key_server_name), StatusUpdate.DEF_SITE);
|
||||||
|
int refresh_time = Integer.parseInt(prefs.getString(getString(R.string.key_refresh_status_time), "600"));
|
||||||
|
|
||||||
|
intent.putExtra("serverName", serverName);
|
||||||
|
|
||||||
|
SharedPreferences states = getApplicationContext().getSharedPreferences(getString(R.string.key_states), 0);
|
||||||
|
Boolean oldStatus = states.getBoolean(getString(R.string.key_status), false);
|
||||||
|
intent.putExtra("oldStatus", oldStatus);
|
||||||
|
intent.putExtra("isCicleService", isCicleService);
|
||||||
|
if(isCicleService)
|
||||||
|
intent.putExtra("refreshTime", refresh_time);
|
||||||
|
|
||||||
|
return intent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDisplay(Boolean status, String last_refresh, String status_changed){
|
||||||
|
String serverName = prefs.getString(getString(R.string.key_server_name), StatusUpdate.DEF_SITE);
|
||||||
|
SharedPreferences states = getApplicationContext().getSharedPreferences(getString(R.string.key_states), 0);
|
||||||
|
|
||||||
|
String mai = getString(R.string.key_status_changed);
|
||||||
|
if(status == null)
|
||||||
|
status = states.getBoolean(getString(R.string.key_status), false);
|
||||||
|
|
||||||
|
if(last_refresh == null)
|
||||||
|
last_refresh = states.getString(getString(R.string.key_last_refresh), mai);
|
||||||
|
|
||||||
|
if(status_changed == null)
|
||||||
|
status_changed = states.getString(getString(R.string.key_status_changed), mai);
|
||||||
|
|
||||||
|
int statusImg = R.drawable.red_btn,
|
||||||
|
statusValue = R.string.close;
|
||||||
|
if(status){
|
||||||
|
statusImg = R.drawable.green_btn;
|
||||||
|
statusValue = R.string.open;
|
||||||
|
}
|
||||||
|
ibStatusBtn.setImageResource(statusImg);
|
||||||
|
tvStatusValue.setText(statusValue);
|
||||||
|
|
||||||
|
tvLastRefreshValue.setText(last_refresh);
|
||||||
|
tvLastStatusValue.setText(status_changed);
|
||||||
|
tvServerValue.setText(serverName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
// Inflate the menu; this adds items to the action bar if it is present.
|
||||||
|
getMenuInflater().inflate(R.menu.main, menu);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
int id = item.getItemId();
|
||||||
|
if (id == R.id.action_settings) {
|
||||||
|
startActivity(new Intent(this, PrefScreen.class));
|
||||||
|
} else if( id== R.id.action_refresh){
|
||||||
|
startService(setUpdateStatusIntent(false));
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onStop() {
|
||||||
|
super.onStop();
|
||||||
|
}
|
||||||
|
}
|
67
src/net/indivia/hacklabbo/statusreader/PrefScreen.java
Executable file
|
@ -0,0 +1,67 @@
|
||||||
|
package net.indivia.hacklabbo.statusreader;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.Preference.OnPreferenceClickListener;
|
||||||
|
import android.preference.PreferenceActivity;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
public class PrefScreen extends PreferenceActivity {
|
||||||
|
private static final String LOG_TAG = "PreferenceScreenActivity";
|
||||||
|
private static String
|
||||||
|
SPREF_KEY_SERV,
|
||||||
|
SPREF_KEY_REFRESH,
|
||||||
|
SPREF_KEY_UPDATE;
|
||||||
|
private static Context ctx;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
extracted();
|
||||||
|
ctx = getApplicationContext();
|
||||||
|
|
||||||
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
|
||||||
|
prefs.registerOnSharedPreferenceChangeListener(mListener);
|
||||||
|
|
||||||
|
/*SPREF_KEY_SERV = getString(R.string.key_refresh_service);
|
||||||
|
SPREF_KEY_REFRESH = getString(R.string.key_refresh_time);
|
||||||
|
SPREF_KEY_UPDATE = getString(R.string.key_update_service);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
private void extracted() {
|
||||||
|
addPreferencesFromResource(R.xml.prefs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OnSharedPreferenceChangeListener mListener = new OnSharedPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
|
boolean preference;
|
||||||
|
Log.d(LOG_TAG, "onSharedPrefCh(): "+key);
|
||||||
|
/*if (key.equalsIgnoreCase(SPREF_KEY_SERV)){
|
||||||
|
preference = sharedPreferences.getBoolean(SPREF_KEY_SERV, false);
|
||||||
|
if(preference){
|
||||||
|
startService(ATab.feedBurnI);
|
||||||
|
} else {
|
||||||
|
stopService(ATab.feedBurnI);
|
||||||
|
}
|
||||||
|
} else if (key.equalsIgnoreCase(SPREF_KEY_REFRESH)) {
|
||||||
|
stopService(ATab.feedBurnI);
|
||||||
|
startService(ATab.feedBurnI);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/*preference = sharedPreferences.getBoolean(SPREF_KEY_UPDATE, true);
|
||||||
|
if (preference){
|
||||||
|
Intent iUpdate = new Intent(ctx,CheckUpdate.class);
|
||||||
|
startService(iUpdate);
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
99
src/net/indivia/hacklabbo/statusreader/SNetwork.java
Executable file
|
@ -0,0 +1,99 @@
|
||||||
|
package net.indivia.hacklabbo.statusreader;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.ProtocolException;
|
||||||
|
import java.net.URL;
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.NetworkInfo;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.StrictMode;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class SNetwork {
|
||||||
|
public static final String LOG_TAG = "SNetwork";
|
||||||
|
|
||||||
|
public static boolean isConnected(ConnectivityManager cm) {
|
||||||
|
boolean connected = false;
|
||||||
|
|
||||||
|
if (cm != null) {
|
||||||
|
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
|
||||||
|
|
||||||
|
for (NetworkInfo ni : netInfo) {
|
||||||
|
Log.d(LOG_TAG, "type:"+ni.getTypeName()+" conn:"+ni.isConnected()
|
||||||
|
+" avv:"+ni.isAvailable() );
|
||||||
|
if ((ni.getTypeName().equalsIgnoreCase("WIFI") ||
|
||||||
|
ni.getTypeName().equalsIgnoreCase("MOBILE"))
|
||||||
|
&& ni.isConnected() && ni.isAvailable()){
|
||||||
|
connected = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return connected;
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
|
||||||
|
public static String GET(String uri){
|
||||||
|
String result = "";
|
||||||
|
HttpURLConnection con;
|
||||||
|
|
||||||
|
try {
|
||||||
|
con = (HttpURLConnection) ( new URL(uri)).openConnection();
|
||||||
|
try {
|
||||||
|
con.setRequestMethod("GET");
|
||||||
|
con.setDoOutput(false);
|
||||||
|
try {
|
||||||
|
if (android.os.Build.VERSION.SDK_INT > 9) {
|
||||||
|
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
|
||||||
|
StrictMode.setThreadPolicy(policy);
|
||||||
|
}
|
||||||
|
con.connect();
|
||||||
|
|
||||||
|
InputStream is = con.getInputStream();
|
||||||
|
if(is != null)
|
||||||
|
result = convertInputStreamToString(is);
|
||||||
|
else
|
||||||
|
result = "Did not work!";
|
||||||
|
|
||||||
|
con.disconnect();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.d(LOG_TAG,"no json");
|
||||||
|
result = "Il file json non esiste";
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} catch (ProtocolException e1) {
|
||||||
|
Log.d(LOG_TAG,"protocoll");
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
} catch (MalformedURLException e2) {
|
||||||
|
Log.d(LOG_TAG,"mal url");
|
||||||
|
result = "Manca il protocollo";
|
||||||
|
e2.printStackTrace();
|
||||||
|
} catch (IOException e2) {
|
||||||
|
Log.d(LOG_TAG,"IO 2");
|
||||||
|
e2.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String convertInputStreamToString(InputStream inputStream) throws IOException{
|
||||||
|
String line = "", result = "";
|
||||||
|
|
||||||
|
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
|
||||||
|
|
||||||
|
while((line = bufferedReader.readLine()) != null)
|
||||||
|
result += line;
|
||||||
|
|
||||||
|
inputStream.close();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
54
src/net/indivia/hacklabbo/statusreader/SUtility.java
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
package net.indivia.hacklabbo.statusreader;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class SUtility {
|
||||||
|
public static final String LOG_TAG = "SUtility";
|
||||||
|
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
public static void saveState(Context ctx, Boolean status, String last_refresh, String status_change){
|
||||||
|
Resources res = ctx.getResources();
|
||||||
|
//storing
|
||||||
|
SharedPreferences states = ctx.getApplicationContext().getSharedPreferences(res.getString(R.string.key_states), 0);
|
||||||
|
SharedPreferences.Editor editor = states.edit();
|
||||||
|
|
||||||
|
editor.putBoolean(res.getString(R.string.key_status), status);
|
||||||
|
editor.putString(res.getString(R.string.key_last_refresh), last_refresh);
|
||||||
|
editor.putString(res.getString(R.string.key_status_changed), status_change);
|
||||||
|
|
||||||
|
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO)
|
||||||
|
editor.apply();
|
||||||
|
else
|
||||||
|
commitShared(editor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.FROYO)
|
||||||
|
private static void commitShared(SharedPreferences.Editor editor){
|
||||||
|
editor.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getFile(String url, String reldir) {
|
||||||
|
final String ADIR = "/StatusReader/" ;
|
||||||
|
File file, apath;
|
||||||
|
|
||||||
|
String[] fileUrlParts = url.split("/");
|
||||||
|
apath = new File(Environment.getExternalStorageDirectory()+ ADIR + reldir);
|
||||||
|
if (! apath.exists()){
|
||||||
|
apath.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
file = new File(apath.toString()+ "/" + fileUrlParts[fileUrlParts.length-1]);
|
||||||
|
Log.d(LOG_TAG,"external storage state:"+Environment.getExternalStorageState());
|
||||||
|
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
}
|
184
src/net/indivia/hacklabbo/statusreader/StatusUpdate.java
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
package net.indivia.hacklabbo.statusreader;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.app.Notification;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.provider.Settings;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
public class StatusUpdate extends Service {
|
||||||
|
// private final static String app_site =
|
||||||
|
// "http://isopen.hacklabbo.indivia.net/";
|
||||||
|
private final static String app_site = "http://ginex.indivia.net/";
|
||||||
|
private final static String LOG_TAG = "StatusUpdate";
|
||||||
|
// public final static String DEF_SITE =
|
||||||
|
// "http://isopen.hacklabbo.indivia.net/hacklabbo/state.json";
|
||||||
|
public final static String DEF_SITE = "http://ginex.indivia.net/state.json";
|
||||||
|
private final static String app_www_current_apk = "latest.apk";
|
||||||
|
|
||||||
|
public final static int NOTIFY_APP_UPDATE = 2;
|
||||||
|
|
||||||
|
private BgThread bgThread;
|
||||||
|
private NotificationManager notificationManager;
|
||||||
|
private Notification notification;
|
||||||
|
private PendingIntent pIntent;
|
||||||
|
private int notificationNumber;
|
||||||
|
private Resources res;
|
||||||
|
private static String serverName;
|
||||||
|
private static Boolean oldStatus, isCicleService;
|
||||||
|
private static int refreshTime;
|
||||||
|
private ConnectivityManager cm;
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
res = getResources();
|
||||||
|
cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
|
||||||
|
bgThread = new BgThread();
|
||||||
|
bgThread.start();
|
||||||
|
|
||||||
|
String app_uri = app_site + app_www_current_apk;
|
||||||
|
Intent i = new Intent(this, MainActivity.class);
|
||||||
|
i.putExtra("checkUpdate", NOTIFY_APP_UPDATE);
|
||||||
|
i.setData(Uri.parse(app_uri));
|
||||||
|
i.putExtra("urlpath", app_uri);
|
||||||
|
|
||||||
|
pIntent = PendingIntent.getActivity(this, 0, i,
|
||||||
|
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
|
|
||||||
|
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||||
|
|
||||||
|
Log.i(LOG_TAG, "Service Created");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
public void notifyBuilder(String status) {
|
||||||
|
notification = new Notification.Builder(this)
|
||||||
|
.setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
|
||||||
|
// .setContentTitle(getString(R.string.app_update_notify_title))
|
||||||
|
.setContentTitle("StatusReader: cambio di stato")
|
||||||
|
.setContentText("Stato cambiato a: " + status)
|
||||||
|
.setLights(0xFFFF0000, 500, 500)
|
||||||
|
// TODO: cambiare l'icona
|
||||||
|
.setSmallIcon(R.drawable.software).setContentIntent(pIntent)
|
||||||
|
.setAutoCancel(true).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: cambiare titolo icone
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void getNotify() {
|
||||||
|
notification = new Notification(R.drawable.software,
|
||||||
|
getString(R.string.app_update_notify_title),
|
||||||
|
System.currentTimeMillis());
|
||||||
|
notification.flags |= Notification.FLAG_AUTO_CANCEL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void sendNotification(int newVersion) {
|
||||||
|
notification.number = ++notificationNumber;
|
||||||
|
notification.setLatestEventInfo(this,
|
||||||
|
res.getString(R.string.app_update_notify_title),
|
||||||
|
res.getString(R.string.app_update_new_version), pIntent);
|
||||||
|
|
||||||
|
notificationManager.notify(NOTIFY_APP_UPDATE, notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final class BgThread extends Thread {
|
||||||
|
public void run() {
|
||||||
|
do {
|
||||||
|
if (SNetwork.isConnected(cm)) {
|
||||||
|
Log.i(LOG_TAG, "Service Cicle");
|
||||||
|
String json = SNetwork.GET(serverName);
|
||||||
|
try {
|
||||||
|
JSONObject jObject = new JSONObject(json);
|
||||||
|
boolean newStatus = jObject.getBoolean("open");
|
||||||
|
String statusChange = jObject.getString("date");
|
||||||
|
|
||||||
|
Calendar c = Calendar.getInstance();
|
||||||
|
SimpleDateFormat dateFormat = new SimpleDateFormat(
|
||||||
|
"yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.ITALY);
|
||||||
|
String last_refresh = dateFormat.format(c.getTime());
|
||||||
|
|
||||||
|
if (newStatus != oldStatus) {
|
||||||
|
String status = res.getString(R.string.close);
|
||||||
|
if (newStatus)
|
||||||
|
status = res.getString(R.string.open);
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||||
|
notifyBuilder(status);
|
||||||
|
notificationManager.notify(0, notification);
|
||||||
|
} else {
|
||||||
|
getNotify();
|
||||||
|
sendNotification(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SUtility.saveState(getApplicationContext(), newStatus,
|
||||||
|
last_refresh, statusChange);
|
||||||
|
|
||||||
|
if (!isCicleService) {
|
||||||
|
stopSelf();
|
||||||
|
Log.i(LOG_TAG, "Service stop");
|
||||||
|
// setDisplay(newStatus, last_refresh, statusChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Thread.sleep(refreshTime);
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
Log.d(LOG_TAG,
|
||||||
|
"Qualcosa è andato storto con il timer.\n"
|
||||||
|
+ ie.toString());
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log.d(LOG_TAG, "Non c'è connessione");
|
||||||
|
}
|
||||||
|
} while (isCicleService);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
|
isCicleService = intent.getBooleanExtra("isCicleService", false);
|
||||||
|
if (isCicleService)
|
||||||
|
refreshTime = intent.getIntExtra("refreshTime", 0);
|
||||||
|
|
||||||
|
serverName = intent.getStringExtra("serverName");
|
||||||
|
oldStatus = intent.getBooleanExtra("oldStatus", false);
|
||||||
|
|
||||||
|
Log.i(LOG_TAG, "Service Started");
|
||||||
|
return super.onStartCommand(intent, flags, startId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
Log.i(LOG_TAG, "Service Destroyed");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|