From 54e5fcd562171a4e4441eb6eb480c2f5a558835f Mon Sep 17 00:00:00 2001 From: Dinhcv Date: Wed, 11 Oct 2017 12:33:32 +0700 Subject: [PATCH] handle top api --- .../lifelogpedometer/activity/DateFragment.java | 15 +- .../lifelogpedometer/activity/MainActivity.java | 86 ------- .../lifelogpedometer/activity/SensorFilter.java | 47 ---- .../lifelogpedometer/activity/StepDetector.java | 65 ----- .../lifelogpedometer/activity/StepListener.java | 7 - .../lifelogpedometer/activity/TopFragment.java | 263 +++++++++++++++++++-- app/src/main/res/layout/fragment_top.xml | 4 +- app/src/main/res/values/strings.xml | 70 +++--- 8 files changed, 291 insertions(+), 266 deletions(-) delete mode 100644 app/src/main/java/com/dinhcv/lifelogpedometer/activity/MainActivity.java delete mode 100644 app/src/main/java/com/dinhcv/lifelogpedometer/activity/SensorFilter.java delete mode 100644 app/src/main/java/com/dinhcv/lifelogpedometer/activity/StepDetector.java delete mode 100644 app/src/main/java/com/dinhcv/lifelogpedometer/activity/StepListener.java diff --git a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/DateFragment.java b/app/src/main/java/com/dinhcv/lifelogpedometer/activity/DateFragment.java index ef76535..86da258 100644 --- a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/DateFragment.java +++ b/app/src/main/java/com/dinhcv/lifelogpedometer/activity/DateFragment.java @@ -4,6 +4,10 @@ import android.app.DatePickerDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; @@ -14,6 +18,7 @@ import android.widget.DatePicker; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.Toast; import com.dinhcv.lifelogpedometer.R; import com.dinhcv.lifelogpedometer.adapter.NoticeAdapter; @@ -280,14 +285,13 @@ public class DateFragment extends FragmentBase implements SettingFragmentPresent mTagetInfo = new TagetInfo();; } - updateUI(); + loadUI(); } - private void updateUI(){ - - tvStep.setText(mTagetInfo.getSteps()); - tvRemain.setText(mTagetInfo.getStepRemain()); + private void loadUI(){ + tvStep.setText(String.valueOf(mTagetInfo.getSteps())); + tvRemain.setText(String.valueOf(mTagetInfo.getStepRemain())); tvRateDone.setText(getResources().getString(R.string.percent_unit, mTagetInfo.getCompletePercent())); List infoLists = mTagetInfo.getNoticeList(); @@ -334,4 +338,5 @@ public class DateFragment extends FragmentBase implements SettingFragmentPresent super.onActivityResult(requestCode, resultCode, data); } + } diff --git a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/MainActivity.java b/app/src/main/java/com/dinhcv/lifelogpedometer/activity/MainActivity.java deleted file mode 100644 index f915ec2..0000000 --- a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/MainActivity.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.dinhcv.lifelogpedometer.activity; - -import android.hardware.Sensor; -import android.hardware.SensorEvent; -import android.hardware.SensorEventListener; -import android.hardware.SensorManager; -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; -import android.view.View; -import android.widget.Button; -import android.widget.TextView; - -import com.dinhcv.lifelogpedometer.R; - -public class MainActivity extends AppCompatActivity implements SensorEventListener, StepListener { - private TextView tvSteps; - private Button btnStart; - private Button btnStop; - private StepDetector simpleStepDetector; - private SensorManager sensorManager; - private Sensor accel; - private static final String TEXT_NUM_STEPS = "Number of Steps: "; - private int numSteps; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - - // Get an instance of the SensorManager - sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); - accel = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); - simpleStepDetector = new StepDetector(); - simpleStepDetector.registerListener(this); - - tvSteps = (TextView) findViewById(R.id.tv_steps); - btnStart = (Button) findViewById(R.id.btn_start); - btnStop = (Button) findViewById(R.id.btn_stop); - - - - btnStart.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View arg0) { - - numSteps = 0; - sensorManager.registerListener(MainActivity.this, accel, SensorManager.SENSOR_DELAY_FASTEST); - - } - }); - - - btnStop.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View arg0) { - - sensorManager.unregisterListener(MainActivity.this); - - } - }); - } - - - - @Override - public void onAccuracyChanged(Sensor sensor, int accuracy) { - } - - @Override - public void onSensorChanged(SensorEvent event) { - if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { - simpleStepDetector.updateAccel( - event.timestamp, event.values[0], event.values[1], event.values[2]); - } - } - - @Override - public void step(long timeNs) { - numSteps++; - tvSteps.setText(TEXT_NUM_STEPS + numSteps); - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/SensorFilter.java b/app/src/main/java/com/dinhcv/lifelogpedometer/activity/SensorFilter.java deleted file mode 100644 index 0d7daf9..0000000 --- a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/SensorFilter.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.dinhcv.lifelogpedometer.activity; - -public class SensorFilter { - - private SensorFilter() { - } - - public static float sum(float[] array) { - float retval = 0; - for (int i = 0; i < array.length; i++) { - retval += array[i]; - } - return retval; - } - - public static float[] cross(float[] arrayA, float[] arrayB) { - float[] retArray = new float[3]; - retArray[0] = arrayA[1] * arrayB[2] - arrayA[2] * arrayB[1]; - retArray[1] = arrayA[2] * arrayB[0] - arrayA[0] * arrayB[2]; - retArray[2] = arrayA[0] * arrayB[1] - arrayA[1] * arrayB[0]; - return retArray; - } - - public static float norm(float[] array) { - float retval = 0; - for (int i = 0; i < array.length; i++) { - retval += array[i] * array[i]; - } - return (float) Math.sqrt(retval); - } - - - public static float dot(float[] a, float[] b) { - float retval = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - return retval; - } - - public static float[] normalize(float[] a) { - float[] retval = new float[a.length]; - float norm = norm(a); - for (int i = 0; i < a.length; i++) { - retval[i] = a[i] / norm; - } - return retval; - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/StepDetector.java b/app/src/main/java/com/dinhcv/lifelogpedometer/activity/StepDetector.java deleted file mode 100644 index 5880211..0000000 --- a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/StepDetector.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.dinhcv.lifelogpedometer.activity; - -public class StepDetector { - - private static final int ACCEL_RING_SIZE = 50; - private static final int VEL_RING_SIZE = 10; - - // change this threshold according to your sensitivity preferences - private static final float STEP_THRESHOLD = 50f; - - private static final int STEP_DELAY_NS = 250000000; - - private int accelRingCounter = 0; - private float[] accelRingX = new float[ACCEL_RING_SIZE]; - private float[] accelRingY = new float[ACCEL_RING_SIZE]; - private float[] accelRingZ = new float[ACCEL_RING_SIZE]; - private int velRingCounter = 0; - private float[] velRing = new float[VEL_RING_SIZE]; - private long lastStepTimeNs = 0; - private float oldVelocityEstimate = 0; - - private StepListener listener; - - public void registerListener(StepListener listener) { - this.listener = listener; - } - - - public void updateAccel(long timeNs, float x, float y, float z) { - float[] currentAccel = new float[3]; - currentAccel[0] = x; - currentAccel[1] = y; - currentAccel[2] = z; - - // First step is to update our guess of where the global z vector is. - accelRingCounter++; - accelRingX[accelRingCounter % ACCEL_RING_SIZE] = currentAccel[0]; - accelRingY[accelRingCounter % ACCEL_RING_SIZE] = currentAccel[1]; - accelRingZ[accelRingCounter % ACCEL_RING_SIZE] = currentAccel[2]; - - float[] worldZ = new float[3]; - worldZ[0] = SensorFilter.sum(accelRingX) / Math.min(accelRingCounter, ACCEL_RING_SIZE); - worldZ[1] = SensorFilter.sum(accelRingY) / Math.min(accelRingCounter, ACCEL_RING_SIZE); - worldZ[2] = SensorFilter.sum(accelRingZ) / Math.min(accelRingCounter, ACCEL_RING_SIZE); - - float normalization_factor = SensorFilter.norm(worldZ); - - worldZ[0] = worldZ[0] / normalization_factor; - worldZ[1] = worldZ[1] / normalization_factor; - worldZ[2] = worldZ[2] / normalization_factor; - - float currentZ = SensorFilter.dot(worldZ, currentAccel) - normalization_factor; - velRingCounter++; - velRing[velRingCounter % VEL_RING_SIZE] = currentZ; - - float velocityEstimate = SensorFilter.sum(velRing); - - if (velocityEstimate > STEP_THRESHOLD && oldVelocityEstimate <= STEP_THRESHOLD - && (timeNs - lastStepTimeNs > STEP_DELAY_NS)) { - listener.step(timeNs); - lastStepTimeNs = timeNs; - } - oldVelocityEstimate = velocityEstimate; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/StepListener.java b/app/src/main/java/com/dinhcv/lifelogpedometer/activity/StepListener.java deleted file mode 100644 index 980765a..0000000 --- a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/StepListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dinhcv.lifelogpedometer.activity; - -public interface StepListener { - - public void step(long timeNs); - -} \ No newline at end of file diff --git a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/TopFragment.java b/app/src/main/java/com/dinhcv/lifelogpedometer/activity/TopFragment.java index 2c47d9b..5564b53 100644 --- a/app/src/main/java/com/dinhcv/lifelogpedometer/activity/TopFragment.java +++ b/app/src/main/java/com/dinhcv/lifelogpedometer/activity/TopFragment.java @@ -3,6 +3,10 @@ package com.dinhcv.lifelogpedometer.activity; import android.app.DatePickerDialog; import android.content.Context; import android.graphics.Color; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; import android.os.Bundle; import android.support.annotation.Nullable; import android.util.Pair; @@ -13,13 +17,18 @@ import android.view.View; import android.view.ViewGroup; import android.widget.DatePicker; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.Toast; import com.dinhcv.lifelogpedometer.R; import com.dinhcv.lifelogpedometer.feature.Database; +import com.dinhcv.lifelogpedometer.interfaces.LLAPIManagerListener; import com.dinhcv.lifelogpedometer.model.StepModel; +import com.dinhcv.lifelogpedometer.portal.LLAPIManager; import com.dinhcv.lifelogpedometer.utils.Const; import com.dinhcv.lifelogpedometer.utils.DayAxisValueFormatter; +import com.dinhcv.lifelogpedometer.utils.Debug; import com.dinhcv.lifelogpedometer.utils.Utils; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.components.YAxis; @@ -32,6 +41,8 @@ import com.github.mikephil.charting.interfaces.datasets.IBarDataSet; import org.eazegraph.lib.charts.PieChart; import org.eazegraph.lib.models.PieModel; +import org.json.JSONArray; +import org.json.JSONObject; import java.text.NumberFormat; import java.util.ArrayList; @@ -43,9 +54,10 @@ import java.util.Locale; import static com.github.mikephil.charting.utils.ColorTemplate.rgb; -public class TopFragment extends FragmentBase implements SettingFragmentPresenter { +public class TopFragment extends FragmentBase implements SettingFragmentPresenter, SensorEventListener { private TextView stepsView; + private TextView tvStepGoal; private TextView tvDistance; private TextView tvStepRemain; private TextView tvStepRateDone; @@ -57,6 +69,10 @@ public class TopFragment extends FragmentBase implements SettingFragmentPresente private ImageView ivNext; private ImageView ivPlay; + private LinearLayout llBike; + private LinearLayout llWalking; + private LinearLayout llRunning; + private Const.STEP_TYPE stepType; private Date mAnaDate; private Calendar mCalendar; @@ -65,11 +81,23 @@ public class TopFragment extends FragmentBase implements SettingFragmentPresente private int mAnaMonth; private int mAnaYear; - private int todayOffset, total_start, since_boot; - public final static NumberFormat formatter = NumberFormat.getInstance(Locale.getDefault()); public static int STEP_SIZE = 75; private StepModel mStepModel; + private TextView tvSmallStepGoal; private TextView tvSmallRemain; + private Context mContext; + + private SensorManager sensorManager; + private boolean activityRunning; + private int stepTotal = 0; + private int stepRemain = 0; + private int stepCount = 0; + + private BarChart mChart; + + private List dateList; + private String[] mParties; + private Integer[] mStep; @Override public void onCreate(final Bundle savedInstanceState) { @@ -80,19 +108,11 @@ public class TopFragment extends FragmentBase implements SettingFragmentPresente @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { - final View v = inflater.inflate(com.dinhcv.lifelogpedometer.R.layout.fragment_top, null); - stepsView = (TextView) v.findViewById(R.id.steps); - tvDistance = (TextView) v.findViewById(R.id.tv_distance); - tvStepRemain = (TextView) v.findViewById(R.id.tv_stepRemain); - tvStepRateDone = (TextView) v.findViewById(R.id.tv_stepRateDone); - tvSmallRemain = (TextView) v.findViewById(R.id.tv_smallRemain); - tvDate = (TextView) v.findViewById(R.id.tv_date); - ivBack = (ImageView) v.findViewById(R.id.iv_back); - ivNext = (ImageView) v.findViewById(R.id.iv_next); - ivPlay = (ImageView) v.findViewById(R.id.iv_play); + final View v = inflater.inflate(R.layout.fragment_top, null); + mContext = getActivity(); + sensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); - mChart = (BarChart) v.findViewById(R.id.chart); - pg = (PieChart) v.findViewById(R.id.graph); + initView(v); // slice for the steps taken today sliceCurrent = new PieModel("", 0, Color.parseColor("#6FE7F7")); @@ -120,6 +140,23 @@ public class TopFragment extends FragmentBase implements SettingFragmentPresente return v; } + private void initView(View v){ + stepsView = (TextView) v.findViewById(R.id.steps); + tvDistance = (TextView) v.findViewById(R.id.tv_distance); + tvStepGoal = (TextView) v.findViewById(R.id.tv_stepGoal); + tvStepRemain = (TextView) v.findViewById(R.id.tv_stepRemain); + tvStepRateDone = (TextView) v.findViewById(R.id.tv_stepRateDone); + tvSmallStepGoal = (TextView) v.findViewById(R.id.tv_smallStepGoal); + tvSmallRemain = (TextView) v.findViewById(R.id.tv_smallRemain); + tvDate = (TextView) v.findViewById(R.id.tv_date); + ivBack = (ImageView) v.findViewById(R.id.iv_back); + ivNext = (ImageView) v.findViewById(R.id.iv_next); + ivPlay = (ImageView) v.findViewById(R.id.iv_play); + + mChart = (BarChart) v.findViewById(R.id.chart); + pg = (PieChart) v.findViewById(R.id.graph); + } + private void stepsDistanceChanged() { updatePie(); updateBars(); @@ -187,11 +224,6 @@ public class TopFragment extends FragmentBase implements SettingFragmentPresente initGraph(); } - private BarChart mChart; - - private List dateList; - private String[] mParties; - private Integer[] mStep; private void initGraph(){ @@ -321,7 +353,43 @@ public class TopFragment extends FragmentBase implements SettingFragmentPresente } }); + llWalking.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + stepType = Const.STEP_TYPE.WALKING; + updateUiStepType(false, true, false); + // add data + getTopData(mAnaDate, stepType); + } + }); + + llRunning.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + stepType = Const.STEP_TYPE.RUNNING; + updateUiStepType(false, false, true); + // add + getTopData(mAnaDate, stepType); + } + }); + + llBike.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + stepType = Const.STEP_TYPE.BIKE; + updateUiStepType(true, false, false); + // add data + getTopData(mAnaDate, stepType); + } + }); + + + } + private void updateUiStepType(boolean b1, boolean b2, boolean b3) { + llBike.setSelected(b1); + llWalking.setSelected(b2); + llRunning.setSelected(b3); } @@ -347,7 +415,100 @@ public class TopFragment extends FragmentBase implements SettingFragmentPresente } + private void getTopData(Date date, Const.STEP_TYPE stepType){ + + showDialog(mContext); + LLAPIManager.homePage(date, stepType, new LLAPIManagerListener() { + @Override + public void onError(Error error) { + Debug.error("Get data history error"); + hiddenDialog(); + showDialogNotData(); + } + + @Override + public void onSuccess(String json) { + Debug.error("Get data history success"); + hiddenDialog(); + loadDataDone(json); + } + + @Override + public void onSuccess(JSONObject object) { + Debug.error("Get data history success"); + hiddenDialog(); + } + }); + } + + private void showDialogNotData(){ + showAlerDialog(mContext, getResources().getString(R.string.can_not_get_data)); + } + + private void loadDataDone(String jsonString) { + JSONObject jsonObject = null; + try { + jsonObject = new JSONObject(jsonString); + int status = jsonObject.optInt("status"); + if (status == 1) { + JSONObject jsonObject1 = jsonObject.optJSONObject("result"); + JSONObject targetInf = jsonObject1.getJSONObject("targetInf"); + JSONArray listNotice = jsonObject1.getJSONArray("listNotice"); + + if (targetInf != null){ + String target = targetInf.optString("target_step"); + Debug.normal("Target: "+ target); + mTagetInfo.setTaget(targetInf.optString("target_step")); + mTagetInfo.setSteps(targetInf.optString("num_step")); + mTagetInfo.setStepRemain(targetInf.optString("remaining_step")); + mTagetInfo.setCompletePercent(targetInf.optString("complete_percent")); + } + + if (listNotice != null && listNotice.length() > 0) { + List infoLists = new ArrayList<>(); + for (int i = 0; i < listNotice.length(); i++){ + NoticeInfo noticeInfo = new NoticeInfo(); + JSONObject ob = (JSONObject) listNotice.get(i); + noticeInfo.setId(ob.optInt("id")); + noticeInfo.setContent(ob.optString("notice_content")); + infoLists.add(noticeInfo); + } + + mTagetInfo.setNoticeList(infoLists); + } + } + } catch (JSONException e) { + e.printStackTrace(); + mTagetInfo = new TagetInfo();; + } + + loadUI(); + } + + + private void loadUI(){ + tvStep.setText(String.valueOf(mTagetInfo.getSteps())); + tvRemain.setText(String.valueOf(mTagetInfo.getStepRemain())); + tvRateDone.setText(getResources().getString(R.string.percent_unit, mTagetInfo.getCompletePercent())); + + List infoLists = mTagetInfo.getNoticeList(); + if (infoLists != null && infoLists.size() >0){ + mNoticeAdapter = new NoticeAdapter(mContext, infoLists); + lvNotice.setAdapter(mNoticeAdapter); + lvNotice.setExpanded(true); + } + + } + + private void updateUI(){ + stepTotal = stepTotal + stepCount; + stepRemain = stepRemain - stepCount; + double percentDone = stepTotal *100.0 / (stepTotal + stepRemain); + tvStep.setText(String.valueOf(stepTotal)); + tvRemain.setText(mTagetInfo.getStepRemain()); + tvRateDone.setText(getResources().getString(R.string.percent_unit, Utils.convert2String2Decimal(percentDone))); + } @Override public void onAttach(Context context) { @@ -376,4 +537,66 @@ public class TopFragment extends FragmentBase implements SettingFragmentPresente initData(); } + + @Override + public void onResume() { + super.onResume(); + activityRunning = true; + Sensor countSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); + if (countSensor != null) { + sensorManager.registerListener(this, countSensor, SensorManager.SENSOR_DELAY_UI); + } else { + Toast.makeText(mContext, getResources().getString(R.string.sensor_available), Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onSensorChanged(SensorEvent event) { + if (activityRunning){ + stepCount = (int) event.values[0]; + // update UI + updateUI(); + } + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + + } + + @Override + public void onPause() { + super.onPause(); + activityRunning = false; + } + + @Override + public void onDestroy() { + super.onDestroy(); + + + } + + private void creatLogStep(Date date, Const.STEP_TYPE stepType){ + + LLAPIManager.homePage(date, stepType, new LLAPIManagerListener() { + @Override + public void onError(Error error) { + Debug.error("Get data history error"); + } + + @Override + public void onSuccess(String json) { + Debug.error("Get data history success"); + hiddenDialog(); + loadDataDone(json); + } + + @Override + public void onSuccess(JSONObject object) { + Debug.error("Get data history success"); + } + }); + } + } diff --git a/app/src/main/res/layout/fragment_top.xml b/app/src/main/res/layout/fragment_top.xml index 6c80b08..d173175 100644 --- a/app/src/main/res/layout/fragment_top.xml +++ b/app/src/main/res/layout/fragment_top.xml @@ -124,6 +124,7 @@ android:textColor="@color/white"/> 都道府県 - Login error - Can not login + ログインエラー + ログインできません。 OK - Error - Password is nulll - Email is null - Uploading - Register error - Error exception + エラー + パスワードはnullです。 + メールはヌルです。 + アップロード中 + レジスタエラー + エラー例外 cm kg % - Please waite some minute - Can not sent request get password - Password have not send, please try it again - Password have send, please check mail - Register success + しばらくお待ちください。 + 要求を送信できないため、パスワードを取得できません。 + パスワードが送信されていません。もう一度お試しください。 + パスワードが送られてきました、メールをチェックしてください。 + 登録成功 - Username is null - Name is null - Nickname is null - Email is null - Email invalid - Password is null - Confirm password is null - Password length is more than 6 character - Confirm password is wrong - Sex is not select - Birthday is not select - Hight is null - Weight is null - Body fat percent is null - Comment is null - Level is not select - Province is not select + ユーザー名はnullです。 + 名前はnullです。 + ニックネームはnullです。 + メールはヌルです。 + 電子メールが無効です。 + パスワードはnullです。 + パスワードの確認はnullです。 + パスワードの長さは6文字以上です。 + パスワードの確認が間違っています。 + 性別は選択されていません。 + 誕生日は選択されていません。 + Hightはnullです。 + 重量はnullです。 + 体脂肪率はnullです。 + コメントはnullです。 + レベルは選択されていません。 + 州は選択されていません。 - Please input email - Please input confirm code - Send confirm + メールを入力してください。 + 確認コードを入力してください。 + 送信確認 @@ -293,7 +293,9 @@ 天気 消費カロリー - Can not get data + データを取得できません。 読み込み中 + カウントセンサーが使用できません。 + \ No newline at end of file -- 1.8.5.3