OSDN Git Service

This is a first commit. master
authornayutanoutyu <nayutanoutyu@users.sourceforge.jp>
Tue, 16 Aug 2011 02:43:49 +0000 (11:43 +0900)
committernayutanoutyu <nayutanoutyu@users.sourceforge.jp>
Tue, 16 Aug 2011 02:43:49 +0000 (11:43 +0900)
39 files changed:
.classpath [new file with mode: 0644]
.gitignore [new file with mode: 0644]
.project [new file with mode: 0644]
AndroidManifest.xml [new file with mode: 0644]
default.properties [new file with mode: 0644]
gen/jp/co/app/ynomoto/pmft/R.java [new file with mode: 0644]
proguard.cfg [new file with mode: 0644]
readme.txt [new file with mode: 0644]
res/drawable-hdpi/background.png [new file with mode: 0644]
res/drawable-hdpi/background_black.png [new file with mode: 0644]
res/drawable-hdpi/background_blue.png [new file with mode: 0644]
res/drawable-hdpi/background_red.png [new file with mode: 0644]
res/drawable-hdpi/background_white.png [new file with mode: 0644]
res/drawable-hdpi/background_yellow.png [new file with mode: 0644]
res/drawable-hdpi/ic_menu_refresh.png [new file with mode: 0644]
res/drawable-hdpi/icon.png [new file with mode: 0644]
res/drawable-ldpi/icon.png [new file with mode: 0644]
res/drawable-mdpi/icon.png [new file with mode: 0644]
res/layout/main.xml [new file with mode: 0644]
res/layout/per_hour_usages.xml [new file with mode: 0644]
res/layout/per_hour_usages_graph.xml [new file with mode: 0644]
res/layout/per_hour_usages_list.xml [new file with mode: 0644]
res/layout/widget.xml [new file with mode: 0644]
res/values/arrays.xml [new file with mode: 0644]
res/values/strings.xml [new file with mode: 0644]
res/xml/preferences.xml [new file with mode: 0644]
res/xml/widget.xml [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/GChart.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/activity/MainActivity.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/activity/PerHourUsages.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/activity/PerHourUsagesGraph.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/activity/PowerMeterPreference.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/adapter/PerHourUsagesAdapter.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/data/MaximumElectricPower.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/data/PeakAvailability.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/data/PerHourUsage.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/parser/TepcoParser.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/receiver/PowerMeterWidget.java [new file with mode: 0644]
src/jp/co/app/ynomoto/pmft/service/PowerMeterService.java [new file with mode: 0644]

diff --git a/.classpath b/.classpath
new file mode 100644 (file)
index 0000000..609aa00
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="src" path="gen"/>
+       <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..0a16723
--- /dev/null
@@ -0,0 +1,5 @@
+*.apk
+*.dex
+*.class
+PowerMeter
+resources.ap_
diff --git a/.project b/.project
new file mode 100644 (file)
index 0000000..0c2daad
--- /dev/null
+++ b/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>PowerMeter</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>com.android.ide.eclipse.adt.ApkBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..10bcdb0
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+       package="jp.co.app.ynomoto.pmft" android:versionCode="130"
+       android:versionName="1.3.0">
+       <uses-sdk android:maxSdkVersion="11" android:minSdkVersion="7" />
+       <application android:icon="@drawable/icon" android:label="@string/app_name">
+               <activity android:name=".activity.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=".activity.PerHourUsages" />
+               <activity android:name=".activity.PerHourUsagesGraph" />
+               <activity android:name=".activity.PowerMeterPreference" />
+               <receiver android:name=".receiver.PowerMeterWidget"
+                       android:label="PowerMeter">
+                       <intent-filter>
+                               <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+                               <action android:name="jp.co.app.ynomoto.pmft.UPDATE" />
+                       </intent-filter>
+                       <meta-data android:name="android.appwidget.provider"
+                               android:resource="@xml/widget" />
+               </receiver>
+       </application>
+       <uses-permission android:name="android.permission.INTERNET" />
+</manifest>
\ No newline at end of file
diff --git a/default.properties b/default.properties
new file mode 100644 (file)
index 0000000..46769a7
--- /dev/null
@@ -0,0 +1,11 @@
+# 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 use,
+# "build.properties", and override values to adapt the script to your
+# project structure.
+
+# Project target.
+target=android-7
diff --git a/gen/jp/co/app/ynomoto/pmft/R.java b/gen/jp/co/app/ynomoto/pmft/R.java
new file mode 100644 (file)
index 0000000..a8f5dfb
--- /dev/null
@@ -0,0 +1,86 @@
+/* AUTO-GENERATED FILE.  DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found.  It
+ * should not be modified by hand.
+ */
+
+package jp.co.app.ynomoto.pmft;
+
+public final class R {
+    public static final class array {
+        public static final int backgroundEntries=0x7f050004;
+        public static final int backgroundValues=0x7f050005;
+        public static final int csvUrlEntries=0x7f050000;
+        public static final int csvUrlEntryValues=0x7f050001;
+        public static final int textColorEntries=0x7f050002;
+        public static final int textColorEntryValues=0x7f050003;
+    }
+    public static final class attr {
+    }
+    public static final class drawable {
+        public static final int background=0x7f020000;
+        public static final int background_black=0x7f020001;
+        public static final int background_blue=0x7f020002;
+        public static final int background_red=0x7f020003;
+        public static final int background_white=0x7f020004;
+        public static final int background_yellow=0x7f020005;
+        public static final int ic_menu_refresh=0x7f020006;
+        public static final int icon=0x7f020007;
+    }
+    public static final class id {
+        public static final int actual=0x7f070008;
+        public static final int date=0x7f070007;
+        public static final int expected=0x7f070009;
+        public static final int icon=0x7f070000;
+        public static final int imageView1=0x7f07000c;
+        public static final int maximumElectricPowerToday=0x7f070003;
+        public static final int message=0x7f070004;
+        public static final int peakAvailabilityToday=0x7f070002;
+        public static final int perHourUsages=0x7f070005;
+        public static final int powerMeter=0x7f07000b;
+        public static final int showGraphButton=0x7f070006;
+        public static final int textView1=0x7f07000d;
+        public static final int textView2=0x7f07000e;
+        public static final int update=0x7f070001;
+        public static final int webView1=0x7f07000a;
+    }
+    public static final class layout {
+        public static final int main=0x7f030000;
+        public static final int per_hour_usages=0x7f030001;
+        public static final int per_hour_usages_graph=0x7f030002;
+        public static final int per_hour_usages_list=0x7f030003;
+        public static final int widget=0x7f030004;
+    }
+    public static final class string {
+        public static final int activity_actual=0x7f06000b;
+        public static final int activity_date=0x7f06000a;
+        public static final int activity_error_network=0x7f060007;
+        public static final int activity_expected=0x7f06000c;
+        public static final int activity_graph=0x7f06000d;
+        public static final int activity_maximumElectricPowerToday=0x7f060003;
+        public static final int activity_menu_preferences=0x7f060008;
+        public static final int activity_menu_refresh=0x7f060009;
+        public static final int activity_message=0x7f060004;
+        public static final int activity_message_not_found=0x7f060006;
+        public static final int activity_peakAvailabilityToday=0x7f060002;
+        public static final int activity_perHourUsages=0x7f060005;
+        public static final int activity_update=0x7f060001;
+        public static final int app_name=0x7f060000;
+        public static final int receiver_backgroundEditTitle=0x7f060018;
+        public static final int receiver_csvUrlDialogTitle=0x7f060012;
+        public static final int receiver_csvUrlTitle1=0x7f060010;
+        public static final int receiver_csvUrlTitle2=0x7f060011;
+        public static final int receiver_kaoMoji69Title=0x7f060016;
+        public static final int receiver_kaoMoji70Title=0x7f060015;
+        public static final int receiver_kaoMoji90Title=0x7f060014;
+        public static final int receiver_kaoMojiEditTitle=0x7f060013;
+        public static final int receiver_textColorEditTitle=0x7f060017;
+        public static final int receiver_textView1=0x7f06000f;
+        public static final int receiver_textView2=0x7f06000e;
+    }
+    public static final class xml {
+        public static final int preferences=0x7f040000;
+        public static final int widget=0x7f040001;
+    }
+}
diff --git a/proguard.cfg b/proguard.cfg
new file mode 100644 (file)
index 0000000..12dd039
--- /dev/null
@@ -0,0 +1,36 @@
+-optimizationpasses 5
+-dontusemixedcaseclassnames
+-dontskipnonpubliclibraryclasses
+-dontpreverify
+-verbose
+-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
+
+-keep public class * extends android.app.Activity
+-keep public class * extends android.app.Application
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+-keep public class com.android.vending.licensing.ILicensingService
+
+-keepclasseswithmembernames class * {
+    native <methods>;
+}
+
+-keepclasseswithmembernames class * {
+    public <init>(android.content.Context, android.util.AttributeSet);
+}
+
+-keepclasseswithmembernames class * {
+    public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+
+-keepclassmembers enum * {
+    public static **[] values();
+    public static ** valueOf(java.lang.String);
+}
+
+-keep class * implements android.os.Parcelable {
+  public static final android.os.Parcelable$Creator *;
+}
diff --git a/readme.txt b/readme.txt
new file mode 100644 (file)
index 0000000..7085023
--- /dev/null
@@ -0,0 +1,5 @@
+本ソフトウェアは、GPLv2 の元で自由に利用できます。詳細については、下記の URL をご参
+照下さい。
+
+http://www.opensource.jp/gpl/gpl.ja.html.euc-jp
+http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
\ No newline at end of file
diff --git a/res/drawable-hdpi/background.png b/res/drawable-hdpi/background.png
new file mode 100644 (file)
index 0000000..0c8f163
Binary files /dev/null and b/res/drawable-hdpi/background.png differ
diff --git a/res/drawable-hdpi/background_black.png b/res/drawable-hdpi/background_black.png
new file mode 100644 (file)
index 0000000..43722f7
Binary files /dev/null and b/res/drawable-hdpi/background_black.png differ
diff --git a/res/drawable-hdpi/background_blue.png b/res/drawable-hdpi/background_blue.png
new file mode 100644 (file)
index 0000000..3b93fa8
Binary files /dev/null and b/res/drawable-hdpi/background_blue.png differ
diff --git a/res/drawable-hdpi/background_red.png b/res/drawable-hdpi/background_red.png
new file mode 100644 (file)
index 0000000..fb8b57e
Binary files /dev/null and b/res/drawable-hdpi/background_red.png differ
diff --git a/res/drawable-hdpi/background_white.png b/res/drawable-hdpi/background_white.png
new file mode 100644 (file)
index 0000000..38c7489
Binary files /dev/null and b/res/drawable-hdpi/background_white.png differ
diff --git a/res/drawable-hdpi/background_yellow.png b/res/drawable-hdpi/background_yellow.png
new file mode 100644 (file)
index 0000000..cfaecfa
Binary files /dev/null and b/res/drawable-hdpi/background_yellow.png differ
diff --git a/res/drawable-hdpi/ic_menu_refresh.png b/res/drawable-hdpi/ic_menu_refresh.png
new file mode 100644 (file)
index 0000000..53cacca
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_refresh.png differ
diff --git a/res/drawable-hdpi/icon.png b/res/drawable-hdpi/icon.png
new file mode 100644 (file)
index 0000000..7dc9e9b
Binary files /dev/null and b/res/drawable-hdpi/icon.png differ
diff --git a/res/drawable-ldpi/icon.png b/res/drawable-ldpi/icon.png
new file mode 100644 (file)
index 0000000..a9847d4
Binary files /dev/null and b/res/drawable-ldpi/icon.png differ
diff --git a/res/drawable-mdpi/icon.png b/res/drawable-mdpi/icon.png
new file mode 100644 (file)
index 0000000..a9847d4
Binary files /dev/null and b/res/drawable-mdpi/icon.png differ
diff --git a/res/layout/main.xml b/res/layout/main.xml
new file mode 100644 (file)
index 0000000..f3db842
--- /dev/null
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="fill_parent"
+  android:layout_height="fill_parent" android:orientation="vertical">
+    <ImageView android:id="@+id/icon" 
+       android:src="@drawable/icon" 
+       android:layout_height="wrap_content" 
+       android:layout_width="wrap_content" />
+    <LinearLayout 
+       android:layout_height="wrap_content" 
+       android:layout_width="fill_parent" 
+       android:orientation="horizontal">
+        <TextView
+               android:text="@string/activity_update" 
+               android:layout_width="100dip" 
+               android:layout_height="40dip" />
+        <TextView android:id="@+id/update"
+               android:layout_marginLeft="10dip"
+               android:layout_width="fill_parent" 
+               android:layout_height="wrap_content" />
+    </LinearLayout>
+    <LinearLayout 
+       android:layout_height="wrap_content" 
+       android:layout_width="fill_parent" 
+       android:orientation="horizontal">
+        <TextView
+               android:text="@string/activity_peakAvailabilityToday" 
+               android:layout_width="100dip" 
+               android:layout_height="40dip" />
+        <TextView android:id="@+id/peakAvailabilityToday"
+            android:layout_marginLeft="10dip"
+               android:layout_width="fill_parent" 
+               android:layout_height="wrap_content" />
+    </LinearLayout>
+    <LinearLayout 
+       android:layout_height="wrap_content" 
+       android:layout_width="fill_parent" 
+       android:orientation="horizontal">
+        <TextView
+               android:text="@string/activity_maximumElectricPowerToday" 
+               android:layout_width="100dip" 
+               android:layout_height="40dip" />
+        <TextView android:id="@+id/maximumElectricPowerToday"
+               android:layout_marginLeft="10dip"
+               android:layout_width="fill_parent" 
+               android:layout_height="wrap_content" />
+    </LinearLayout>
+        <LinearLayout 
+       android:layout_height="wrap_content" 
+       android:layout_width="fill_parent" 
+       android:orientation="horizontal">
+        <TextView
+               android:text="@string/activity_message" 
+               android:layout_width="100dip" 
+               android:layout_height="40dip" />
+        <TextView android:id="@+id/message"
+            android:layout_marginLeft="10dip"
+               android:layout_width="fill_parent" 
+               android:layout_height="wrap_content" />
+    </LinearLayout>
+        <Button android:id="@+id/perHourUsages"
+               android:text="@string/activity_perHourUsages"
+               android:layout_width="fill_parent" 
+               android:layout_height="wrap_content" />
+</LinearLayout>
diff --git a/res/layout/per_hour_usages.xml b/res/layout/per_hour_usages.xml
new file mode 100644 (file)
index 0000000..68cb6e1
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="fill_parent"
+  android:layout_height="fill_parent" android:orientation="vertical">
+
+    <LinearLayout
+               android:layout_width="fill_parent"
+               android:layout_height="wrap_content" 
+               android:orientation="horizontal">
+        <ImageView
+               android:src="@drawable/icon"
+               android:layout_height="wrap_content" 
+               android:layout_width="wrap_content" />
+       <Button android:id="@+id/showGraphButton"
+               android:layout_marginLeft="75dip"
+               android:text="@string/activity_graph"
+               android:layout_height="wrap_content" 
+               android:layout_width="wrap_content" />
+    </LinearLayout>
+    <LinearLayout
+       android:layout_width="fill_parent"
+               android:layout_height="wrap_content" 
+               android:orientation="horizontal">
+       <TextView android:id="@+id/date"
+               android:text="@string/activity_date" 
+               android:layout_width="fill_parent"
+               android:layout_weight="1" 
+               android:layout_height="wrap_content" />
+       <TextView android:id="@+id/actual"
+               android:text="@string/activity_actual" 
+               android:layout_width="fill_parent" 
+               android:layout_weight="1" 
+               android:layout_height="wrap_content" />
+       <TextView android:id="@+id/expected"
+               android:text="@string/activity_expected" 
+               android:layout_width="fill_parent"
+               android:layout_weight="1" 
+               android:layout_height="wrap_content" />
+       </LinearLayout>
+    <ListView 
+               android:id="@android:id/list"
+               android:layout_width="fill_parent"
+               android:layout_height="fill_parent"/>
+</LinearLayout>
diff --git a/res/layout/per_hour_usages_graph.xml b/res/layout/per_hour_usages_graph.xml
new file mode 100644 (file)
index 0000000..758a9ef
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  android:orientation="vertical"
+  android:layout_width="fill_parent"
+  android:layout_height="fill_parent">
+    <android.webkit.WebView 
+       android:id="@+id/webView1" 
+       android:layout_width="fill_parent" 
+       android:layout_height="fill_parent" />
+</LinearLayout>
diff --git a/res/layout/per_hour_usages_list.xml b/res/layout/per_hour_usages_list.xml
new file mode 100644 (file)
index 0000000..5369930
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="fill_parent"
+  android:layout_height="fill_parent" android:orientation="horizontal">
+    <TextView android:id="@+id/date"
+       android:text="TextView" 
+       android:layout_width="fill_parent"
+       android:layout_weight="1" 
+       android:layout_height="wrap_content" />
+    <TextView android:id="@+id/actual"
+       android:text="TextView" 
+       android:layout_width="fill_parent" 
+       android:layout_weight="1" 
+       android:layout_height="wrap_content" />
+    <TextView android:id="@+id/expected"
+       android:text="TextView" 
+       android:layout_width="fill_parent"
+       android:layout_weight="1" 
+       android:layout_height="wrap_content" />
+</LinearLayout>
diff --git a/res/layout/widget.xml b/res/layout/widget.xml
new file mode 100644 (file)
index 0000000..558439d
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="72dip"
+    android:layout_height="72dip"
+    android:gravity="center"
+    android:id="@+id/powerMeter">
+<ImageView
+       android:layout_width="fill_parent"
+       android:layout_height="fill_parent"
+       android:id="@+id/imageView1"
+       android:background="@drawable/background"       
+        />
+<TextView  
+    android:layout_width="fill_parent" 
+    android:layout_height="wrap_content" 
+    android:gravity="center"
+    android:layout_alignParentTop="true"
+    android:id="@+id/textView1"
+    android:textSize="30sp"
+    android:textColor="#ffffff"
+    android:text="@string/receiver_textView1"
+    android:paddingTop="5dip"
+    />
+<TextView  
+    android:layout_width="fill_parent" 
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    android:layout_below="@id/textView1"
+    android:id="@+id/textView2"
+    android:textSize="10sp"
+    android:textColor="#ffffff"
+    android:textStyle="bold" 
+    android:text="@string/receiver_textView2"
+    android:padding="0px"
+    />
+</RelativeLayout>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
new file mode 100644 (file)
index 0000000..48bb4b0
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string-array name="csvUrlEntries">
+        <item>powermeter.sourceforge.jp</item>
+        <item>www.tepco.co.jp</item>
+    </string-array>
+    <string-array name="csvUrlEntryValues">
+               <item>http://powermeter.sourceforge.jp/juyo-j.csv</item>
+               <item>http://www.tepco.co.jp/forecast/html/images/juyo-j.csv</item>
+    </string-array>
+    <string-array name="textColorEntries">
+               <item>白</item>
+               <item>黒</item>
+               <item>赤</item>
+               <item>緑</item>
+               <item>青</item>
+               <item>黄</item>
+               <item>紫</item>
+               <item>桃</item>
+    </string-array>
+    <string-array name="textColorEntryValues">
+               <item>#ffffff</item>
+               <item>#000000</item>
+               <item>#ff0000</item>
+               <item>#00ff00</item>
+               <item>#0000ff</item>
+               <item>#ffff00</item>
+               <item>#ff00ff</item>
+               <item>#ff99ff</item>
+    </string-array>
+    <string-array name="backgroundEntries">
+       <item>緑</item>
+               <item>白</item>
+               <item>黒</item>
+               <item>赤</item>
+               <item>青</item>
+               <item>黄</item>
+    </string-array>
+    <string-array name="backgroundValues">
+               <item>background</item>
+               <item>background_white</item>
+               <item>background_black</item>
+               <item>background_red</item>
+               <item>background_blue</item>
+               <item>background_yellow</item>
+    </string-array>
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
new file mode 100644 (file)
index 0000000..97e072c
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">TEPCOメーター顔文字</string>
+
+       <string name="activity_update">更新日</string>
+       <string name="activity_peakAvailabilityToday">ピーク時供給力(万kW)</string>
+       <string name="activity_maximumElectricPowerToday">予想最大電力(万kW)</string>
+       <string name="activity_message">東京電力からのお願い</string>
+       <string name="activity_perHourUsages">一時間毎の電力</string>
+       <string name="activity_message_not_found">メッセージはありません</string>
+       <string name="activity_error_network">ネットワークエラーが発生しました</string>
+       
+       
+       <string name="activity_menu_preferences">設定</string>
+       <string name="activity_menu_refresh">更新</string>
+       
+       <string name="activity_date">時間</string>
+       <string name="activity_actual">当日実績(万kW)</string>
+       <string name="activity_expected">予測値(万kW)</string>
+       <string name="activity_graph">グラフを表示する</string>
+
+    <string name="receiver_textView2">(´・ω・`)</string>
+    <string name="receiver_textView1">00%</string>
+    <string name="receiver_csvUrlTitle1">CSVの取得</string>
+    <string name="receiver_csvUrlTitle2">CSVのダウンロード先</string>
+    <string name="receiver_csvUrlDialogTitle">CSVのダウンロード先</string>
+    <string name="receiver_kaoMojiEditTitle">顔文字の編集</string>
+    <string name="receiver_kaoMoji90Title">電力使用率90%以上</string>
+    <string name="receiver_kaoMoji70Title">電力使用率70%以上</string>
+    <string name="receiver_kaoMoji69Title">電力使用率70%未満</string>
+    <string name="receiver_textColorEditTitle">テキストカラーの編集</string>
+    <string name="receiver_backgroundEditTitle">背景の編集</string>
+</resources>
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
new file mode 100644 (file)
index 0000000..774aff3
--- /dev/null
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<PreferenceScreen
+       xmlns:android="http://schemas.android.com/apk/res/android">
+       <PreferenceCategory android:title="@string/receiver_csvUrlTitle1">
+               <ListPreference 
+                       android:key="csvUrl"
+                       android:title="@string/receiver_csvUrlTitle2"
+                       android:dialogTitle="@string/receiver_csvUrlDialogTitle"
+                       android:entries="@array/csvUrlEntries"
+                       android:entryValues="@array/csvUrlEntryValues"
+                       android:defaultValue="http://powermeter.sourceforge.jp/juyo-j.csv"/>
+       </PreferenceCategory>   
+       <PreferenceCategory android:title="@string/receiver_kaoMojiEditTitle">
+               <EditTextPreference  
+               android:key="kaoMoji90"  
+                       android:title="@string/receiver_kaoMoji90Title"  
+               android:dialogTitle="@string/receiver_kaoMoji90Title"
+               android:defaultValue="(´;ω;`)" />
+       <EditTextPreference  
+               android:key="kaoMoji70"  
+                       android:title="@string/receiver_kaoMoji70Title"  
+               android:dialogTitle="@string/receiver_kaoMoji70Title"
+               android:defaultValue="(´・ω・`)" />
+       <EditTextPreference  
+               android:key="kaoMoji69"  
+                       android:title="@string/receiver_kaoMoji69Title"  
+               android:dialogTitle="@string/receiver_kaoMoji69Title"
+               android:defaultValue="(`・ω・´)" />
+       </PreferenceCategory>
+       <PreferenceCategory android:title="@string/receiver_textColorEditTitle">
+                       <ListPreference 
+                       android:key="textColor"
+                       android:title="@string/receiver_textColorEditTitle"
+                       android:dialogTitle="@string/receiver_textColorEditTitle"
+                       android:entries="@array/textColorEntries"
+                       android:entryValues="@array/textColorEntryValues"
+                       android:defaultValue="#ffffff"/>
+       </PreferenceCategory>
+       <PreferenceCategory android:title="@string/receiver_backgroundEditTitle">
+                       <ListPreference 
+                       android:key="background"
+                       android:title="@string/receiver_backgroundEditTitle"
+                       android:dialogTitle="@string/receiver_backgroundEditTitle"
+                       android:entries="@array/backgroundEntries"
+                       android:entryValues="@array/backgroundValues"
+                       android:defaultValue="@drawable/background"/>
+       </PreferenceCategory>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/widget.xml b/res/xml/widget.xml
new file mode 100644 (file)
index 0000000..3d64bb8
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<appwidget-provider
+               xmlns:android="http://schemas.android.com/apk/res/android"
+               android:minWidth="72dip"
+               android:minHeight="72dip"
+               android:updatePeriodMillis="1800000"
+               android:initialLayout="@layout/widget" />
\ No newline at end of file
diff --git a/src/jp/co/app/ynomoto/pmft/GChart.java b/src/jp/co/app/ynomoto/pmft/GChart.java
new file mode 100644 (file)
index 0000000..59b4446
--- /dev/null
@@ -0,0 +1,56 @@
+package jp.co.app.ynomoto.pmft;\r
+\r
+import java.util.ArrayList;\r
+\r
+import android.net.Uri;\r
+import android.util.Log;\r
+\r
+public class GChart {\r
+       private final String URL = "http://chart.apis.google.com/chart";\r
+       private String chs,chd, cht, chco, chtt, chdl, chxt, chxl, chg;\r
+       \r
+       // Google チャートへ渡すパラメータの作成\r
+       public GChart(int maximumKw, ArrayList<Integer> actualToday, ArrayList<Integer> expectedToday){\r
+               int graphMax = 6000;\r
+               chs = "800x300";\r
+               chd = "t:"+ toPercentage(maximumKw, graphMax) + "|" + toPercentage(actualToday, graphMax) + "|" + toPercentage(actualToday, graphMax);\r
+               cht = "bvo";\r
+               chco = "11210D,3D7930,A2C180";\r
+               chtt = "「本日の電力グラフ(単位:万Kw)」";\r
+               chdl = "ピーク時供給力|本日実績|本日予測";\r
+               chxt = "x,y"; \r
+               chxl = "0:|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|1:|0|" + (graphMax / 2) + "|" + graphMax;\r
+               chg = "25,-1";\r
+       }\r
+       \r
+       private String toPercentage(int kWs, int graphMax){\r
+               String percentages = (int)((float)kWs / graphMax * 100) + "";\r
+               for(int i = 1; i < 24; i++){\r
+                       percentages += "," + (int)((float)kWs / graphMax * 100);\r
+               }\r
+               return percentages;\r
+       }\r
+       \r
+       private String toPercentage(ArrayList<Integer> kWs, int graphMax){\r
+               String percentages = (int)((float)kWs.get(0) / graphMax * 100) + "";\r
+               for(int i = 1; i < 24; i++){\r
+                       percentages += "," + (int)((float)kWs.get(i) / graphMax * 100);\r
+               }\r
+               return percentages;\r
+       }\r
+       \r
+       public Uri getChart() {\r
+               String s = URL \r
+                                       + "?" + "chs=" + chs \r
+                                       + "&" + "chd=" + chd \r
+                                       + "&" + "cht=" + cht \r
+                                       + "&" + "chco=" + chco \r
+                                       + "&" + "chtt=" + chtt \r
+                                       + "&" + "chdl=" + chdl \r
+                                       + "&" + "chxt=" + chxt\r
+                                       + "&" + "chxl=" + chxl\r
+                                       + "&" + "chg=" + chg;\r
+               Log.v("jp.co.app.ynomoto.pmft.PowerMeter.GChart.getChart()", s);\r
+               return Uri.parse(s);\r
+       }\r
+}\r
diff --git a/src/jp/co/app/ynomoto/pmft/activity/MainActivity.java b/src/jp/co/app/ynomoto/pmft/activity/MainActivity.java
new file mode 100644 (file)
index 0000000..8d66400
--- /dev/null
@@ -0,0 +1,110 @@
+package jp.co.app.ynomoto.pmft.activity;\r
+\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+\r
+import org.apache.http.client.ClientProtocolException;\r
+\r
+import jp.co.app.ynomoto.pmft.R;\r
+import jp.co.app.ynomoto.pmft.parser.TepcoParser;\r
+import android.app.Activity;\r
+import android.content.Intent;\r
+import android.content.SharedPreferences;\r
+import android.os.Bundle;\r
+import android.preference.PreferenceManager;\r
+import android.view.Menu;\r
+import android.view.MenuItem;\r
+import android.view.View;\r
+import android.view.View.OnClickListener;\r
+import android.widget.Button;\r
+import android.widget.TextView;\r
+import android.widget.Toast;\r
+\r
+public class MainActivity extends Activity implements OnClickListener{\r
+       private static final String UPDATE_INTENT = "jp.co.app.ynomoto.pmft.UPDATE";\r
+       private TextView mUpdate;\r
+       private TextView mPeakAvailabilityToday;\r
+       private TextView mMaximumElectricPowerToday;\r
+       private TextView mMessage;\r
+       private Button mPerHourUsages;\r
+       \r
+       @Override\r
+       protected void onCreate(Bundle savedInstanceState) {\r
+               super.onCreate(savedInstanceState);\r
+        setContentView(R.layout.main);\r
+\r
+               mUpdate = (TextView)findViewById(R.id.update);\r
+               mPeakAvailabilityToday = (TextView)findViewById(R.id.peakAvailabilityToday);\r
+               mMaximumElectricPowerToday = (TextView)findViewById(R.id.maximumElectricPowerToday);\r
+               mMessage = (TextView)findViewById(R.id.message);\r
+               mPerHourUsages = (Button) findViewById(R.id.perHourUsages);\r
+               setup();\r
+       }\r
+       \r
+       private void setup(){\r
+               SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);\r
+               TepcoParser parser;\r
+               \r
+               try {\r
+                       parser = new TepcoParser(sharedPreferences.getString("csvUrl", "http://powermeter.sourceforge.jp/juyo-j.csv"));\r
+                       mUpdate.setText(parser.getUpdate().toString());\r
+                       mPeakAvailabilityToday.setText(parser.getPeakAvailabilityToday()\r
+                                       .getTimeZones()\r
+                                       + " " + parser.getPeakAvailabilityToday().getPower());\r
+                       mMaximumElectricPowerToday.setText(parser\r
+                                       .getMaximumElectricPowerToday().getTimeZones()\r
+                                       + " " + parser.getMaximumElectricPowerToday().getPower());\r
+                       ArrayList<String> strings = parser.getMessages();\r
+                       if (strings != null) {\r
+                               mMessage.setText(strings.get(0));\r
+                       } else {\r
+                               mMessage.setText(getString(R.string.activity_message_not_found));\r
+                       }\r
+               } catch (ClientProtocolException e) {\r
+                       e.printStackTrace();\r
+                       Toast.makeText(this, getString(R.string.activity_error_network), Toast.LENGTH_SHORT).show();\r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
+                       Toast.makeText(this, getString(R.string.activity_error_network), Toast.LENGTH_SHORT).show();\r
+               } \r
+               \r
+               mPerHourUsages.setOnClickListener(this);\r
+\r
+       }\r
+\r
+       @Override\r
+       public void onClick(View v) {\r
+               Intent intent = new Intent(this, PerHourUsages.class);\r
+               startActivity(intent);  \r
+       }\r
+       \r
+           @Override\r
+    public boolean onCreateOptionsMenu(Menu menu){\r
+       menu.add(1, 1, Menu.NONE, getString(R.string.activity_menu_preferences))\r
+       .setIcon(android.R.drawable.ic_menu_preferences);\r
+       \r
+       menu.add(1, 2, Menu.NONE, getString(R.string.activity_menu_refresh))\r
+       .setIcon(R.drawable.ic_menu_refresh);\r
+       \r
+               return super.onCreateOptionsMenu(menu);\r
+    }\r
+    \r
+    @Override\r
+    public boolean onOptionsItemSelected(MenuItem item){\r
+       Intent intent;\r
+       switch (item.getItemId()) {\r
+               case 1:\r
+                       intent = new Intent(this, PowerMeterPreference.class);\r
+                       startActivity(intent); \r
+                       break;\r
+               case 2:\r
+                       setup();\r
+            intent=new Intent(UPDATE_INTENT);\r
+            sendBroadcast(intent);\r
+               default:\r
+                       break;\r
+               }\r
+       \r
+               return true;    \r
+    }\r
+}\r
diff --git a/src/jp/co/app/ynomoto/pmft/activity/PerHourUsages.java b/src/jp/co/app/ynomoto/pmft/activity/PerHourUsages.java
new file mode 100644 (file)
index 0000000..f2b98f4
--- /dev/null
@@ -0,0 +1,56 @@
+package jp.co.app.ynomoto.pmft.activity;\r
+\r
+import java.io.IOException;\r
+\r
+import org.apache.http.client.ClientProtocolException;\r
+\r
+import jp.co.app.ynomoto.pmft.R;\r
+import jp.co.app.ynomoto.pmft.adapter.PerHourUsagesAdapter;\r
+import jp.co.app.ynomoto.pmft.parser.TepcoParser;\r
+import android.app.ListActivity;\r
+import android.content.Intent;\r
+import android.content.SharedPreferences;\r
+import android.os.Bundle;\r
+import android.preference.PreferenceManager;\r
+import android.view.View;\r
+import android.view.View.OnClickListener;\r
+import android.widget.Button;\r
+import android.widget.Toast;\r
+\r
+public class PerHourUsages extends ListActivity implements OnClickListener{\r
+       Button mShowGraphButton;\r
+       \r
+       @Override\r
+       protected void onCreate(Bundle savedInstanceState) {\r
+               super.onCreate(savedInstanceState);\r
+               setContentView(R.layout.per_hour_usages);\r
+\r
+               SharedPreferences sharedPreferences = PreferenceManager\r
+                               .getDefaultSharedPreferences(this);\r
+               TepcoParser parser;\r
+               try {\r
+                       parser = new TepcoParser(sharedPreferences.getString(\r
+                                       "csvUrl", "http://powermeter.sourceforge.jp/juyo-j.csv"));\r
+                       PerHourUsagesAdapter adapter = new PerHourUsagesAdapter(this,\r
+                                       R.layout.per_hour_usages_list, parser.getPerHourUsages());\r
+                       setListAdapter(adapter);\r
+               } catch (ClientProtocolException e) {\r
+                       e.printStackTrace();\r
+                       Toast.makeText(this, getString(R.string.activity_error_network), Toast.LENGTH_SHORT);\r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
+                       Toast.makeText(this, getString(R.string.activity_error_network), Toast.LENGTH_SHORT);\r
+               }\r
+\r
+               mShowGraphButton = (Button) findViewById(R.id.showGraphButton);\r
+               mShowGraphButton.setOnClickListener(this);\r
+       }\r
+\r
+       @Override\r
+       public void onClick(View v) {\r
+               Intent intent = new Intent(this, PerHourUsagesGraph.class);\r
+               // intent に何か渡すならば\r
+               // intent.putExtra("", );\r
+               startActivity(intent); \r
+       }\r
+}\r
diff --git a/src/jp/co/app/ynomoto/pmft/activity/PerHourUsagesGraph.java b/src/jp/co/app/ynomoto/pmft/activity/PerHourUsagesGraph.java
new file mode 100644 (file)
index 0000000..b44c25a
--- /dev/null
@@ -0,0 +1,75 @@
+package jp.co.app.ynomoto.pmft.activity;\r
+\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+\r
+import org.apache.http.client.ClientProtocolException;\r
+\r
+import jp.co.app.ynomoto.pmft.GChart;\r
+import jp.co.app.ynomoto.pmft.R;\r
+import jp.co.app.ynomoto.pmft.data.PerHourUsage;\r
+import jp.co.app.ynomoto.pmft.parser.TepcoParser;\r
+import android.app.Activity;\r
+import android.content.Intent;\r
+import android.content.SharedPreferences;\r
+import android.os.Bundle;\r
+import android.preference.PreferenceManager;\r
+import android.webkit.WebView;\r
+import android.widget.Toast;\r
+\r
+public class PerHourUsagesGraph extends Activity {\r
+       private WebView mWebView1;\r
+\r
+       @Override\r
+       protected void onCreate(Bundle savedInstanceState) {\r
+               super.onCreate(savedInstanceState);\r
+               setContentView(R.layout.per_hour_usages_graph);\r
+\r
+               mWebView1 = (WebView) findViewById(R.id.webView1);\r
+\r
+               SharedPreferences sharedPreferences = PreferenceManager\r
+                               .getDefaultSharedPreferences(this);\r
+               TepcoParser parser;\r
+               try {\r
+                       parser = new TepcoParser(sharedPreferences.getString("csvUrl",\r
+                                       "http://powermeter.sourceforge.jp/juyo-j.csv"));\r
+                       ArrayList<PerHourUsage> hourUsages = parser.getPerHourUsages();\r
+                       ArrayList<Integer> actualToday = new ArrayList<Integer>();\r
+                       ArrayList<Integer> expectedToday = new ArrayList<Integer>();\r
+                       for (PerHourUsage perHourUsage : hourUsages) {\r
+                               actualToday.add(perHourUsage.getActual());\r
+                               expectedToday.add(perHourUsage.getExpected());\r
+                       }\r
+\r
+                       GChart chart = new GChart(parser.getPeakAvailabilityToday()\r
+                                       .getPower(), actualToday, expectedToday);\r
+                       String content = chart.getChart().toString();\r
+                       mWebView1.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);\r
+                       StringBuilder bufResult = new StringBuilder("<html>");\r
+                       bufResult.append("<head>");\r
+                       bufResult\r
+                                       .append("<meta name=\"viewport\" content=\"target-densitydpi=high-dpi\" />");\r
+                       bufResult.append("</head>");\r
+                       bufResult.append("<body>");\r
+                       bufResult.append("<style type=\"text/css\">");\r
+                       bufResult.append("body {font-size: 18pt; margin: 0; padding: 0;}");\r
+                       bufResult.append("</style>");\r
+                       bufResult.append("<img src=\"");\r
+                       bufResult.append(content);\r
+                       bufResult.append("\" />");\r
+                       bufResult.append("</body></html>");\r
+                       mWebView1.loadDataWithBaseURL(null, bufResult.toString(),\r
+                                       "text/html", "UTF-8", null);\r
+               } catch (ClientProtocolException e) {\r
+                       e.printStackTrace();\r
+                       Toast.makeText(this, getString(R.string.activity_error_network),\r
+                                       Toast.LENGTH_SHORT).show();\r
+                       finish();\r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
+                       Toast.makeText(this, getString(R.string.activity_error_network),\r
+                                       Toast.LENGTH_SHORT).show();\r
+                       finish();\r
+               }\r
+       }\r
+}\r
diff --git a/src/jp/co/app/ynomoto/pmft/activity/PowerMeterPreference.java b/src/jp/co/app/ynomoto/pmft/activity/PowerMeterPreference.java
new file mode 100644 (file)
index 0000000..de0f93f
--- /dev/null
@@ -0,0 +1,13 @@
+package jp.co.app.ynomoto.pmft.activity;
+
+import jp.co.app.ynomoto.pmft.R;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+
+public class PowerMeterPreference extends PreferenceActivity {
+       @Override
+       public void onCreate(Bundle savedInstanceState){
+               super.onCreate(savedInstanceState);
+               addPreferencesFromResource(R.xml.preferences);
+       }
+}
diff --git a/src/jp/co/app/ynomoto/pmft/adapter/PerHourUsagesAdapter.java b/src/jp/co/app/ynomoto/pmft/adapter/PerHourUsagesAdapter.java
new file mode 100644 (file)
index 0000000..c3ba814
--- /dev/null
@@ -0,0 +1,46 @@
+package jp.co.app.ynomoto.pmft.adapter;\r
+\r
+import java.util.ArrayList;\r
+\r
+import jp.co.app.ynomoto.pmft.data.PerHourUsage;\r
+import android.content.Context;\r
+import android.view.LayoutInflater;\r
+import android.view.View;\r
+import android.view.ViewGroup;\r
+import android.widget.ArrayAdapter;\r
+import android.widget.TextView;\r
+\r
+public class PerHourUsagesAdapter extends ArrayAdapter<PerHourUsage> {\r
+       ArrayList<PerHourUsage> mHourUsages = null;\r
+       Context mContext;\r
+       LayoutInflater mInflater = null;\r
+       int mTextViewResourceId;\r
+\r
+       public PerHourUsagesAdapter(Context context, int textViewResourceId, ArrayList<PerHourUsage> hourUsages) {\r
+               super(context, textViewResourceId, hourUsages);\r
+               mHourUsages = hourUsages;\r
+               mContext = context;\r
+               mTextViewResourceId = textViewResourceId;\r
+               mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r
+       }\r
+       \r
+       @Override\r
+       public View getView(int position, View convertView, ViewGroup parent) {\r
+\r
+               View row = convertView;\r
+               if (row == null) {\r
+                       row = mInflater.inflate(mTextViewResourceId, parent, false);\r
+               }\r
+               \r
+               TextView date = (TextView)row.findViewById(jp.co.app.ynomoto.pmft.R.id.date);\r
+               TextView actual = (TextView)row.findViewById(jp.co.app.ynomoto.pmft.R.id.actual);\r
+               TextView expected = (TextView)row.findViewById(jp.co.app.ynomoto.pmft.R.id.expected);\r
+               \r
+               date.setText(mHourUsages.get(position).getDate().toLocaleString());\r
+               actual.setText(mHourUsages.get(position).getActual() + "");\r
+               expected.setText(mHourUsages.get(position).getExpected() + "");\r
+\r
+               return row;\r
+       }\r
+\r
+}\r
diff --git a/src/jp/co/app/ynomoto/pmft/data/MaximumElectricPower.java b/src/jp/co/app/ynomoto/pmft/data/MaximumElectricPower.java
new file mode 100644 (file)
index 0000000..b296ea5
--- /dev/null
@@ -0,0 +1,33 @@
+package jp.co.app.ynomoto.pmft.data;\r
+\r
+import java.util.Date;\r
+\r
+public class MaximumElectricPower {\r
+       private int power; // 予想最大電力(万kW)\r
+       private String timeZones; // 時間帯\r
+       private Date update; // 予想最大電力情報更新日 + 予想最大電力情報更新時刻\r
+\r
+       public int getPower() {\r
+               return power;\r
+       }\r
+\r
+       public void setPower(int power) {\r
+               this.power = power;\r
+       }\r
+\r
+       public String getTimeZones() {\r
+               return timeZones;\r
+       }\r
+\r
+       public void setTimeZones(String timeZones) {\r
+               this.timeZones = timeZones;\r
+       }\r
+\r
+       public Date getUpdate() {\r
+               return update;\r
+       }\r
+\r
+       public void setUpdate(Date update) {\r
+               this.update = update;\r
+       }\r
+}\r
diff --git a/src/jp/co/app/ynomoto/pmft/data/PeakAvailability.java b/src/jp/co/app/ynomoto/pmft/data/PeakAvailability.java
new file mode 100644 (file)
index 0000000..85a9098
--- /dev/null
@@ -0,0 +1,33 @@
+package jp.co.app.ynomoto.pmft.data;\r
+\r
+import java.util.Date;\r
+\r
+public class PeakAvailability {\r
+       private int power; // ピーク時供給力(万kW)\r
+       private String timeZones; // 時間帯\r
+       private Date update; // 供給力情報更新日 + 供給力情報更新時刻\r
+\r
+       public int getPower() {\r
+               return power;\r
+       }\r
+\r
+       public void setPower(int power) {\r
+               this.power = power;\r
+       }\r
+\r
+       public String getTimeZones() {\r
+               return timeZones;\r
+       }\r
+\r
+       public void setTimeZones(String timeZones) {\r
+               this.timeZones = timeZones;\r
+       }\r
+\r
+       public Date getUpdate() {\r
+               return update;\r
+       }\r
+\r
+       public void setUpdate(Date update) {\r
+               this.update = update;\r
+       }\r
+}\r
diff --git a/src/jp/co/app/ynomoto/pmft/data/PerHourUsage.java b/src/jp/co/app/ynomoto/pmft/data/PerHourUsage.java
new file mode 100644 (file)
index 0000000..6a76ccb
--- /dev/null
@@ -0,0 +1,33 @@
+package jp.co.app.ynomoto.pmft.data;\r
+\r
+import java.util.Date;\r
+\r
+public class PerHourUsage {\r
+       private Date date; // DATE + TIME\r
+       private int actual; // 当日実績(万kW)\r
+       private int expected; // 予測値(万kW)\r
+\r
+       public Date getDate() {\r
+               return date;\r
+       }\r
+\r
+       public void setDate(Date date) {\r
+               this.date = date;\r
+       }\r
+\r
+       public int getActual() {\r
+               return actual;\r
+       }\r
+\r
+       public void setActual(int actual) {\r
+               this.actual = actual;\r
+       }\r
+\r
+       public int getExpected() {\r
+               return expected;\r
+       }\r
+\r
+       public void setExpected(int expected) {\r
+               this.expected = expected;\r
+       }\r
+}\r
diff --git a/src/jp/co/app/ynomoto/pmft/parser/TepcoParser.java b/src/jp/co/app/ynomoto/pmft/parser/TepcoParser.java
new file mode 100644 (file)
index 0000000..9f078d2
--- /dev/null
@@ -0,0 +1,648 @@
+package jp.co.app.ynomoto.pmft.parser;\r
+\r
+import java.io.BufferedReader;\r
+import java.io.IOException;\r
+import java.io.InputStreamReader;\r
+import java.net.HttpURLConnection;\r
+import java.net.URL;\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Date;\r
+\r
+import jp.co.app.ynomoto.pmft.data.MaximumElectricPower;\r
+import jp.co.app.ynomoto.pmft.data.PeakAvailability;\r
+import jp.co.app.ynomoto.pmft.data.PerHourUsage;\r
+\r
+import org.apache.http.client.ClientProtocolException;\r
+\r
+import android.util.Log;\r
+\r
+// コンストラクタでネットワークエラーが発生したならば、そのオブジェクトは null\r
+public class TepcoParser {\r
+       private final String LOG_TAG = "jp.co.app.ynomoto.pmft.TepcoParser";\r
+       private Date update; // CSV の更新日時を保存\r
+       private PeakAvailability peakAvailabilityToday = new PeakAvailability(); // ピーク時供給力(今日)\r
+       private PeakAvailability peakAvailabilityTomorrow = new PeakAvailability(); // ピーク時供給力(明日)\r
+       private MaximumElectricPower maximumElectricPowerToday = new MaximumElectricPower(); // 予想最大電力(今日)\r
+       private MaximumElectricPower maximumElectricPowerTomorrow = new MaximumElectricPower(); // 予想最大電力(昨日)\r
+       private ArrayList<PerHourUsage> perHourUsages = new ArrayList<PerHourUsage>(); // 一時間当たりの電力使用量\r
+       private ArrayList<String> messages = new ArrayList<String>(); // 東京電力からのお知らせ\r
+       \r
+       public Date getUpdate() {\r
+               return update;\r
+       }\r
+\r
+       public void setUpdate(Date update) {\r
+               this.update = update;\r
+       }\r
+\r
+       public PeakAvailability getPeakAvailabilityToday() {\r
+               return peakAvailabilityToday;\r
+       }\r
+\r
+       public void setPeakAvailabilityToday(PeakAvailability peakAvailabilityToday) {\r
+               this.peakAvailabilityToday = peakAvailabilityToday;\r
+       }\r
+\r
+       public PeakAvailability getPeakAvailabilityTomorrow() {\r
+               return peakAvailabilityTomorrow;\r
+       }\r
+\r
+       public void setPeakAvailabilityTomorrow(\r
+                       PeakAvailability peakAvailabilityTomorrow) {\r
+               this.peakAvailabilityTomorrow = peakAvailabilityTomorrow;\r
+       }\r
+\r
+       public MaximumElectricPower getMaximumElectricPowerToday() {\r
+               return maximumElectricPowerToday;\r
+       }\r
+\r
+       public void setMaximumElectricPowerToday(\r
+                       MaximumElectricPower maximumElectricPowerToday) {\r
+               this.maximumElectricPowerToday = maximumElectricPowerToday;\r
+       }\r
+\r
+       public MaximumElectricPower getMaximumElectricPowerTomorrow() {\r
+               return maximumElectricPowerTomorrow;\r
+       }\r
+\r
+       public void setMaximumElectricPowerTomorrow(\r
+                       MaximumElectricPower maximumElectricPowerTomorrow) {\r
+               this.maximumElectricPowerTomorrow = maximumElectricPowerTomorrow;\r
+       }\r
+\r
+       public ArrayList<PerHourUsage> getPerHourUsages() {\r
+               return perHourUsages;\r
+       }\r
+\r
+       public void setPerHourUsages(ArrayList<PerHourUsage> perHourUsages) {\r
+               this.perHourUsages = perHourUsages;\r
+       }\r
+\r
+       public ArrayList<String> getMessages() {\r
+               return messages;\r
+       }\r
+\r
+       public void setMessages(ArrayList<String> messages) {\r
+               this.messages = messages;\r
+       }\r
+\r
+       public TepcoParser(String url) throws ClientProtocolException, IOException {\r
+                       parse(get(url));\r
+       }\r
+       \r
+       // CSV ファイルを入手する\r
+       private ArrayList<String> get(String url) throws ClientProtocolException, IOException{\r
+               String host[] = url.split("/");\r
+               \r
+               HttpURLConnection urlconn = (HttpURLConnection)(new URL(url).openConnection());\r
+               urlconn.setRequestMethod("GET");\r
+               urlconn.setInstanceFollowRedirects(false);\r
+               urlconn.setRequestProperty("Host", host[2]);\r
+               urlconn.setRequestProperty("Accept", "*/*");\r
+               urlconn.setRequestProperty("Referer", "http://jp.co.app.ynomoto.pmft/");\r
+               urlconn.setRequestProperty("Accept-Language", "ja");\r
+               urlconn.setRequestProperty("User-Agent", "pmft/1.0");\r
+               urlconn.setRequestProperty("Connection:", "close");\r
+               urlconn.connect();\r
+\r
+               Log.d(LOG_TAG, "HTTP Response Code:" + urlconn.getResponseCode());\r
+               ArrayList<String> response = new ArrayList<String>();\r
+               if (urlconn.getResponseCode() == HttpURLConnection.HTTP_OK) {\r
+                       BufferedReader reader = new BufferedReader(new InputStreamReader(urlconn.getInputStream(), "Shift_JIS"));\r
+                       \r
+                       int i = 0;\r
+                       response.add(reader.readLine());\r
+                       while (response.get(i) != null) {\r
+                               response.add(reader.readLine());\r
+                               i++;\r
+                       }\r
+                       response.remove(i);\r
+                       reader.close();\r
+               }\r
+\r
+               urlconn.disconnect();\r
+               return response;\r
+       }\r
+       \r
+       // CSV ファイルを解析する\r
+       private boolean parse(ArrayList<String> data){\r
+               \r
+               int i = 0;\r
+               while( i < data.size()){\r
+                       \r
+//                     Log.v(LOG_TAG, data.get(i));\r
+                       \r
+                       if (data.get(i).endsWith("UPDATE")) {\r
+                               SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");\r
+                               try {\r
+                                       update = sdf.parse(data.get(i).substring(0, 14));\r
+                               } catch (ParseException e) {\r
+                                       Log.d(LOG_TAG, "parsing failed");\r
+                                       return false;\r
+                               }\r
+                       }\r
+                       \r
+                       if (data.get(i).startsWith("ピーク時供給力(万kW),")) {\r
+                               i++;\r
+                               peakAvailabilityToday.setPower(Integer.parseInt(data.get(i).split(",")[0]));\r
+                               peakAvailabilityToday.setTimeZones(data.get(i).split(",")[1]);\r
+                               String tmp = data.get(i).split(",")[2] + " " + data.get(i).split(",")[3];\r
+                               SimpleDateFormat sdf = new SimpleDateFormat("MM/dd HH:mm");\r
+                               try {\r
+                                       peakAvailabilityToday.setUpdate(sdf.parse(tmp));\r
+                               } catch (ParseException e) {\r
+                                       Log.d(LOG_TAG, "parsing failed");\r
+                                       return false;\r
+                               }\r
+                       }\r
+                       \r
+                       if (data.get(i).startsWith("予想最大電力(万kW),")) {\r
+                               i++;\r
+                               maximumElectricPowerToday.setPower(Integer.parseInt(data.get(i).split(",")[0]));\r
+                               maximumElectricPowerToday.setTimeZones(data.get(i).split(",")[1]);\r
+                               String tmp = data.get(i).split(",")[2] + " " + data.get(i).split(",")[3];\r
+                               SimpleDateFormat sdf = new SimpleDateFormat("MM/dd HH:mm");\r
+                               try {\r
+                                       maximumElectricPowerToday.setUpdate(sdf.parse(tmp));\r
+                               } catch (ParseException e) {\r
+                                       Log.d(LOG_TAG, "parsing failed");\r
+                                       return false;\r
+                               }\r
+                       }\r
+                       \r
+                       if (data.get(i).startsWith("翌日のピーク時供給力(万kW)")) {\r
+                               i++;\r
+                               try {\r
+                                       peakAvailabilityTomorrow.setPower(Integer.parseInt(data.get(i).split(",")[0]));\r
+                                       peakAvailabilityTomorrow.setTimeZones(data.get(i).split(",")[1]);\r
+                                       String tmp = data.get(i).split(",")[2] + " " + data.get(i).split(",")[3];\r
+                                       SimpleDateFormat sdf = new SimpleDateFormat("MM/dd HH:mm");\r
+                                       peakAvailabilityTomorrow.setUpdate(sdf.parse(tmp));\r
+                               } catch (ArrayIndexOutOfBoundsException e){\r
+                                       Log.d(LOG_TAG, "peakAvailabilityTomorrow is null");\r
+                                       peakAvailabilityTomorrow = null;\r
+                               } catch (ParseException e) {\r
+                                       Log.d(LOG_TAG, "parsing failed");\r
+                                       return false;\r
+                               }\r
+                       }\r
+                       \r
+                       if (data.get(i).startsWith("翌日の予想最大電力(万kW)")) {\r
+                               i++;\r
+                               try {\r
+                                       maximumElectricPowerTomorrow.setPower(Integer.parseInt(data.get(i).split(",")[0]));\r
+                                       maximumElectricPowerTomorrow.setTimeZones(data.get(i).split(",")[1]);\r
+                                       String tmp = data.get(i).split(",")[2] + " " + data.get(i).split(",")[3];\r
+                                       SimpleDateFormat sdf = new SimpleDateFormat("MM/dd HH:mm");\r
+                                       maximumElectricPowerTomorrow.setUpdate(sdf.parse(tmp));\r
+                               } catch (ArrayIndexOutOfBoundsException e){\r
+                                       Log.d(LOG_TAG, "maximumElectricPowerTomorrow is null");\r
+                                       peakAvailabilityTomorrow = null;\r
+                               } catch (ParseException e) {\r
+                                       Log.d(LOG_TAG, "parsing failed");\r
+                                       return false;\r
+                               }\r
+                       }\r
+                       \r
+                       if (data.get(i).startsWith("DATE,TIME,当日実績(万kW),予測値(万kW)")) {\r
+                               i++;\r
+                               for (int j = i; j < i + 24; j++) {\r
+                                       PerHourUsage usage = new PerHourUsage();\r
+                                       String tmp = data.get(j).split(",")[0] + " " + data.get(j).split(",")[1];\r
+                                       SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");\r
+                                       try {\r
+                                               usage.setDate(sdf.parse(tmp));\r
+                                       } catch (ParseException e) {\r
+                                               Log.d(LOG_TAG, "parsing failed");\r
+                                               return false;\r
+                                       }\r
+                                       usage.setActual(Integer.parseInt(data.get(j).split(",")[2]));\r
+                                       usage.setExpected(Integer.parseInt(data.get(j).split(",")[3]));\r
+                                       perHourUsages.add(usage);\r
+                               }\r
+                       }\r
+                       \r
+                       if (data.get(i).startsWith("メッセージNo,")) {\r
+                               i++;\r
+                               try {\r
+                                       messages.add(data.get(i).split(",")[1]);\r
+                                       messages.add(data.get(i+1).split(",")[1]);\r
+                               } catch (ArrayIndexOutOfBoundsException e) {\r
+                                       Log.d(LOG_TAG, "messages is null");\r
+                                       messages = null;\r
+                               }\r
+                       }\r
+                       \r
+                       i++;\r
+               }\r
+               \r
+               return true;\r
+       }\r
+}\r
+\r
+/*\r
+ * juyo-j.csv フォーマット 変更履歴\r
+ */\r
+//2011/7/28 18:40 UPDATE\r
+//ピーク時供給力(万kW),時間帯,供給力情報更新日,供給力情報更新時刻\r
+//5160,9:00~20:00,7/28,8:30\r
+//\r
+//予想最大電力(万kW),時間帯,予想最大電力情報更新日,予想最大電力情報更新時刻\r
+//3930,14:00~15:00,7/28,8:30\r
+//\r
+//DATE,TIME,当日実績(万kW),予測値(万kW)\r
+//2011/7/28,0:00,3091,0\r
+//2011/7/28,1:00,2869,0\r
+//2011/7/28,2:00,2732,0\r
+//2011/7/28,3:00,2657,0\r
+//2011/7/28,4:00,2629,0\r
+//2011/7/28,5:00,2625,0\r
+//2011/7/28,6:00,2768,0\r
+//2011/7/28,7:00,3008,0\r
+//2011/7/28,8:00,3353,0\r
+//2011/7/28,9:00,3665,0\r
+//2011/7/28,10:00,3794,0\r
+//2011/7/28,11:00,3858,0\r
+//2011/7/28,12:00,3730,0\r
+//2011/7/28,13:00,3837,0\r
+//2011/7/28,14:00,3867,0\r
+//2011/7/28,15:00,3872,0\r
+//2011/7/28,16:00,3907,0\r
+//2011/7/28,17:00,3841,0\r
+//2011/7/28,18:00,0,3800\r
+//2011/7/28,19:00,0,3730\r
+//2011/7/28,20:00,0,0\r
+//2011/7/28,21:00,0,0\r
+//2011/7/28,22:00,0,0\r
+//2011/7/28,23:00,0,0\r
+//\r
+//翌日のピーク時供給力(万kW),時間帯,供給力情報更新日,供給力情報更新時刻\r
+//5030,9:00~20:00,7/28,17:30\r
+//\r
+//翌日の予想最大電力(万kW),時間帯,予想最大電力情報更新日,予想最大電力情報更新時刻\r
+//3810,14:00~15:00,7/28,17:30\r
+//\r
+//メッセージNo,節電お願い文\r
+//1,節電にご協力いただき、ありがとうございます。皆さまのご協力により、電気の供給は、比較的余裕のある一日となりそうです。\r
+//1,Thank you for your cooperation in helping us save electricity.Due to your efforts we will meet today’s Electricity Supply needs.\r
+//\r
+//DATE,TIME,当日実績(5分間隔値)(万kW)\r
+//2011/7/28,0:00,3235\r
+//2011/7/28,0:05,3190\r
+//2011/7/28,0:10,3186\r
+//2011/7/28,0:15,3153\r
+//2011/7/28,0:20,3123\r
+//2011/7/28,0:25,3101\r
+//2011/7/28,0:30,3073\r
+//2011/7/28,0:35,3041\r
+//2011/7/28,0:40,3020\r
+//2011/7/28,0:45,3009\r
+//2011/7/28,0:50,2993\r
+//2011/7/28,0:55,2963\r
+//2011/7/28,1:00,2962\r
+//2011/7/28,1:05,2942\r
+//2011/7/28,1:10,2920\r
+//2011/7/28,1:15,2904\r
+//2011/7/28,1:20,2879\r
+//2011/7/28,1:25,2865\r
+//2011/7/28,1:30,2855\r
+//2011/7/28,1:35,2840\r
+//2011/7/28,1:40,2835\r
+//2011/7/28,1:45,2822\r
+//2011/7/28,1:50,2810\r
+//2011/7/28,1:55,2797\r
+//2011/7/28,2:00,2781\r
+//2011/7/28,2:05,2768\r
+//2011/7/28,2:10,2767\r
+//2011/7/28,2:15,2748\r
+//2011/7/28,2:20,2742\r
+//2011/7/28,2:25,2731\r
+//2011/7/28,2:30,2716\r
+//2011/7/28,2:35,2717\r
+//2011/7/28,2:40,2727\r
+//2011/7/28,2:45,2704\r
+//2011/7/28,2:50,2702\r
+//2011/7/28,2:55,2687\r
+//2011/7/28,3:00,2672\r
+//2011/7/28,3:05,2658\r
+//2011/7/28,3:10,2659\r
+//2011/7/28,3:15,2675\r
+//2011/7/28,3:20,2662\r
+//2011/7/28,3:25,2655\r
+//2011/7/28,3:30,2646\r
+//2011/7/28,3:35,2650\r
+//2011/7/28,3:40,2653\r
+//2011/7/28,3:45,2645\r
+//2011/7/28,3:50,2657\r
+//2011/7/28,3:55,2648\r
+//2011/7/28,4:00,2643\r
+//2011/7/28,4:05,2648\r
+//2011/7/28,4:10,2637\r
+//2011/7/28,4:15,2639\r
+//2011/7/28,4:20,2638\r
+//2011/7/28,4:25,2615\r
+//2011/7/28,4:30,2630\r
+//2011/7/28,4:35,2627\r
+//2011/7/28,4:40,2623\r
+//2011/7/28,4:45,2616\r
+//2011/7/28,4:50,2613\r
+//2011/7/28,4:55,2613\r
+//2011/7/28,5:00,2624\r
+//2011/7/28,5:05,2616\r
+//2011/7/28,5:10,2627\r
+//2011/7/28,5:15,2624\r
+//2011/7/28,5:20,2618\r
+//2011/7/28,5:25,2627\r
+//2011/7/28,5:30,2623\r
+//2011/7/28,5:35,2634\r
+//2011/7/28,5:40,2623\r
+//2011/7/28,5:45,2616\r
+//2011/7/28,5:50,2632\r
+//2011/7/28,5:55,2637\r
+//2011/7/28,6:00,2675\r
+//2011/7/28,6:05,2697\r
+//2011/7/28,6:10,2712\r
+//2011/7/28,6:15,2727\r
+//2011/7/28,6:20,2729\r
+//2011/7/28,6:25,2735\r
+//2011/7/28,6:30,2763\r
+//2011/7/28,6:35,2793\r
+//2011/7/28,6:40,2815\r
+//2011/7/28,6:45,2831\r
+//2011/7/28,6:50,2860\r
+//2011/7/28,6:55,2882\r
+//2011/7/28,7:00,2891\r
+//2011/7/28,7:05,2923\r
+//2011/7/28,7:10,2934\r
+//2011/7/28,7:15,2966\r
+//2011/7/28,7:20,2959\r
+//2011/7/28,7:25,3001\r
+//2011/7/28,7:30,2994\r
+//2011/7/28,7:35,3036\r
+//2011/7/28,7:40,3063\r
+//2011/7/28,7:45,3084\r
+//2011/7/28,7:50,3086\r
+//2011/7/28,7:55,3154\r
+//2011/7/28,8:00,3177\r
+//2011/7/28,8:05,3203\r
+//2011/7/28,8:10,3238\r
+//2011/7/28,8:15,3261\r
+//2011/7/28,8:20,3283\r
+//2011/7/28,8:25,3334\r
+//2011/7/28,8:30,3361\r
+//2011/7/28,8:35,3416\r
+//2011/7/28,8:40,3458\r
+//2011/7/28,8:45,3486\r
+//2011/7/28,8:50,3490\r
+//2011/7/28,8:55,3526\r
+//2011/7/28,9:00,3559\r
+//2011/7/28,9:05,3596\r
+//2011/7/28,9:10,3629\r
+//2011/7/28,9:15,3625\r
+//2011/7/28,9:20,3636\r
+//2011/7/28,9:25,3641\r
+//2011/7/28,9:30,3672\r
+//2011/7/28,9:35,3709\r
+//2011/7/28,9:40,3722\r
+//2011/7/28,9:45,3721\r
+//2011/7/28,9:50,3723\r
+//2011/7/28,9:55,3745\r
+//2011/7/28,10:00,3761\r
+//2011/7/28,10:05,3763\r
+//2011/7/28,10:10,3771\r
+//2011/7/28,10:15,3781\r
+//2011/7/28,10:20,3793\r
+//2011/7/28,10:25,3798\r
+//2011/7/28,10:30,3791\r
+//2011/7/28,10:35,3806\r
+//2011/7/28,10:40,3812\r
+//2011/7/28,10:45,3809\r
+//2011/7/28,10:50,3819\r
+//2011/7/28,10:55,3824\r
+//2011/7/28,11:00,3839\r
+//2011/7/28,11:05,3850\r
+//2011/7/28,11:10,3845\r
+//2011/7/28,11:15,3853\r
+//2011/7/28,11:20,3849\r
+//2011/7/28,11:25,3856\r
+//2011/7/28,11:30,3852\r
+//2011/7/28,11:35,3885\r
+//2011/7/28,11:40,3867\r
+//2011/7/28,11:45,3875\r
+//2011/7/28,11:50,3858\r
+//2011/7/28,11:55,3866\r
+//2011/7/28,12:00,3830\r
+//2011/7/28,12:05,3771\r
+//2011/7/28,12:10,3745\r
+//2011/7/28,12:15,3737\r
+//2011/7/28,12:20,3707\r
+//2011/7/28,12:25,3701\r
+//2011/7/28,12:30,3708\r
+//2011/7/28,12:35,3702\r
+//2011/7/28,12:40,3699\r
+//2011/7/28,12:45,3695\r
+//2011/7/28,12:50,3730\r
+//2011/7/28,12:55,3738\r
+//2011/7/28,13:00,3768\r
+//2011/7/28,13:05,3809\r
+//2011/7/28,13:10,3826\r
+//2011/7/28,13:15,3841\r
+//2011/7/28,13:20,3834\r
+//2011/7/28,13:25,3832\r
+//2011/7/28,13:30,3850\r
+//2011/7/28,13:35,3846\r
+//2011/7/28,13:40,3866\r
+//2011/7/28,13:45,3858\r
+//2011/7/28,13:50,3857\r
+//2011/7/28,13:55,3856\r
+//2011/7/28,14:00,3849\r
+//2011/7/28,14:05,3877\r
+//2011/7/28,14:10,3867\r
+//2011/7/28,14:15,3861\r
+//2011/7/28,14:20,3878\r
+//2011/7/28,14:25,3869\r
+//2011/7/28,14:30,3865\r
+//2011/7/28,14:35,3869\r
+//2011/7/28,14:40,3860\r
+//2011/7/28,14:45,3865\r
+//2011/7/28,14:50,3868\r
+//2011/7/28,14:55,3876\r
+//2011/7/28,15:00,3856\r
+//2011/7/28,15:05,3853\r
+//2011/7/28,15:10,3834\r
+//2011/7/28,15:15,3850\r
+//2011/7/28,15:20,3871\r
+//2011/7/28,15:25,3868\r
+//2011/7/28,15:30,3884\r
+//2011/7/28,15:35,3888\r
+//2011/7/28,15:40,3894\r
+//2011/7/28,15:45,3884\r
+//2011/7/28,15:50,3898\r
+//2011/7/28,15:55,3888\r
+//2011/7/28,16:00,3897\r
+//2011/7/28,16:05,3912\r
+//2011/7/28,16:10,3922\r
+//2011/7/28,16:15,3908\r
+//2011/7/28,16:20,3922\r
+//2011/7/28,16:25,3906\r
+//2011/7/28,16:30,3914\r
+//2011/7/28,16:35,3898\r
+//2011/7/28,16:40,3914\r
+//2011/7/28,16:45,3908\r
+//2011/7/28,16:50,3901\r
+//2011/7/28,16:55,3886\r
+//2011/7/28,17:00,3859\r
+//2011/7/28,17:05,3853\r
+//2011/7/28,17:10,3845\r
+//2011/7/28,17:15,3853\r
+//2011/7/28,17:20,3830\r
+//2011/7/28,17:25,3844\r
+//2011/7/28,17:30,3825\r
+//2011/7/28,17:35,3834\r
+//2011/7/28,17:40,3835\r
+//2011/7/28,17:45,3830\r
+//2011/7/28,17:50,3842\r
+//2011/7/28,17:55,3837\r
+//2011/7/28,18:00,3818\r
+//2011/7/28,18:05,3805\r
+//2011/7/28,18:10,3814\r
+//2011/7/28,18:15,3815\r
+//2011/7/28,18:20,3827\r
+//2011/7/28,18:25,3850\r
+//2011/7/28,18:30,3837\r
+//2011/7/28,18:35,3850\r
+//2011/7/28,18:40,3859\r
+//2011/7/28,18:45,\r
+//2011/7/28,18:50,\r
+//2011/7/28,18:55,\r
+//2011/7/28,19:00,\r
+//2011/7/28,19:05,\r
+//2011/7/28,19:10,\r
+//2011/7/28,19:15,\r
+//2011/7/28,19:20,\r
+//2011/7/28,19:25,\r
+//2011/7/28,19:30,\r
+//2011/7/28,19:35,\r
+//2011/7/28,19:40,\r
+//2011/7/28,19:45,\r
+//2011/7/28,19:50,\r
+//2011/7/28,19:55,\r
+//2011/7/28,20:00,\r
+//2011/7/28,20:05,\r
+//2011/7/28,20:10,\r
+//2011/7/28,20:15,\r
+//2011/7/28,20:20,\r
+//2011/7/28,20:25,\r
+//2011/7/28,20:30,\r
+//2011/7/28,20:35,\r
+//2011/7/28,20:40,\r
+//2011/7/28,20:45,\r
+//2011/7/28,20:50,\r
+//2011/7/28,20:55,\r
+//2011/7/28,21:00,\r
+//2011/7/28,21:05,\r
+//2011/7/28,21:10,\r
+//2011/7/28,21:15,\r
+//2011/7/28,21:20,\r
+//2011/7/28,21:25,\r
+//2011/7/28,21:30,\r
+//2011/7/28,21:35,\r
+//2011/7/28,21:40,\r
+//2011/7/28,21:45,\r
+//2011/7/28,21:50,\r
+//2011/7/28,21:55,\r
+//2011/7/28,22:00,\r
+//2011/7/28,22:05,\r
+//2011/7/28,22:10,\r
+//2011/7/28,22:15,\r
+//2011/7/28,22:20,\r
+//2011/7/28,22:25,\r
+//2011/7/28,22:30,\r
+//2011/7/28,22:35,\r
+//2011/7/28,22:40,\r
+//2011/7/28,22:45,\r
+//2011/7/28,22:50,\r
+//2011/7/28,22:55,\r
+//2011/7/28,23:00,\r
+//2011/7/28,23:05,\r
+//2011/7/28,23:10,\r
+//2011/7/28,23:15,\r
+//2011/7/28,23:20,\r
+//2011/7/28,23:25,\r
+//2011/7/28,23:30,\r
+//2011/7/28,23:35,\r
+//2011/7/28,23:40,\r
+//2011/7/28,23:45,\r
+//2011/7/28,23:50,\r
+//2011/7/28,23:55,\r
+\r
+// 2011/3/28 時点での csv のフォーマット\r
+// -----------------------------------------------------------------\r
+// 2011/3/28 7:05 UPDATE\r
+// ピーク時供給力(万kW),時台,供給力情報更新日,供給力情報更新時刻\r
+// 3850,18:00,3/27,17:30\r
+//\r
+// DATE,TIME,当日実績(万kW),前日実績(万kW)\r
+// 2011/3/28,0:00,2710,2904\r
+// 2011/3/28,1:00,2576,2759\r
+// 2011/3/28,2:00,2506,2661\r
+// 2011/3/28,3:00,2457,2578\r
+// 2011/3/28,4:00,2454,2520\r
+// 2011/3/28,5:00,2589,2529\r
+// 2011/3/28,6:00,2863,2598\r
+// 2011/3/28,7:00,0,2760\r
+// 2011/3/28,8:00,0,2908\r
+// 2011/3/28,9:00,0,2946\r
+// 2011/3/28,10:00,0,2913\r
+// 2011/3/28,11:00,0,2857\r
+// 2011/3/28,12:00,0,2826\r
+// 2011/3/28,13:00,0,2786\r
+// 2011/3/28,14:00,0,2772\r
+// 2011/3/28,15:00,0,2786\r
+// 2011/3/28,16:00,0,2860\r
+// 2011/3/28,17:00,0,3073\r
+// 2011/3/28,18:00,0,3371\r
+// 2011/3/28,19:00,0,3392\r
+// 2011/3/28,20:00,0,3345\r
+// 2011/3/28,21:00,0,3251\r
+// 2011/3/28,22:00,0,3103\r
+// 2011/3/28,23:00,0,2939\r
+// -----------------------------------------------------------------\r
+\r
+//2011/4/8 時点での csv のフォーマット\r
+//-----------------------------------------------------------------\r
+//2011/4/8 5:30 UPDATE\r
+//ピーク時供給力(万kW),時台,供給力情報更新日,供給力情報更新時刻\r
+//4050,18:00,4/8,1:05\r
+//\r
+//予想最大電力(万kW),時間帯,予想最大電力情報更新日,予想最大電力情報更新時刻\r
+//3350,18:00~19:00,4/8,1:05\r
+//\r
+//DATE,TIME,当日実績(万kW),前日実績(万kW)\r
+//2011/4/8,0:00,2677,2659\r
+//2011/4/8,1:00,2546,2551\r
+//2011/4/8,2:00,2484,2492\r
+//2011/4/8,3:00,2438,2442\r
+//2011/4/8,4:00,2424,2438\r
+//2011/4/8,5:00,0,2499\r
+//2011/4/8,6:00,0,2713\r
+//2011/4/8,7:00,0,2909\r
+//2011/4/8,8:00,0,3153\r
+//2011/4/8,9:00,0,3301\r
+//2011/4/8,10:00,0,3300\r
+//2011/4/8,11:00,0,3287\r
+//2011/4/8,12:00,0,3051\r
+//2011/4/8,13:00,0,3183\r
+//2011/4/8,14:00,0,3184\r
+//2011/4/8,15:00,0,3124\r
+//2011/4/8,16:00,0,3133\r
+//2011/4/8,17:00,0,3114\r
+//2011/4/8,18:00,0,3295\r
+//2011/4/8,19:00,0,3281\r
+//2011/4/8,20:00,0,3177\r
+//2011/4/8,21:00,0,3071\r
+//2011/4/8,22:00,0,3018\r
+//2011/4/8,23:00,0,2860\r
+//-----------------------------------------------------------------
\ No newline at end of file
diff --git a/src/jp/co/app/ynomoto/pmft/receiver/PowerMeterWidget.java b/src/jp/co/app/ynomoto/pmft/receiver/PowerMeterWidget.java
new file mode 100644 (file)
index 0000000..60ae5a7
--- /dev/null
@@ -0,0 +1,169 @@
+package jp.co.app.ynomoto.pmft.receiver;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.apache.http.client.ClientProtocolException;
+
+import jp.co.app.ynomoto.pmft.R;
+import jp.co.app.ynomoto.pmft.data.PerHourUsage;
+import jp.co.app.ynomoto.pmft.parser.TepcoParser;
+
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.os.AsyncTask;
+import android.preference.PreferenceManager;
+import android.widget.RemoteViews;
+import android.widget.Toast;
+
+import android.util.Log;
+
+public class PowerMeterWidget extends AppWidgetProvider {
+       private static final String UPDATE_INTENT = "jp.co.app.ynomoto.pmft.UPDATE";
+       // awm と context は、PowerMeterMain クラスで参照したいので、static 宣言する。
+       private static AppWidgetManager awm;
+       private static SharedPreferences sp;
+       private static int[] appWidgetIds;
+       
+       @Override
+       public void onUpdate(Context context, AppWidgetManager awm, int[] appWidgetIds) {
+               PowerMeterWidget.awm = awm; 
+               sp = PreferenceManager.getDefaultSharedPreferences(context);
+               PowerMeterWidget.appWidgetIds = appWidgetIds;
+               
+               for (int i = 0; i < appWidgetIds.length; i++) {
+                       (new PowerMeterMain(appWidgetIds[i], context)).execute();
+               }
+       }
+       
+       @Override
+       public void onReceive(Context context, Intent intent){
+               // onUpdate() を実行するために、スーパークラスの onReceive を呼ぶ。
+               super.onReceive(context, intent);
+               // ネットワークエラー復帰後を想定して、UPDATE_INTENT によるデータ更新を行う。
+               if (intent.getAction().equals(UPDATE_INTENT)) {
+                       if (awm != null) {
+                               for (int i = 0; i < appWidgetIds.length; i++) {
+                                       (new PowerMeterMain(appWidgetIds[i], context)).execute();
+                               }
+                       }
+               }
+       }
+       
+       public class PowerMeterMain extends AsyncTask<Void, Void, RemoteViews>{
+               private int appWidgetId;
+               private Context context;
+               
+               public PowerMeterMain(int appWidgetId, Context context){
+                       this.appWidgetId = appWidgetId;
+                       this.context = context;
+               }
+
+               @Override
+               protected RemoteViews doInBackground(Void... params) {
+
+                       Log.v("jp.co.app.ynomoto.pmft.PowerMeter", "update appWidgetIds: "
+                                       + appWidgetId);
+                       // 何かが影響して次の行で NullPointerException が発生する可能性がある。
+                       // 実機上(Xperia)で2度同じ事象が確認されている。
+                       Log.v("jp.co.app.ynomoto.pmft.PowerMeter",
+                                       "Check NullPointerException");
+                       Log.v("jp.co.app.ynomoto.pmft.PowerMeter",
+                                       "context.getPackageName():" + context.getPackageName());
+
+                       // リモートビューに main.xml をセットする。
+                       RemoteViews rv = new RemoteViews(context.getPackageName(),
+                                       R.layout.widget);
+
+                       // csv の取得を行う。取得されたデータは解析済み
+                       TepcoParser parser;
+                       try {
+                               parser = new TepcoParser(sp.getString("csvUrl",
+                                               "http://powermeter.sourceforge.jp/juyo-j.csv"));
+                               // ウィジェットをクリックしたときに PerHourUsagesGraph を起動する処理
+                               // rv.setOnClickPendingIntent();
+
+                               // ピーク時供給力供給量に対する電力の消費率を表示
+                               ArrayList<PerHourUsage> hourUsages = parser.getPerHourUsages();
+                               int usage;
+                               if (parser.getUpdate().getHours() == 0) {
+                                       usage = calculate(hourUsages.get(23).getActual(), parser
+                                                       .getPeakAvailabilityToday().getPower());
+                               } else {
+                                       usage = calculate(hourUsages.get(
+                                                       parser.getUpdate().getHours() - 1).getActual(),
+                                                       parser.getPeakAvailabilityToday().getPower());
+                               }
+                               Log.v("jp.co.app.ynomoto.pmft.PowerMeter", "usage=" + usage);
+                               rv.setTextViewText(R.id.textView1, Integer.toString(usage)
+                                               + "%");
+
+                               // 電力消費率による顔文字の変化
+                               if (usage >= 90) {
+                                       rv.setTextViewText(R.id.textView2, sp.getString(
+                                                       "kaoMoji90", "(´;ω;`)"));
+                               } else if (usage >= 70) {
+                                       rv.setTextViewText(R.id.textView2, sp.getString(
+                                                       "kaoMoji70", "(´・ω・`)"));
+                               } else {
+                                       rv.setTextViewText(R.id.textView2, sp.getString(
+                                                       "kaoMoji69", "(`・ω・´)"));
+                               }
+
+                               // テキストカラーと背景を変更する。
+                               rv.setTextColor(R.id.textView1, Color.parseColor(sp.getString(
+                                               "textColor", "#ffffff")));
+                               rv.setTextColor(R.id.textView2, Color.parseColor(sp.getString(
+                                               "textColor", "#ffffff")));
+                               String str = sp.getString("background", "background");
+                               if (str.equals("background_white")) {
+                                       rv.setImageViewResource(R.id.imageView1,
+                                                       R.drawable.background_white);
+                               } else if (str.equals("background_black")) {
+                                       rv.setImageViewResource(R.id.imageView1,
+                                                       R.drawable.background_black);
+                               } else if (str.equals("background_red")) {
+                                       rv.setImageViewResource(R.id.imageView1,
+                                                       R.drawable.background_red);
+                               } else if (str.equals("background_blue")) {
+                                       rv.setImageViewResource(R.id.imageView1,
+                                                       R.drawable.background_blue);
+                               } else if (str.equals("background_yellow")) {
+                                       rv.setImageViewResource(R.id.imageView1,
+                                                       R.drawable.background_yellow);
+                               } else {
+                                       rv.setImageViewResource(R.id.imageView1,
+                                                       R.drawable.background);
+                               }
+                               
+                               return rv;
+                               
+                       } catch (ClientProtocolException e) {
+                               e.printStackTrace();
+                               return null;
+                       } catch (IOException e) {
+                               // TODO Auto-generated catch block
+                               e.printStackTrace();
+                               return null;
+                       } 
+               }
+               
+               @Override
+               protected void onPostExecute(RemoteViews rv) {
+                       if (rv == null) {
+                               Toast.makeText(context, "電力情報の取得に失敗しました。", Toast.LENGTH_SHORT)
+                                               .show();
+                       } else {
+                               awm.updateAppWidget(appWidgetId, rv);
+                       }
+               }
+
+               public int calculate(int currentKw, int maximumKw) {
+                       return (int) ((float) currentKw / maximumKw * 100);
+               }
+       }
+}
diff --git a/src/jp/co/app/ynomoto/pmft/service/PowerMeterService.java b/src/jp/co/app/ynomoto/pmft/service/PowerMeterService.java
new file mode 100644 (file)
index 0000000..ed4a8f9
--- /dev/null
@@ -0,0 +1,15 @@
+package jp.co.app.ynomoto.pmft.service;\r
+\r
+import android.app.Service;\r
+import android.content.Intent;\r
+import android.os.IBinder;\r
+\r
+public class PowerMeterService extends Service {\r
+\r
+       @Override\r
+       public IBinder onBind(Intent intent) {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+\r
+}\r