exporting logs to user storage

fix/get-all-stations-hangout
Mateusz Lubecki 2022-01-06 21:09:33 +01:00
rodzic 63f4d64a4b
commit a08f06618b
7 zmienionych plików z 144 dodań i 5 usunięć

Wyświetl plik

@ -39,6 +39,10 @@ public class Main extends Application {
private ConfigurationFile confFile;
public FileNames getFileNames() {
return fileNames;
}
private FileNames fileNames;
private FavouritiesFile favouritiesFile;

Wyświetl plik

@ -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
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
@ -23,8 +26,11 @@ import com.jakewharton.threetenabp.AndroidThreeTen;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.format.DateTimeFormatter;
import org.tinylog.Logger;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
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.dao.AllStationsDao;
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.FileNames;
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
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_activity_menu, menu);
@ -140,6 +173,19 @@ public class MainActivity extends AppCompatActivity {
});
builder.create();
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;
}
}

Wyświetl plik

@ -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
}
}

Wyświetl plik

@ -237,6 +237,7 @@
android:layout_marginTop="32dp"
android:fontFamily="@font/alegreya_sans_sc_medium"
android:text="@string/credits_1"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@ -250,7 +251,7 @@
android:layout_marginBottom="2dp"
android:fontFamily="@font/alegreya_sans_sc_medium"
android:text="@string/credits_2"
android:textSize="18sp"
android:textSize="28sp"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/textViewCredits3"
app:layout_constraintEnd_toEndOf="parent"
@ -263,7 +264,7 @@
android:layout_height="wrap_content"
android:fontFamily="@font/alegreya_sans_sc_medium"
android:text="@string/credits_3"
android:textSize="18sp"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/textViewCredits4"
app:layout_constraintEnd_toEndOf="parent"
@ -276,6 +277,7 @@
android:layout_height="wrap_content"
android:fontFamily="@font/alegreya_sans_sc_medium"
android:text="@string/credits_4"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/textViewCredits5"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@ -287,6 +289,7 @@
android:layout_height="wrap_content"
android:fontFamily="@font/alegreya_sans_sc_medium"
android:text="@string/credits_5"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewCredits4" />

Wyświetl plik

@ -4,4 +4,7 @@
<item
android:id="@+id/menu_item_translation_authors"
android:title="@string/translation_authors" />
<item
android:id="@+id/menu_item_log_export"
android:title="Log file export" />
</menu>

Wyświetl plik

@ -7,6 +7,6 @@ writer1.format = {date: HH:mm:ss.SSS} {tag} {method}({file}:{line}): {message}
writer2 = rolling file
writer2.level = debug
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

Wyświetl plik

@ -3,10 +3,10 @@ writer1 = rolling file
writer1.level = debug
writer1.file = #{tinylog.directory}/log_{date:yyyy-MM-dd}.txt
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
writer2 = logcat
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}