Skip to content

Commit

Permalink
Merge pull request #34 from clams2017/feature/#19
Browse files Browse the repository at this point in the history
#19 ダイバーログのCSVエクスポートのロジック追加
  • Loading branch information
kzysd committed Mar 5, 2018
2 parents b87a4aa + 8984803 commit 484007b
Show file tree
Hide file tree
Showing 11 changed files with 221 additions and 21 deletions.
31 changes: 16 additions & 15 deletions app/app.iml
Expand Up @@ -49,41 +49,41 @@
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/build-info" />
Expand All @@ -102,7 +102,6 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaPrecompile" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
Expand Down Expand Up @@ -166,7 +165,9 @@
<orderEntry type="library" name="com.getkeepsafe.relinker:relinker-1.2.2" level="project" />
<orderEntry type="library" scope="TEST" name="org.bouncycastle:bcprov-jdk15on:1.52@jar" level="project" />
<orderEntry type="library" scope="TEST" name="org.apache.maven:maven-model:2.2.1@jar" level="project" />
<orderEntry type="library" scope="TEST" name="org.threeten:threetenbp:1.3.3@jar" level="project" />
<orderEntry type="library" scope="TEST" name="junit:junit:4.12@jar" level="project" />
<orderEntry type="library" name="net.sf.opencsv:opencsv:2.3@jar" level="project" />
<orderEntry type="library" scope="TEST" name="com.android.support.test.espresso:espresso-core-3.0.1" level="project" />
<orderEntry type="library" name="com.android.support:support-fragment-26.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="javax.inject:javax.inject:1@jar" level="project" />
Expand Down
5 changes: 3 additions & 2 deletions app/build.gradle
Expand Up @@ -43,7 +43,8 @@ dependencies {

compile 'com.beardedhen:androidbootstrap:2.3.2'

testCompile "org.robolectric:robolectric:3.6.1"
compile 'net.sf.opencsv:opencsv:2.3'

compile 'com.beardedhen:androidbootstrap:2.3.2'
testCompile "org.robolectric:robolectric:3.6.1"
testCompile 'org.threeten:threetenbp:1.3.3'
}
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Expand Up @@ -2,6 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.slymapp.diverlog">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
android:name=".DiverLogApplication"
Expand Down
@@ -0,0 +1,45 @@
package com.slymapp.diverlog.domain;

import android.content.Context;
import android.os.Environment;
import android.util.Log;

import com.slymapp.diverlog.infrastructure.realm.DiverLogRepositoryImpl;
import com.slymapp.diverlog.utils.DiverLogHelper;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import au.com.bytecode.opencsv.CSVWriter;

/**
* {@link DiverLog}をCSV形式でエクスポートするクラス
*/
public class DiverLogCsvExporter implements DiverLogExporter {

//TODO Daggerを利用してDIに置き換える
private DiverLogRepository repository = new DiverLogRepositoryImpl();

@Override
public void exportAllLog(Context context, String exportedName) {
List<DiverLog> list = repository.fetchAll();

//TODO パーミッションを確認するフローを追加する
File file = new File(Environment.getExternalStorageDirectory().getPath(), exportedName);
Log.d("EXPORT_FILE", file.getAbsolutePath());
try {
if (!file.createNewFile()) {
return;
}
CSVWriter writer = new CSVWriter(new PrintWriter(file));
for (DiverLog log : list) {
writer.writeNext(DiverLogHelper.toStringArray(log));
}
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,18 @@
package com.slymapp.diverlog.domain;

import android.content.Context;

/**
* ダイバーログの外部保存・読み込みをするインターフェース
*/
public interface DiverLogExporter {

/**
* ダイバーログをファイル保存する
* 外部保存をするため、外部ストレージの書き込みパーミッションが必要
*
* @param context {@link Context}
* @param exportedName 出力ファイル名
*/
void exportAllLog(Context context, String exportedName);
}
11 changes: 10 additions & 1 deletion app/src/main/java/com/slymapp/diverlog/utils/DateUtils.java
Expand Up @@ -34,13 +34,22 @@ public static String toDateString(Date date) {

/**
* {@link Date} を時刻形式に変換する
* @param date {@link}
* @param date {@link Date}
* @return 時刻形式 (HH:mm)
*/
public static String toTimeString(Date date) {
return DateUtils.format(date, TIME_PATTERN);
}

/**
* {@link Date} を日時形式に変換する
* @param date {@link Date}
* @return 日時形式 (yyyy-MM-dd HH:mm:ss)
*/
public static String toDateTimeString(Date date){
return DateUtils.format(date, "yyyy-MM-dd HH:mm:ss");
}

/**
* 日付から{@link Date}を生成する
*
Expand Down
34 changes: 34 additions & 0 deletions app/src/main/java/com/slymapp/diverlog/utils/DiverLogHelper.java
@@ -0,0 +1,34 @@
package com.slymapp.diverlog.utils;

import com.slymapp.diverlog.domain.DiverLog;

/**
* {@link com.slymapp.diverlog.domain.DiverLog}のヘルパークラス
*/
public class DiverLogHelper {

/**
* {@link DiverLog}を文字列配列に変換する
* @param diverLog {@link DiverLog}
* @return ダイビングNo,ダイビング日時,潜水場所,開始時圧力,終了時圧力,開始時間,終了時間,入水方法,透明度,スーツ種別,ウェイト,平均深度,最大深度,水温
*/
public static String[] toStringArray(DiverLog diverLog) {
return new String[]{
String.valueOf(diverLog.getDivingNumber()),
DateUtils.toDateTimeString(diverLog.getDate()),
diverLog.getWeather(),
diverLog.getPlace(),
String.valueOf(diverLog.getStartPressure()),
String.valueOf(diverLog.getEndPressure()),
DateUtils.toDateTimeString(diverLog.getStartTime()),
DateUtils.toDateTimeString(diverLog.getEndTime()),
diverLog.getEntryMethod(),
String.valueOf(diverLog.getTransparent()),
diverLog.getSuits(),
String.valueOf(diverLog.getWeight()),
String.valueOf(diverLog.getAverageDepth()),
String.valueOf(diverLog.getMaxDepth()),
String.valueOf(diverLog.getTemperature())
};
}
}
18 changes: 17 additions & 1 deletion app/src/main/java/com/slymapp/diverlog/view/DummyFragment.java
@@ -1,12 +1,17 @@
package com.slymapp.diverlog.view;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.slymapp.diverlog.R;
import com.slymapp.diverlog.databinding.FragmentDummyBinding;
import com.slymapp.diverlog.domain.DiverLogCsvExporter;
import com.slymapp.diverlog.domain.DiverLogExporter;

/**
* Hello Worldを表示する、画面遷移の実装のダミー画面
Expand All @@ -16,6 +21,17 @@ public class DummyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
View view = inflater.inflate(R.layout.fragment_dummy, container, false);
FragmentDummyBinding binding = DataBindingUtil.bind(view);
binding.sampleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DiverLogExporter exporter = new DiverLogCsvExporter();
exporter.exportAllLog(getContext(), "DiverLogList.csv");
Toast.makeText(view.getContext(), "exported!!", Toast.LENGTH_SHORT).show();
}
});
return view;
}

}
2 changes: 1 addition & 1 deletion app/src/main/res/layout/content_main.xml
Expand Up @@ -5,4 +5,4 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:layout="@layout/fragment_main" />
tools:layout="@layout/fragment_dummy" />
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<layout>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
Expand All @@ -9,6 +11,7 @@
tools:showIn="@layout/activity_main">

<TextView
android:id="@+id/sample_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
Expand All @@ -17,4 +20,15 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/sample_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="export!!"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/sample_text"
/>

</android.support.constraint.ConstraintLayout>
</layout>
@@ -0,0 +1,61 @@
package com.slymapp.diverlog.utils;

import com.slymapp.diverlog.domain.DiverLog;

import org.junit.Test;

import java.util.Calendar;
import java.util.GregorianCalendar;

import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;

public class DiverLogHelperTest {
@Test
public void toStringArray() throws Exception {
DiverLog diverLog = createDiverLogMock();

String[] actual = DiverLogHelper.toStringArray(diverLog);

assertThat(actual, is(notNullValue()));
assertThat(actual.length, is(15));
assertThat(actual[0], is("1"));
assertThat(actual[1], is("2017-12-23 00:00:00"));
assertThat(actual[2], is("晴れ"));
assertThat(actual[3], is("どこかの海"));
assertThat(actual[4], is("300"));
assertThat(actual[5], is("0"));
assertThat(actual[6], is("2017-12-23 12:00:00"));
assertThat(actual[7], is("2017-12-23 12:30:00"));
assertThat(actual[8], is("ボート"));
assertThat(actual[9], is("30"));
assertThat(actual[10], is("ドライ"));
assertThat(actual[11], is("15"));
assertThat(actual[12], is("20.0"));
assertThat(actual[13], is("40.0"));
assertThat(actual[14], is("10.0"));
}

private DiverLog createDiverLogMock() {
DiverLog diverLog = new DiverLog();
diverLog.setDivingNumber(1);
diverLog.setDate(new GregorianCalendar(2017, Calendar.DECEMBER, 23, 0, 0, 0).getTime());
diverLog.setWeather("晴れ");
diverLog.setPlace("どこかの海");
diverLog.setStartPressure(300);
diverLog.setEndPressure(0);
diverLog.setStartTime(new GregorianCalendar(2017, Calendar.DECEMBER, 23, 12, 0, 0).getTime());
diverLog.setEndTime(new GregorianCalendar(2017, Calendar.DECEMBER, 23, 12, 30, 0).getTime());
diverLog.setEntryMethod("ボート");
diverLog.setTransparent(30);
diverLog.setSuits("ドライ");
diverLog.setWeight(15);
diverLog.setAverageDepth(20f);
diverLog.setMaxDepth(40f);
diverLog.setTemperature(10f);
return diverLog;
}


}

0 comments on commit 484007b

Please sign in to comment.