diff --git a/README.md b/README.md index d05b56e..b148620 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,14 @@ repositories { and then declare a dependency inside a module: ```groovy dependencies { - compile('com.github.bright:slf4android:0.1.6'){ - transitive = true - } - //other dependencies + // just SLF4J binding + implementation("com.github.bright.slf4android:slf4android:$slf4androidVersion") + + // (optional) a handler for file logging + implementation("com.github.bright.slf4android:slf4android-handler-file-log:$slf4androidVersion") + + // (optional) a handler for notifying the developer in case of an error + implementation("com.github.bright.slf4android:slf4android-handler-notify-developer:$slf4androidVersion") } ``` As with any slf4j compatible implementation using slf4android looks like this: @@ -77,7 +81,7 @@ Note that we remove a default logcat handler since Crashlytics will push message ### Logging to a file To print messages to a separate file just add: ```java -FileLogHandlerConfiguration fileHandler = LoggerConfiguration.fileLogHandler(this); +FileLogHandlerConfiguration fileHandler = FileLogHandlerConfiguration.create(this); LoggerConfiguration.configuration().addHandlerToRootLogger(fileHandler); String logFileName = fileHandler.getCurrentFileName(); // logFileName contains full path to logged file @@ -86,7 +90,7 @@ inside your custom `android.app.Application` `onCreate` method. This will create To change the location of log file you can use: ```java -FileLogHandlerConfiguration fileHandler = LoggerConfiguration.fileLogHandler(this); +FileLogHandlerConfiguration fileHandler = FileLogHandlerConfiguration.create(this); fileHandler.setFullFilePathPattern("/sdcard/your.package/my_log.%g.%u.log"); diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index aa54e88..0000000 --- a/app/build.gradle +++ /dev/null @@ -1,85 +0,0 @@ -plugins { - id 'com.android.library' - id 'maven-publish' -} - -android { - namespace "pl.brightinventions.slf4android" - testNamespace "pl.brightinventions.slf4android.androidTest" - - compileSdk 34 - - defaultConfig { - minSdkVersion 14 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - publishing { - singleVariant('release') { - withSourcesJar() - } - } - - packagingOptions { - exclude 'LICENSE.txt' - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/LICENSE' - exclude 'META-INF/NOTICE' - } - - useLibrary 'android.test.runner' - useLibrary 'android.test.base' - - java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } - } -} - -dependencies { - implementation 'androidx.core:core:1.12.0' - implementation 'org.slf4j:slf4j-api:1.7.36' - implementation 'com.squareup:seismic:1.0.2' - androidTestImplementation 'org.hamcrest:hamcrest-core:1.3' - androidTestImplementation 'org.hamcrest:hamcrest-library:1.3' - androidTestImplementation('junit:junit:4.13.2') - androidTestImplementation 'androidx.test:rules:1.5.0' - androidTestImplementation 'org.easytesting:fest-util:1.2.5' - - testImplementation 'org.hamcrest:hamcrest-core:1.3' - testImplementation 'org.hamcrest:hamcrest-library:1.3' - testImplementation('junit:junit:4.13.2') - testImplementation 'org.easytesting:fest-util:1.2.5' - testImplementation('org.robolectric:robolectric:4.11.1') { - exclude module: 'classworlds' - exclude module: 'commons-logging' - exclude module: 'httpclient' - exclude module: 'maven-artifact' - exclude module: 'maven-artifact-manager' - exclude module: 'maven-error-diagnostics' - exclude module: 'maven-model' - exclude module: 'maven-project' - exclude module: 'maven-settings' - exclude module: 'plexus-container-default' - exclude module: 'plexus-interpolation' - exclude module: 'plexus-utils' - exclude module: 'wagon-file' - exclude module: 'wagon-http-lightweight' - exclude module: 'wagon-provider-api' - } -} - -publishing { - publications { - release(MavenPublication) { - groupId = 'com.github.bright' - artifactId = 'slf4android' - version = '1.0' - - afterEvaluate { - from components.release - } - } - } -} diff --git a/app/src/androidTest/AndroidManifest.xml b/app/src/androidTest/AndroidManifest.xml deleted file mode 100644 index bbb0c50..0000000 --- a/app/src/androidTest/AndroidManifest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/java/pl/brightinventions/slf4android/Disposable.java b/app/src/main/java/pl/brightinventions/slf4android/Disposable.java deleted file mode 100644 index a1dede6..0000000 --- a/app/src/main/java/pl/brightinventions/slf4android/Disposable.java +++ /dev/null @@ -1,5 +0,0 @@ -package pl.brightinventions.slf4android; - -interface Disposable { - void dispose(); -} diff --git a/app/src/main/java/pl/brightinventions/slf4android/FileLogHandlerConfiguration.java b/app/src/main/java/pl/brightinventions/slf4android/FileLogHandlerConfiguration.java deleted file mode 100644 index 0663194..0000000 --- a/app/src/main/java/pl/brightinventions/slf4android/FileLogHandlerConfiguration.java +++ /dev/null @@ -1,15 +0,0 @@ -package pl.brightinventions.slf4android; - -import java.util.logging.Handler; - -public abstract class FileLogHandlerConfiguration extends Handler { - @SuppressWarnings("UnusedDeclaration") - public abstract FileLogHandlerConfiguration setFullFilePathPattern(String fullPathPattern); - - @SuppressWarnings("UnusedDeclaration") - public abstract FileLogHandlerConfiguration setRotateFilesCountLimit(int count); - - @SuppressWarnings("UnusedDeclaration") - public abstract FileLogHandlerConfiguration setLogFileSizeLimitInBytes(int maxFileSizeInBytes); - public abstract String getCurrentFileName(); -} diff --git a/build.gradle b/build.gradle index 2758468..d0caab2 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:8.2.0' + classpath 'com.android.tools.build:gradle:8.4.0' //classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' } } diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/core/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 0000000..f11ccd2 --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,64 @@ +plugins { + id 'com.android.library' + id 'maven-publish' +} + +android { + namespace 'pl.brightinventions.slf4android' + compileSdk 34 + + defaultConfig { + minSdk 14 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + publishing { + singleVariant('release') { + withSourcesJar() + } + } + + java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + api 'org.slf4j:slf4j-api:1.7.36' + + testImplementation('junit:junit:4.13.2') + testImplementation 'org.hamcrest:hamcrest-core:1.3' + testImplementation 'org.hamcrest:hamcrest-library:1.3' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' +} + +publishing { + publications { + release(MavenPublication) { + groupId = 'com.github.bright.slf4android' + artifactId = 'slf4android' + version = '1.0' + + afterEvaluate { + from components.release + } + } + } +} diff --git a/core/consumer-rules.pro b/core/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/core/proguard-rules.pro b/core/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/core/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/LoggerAdapterTests.java b/core/src/androidTest/java/pl/brightinventions/slf4android/LoggerAdapterTests.java similarity index 94% rename from app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/LoggerAdapterTests.java rename to core/src/androidTest/java/pl/brightinventions/slf4android/LoggerAdapterTests.java index d1c8fe6..ab19d5d 100644 --- a/app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/LoggerAdapterTests.java +++ b/core/src/androidTest/java/pl/brightinventions/slf4android/LoggerAdapterTests.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android.androidTest; +package pl.brightinventions.slf4android; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; @@ -13,9 +13,6 @@ import java.io.IOException; import java.io.InputStreamReader; -import pl.brightinventions.slf4android.LogLevel; -import pl.brightinventions.slf4android.LoggerConfiguration; - public class LoggerAdapterTests { public static final String LOGGER_NAME = "ApplicationTest"; @@ -141,7 +138,7 @@ public void test_error_message_printed_when_level_is_set_to_debug() { @Test public void test_warning_message_printed_when_level_is_set_to_debug() { setLevelTo(LogLevel.DEBUG); - getLogger().error("new warning message with exception", new NullPointerException("Bad")); + getLogger().warn("new warning message with exception", new NullPointerException("Bad")); assertThat(getLastMessage(), containsString("new warning message with exception")); } } \ No newline at end of file diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..568741e --- /dev/null +++ b/core/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/java/org/slf4j/impl/StaticLoggerBinder.java b/core/src/main/java/org/slf4j/impl/StaticLoggerBinder.java similarity index 100% rename from app/src/main/java/org/slf4j/impl/StaticLoggerBinder.java rename to core/src/main/java/org/slf4j/impl/StaticLoggerBinder.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/AndroidLoggerAdapter.java b/core/src/main/java/pl/brightinventions/slf4android/AndroidLoggerAdapter.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/AndroidLoggerAdapter.java rename to core/src/main/java/pl/brightinventions/slf4android/AndroidLoggerAdapter.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/AndroidLoggerFactory.java b/core/src/main/java/pl/brightinventions/slf4android/AndroidLoggerFactory.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/AndroidLoggerFactory.java rename to core/src/main/java/pl/brightinventions/slf4android/AndroidLoggerFactory.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/ConstLoggerValueSupplier.java b/core/src/main/java/pl/brightinventions/slf4android/ConstLoggerValueSupplier.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/ConstLoggerValueSupplier.java rename to core/src/main/java/pl/brightinventions/slf4android/ConstLoggerValueSupplier.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/DateValueSupplier.java b/core/src/main/java/pl/brightinventions/slf4android/DateValueSupplier.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/DateValueSupplier.java rename to core/src/main/java/pl/brightinventions/slf4android/DateValueSupplier.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/HandlerFormatterCompiler.java b/core/src/main/java/pl/brightinventions/slf4android/HandlerFormatterCompiler.java similarity index 94% rename from app/src/main/java/pl/brightinventions/slf4android/HandlerFormatterCompiler.java rename to core/src/main/java/pl/brightinventions/slf4android/HandlerFormatterCompiler.java index e303624..32079d7 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/HandlerFormatterCompiler.java +++ b/core/src/main/java/pl/brightinventions/slf4android/HandlerFormatterCompiler.java @@ -3,7 +3,7 @@ public class HandlerFormatterCompiler { private final LoggerPatternConfiguration configuration; - public HandlerFormatterCompiler(LoggerPatternConfiguration configuration) { + HandlerFormatterCompiler(LoggerPatternConfiguration configuration) { this.configuration = configuration; } diff --git a/app/src/main/java/pl/brightinventions/slf4android/LevelValueSupplier.java b/core/src/main/java/pl/brightinventions/slf4android/LevelValueSupplier.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/LevelValueSupplier.java rename to core/src/main/java/pl/brightinventions/slf4android/LevelValueSupplier.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/ListLogRecordFormatter.java b/core/src/main/java/pl/brightinventions/slf4android/ListLogRecordFormatter.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/ListLogRecordFormatter.java rename to core/src/main/java/pl/brightinventions/slf4android/ListLogRecordFormatter.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/LogLevel.java b/core/src/main/java/pl/brightinventions/slf4android/LogLevel.java similarity index 79% rename from app/src/main/java/pl/brightinventions/slf4android/LogLevel.java rename to core/src/main/java/pl/brightinventions/slf4android/LogLevel.java index d181221..b404d2b 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/LogLevel.java +++ b/core/src/main/java/pl/brightinventions/slf4android/LogLevel.java @@ -33,7 +33,7 @@ public boolean isSmallerOrEqualTo(Level level) { } /** - * Converts a {@link pl.brightinventions.slf4android.LogLevel} logging level into an Android one. + * Converts a {@link LogLevel} logging level into an Android one. * * @return The resulting Android logging level. */ @@ -42,9 +42,9 @@ public int getAndroidLevel() { } /** - * Converts a {@link pl.brightinventions.slf4android.LogLevel} logging level into a {@link java.util.logging.Level}. + * Converts a {@link LogLevel} logging level into a {@link Level}. * - * @return The resulting {@link java.util.logging.Level}. + * @return The resulting {@link Level}. */ public Level getUtilLogLevel() { return utilLogLevel; diff --git a/app/src/main/java/pl/brightinventions/slf4android/LogRecord.java b/core/src/main/java/pl/brightinventions/slf4android/LogRecord.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/LogRecord.java rename to core/src/main/java/pl/brightinventions/slf4android/LogRecord.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/LogRecordFormatter.java b/core/src/main/java/pl/brightinventions/slf4android/LogRecordFormatter.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/LogRecordFormatter.java rename to core/src/main/java/pl/brightinventions/slf4android/LogRecordFormatter.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/LogcatHandler.java b/core/src/main/java/pl/brightinventions/slf4android/LogcatHandler.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/LogcatHandler.java rename to core/src/main/java/pl/brightinventions/slf4android/LogcatHandler.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/LoggerConfiguration.java b/core/src/main/java/pl/brightinventions/slf4android/LoggerConfiguration.java similarity index 67% rename from app/src/main/java/pl/brightinventions/slf4android/LoggerConfiguration.java rename to core/src/main/java/pl/brightinventions/slf4android/LoggerConfiguration.java index 5b007ef..dd37a0f 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/LoggerConfiguration.java +++ b/core/src/main/java/pl/brightinventions/slf4android/LoggerConfiguration.java @@ -1,10 +1,9 @@ package pl.brightinventions.slf4android; -import android.annotation.TargetApi; -import android.app.Application; -import android.content.Context; -import android.os.Build; +import org.slf4j.LoggerFactory; +import java.io.Closeable; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.logging.Handler; @@ -14,25 +13,40 @@ public class LoggerConfiguration implements LoggerPatternConfiguration { private static boolean initialized = false; private static LoggerConfiguration configuration; - private final ArrayList loggerPatterns = new ArrayList(); - private final ArrayList disposeThingsOnReset = new ArrayList(); + private final ArrayList loggerPatterns = new ArrayList<>(); + private final ArrayList thingsToCloseOnReset = new ArrayList<>(); private final HandlerFormatterCompiler compiler; - public LoggerConfiguration() { + private final org.slf4j.Logger logger; + + LoggerConfiguration() { compiler = new HandlerFormatterCompiler(this); + logger = LoggerFactory.getLogger(getClass().getSimpleName()); } public static LoggerConfiguration resetConfigurationToDefault() { if (configuration != null) { - configuration.dispose(); + configuration.close(); } configureDefaults(); return configuration; } - private void dispose() { - for (Disposable dispose : disposeThingsOnReset) { - dispose.dispose(); + /** + * Registers a {@link Closeable} that will be closed upon + * {@link #resetConfigurationToDefault() configuration reset}. + */ + public synchronized void registerCloseable(Closeable closeable) { + thingsToCloseOnReset.add(closeable); + } + + private synchronized void close() { + for (Closeable closeable : thingsToCloseOnReset) { + try { + closeable.close(); + } catch (IOException e) { + logger.error("Could not close {}", closeable, e); + } } } @@ -86,17 +100,6 @@ private static Logger removeLogHandlers(String loggerName) { return rootLogger; } - /** - * Creates a {@link pl.brightinventions.slf4android.FileLogHandlerConfiguration} logger handler. - * The returned new instance should be added to some logger with {@link #addHandlerToLogger(String, java.util.logging.Handler)} - * - * @return A new instance of {@link pl.brightinventions.slf4android.FileLogHandlerConfiguration}. - */ - public static FileLogHandlerConfiguration fileLogHandler(Context context) { - LogRecordFormatter formatter = configuration().compiler.compile("%date %level [%thread] %name - %message%newline"); - return new FileLogHandler(context, formatter); - } - public static LoggerConfiguration configuration() { ensureInitialized(); return configuration; @@ -138,36 +141,10 @@ public LoggerConfiguration removeHandlerFromLogger(String loggerName, Class emails = new ArrayList(); - emails.add(email); - NotifyDeveloperHandler handler = new NotifyDeveloperHandler(context, emails, stateListener); - handler.addAttachmentClass(ReadLogcatEntriesAsyncTask.class); - handler.addAttachmentClass(MakeScreenShotAsyncTask.class); - return handler; - } - - @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) - private ActivityStateListener getStateListener(final Application context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - final ActivityStateListener stateListener = new ActivityStateListener(); - disposeThingsOnReset.add(new Disposable() { - @Override - public void dispose() { - context.unregisterActivityLifecycleCallbacks(stateListener); - } - }); - context.registerActivityLifecycleCallbacks(stateListener); - return stateListener; - } - return null; - } - /** * Adds given {@code handler} to logger named {@code loggerName}. * - * @return A {@link java.util.logging.Logger} named {@code loggerName}. + * @return A {@link Logger} named {@code loggerName}. */ public Logger addHandlerToLogger(String loggerName, Handler handler) { Logger logger = Logger.getLogger(loggerName); @@ -178,7 +155,7 @@ public Logger addHandlerToLogger(String loggerName, Handler handler) { /** * Adds given {@code handler} to root logger. * - * @return The root {@link java.util.logging.Logger}. + * @return The root {@link Logger}. */ public Logger addHandlerToRootLogger(Handler handler) { Logger logger = Logger.getLogger(""); diff --git a/app/src/main/java/pl/brightinventions/slf4android/LoggerNameValueSupplier.java b/core/src/main/java/pl/brightinventions/slf4android/LoggerNameValueSupplier.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/LoggerNameValueSupplier.java rename to core/src/main/java/pl/brightinventions/slf4android/LoggerNameValueSupplier.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/LoggerPattern.java b/core/src/main/java/pl/brightinventions/slf4android/LoggerPattern.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/LoggerPattern.java rename to core/src/main/java/pl/brightinventions/slf4android/LoggerPattern.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/LoggerPatternConfiguration.java b/core/src/main/java/pl/brightinventions/slf4android/LoggerPatternConfiguration.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/LoggerPatternConfiguration.java rename to core/src/main/java/pl/brightinventions/slf4android/LoggerPatternConfiguration.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/LoggerPatternValueSupplier.java b/core/src/main/java/pl/brightinventions/slf4android/LoggerPatternValueSupplier.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/LoggerPatternValueSupplier.java rename to core/src/main/java/pl/brightinventions/slf4android/LoggerPatternValueSupplier.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/MessageValueSupplier.java b/core/src/main/java/pl/brightinventions/slf4android/MessageValueSupplier.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/MessageValueSupplier.java rename to core/src/main/java/pl/brightinventions/slf4android/MessageValueSupplier.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/TextUtils.java b/core/src/main/java/pl/brightinventions/slf4android/TextUtils.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/TextUtils.java rename to core/src/main/java/pl/brightinventions/slf4android/TextUtils.java diff --git a/app/src/main/java/pl/brightinventions/slf4android/ThreadValueSupplier.java b/core/src/main/java/pl/brightinventions/slf4android/ThreadValueSupplier.java similarity index 100% rename from app/src/main/java/pl/brightinventions/slf4android/ThreadValueSupplier.java rename to core/src/main/java/pl/brightinventions/slf4android/ThreadValueSupplier.java diff --git a/app/src/test/java/pl/brightinventions/slf4android/HandlerFormatterCompilerTests.java b/core/src/test/java/pl/brightinventions/slf4android/HandlerFormatterCompilerTests.java similarity index 100% rename from app/src/test/java/pl/brightinventions/slf4android/HandlerFormatterCompilerTests.java rename to core/src/test/java/pl/brightinventions/slf4android/HandlerFormatterCompilerTests.java diff --git a/app/src/test/java/pl/brightinventions/slf4android/MessageValueSupplierTests.java b/core/src/test/java/pl/brightinventions/slf4android/MessageValueSupplierTests.java similarity index 100% rename from app/src/test/java/pl/brightinventions/slf4android/MessageValueSupplierTests.java rename to core/src/test/java/pl/brightinventions/slf4android/MessageValueSupplierTests.java diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0f23ff6..09e0043 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Dec 29 11:11:03 CET 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/handler-file-log/.gitignore b/handler-file-log/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/handler-file-log/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/handler-file-log/build.gradle b/handler-file-log/build.gradle new file mode 100644 index 0000000..8584ac7 --- /dev/null +++ b/handler-file-log/build.gradle @@ -0,0 +1,64 @@ +plugins { + id 'com.android.library' + id 'maven-publish' +} + +android { + namespace 'pl.brightinventions.slf4android.handler.filelog' + compileSdk 34 + + defaultConfig { + minSdk 14 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + publishing { + singleVariant('release') { + withSourcesJar() + } + } + + java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + api project(':core') + + androidTestImplementation 'org.hamcrest:hamcrest-core:1.3' + androidTestImplementation 'org.hamcrest:hamcrest-library:1.3' + androidTestImplementation('junit:junit:4.13.2') + androidTestImplementation 'androidx.test:rules:1.5.0' + androidTestImplementation 'org.easytesting:fest-util:1.2.5' +} + +publishing { + publications { + release(MavenPublication) { + groupId = 'com.github.bright.slf4android' + artifactId = 'slf4android-handler-file-log' + version = '1.0' + + afterEvaluate { + from components.release + } + } + } +} diff --git a/handler-file-log/consumer-rules.pro b/handler-file-log/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/handler-file-log/proguard-rules.pro b/handler-file-log/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/handler-file-log/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/FileHandlerTests.java b/handler-file-log/src/androidTest/java/pl/brightinventions/slf4android/handler/filelog/FileHandlerTests.java similarity index 94% rename from app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/FileHandlerTests.java rename to handler-file-log/src/androidTest/java/pl/brightinventions/slf4android/handler/filelog/FileHandlerTests.java index d256e9f..199a1d8 100644 --- a/app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/FileHandlerTests.java +++ b/handler-file-log/src/androidTest/java/pl/brightinventions/slf4android/handler/filelog/FileHandlerTests.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android.androidTest; +package pl.brightinventions.slf4android.handler.filelog; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static org.hamcrest.MatcherAssert.assertThat; @@ -18,7 +18,6 @@ import java.util.Calendar; import java.util.GregorianCalendar; -import pl.brightinventions.slf4android.FileLogHandlerConfiguration; import pl.brightinventions.slf4android.LoggerConfiguration; public class FileHandlerTests { @@ -28,7 +27,7 @@ public class FileHandlerTests { @Before public void setUp() { LoggerConfiguration.resetConfigurationToDefault(); - handler = LoggerConfiguration.fileLogHandler(getInstrumentation().getContext()); + handler = FileLogHandlerConfiguration.create(getInstrumentation().getContext()); LoggerConfiguration.configuration().addHandlerToLogger(getClass().getSimpleName(), handler); LOG = LoggerFactory.getLogger(getClass().getSimpleName()); } diff --git a/handler-file-log/src/main/AndroidManifest.xml b/handler-file-log/src/main/AndroidManifest.xml new file mode 100644 index 0000000..568741e --- /dev/null +++ b/handler-file-log/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/java/pl/brightinventions/slf4android/FileHandlerExpose.java b/handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/FileHandlerExpose.java similarity index 97% rename from app/src/main/java/pl/brightinventions/slf4android/FileHandlerExpose.java rename to handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/FileHandlerExpose.java index a979438..bd00358 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/FileHandlerExpose.java +++ b/handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/FileHandlerExpose.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.filelog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/app/src/main/java/pl/brightinventions/slf4android/FileLogHandler.java b/handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/FileLogHandler.java similarity index 97% rename from app/src/main/java/pl/brightinventions/slf4android/FileLogHandler.java rename to handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/FileLogHandler.java index ab02d16..b48f8e8 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/FileLogHandler.java +++ b/handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/FileLogHandler.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.filelog; import android.content.Context; import android.util.Log; @@ -13,6 +13,8 @@ import java.util.logging.Level; import java.util.logging.LogRecord; +import pl.brightinventions.slf4android.LogRecordFormatter; + class FileLogHandler extends FileLogHandlerConfiguration { private static String TAG = FileLogHandler.class.getSimpleName(); private FileHandler fileHandler; diff --git a/handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/FileLogHandlerConfiguration.java b/handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/FileLogHandlerConfiguration.java new file mode 100644 index 0000000..a4faf2c --- /dev/null +++ b/handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/FileLogHandlerConfiguration.java @@ -0,0 +1,36 @@ +package pl.brightinventions.slf4android.handler.filelog; + +import android.content.Context; + +import java.util.logging.Handler; + +import pl.brightinventions.slf4android.LogRecordFormatter; +import pl.brightinventions.slf4android.LoggerConfiguration; + +public abstract class FileLogHandlerConfiguration extends Handler { + @SuppressWarnings("UnusedDeclaration") + public abstract FileLogHandlerConfiguration setFullFilePathPattern(String fullPathPattern); + + @SuppressWarnings("UnusedDeclaration") + public abstract FileLogHandlerConfiguration setRotateFilesCountLimit(int count); + + @SuppressWarnings("UnusedDeclaration") + public abstract FileLogHandlerConfiguration setLogFileSizeLimitInBytes(int maxFileSizeInBytes); + + public abstract String getCurrentFileName(); + + + /** + * Creates a {@link FileLogHandlerConfiguration} logger handler. + * The returned new instance should be added to some logger with + * {@link pl.brightinventions.slf4android.LoggerConfiguration#addHandlerToLogger(String, Handler)} + * + * @return A new instance of {@link FileLogHandlerConfiguration}. + */ + public static FileLogHandlerConfiguration create(Context context) { + LogRecordFormatter formatter = LoggerConfiguration.configuration() + .getCompiler() + .compile("%date %level [%thread] %name - %message%newline"); + return new FileLogHandler(context, formatter); + } +} diff --git a/app/src/main/java/pl/brightinventions/slf4android/LogRecordFormatterUtilFormatterAdapter.java b/handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/LogRecordFormatterUtilFormatterAdapter.java similarity index 79% rename from app/src/main/java/pl/brightinventions/slf4android/LogRecordFormatterUtilFormatterAdapter.java rename to handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/LogRecordFormatterUtilFormatterAdapter.java index 3650e24..9dbe58a 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/LogRecordFormatterUtilFormatterAdapter.java +++ b/handler-file-log/src/main/java/pl/brightinventions/slf4android/handler/filelog/LogRecordFormatterUtilFormatterAdapter.java @@ -1,8 +1,10 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.filelog; import java.util.logging.Formatter; import java.util.logging.LogRecord; +import pl.brightinventions.slf4android.LogRecordFormatter; + class LogRecordFormatterUtilFormatterAdapter extends Formatter { private final LogRecordFormatter formatter; diff --git a/app/.gitignore b/handler-notify-developer/.gitignore similarity index 100% rename from app/.gitignore rename to handler-notify-developer/.gitignore diff --git a/handler-notify-developer/build.gradle b/handler-notify-developer/build.gradle new file mode 100644 index 0000000..7b72347 --- /dev/null +++ b/handler-notify-developer/build.gradle @@ -0,0 +1,69 @@ +plugins { + id 'com.android.library' + id 'maven-publish' +} + +android { + namespace "pl.brightinventions.slf4android.handler.notifydeveloper" + + compileSdk 34 + + defaultConfig { + minSdkVersion 19 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + publishing { + singleVariant('release') { + withSourcesJar() + } + } + + packagingOptions { + exclude 'LICENSE.txt' + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/LICENSE' + exclude 'META-INF/NOTICE' + } + + useLibrary 'android.test.runner' + useLibrary 'android.test.base' + + java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + api project(':core') + + implementation 'androidx.core:core:1.13.1' + implementation 'com.squareup:seismic:1.0.2' + + androidTestImplementation 'org.hamcrest:hamcrest-core:1.3' + androidTestImplementation 'org.hamcrest:hamcrest-library:1.3' + androidTestImplementation('junit:junit:4.13.2') + androidTestImplementation 'androidx.test:rules:1.5.0' + androidTestImplementation 'org.easytesting:fest-util:1.2.5' +} + +publishing { + publications { + release(MavenPublication) { + groupId = 'com.github.bright.slf4android' + artifactId = 'slf4android-handler-notify-developer' + version = '1.0' + + afterEvaluate { + from components.release + } + } + } +} diff --git a/app/proguard-rules.pro b/handler-notify-developer/proguard-rules.pro similarity index 100% rename from app/proguard-rules.pro rename to handler-notify-developer/proguard-rules.pro diff --git a/handler-notify-developer/src/androidTest/AndroidManifest.xml b/handler-notify-developer/src/androidTest/AndroidManifest.xml new file mode 100644 index 0000000..91142f0 --- /dev/null +++ b/handler-notify-developer/src/androidTest/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/NotifyDeveloperHandlerTests.java b/handler-notify-developer/src/androidTest/java/pl/brightinventions/slf4android/handler/notifydeveloper/NotifyDeveloperHandlerTests.java similarity index 76% rename from app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/NotifyDeveloperHandlerTests.java rename to handler-notify-developer/src/androidTest/java/pl/brightinventions/slf4android/handler/notifydeveloper/NotifyDeveloperHandlerTests.java index 1168111..573cb2a 100644 --- a/app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/NotifyDeveloperHandlerTests.java +++ b/handler-notify-developer/src/androidTest/java/pl/brightinventions/slf4android/handler/notifydeveloper/NotifyDeveloperHandlerTests.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android.androidTest; +package pl.brightinventions.slf4android.handler.notifydeveloper; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; @@ -7,6 +7,7 @@ import androidx.test.rule.ActivityTestRule; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,36 +15,35 @@ import java.util.concurrent.TimeUnit; import pl.brightinventions.slf4android.LoggerConfiguration; -import pl.brightinventions.slf4android.NotifyDeveloperHandler; -public class NotifyDeveloperHandlerTests extends ActivityTestRule { +public class NotifyDeveloperHandlerTests { + + @Rule + public ActivityTestRule activityTestRule = + new ActivityTestRule<>(TestActivity.class, true, true); private Logger LOG; private NotifyDeveloperHandler handler; - public NotifyDeveloperHandlerTests() { - super(TestActivity.class); - } - @Before public void setUp() { LoggerConfiguration.resetConfigurationToDefault(); LoggerConfiguration configuration = LoggerConfiguration.configuration(); Application targetContext = (Application) getInstrumentation().getTargetContext().getApplicationContext(); - handler = configuration.notifyDeveloperHandler(targetContext, "piotr.mionskowski@gmail.com"); + handler = NotifyDeveloperHandler.create(targetContext, "piotr.mionskowski@gmail.com"); configuration.addHandlerToLogger("", handler); LOG = LoggerFactory.getLogger(getClass().getSimpleName()); } @Test public void test_dont_send_message_with_level_lower_than_error() { - getActivity(); + activityTestRule.getActivity(); LOG.warn("Hello"); } @Test public void test_send_message_with_level_error() throws Exception { - getActivity(); + activityTestRule.getActivity(); LOG.warn("Hello"); LOG.error("Send email", new NullPointerException("A test message")); Thread.sleep(TimeUnit.SECONDS.toMillis(15)); @@ -52,7 +52,7 @@ public void test_send_message_with_level_error() throws Exception { @Test public void test_send_message_with_custom_subject_body_with_level_error() throws Exception { handler.withSubject("Błąd").withBody("Podaj szczegóły błędu: "); - getActivity(); + activityTestRule.getActivity(); LOG.warn("Hello"); LOG.error("Send email", new NullPointerException("A test message")); Thread.sleep(TimeUnit.SECONDS.toMillis(15)); diff --git a/app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/TestActivity.java b/handler-notify-developer/src/androidTest/java/pl/brightinventions/slf4android/handler/notifydeveloper/TestActivity.java similarity index 57% rename from app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/TestActivity.java rename to handler-notify-developer/src/androidTest/java/pl/brightinventions/slf4android/handler/notifydeveloper/TestActivity.java index 1b077a8..c6d79d5 100644 --- a/app/src/androidTest/java/pl/brightinventions/slf4android/androidTest/TestActivity.java +++ b/handler-notify-developer/src/androidTest/java/pl/brightinventions/slf4android/handler/notifydeveloper/TestActivity.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android.androidTest; +package pl.brightinventions.slf4android.handler.notifydeveloper; import android.app.Activity; import android.os.Bundle; @@ -7,6 +7,6 @@ public class TestActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.test); + setContentView(pl.brightinventions.slf4android.handler.notifydeveloper.test.R.layout.test); } } diff --git a/app/src/androidTest/res/layout/test.xml b/handler-notify-developer/src/androidTest/res/layout/test.xml similarity index 100% rename from app/src/androidTest/res/layout/test.xml rename to handler-notify-developer/src/androidTest/res/layout/test.xml diff --git a/app/src/main/AndroidManifest.xml b/handler-notify-developer/src/main/AndroidManifest.xml similarity index 94% rename from app/src/main/AndroidManifest.xml rename to handler-notify-developer/src/main/AndroidManifest.xml index c081391..5c31aae 100644 --- a/app/src/main/AndroidManifest.xml +++ b/handler-notify-developer/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/java/pl/brightinventions/slf4android/ActivityStateListener.java b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/ActivityStateListener.java similarity index 90% rename from app/src/main/java/pl/brightinventions/slf4android/ActivityStateListener.java rename to handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/ActivityStateListener.java index 03fb919..a422816 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/ActivityStateListener.java +++ b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/ActivityStateListener.java @@ -1,14 +1,11 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.notifydeveloper; -import android.annotation.TargetApi; import android.app.Activity; import android.app.Application; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; -@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) class ActivityStateListener implements Application.ActivityLifecycleCallbacks { private Activity lastUsedActivity; private Activity activeActivity; diff --git a/app/src/main/java/pl/brightinventions/slf4android/AtLeastFilter.java b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/AtLeastFilter.java similarity index 76% rename from app/src/main/java/pl/brightinventions/slf4android/AtLeastFilter.java rename to handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/AtLeastFilter.java index 5ae45da..5946127 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/AtLeastFilter.java +++ b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/AtLeastFilter.java @@ -1,8 +1,10 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.notifydeveloper; import java.util.logging.Filter; import java.util.logging.LogRecord; +import pl.brightinventions.slf4android.LogLevel; + class AtLeastFilter implements Filter { private final LogLevel level; diff --git a/app/src/main/java/pl/brightinventions/slf4android/EmailErrorReport.java b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/EmailErrorReport.java similarity index 97% rename from app/src/main/java/pl/brightinventions/slf4android/EmailErrorReport.java rename to handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/EmailErrorReport.java index 47d7f33..a190d52 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/EmailErrorReport.java +++ b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/EmailErrorReport.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.notifydeveloper; import android.content.Context; import android.content.Intent; diff --git a/app/src/main/java/pl/brightinventions/slf4android/Lists.java b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/Lists.java similarity index 82% rename from app/src/main/java/pl/brightinventions/slf4android/Lists.java rename to handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/Lists.java index 48ed174..78a702d 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/Lists.java +++ b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/Lists.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.notifydeveloper; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/pl/brightinventions/slf4android/LogcatReadingConfiguration.java b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/LogcatReadingConfiguration.java similarity index 81% rename from app/src/main/java/pl/brightinventions/slf4android/LogcatReadingConfiguration.java rename to handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/LogcatReadingConfiguration.java index 4bf28cb..d2ce824 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/LogcatReadingConfiguration.java +++ b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/LogcatReadingConfiguration.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.notifydeveloper; class LogcatReadingConfiguration { private boolean shouldClear; diff --git a/app/src/main/java/pl/brightinventions/slf4android/MakeScreenShotAsyncTask.java b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/MakeScreenShotAsyncTask.java similarity index 98% rename from app/src/main/java/pl/brightinventions/slf4android/MakeScreenShotAsyncTask.java rename to handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/MakeScreenShotAsyncTask.java index 9d51981..55dc53f 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/MakeScreenShotAsyncTask.java +++ b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/MakeScreenShotAsyncTask.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.notifydeveloper; import android.app.Activity; import android.content.Context; diff --git a/app/src/main/java/pl/brightinventions/slf4android/NotifyDeveloperDialogDisplayActivity.java b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/NotifyDeveloperDialogDisplayActivity.java similarity index 90% rename from app/src/main/java/pl/brightinventions/slf4android/NotifyDeveloperDialogDisplayActivity.java rename to handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/NotifyDeveloperDialogDisplayActivity.java index a9208d7..1e3e2d2 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/NotifyDeveloperDialogDisplayActivity.java +++ b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/NotifyDeveloperDialogDisplayActivity.java @@ -1,21 +1,24 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.notifydeveloper; -import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; import android.util.Log; import android.widget.Toast; +import java.io.Closeable; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; +import pl.brightinventions.slf4android.LogRecord; +import pl.brightinventions.slf4android.MessageValueSupplier; + public class NotifyDeveloperDialogDisplayActivity extends Activity { private static final String TAG = NotifyDeveloperDialogDisplayActivity.class.getSimpleName(); private static final MessageValueSupplier messageFormatter = new MessageValueSupplier(); @@ -47,7 +50,7 @@ public static AlertDialog showDialogIn(final Context activityContext, LogRecord return alertDialog; } - private static AlertDialog showDialogIn(final Context activityContext, final String message, final List emailAddresses, String emailSubject, String emailBody, Iterable> attachmentTasks, final Disposable onDialogClose) { + private static AlertDialog showDialogIn(final Context activityContext, final String message, final List emailAddresses, String emailSubject, String emailBody, Iterable> attachmentTasks, final Closeable onDialogClose) { final EmailErrorReport emailErrorReport = new EmailErrorReport(message, emailAddresses, emailSubject, emailBody); for (AsyncTask attachment : attachmentTasks) { startTaskExecution(activityContext, attachment); @@ -67,18 +70,14 @@ private static AlertDialog showDialogIn(final Context activityContext, final Str public void onClick(DialogInterface dialog, int which) { sendEmailWithError(activityContext, emailErrorReport); dialog.dismiss(); - if (onDialogClose != null) { - onDialogClose.dispose(); - } + closeSafely(onDialogClose); } }) .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - if (onDialogClose != null) { - onDialogClose.dispose(); - } + closeSafely(onDialogClose); } }) .create(); @@ -86,6 +85,16 @@ public void onClick(DialogInterface dialog, int which) { return alertDialog; } + private static void closeSafely(Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (IOException e) { + Log.e(TAG, "Could not close " + closeable, e); + } + } + } + private static List> buildAttachmentFactories(Iterable attachmentsClasses) { List> attachmentTasks = new ArrayList>(); for (String attachmentClassName : attachmentsClasses) { @@ -104,7 +113,6 @@ private static List> buildAttachmentFactories(Ite return attachmentTasks; } - @TargetApi(Build.VERSION_CODES.HONEYCOMB) private static void startTaskExecution(Context activityContext, AsyncTask attachment) { attachment.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, activityContext); } @@ -146,9 +154,9 @@ protected void onCreate(Bundle savedInstanceState) { String emailBody = getIntent().getExtras().getString("email_body"); List> attachmentTasks = buildAttachmentFactoriesFromIntent(); if (log_record != null) { - dialog = showDialogIn(this, log_record, emailAddresses, emailSubject, emailBody, attachmentTasks, new Disposable() { + dialog = showDialogIn(this, log_record, emailAddresses, emailSubject, emailBody, attachmentTasks, new Closeable() { @Override - public void dispose() { + public void close() { finish(); } }); diff --git a/app/src/main/java/pl/brightinventions/slf4android/NotifyDeveloperHandler.java b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/NotifyDeveloperHandler.java similarity index 85% rename from app/src/main/java/pl/brightinventions/slf4android/NotifyDeveloperHandler.java rename to handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/NotifyDeveloperHandler.java index 718e9d5..194ca2a 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/NotifyDeveloperHandler.java +++ b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/NotifyDeveloperHandler.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.notifydeveloper; import android.app.Activity; import android.app.AlertDialog; @@ -21,6 +21,9 @@ import java.util.logging.Level; import java.util.logging.LogRecord; +import pl.brightinventions.slf4android.LogLevel; +import pl.brightinventions.slf4android.LoggerConfiguration; + public class NotifyDeveloperHandler extends Handler { private static final String TAG = NotifyDeveloperHandler.class.getSimpleName(); private final Context context; @@ -34,6 +37,27 @@ public class NotifyDeveloperHandler extends Handler { private android.os.Handler mailLoopHandler = new android.os.Handler(Looper.getMainLooper()); private ArrayList attachmentClassList; + public static NotifyDeveloperHandler create(final Application context, String email) { + final ActivityStateListener stateListener = getStateListener(context); + ArrayList emails = new ArrayList(); + emails.add(email); + NotifyDeveloperHandler handler = new NotifyDeveloperHandler(context, emails, stateListener); + handler.addAttachmentClass(ReadLogcatEntriesAsyncTask.class); + handler.addAttachmentClass(MakeScreenShotAsyncTask.class); + return handler; + } + + private static ActivityStateListener getStateListener(final Application context) { + final ActivityStateListener stateListener = new ActivityStateListener(); + + LoggerConfiguration.configuration().registerCloseable(() -> + context.unregisterActivityLifecycleCallbacks(stateListener) + ); + + context.registerActivityLifecycleCallbacks(stateListener); + return stateListener; + } + NotifyDeveloperHandler(Application context, Iterable emailAddress, ActivityStateListener activityState) { this(context, emailAddress, LogLevel.ERROR, activityState); } @@ -141,7 +165,7 @@ private ArrayList getAttachmentClassList() { return attachmentClassList; } - public NotifyDeveloperHandler withSubject(String subject){ + public NotifyDeveloperHandler withSubject(String subject) { this.emailSubject = subject; return this; } diff --git a/app/src/main/java/pl/brightinventions/slf4android/ReadLogcatEntriesAsyncTask.java b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/ReadLogcatEntriesAsyncTask.java similarity index 97% rename from app/src/main/java/pl/brightinventions/slf4android/ReadLogcatEntriesAsyncTask.java rename to handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/ReadLogcatEntriesAsyncTask.java index 17d5f51..4696b31 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/ReadLogcatEntriesAsyncTask.java +++ b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/ReadLogcatEntriesAsyncTask.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.notifydeveloper; import android.content.Context; import android.os.AsyncTask; diff --git a/app/src/main/java/pl/brightinventions/slf4android/Slf4AndroidLogFileProvider.java b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/Slf4AndroidLogFileProvider.java similarity index 85% rename from app/src/main/java/pl/brightinventions/slf4android/Slf4AndroidLogFileProvider.java rename to handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/Slf4AndroidLogFileProvider.java index e1db851..35597fe 100644 --- a/app/src/main/java/pl/brightinventions/slf4android/Slf4AndroidLogFileProvider.java +++ b/handler-notify-developer/src/main/java/pl/brightinventions/slf4android/handler/notifydeveloper/Slf4AndroidLogFileProvider.java @@ -1,4 +1,4 @@ -package pl.brightinventions.slf4android; +package pl.brightinventions.slf4android.handler.notifydeveloper; import android.content.Context; diff --git a/app/src/main/res/values/strings.xml b/handler-notify-developer/src/main/res/values/strings.xml similarity index 100% rename from app/src/main/res/values/strings.xml rename to handler-notify-developer/src/main/res/values/strings.xml diff --git a/app/src/main/res/xml/file_paths.xml b/handler-notify-developer/src/main/res/xml/file_paths.xml similarity index 58% rename from app/src/main/res/xml/file_paths.xml rename to handler-notify-developer/src/main/res/xml/file_paths.xml index 6545fb7..338bd74 100644 --- a/app/src/main/res/xml/file_paths.xml +++ b/handler-notify-developer/src/main/res/xml/file_paths.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 5c962e0..d567183 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,4 +2,7 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.7.0" } -include ':app' +include ':core' +include ':testapp' +include ':handler-file-log' +include ':handler-notify-developer' diff --git a/testapp/.gitignore b/testapp/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/testapp/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/testapp/build.gradle b/testapp/build.gradle new file mode 100644 index 0000000..bf92b5e --- /dev/null +++ b/testapp/build.gradle @@ -0,0 +1,69 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'pl.brightinventions.slf4android.testapp' + compileSdk 34 + + defaultConfig { + applicationId "pl.brightinventions.slf4android.testapp" + minSdk 19 + targetSdk 34 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + signingConfigs { + release { + storeFile file('testkeystore.jks') + storePassword 'teststore' + keyAlias 'key' + keyPassword 'testkey' + } + } + + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release + } + } + + java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +repositories { + maven { url 'https://jitpack.io' } +} + +dependencies { + // Uncomment to use the artifacts from JitPack + //var slf4androidVersion = '7378c1016a' + //implementation "com.github.bright.slf4android:slf4android:$slf4androidVersion" + //implementation "com.github.bright.slf4android:slf4android-handler-file-log:slf4androidVersion" + //implementation "com.github.bright.slf4android:slf4android-handler-notify-developer:slf4androidVersion" + + // Uncomment to use the local modules + implementation project(':core') + //implementation project(':handler-file-log') + //implementation project(':handler-notify-developer') + + implementation 'androidx.core:core:1.13.1' + + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' +} \ No newline at end of file diff --git a/testapp/proguard-rules.pro b/testapp/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/testapp/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/testapp/src/main/AndroidManifest.xml b/testapp/src/main/AndroidManifest.xml new file mode 100644 index 0000000..c9f751f --- /dev/null +++ b/testapp/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/testapp/src/main/java/pl/brightinventions/slf4android/testapp/MainActivity.java b/testapp/src/main/java/pl/brightinventions/slf4android/testapp/MainActivity.java new file mode 100644 index 0000000..da19640 --- /dev/null +++ b/testapp/src/main/java/pl/brightinventions/slf4android/testapp/MainActivity.java @@ -0,0 +1,44 @@ +package pl.brightinventions.slf4android.testapp; + +import android.app.Activity; +import android.os.Bundle; + +import androidx.annotation.Nullable; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +import pl.brightinventions.slf4android.LoggerConfiguration; + +public class MainActivity extends Activity { + + private static final Logger LOG = LoggerFactory.getLogger(MainActivity.class.getSimpleName()); + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + findViewById(R.id.log).setOnClickListener((view) -> { + LOG.trace("trace"); + LOG.debug("debug"); + LOG.info("info"); + LOG.warn("warn"); + LOG.error("error"); + }); + findViewById(R.id.reset).setOnClickListener((view) -> { + LoggerConfiguration.resetConfigurationToDefault(); + }); + findViewById(R.id.registerCloseable).setOnClickListener((view) -> { + LoggerConfiguration.configuration().registerCloseable(() -> LOG.info("Closing")); + }); + findViewById(R.id.registerFailingCloseable).setOnClickListener((view) -> { + LoggerConfiguration.configuration().registerCloseable(() -> { + throw new IOException("Test"); + }); + }); + + } +} diff --git a/testapp/src/main/java/pl/brightinventions/slf4android/testapp/TestApp.java b/testapp/src/main/java/pl/brightinventions/slf4android/testapp/TestApp.java new file mode 100644 index 0000000..178891a --- /dev/null +++ b/testapp/src/main/java/pl/brightinventions/slf4android/testapp/TestApp.java @@ -0,0 +1,15 @@ +package pl.brightinventions.slf4android.testapp; + +import android.app.Application; + +import pl.brightinventions.slf4android.LoggerConfiguration; + +public class TestApp extends Application { + + @Override + public void onCreate() { + super.onCreate(); + + LoggerConfiguration.resetConfigurationToDefault(); + } +} diff --git a/testapp/src/main/res/layout/activity_main.xml b/testapp/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..084bae0 --- /dev/null +++ b/testapp/src/main/res/layout/activity_main.xml @@ -0,0 +1,31 @@ + + + +