kopia lustrzana https://github.com/SP8EBC/MeteoSystem
exporting logs to user storage
rodzic
63f4d64a4b
commit
a08f06618b
|
@ -39,6 +39,10 @@ public class Main extends Application {
|
||||||
|
|
||||||
private ConfigurationFile confFile;
|
private ConfigurationFile confFile;
|
||||||
|
|
||||||
|
public FileNames getFileNames() {
|
||||||
|
return fileNames;
|
||||||
|
}
|
||||||
|
|
||||||
private FileNames fileNames;
|
private FileNames fileNames;
|
||||||
|
|
||||||
private FavouritiesFile favouritiesFile;
|
private FavouritiesFile favouritiesFile;
|
||||||
|
|
|
@ -3,13 +3,16 @@ package cc.pogoda.mobile.meteosystem.activity;
|
||||||
// https://www.softicons.com/web-icons/vector-stylish-weather-icons-by-bartosz-kaszubowski/sun-rays-cloud-icon#google_vignette
|
// https://www.softicons.com/web-icons/vector-stylish-weather-icons-by-bartosz-kaszubowski/sun-rays-cloud-icon#google_vignette
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.StrictMode;
|
import android.os.StrictMode;
|
||||||
|
@ -23,8 +26,11 @@ import com.jakewharton.threetenabp.AndroidThreeTen;
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
import org.greenrobot.eventbus.Subscribe;
|
import org.greenrobot.eventbus.Subscribe;
|
||||||
import org.greenrobot.eventbus.ThreadMode;
|
import org.greenrobot.eventbus.ThreadMode;
|
||||||
|
import org.threeten.bp.LocalDateTime;
|
||||||
|
import org.threeten.bp.format.DateTimeFormatter;
|
||||||
import org.tinylog.Logger;
|
import org.tinylog.Logger;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -39,6 +45,7 @@ import cc.pogoda.mobile.meteosystem.activity.handler.MainActImageButtonSettingsC
|
||||||
import cc.pogoda.mobile.meteosystem.config.AppConfiguration;
|
import cc.pogoda.mobile.meteosystem.config.AppConfiguration;
|
||||||
import cc.pogoda.mobile.meteosystem.dao.AllStationsDao;
|
import cc.pogoda.mobile.meteosystem.dao.AllStationsDao;
|
||||||
import cc.pogoda.mobile.meteosystem.file.ConfigurationFile;
|
import cc.pogoda.mobile.meteosystem.file.ConfigurationFile;
|
||||||
|
import cc.pogoda.mobile.meteosystem.file.CopyLog;
|
||||||
import cc.pogoda.mobile.meteosystem.file.FavouritiesFile;
|
import cc.pogoda.mobile.meteosystem.file.FavouritiesFile;
|
||||||
import cc.pogoda.mobile.meteosystem.file.FileNames;
|
import cc.pogoda.mobile.meteosystem.file.FileNames;
|
||||||
import cc.pogoda.mobile.meteosystem.type.ParceableStationsList;
|
import cc.pogoda.mobile.meteosystem.type.ParceableStationsList;
|
||||||
|
@ -117,6 +124,32 @@ public class MainActivity extends AppCompatActivity {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
||||||
|
|
||||||
|
if (requestCode == 123 && resultCode == RESULT_OK) {
|
||||||
|
Uri uri = data.getData();
|
||||||
|
|
||||||
|
Logger.debug("[MainActivity][onActivityResult][requestCode = 123][uri.getPath() = " + uri.getPath() +"]");
|
||||||
|
|
||||||
|
grantUriPermission(getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||||
|
getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||||
|
|
||||||
|
try {
|
||||||
|
CopyLog.forDay(main.getFileNames(), LocalDateTime.now(), getContentResolver().openOutputStream(uri));
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
Logger.error("[MainActivity][onActivityResult][FileNotFoundException]");
|
||||||
|
}
|
||||||
|
|
||||||
|
// getContentResolver().openOutputStream(exportUri)
|
||||||
|
|
||||||
|
//exportUri = uri;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
getMenuInflater().inflate(R.menu.main_activity_menu, menu);
|
getMenuInflater().inflate(R.menu.main_activity_menu, menu);
|
||||||
|
@ -140,6 +173,19 @@ public class MainActivity extends AppCompatActivity {
|
||||||
});
|
});
|
||||||
builder.create();
|
builder.create();
|
||||||
builder.show();
|
builder.show();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case (R.id.menu_item_log_export) : {
|
||||||
|
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
|
||||||
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
intent.setType("text/plain");
|
||||||
|
intent.putExtra(Intent.EXTRA_TITLE, LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE) + ".log");
|
||||||
|
|
||||||
|
startActivityForResult(intent, 123);
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
package cc.pogoda.mobile.meteosystem.file;
|
||||||
|
|
||||||
|
import org.threeten.bp.LocalDateTime;
|
||||||
|
import org.threeten.bp.format.DateTimeFormatter;
|
||||||
|
import org.tinylog.Logger;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
|
||||||
|
public class CopyLog {
|
||||||
|
|
||||||
|
public static class CopyLogRunner implements Runnable {
|
||||||
|
|
||||||
|
InputStreamReader streamReader;
|
||||||
|
OutputStreamWriter streamWriter;
|
||||||
|
|
||||||
|
int logFileLn;
|
||||||
|
|
||||||
|
public CopyLogRunner(InputStreamReader _stream_reader, OutputStreamWriter _stream_writer, int _log_file_ln) {
|
||||||
|
streamReader = _stream_reader;
|
||||||
|
streamWriter = _stream_writer;
|
||||||
|
logFileLn = _log_file_ln;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
char buffer[] = new char[logFileLn];
|
||||||
|
|
||||||
|
streamReader.read(buffer);
|
||||||
|
|
||||||
|
streamWriter.write(buffer);
|
||||||
|
|
||||||
|
streamReader.close();
|
||||||
|
streamWriter.flush();
|
||||||
|
streamWriter.close();
|
||||||
|
|
||||||
|
Logger.info("[CopyLog][CopyLogRunner][run][log file copied succesfully]");
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
Logger.error("[CopyLog][CopyLogRunner][run][IOException e = " + e.getLocalizedMessage() +"]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void forDay(FileNames _file_names, LocalDateTime _date, OutputStream _out) {
|
||||||
|
|
||||||
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||||
|
|
||||||
|
File baseDir = _file_names.getDirectory();
|
||||||
|
|
||||||
|
File logfile = new File(baseDir.getAbsolutePath() + "/logs/log_" + _date.format(formatter) + ".txt");
|
||||||
|
|
||||||
|
Logger.debug("[CopyLog][forDay][logfile.getAbsolutePath() = " + logfile.getAbsolutePath() +"][logfile.length() = " + logfile.length() +"]");
|
||||||
|
|
||||||
|
try {
|
||||||
|
// create an input stream to load log file
|
||||||
|
FileInputStream fns = new FileInputStream(logfile);
|
||||||
|
InputStreamReader streamReader = new InputStreamReader(fns);
|
||||||
|
|
||||||
|
// create output stream writer to copy log file into
|
||||||
|
OutputStreamWriter writer = new OutputStreamWriter(_out);
|
||||||
|
|
||||||
|
CopyLogRunner runner = new CopyLogRunner(streamReader, writer, (int)logfile.length());
|
||||||
|
|
||||||
|
Thread t = new Thread(runner);
|
||||||
|
|
||||||
|
t.start();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
Logger.error("[CopyLog][forDay][IOException e = " + e.getLocalizedMessage() +"]");
|
||||||
|
}
|
||||||
|
|
||||||
|
// log_{date:yyyy-MM-dd}.txt
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -237,6 +237,7 @@
|
||||||
android:layout_marginTop="32dp"
|
android:layout_marginTop="32dp"
|
||||||
android:fontFamily="@font/alegreya_sans_sc_medium"
|
android:fontFamily="@font/alegreya_sans_sc_medium"
|
||||||
android:text="@string/credits_1"
|
android:text="@string/credits_1"
|
||||||
|
android:textSize="20sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
@ -250,7 +251,7 @@
|
||||||
android:layout_marginBottom="2dp"
|
android:layout_marginBottom="2dp"
|
||||||
android:fontFamily="@font/alegreya_sans_sc_medium"
|
android:fontFamily="@font/alegreya_sans_sc_medium"
|
||||||
android:text="@string/credits_2"
|
android:text="@string/credits_2"
|
||||||
android:textSize="18sp"
|
android:textSize="28sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
app:layout_constraintBottom_toTopOf="@+id/textViewCredits3"
|
app:layout_constraintBottom_toTopOf="@+id/textViewCredits3"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
@ -263,7 +264,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fontFamily="@font/alegreya_sans_sc_medium"
|
android:fontFamily="@font/alegreya_sans_sc_medium"
|
||||||
android:text="@string/credits_3"
|
android:text="@string/credits_3"
|
||||||
android:textSize="18sp"
|
android:textSize="24sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
app:layout_constraintBottom_toTopOf="@+id/textViewCredits4"
|
app:layout_constraintBottom_toTopOf="@+id/textViewCredits4"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
@ -276,6 +277,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fontFamily="@font/alegreya_sans_sc_medium"
|
android:fontFamily="@font/alegreya_sans_sc_medium"
|
||||||
android:text="@string/credits_4"
|
android:text="@string/credits_4"
|
||||||
|
android:textSize="24sp"
|
||||||
app:layout_constraintBottom_toTopOf="@+id/textViewCredits5"
|
app:layout_constraintBottom_toTopOf="@+id/textViewCredits5"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
@ -287,6 +289,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fontFamily="@font/alegreya_sans_sc_medium"
|
android:fontFamily="@font/alegreya_sans_sc_medium"
|
||||||
android:text="@string/credits_5"
|
android:text="@string/credits_5"
|
||||||
|
android:textSize="24sp"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/textViewCredits4" />
|
app:layout_constraintTop_toBottomOf="@+id/textViewCredits4" />
|
||||||
|
|
|
@ -4,4 +4,7 @@
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_item_translation_authors"
|
android:id="@+id/menu_item_translation_authors"
|
||||||
android:title="@string/translation_authors" />
|
android:title="@string/translation_authors" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/menu_item_log_export"
|
||||||
|
android:title="Log file export" />
|
||||||
</menu>
|
</menu>
|
|
@ -7,6 +7,6 @@ writer1.format = {date: HH:mm:ss.SSS} {tag} {method}({file}:{line}): {message}
|
||||||
writer2 = rolling file
|
writer2 = rolling file
|
||||||
writer2.level = debug
|
writer2.level = debug
|
||||||
writer2.file = #{tinylog.directory}/log_{date:yyyy-MM-dd}.txt
|
writer2.file = #{tinylog.directory}/log_{date:yyyy-MM-dd}.txt
|
||||||
writer2.format = {date: HH:mm:ss.SSS} {class}.{method}()\n{level}: {message}
|
writer2.format = {date: HH:mm:ss.SSS} {class}.{method}() {level}: {message}
|
||||||
writer2.policies = daily
|
writer2.policies = daily
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,10 @@ writer1 = rolling file
|
||||||
writer1.level = debug
|
writer1.level = debug
|
||||||
writer1.file = #{tinylog.directory}/log_{date:yyyy-MM-dd}.txt
|
writer1.file = #{tinylog.directory}/log_{date:yyyy-MM-dd}.txt
|
||||||
writer1.backups = 7
|
writer1.backups = 7
|
||||||
writer1.format = {date: HH:mm:ss.SSS} {class}.{method}()\n{level}: {message}
|
writer1.format = {date: HH:mm:ss.SSS} {class}.{method}() {level}: {message}
|
||||||
writer1.policies = daily
|
writer1.policies = daily
|
||||||
|
|
||||||
writer2 = logcat
|
writer2 = logcat
|
||||||
writer2.level = TRACE
|
writer2.level = TRACE
|
||||||
writer2.format = {date: HH:mm:ss.SSS} {class}.{method}()\n{level}: {message}
|
writer2.format = {date: HH:mm:ss.SSS} {class}.{method}() {level}: {message}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue