--- /dev/null
+<?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>
--- /dev/null
+*.apk
+*.dex
+*.class
+PowerMeter
+resources.ap_
--- /dev/null
+<?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>
--- /dev/null
+<?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
--- /dev/null
+# 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
--- /dev/null
+/* 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;
+ }
+}
--- /dev/null
+-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 *;
+}
--- /dev/null
+本ソフトウェアは、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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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);
+ }
+}
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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);
+ }
+ }
+}
--- /dev/null
+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