diff --git a/logsender-sample/src/main/java/com/itsaky/androidide/logsender/sample/MainActivity.java b/logsender-sample/src/main/java/com/itsaky/androidide/logsender/sample/MainActivity.java
index 1e3020176..cbfe1ca33 100644
--- a/logsender-sample/src/main/java/com/itsaky/androidide/logsender/sample/MainActivity.java
+++ b/logsender-sample/src/main/java/com/itsaky/androidide/logsender/sample/MainActivity.java
@@ -20,7 +20,6 @@ package com.itsaky.androidide.logsender.sample;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.os.PersistableBundle;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
@@ -51,12 +50,14 @@ public class MainActivity extends AppCompatActivity {
handler.postDelayed(logger, 1000);
- new Thread(() -> {
+ findViewById(R.id.exception).setOnClickListener(v -> {
+ throw new RuntimeException("Oops!");
+ });
- // Test with 100K lines at once
+ findViewById(R.id.log_overflow).setOnClickListener(v -> new Thread(() -> {
for (int i = 0; i < 100000; i++) {
- Log.d("SomeLogs", "Log #" + i);
+ Log.d("ShouldNotBreak", "Log #" + i);
}
- }).start();
+ }).start());
}
}
diff --git a/logsender-sample/src/main/res/layout/activity_main.xml b/logsender-sample/src/main/res/layout/activity_main.xml
index 2e2dcb3a8..0a59af1db 100644
--- a/logsender-sample/src/main/res/layout/activity_main.xml
+++ b/logsender-sample/src/main/res/layout/activity_main.xml
@@ -21,11 +21,32 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:gravity="center"
+ android:orientation="vertical"
tools:context=".MainActivity">
+ android:text="Click the buttons below to test different cases." />
+
+
+
+
\ No newline at end of file
diff --git a/logsender-sample/src/main/res/values-night/themes.xml b/logsender-sample/src/main/res/values-night/themes.xml
index 34446cc75..66b4286dd 100644
--- a/logsender-sample/src/main/res/values-night/themes.xml
+++ b/logsender-sample/src/main/res/values-night/themes.xml
@@ -17,7 +17,7 @@
-
diff --git a/logsender-sample/src/main/res/values/themes.xml b/logsender-sample/src/main/res/values/themes.xml
index a6087265d..af2adc491 100644
--- a/logsender-sample/src/main/res/values/themes.xml
+++ b/logsender-sample/src/main/res/values/themes.xml
@@ -17,7 +17,7 @@
-
diff --git a/logsender/src/main/AndroidManifest.xml b/logsender/src/main/AndroidManifest.xml
index ec22be03e..9b62c8398 100644
--- a/logsender/src/main/AndroidManifest.xml
+++ b/logsender/src/main/AndroidManifest.xml
@@ -16,16 +16,22 @@
-->
+
-
+
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/logsender/src/main/java/com/itsaky/androidide/logsender/LogSender.java b/logsender/src/main/java/com/itsaky/androidide/logsender/LogSender.java
index 3ea7c5a78..fa145db54 100644
--- a/logsender/src/main/java/com/itsaky/androidide/logsender/LogSender.java
+++ b/logsender/src/main/java/com/itsaky/androidide/logsender/LogSender.java
@@ -17,8 +17,8 @@
package com.itsaky.androidide.logsender;
-import android.app.Application;
import android.content.ComponentName;
+import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
@@ -33,7 +33,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
*
* @author Akash Yadav
*/
-public class LogSender extends ILogSender.Stub implements ServiceConnection {
+public final class LogSender extends ILogSender.Stub implements ServiceConnection {
private final AtomicBoolean installed = new AtomicBoolean(false);
@@ -63,24 +63,20 @@ public class LogSender extends ILogSender.Stub implements ServiceConnection {
private LogSender() {
}
- public static void install(Application app) {
- INSTANCE.doInstall(app);
- }
-
- private void doInstall(Application app) {
+ void doInstall(Context context) {
if (installed.get()) {
Logger.warn("LogSender is already installed");
return;
}
- this.packageName = app.getPackageName();
+ this.packageName = context.getPackageName();
if (PACKAGE_ANDROIDIDE.equals(packageName)) {
return;
}
final Intent intent = new Intent(SERVICE_ACTION);
intent.setPackage(PACKAGE_ANDROIDIDE);
- if (app.bindService(intent, this, 0)) {
+ if (context.bindService(intent, this, 0)) {
Logger.info("Binding to log receiver");
installed.set(true);
} else {
diff --git a/logsender/src/main/java/com/itsaky/androidide/logsender/LogSenderService.java b/logsender/src/main/java/com/itsaky/androidide/logsender/LogSenderService.java
new file mode 100644
index 000000000..2e1c20409
--- /dev/null
+++ b/logsender/src/main/java/com/itsaky/androidide/logsender/LogSenderService.java
@@ -0,0 +1,45 @@
+/*
+ * This file is part of AndroidIDE.
+ *
+ * AndroidIDE is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AndroidIDE is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AndroidIDE. If not, see .
+ */
+
+package com.itsaky.androidide.logsender;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+import androidx.annotation.Nullable;
+
+/**
+ * A {@link Service} which runs in the background and sends logs to AndroidIDE.
+ *
+ * @author Akash Yadav
+ */
+public class LogSenderService extends Service {
+
+ private final LogSender logSender = LogSender.INSTANCE;
+
+ @Nullable
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ logSender.doInstall(getApplicationContext());
+ return START_NOT_STICKY;
+ }
+}
diff --git a/logsender/src/main/java/com/itsaky/androidide/logsender/utils/LogSenderInstaller.java b/logsender/src/main/java/com/itsaky/androidide/logsender/utils/LogSenderInstaller.java
index 00c5c6620..080adb7cf 100644
--- a/logsender/src/main/java/com/itsaky/androidide/logsender/utils/LogSenderInstaller.java
+++ b/logsender/src/main/java/com/itsaky/androidide/logsender/utils/LogSenderInstaller.java
@@ -20,9 +20,11 @@ package com.itsaky.androidide.logsender.utils;
import android.app.Application;
import android.content.ContentProvider;
import android.content.ContentValues;
+import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import com.itsaky.androidide.logsender.LogSender;
+import com.itsaky.androidide.logsender.LogSenderService;
/**
* Content providers are loaded before the application class is created. {@link LogSenderInstaller}
@@ -40,7 +42,7 @@ public class LogSenderInstaller extends ContentProvider {
@Override
public boolean onCreate() {
final Application application = ((Application) getContext());
- LogSender.install(application);
+ application.startService(new Intent(application, LogSenderService.class));
return true;
}