GithubHelp home page GithubHelp logo

pandulapeter / beagle Goto Github PK

View Code? Open in Web Editor NEW
481.0 10.0 26.0 23.66 MB

A smart, reliable, and highly customizable debug menu library for Android apps that supports screen recording, network activity logging, and many other useful features.

License: Apache License 2.0

Kotlin 99.94% Ruby 0.06%
library debug menu android debug-menu beagle drawer debug-drawer kotlin

beagle's Issues

Rewrite the dialog used for displaying network request / response payloads

Required features:

  • Formatting the JSON should be done in the background to avoid blocking the UI thread in case of large payloads.
  • Controls for showing request / response metadata (headers, timestamp, duration) should be on the UI.
  • The copy feature is currently based on Android's default text selection UX which is cumbersome with JSON-s.
  • Expanding / collapsing JSON objects / arrays would be very helpful.
  • Links should be clickable.
  • Scrollbars are also needed.

Support for custom built Trick

Hi, I wonder if you had plans to make it more extensible in a near future? I've seen there is a lots of building blocks and great modules already built-in but I just wonder if you were planning to open Beagle for custom made Tricks.

Thanks and great work on the library! :)

Add ability to access to current activity from Beagle

Hi, thanks for the great library.
We faced some issue, that we need to access current activity to open some dialogs by clicking to Button trick.

How to make this behaviour correctly? Or the library can have a method like this:
Beagle.currentActivity()

Thanks a lot.

BeagleNetworkInterceptor is misleadingly named

Due to the name I assumed I had to add BeagleNetworkInterceptor using OkHttpClient.Builder.addNetworkInterceptor(). This worked fine for a while, until I enabled gzip compression on backend responses, at which point this line started quietly mangling all my gzipped responses, then gzip decompression runs after the network interceptors, resulting in some confusing gzip decoding error.

I wonder if there's any way to assert that BeagleNetworkInterceptor got added as a normal interceptor and not a network interceptor, so this bug could've been caught early?

Improve list item appearance

  • The height of the items and their headers should be the same.
  • Adding a bullet point to the beginning of the list items is not the greatest UI decision.
  • Animating the chevron expanded / collapsed state would be a nice improvement.

Refactor inset handling

Now that we target SDK 30 the current inset handling logic is deprecated. It also didn't work well on some apps (especially with the Insetter library it needed some manual workarounds) so hopefully migrating to new API-s will fix the issues.

ViewBoundsOverlayToggle crash

Hi. Thanks for the nice library. I found the crash for some functionality such as ViewBoundsOverlayToggle

If I enable this functionality, that crash happens. Looks like the problem in OverlayFrameLayout. Should be GlobalScope.launch(Dispatchers.Main) {}

Crash log:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6855) at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1075) at android.view.ViewGroup.invalidateChild(ViewGroup.java:5242) at android.view.View.invalidateInternal(View.java:13574) at android.view.View.invalidate(View.java:13538) at android.view.View.invalidate(View.java:13522) at com.pandulapeter.beagle.views.OverlayFrameLayout$startAutomaticRefresh$1.invokeSuspend(OverlayFrameLayout.kt:71) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:561) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:727) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:667) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:655)

[Bug] Default KeylineOverlay color is not updated on configuration change

Unless explicitly specified otherwise, the module tries to use the default text color from the theme. This is cached the first time the switch is enabled and does not get updated, for example when turning night mode on or off. As a result the caching logic should be removed (or invalidated more frequently).

[Feature request] Add a floating button

Hey, I would like to propose an idea for the library.
In our huge project, we faced with a situation, when the developer should change different options inside Tricks and after that restart application by clicking some button. After click, we save in preferences all necessary data and force stop application.

For this purpose will be very useful the new type of Trick (Please see "Apply" button on screenshot).

What do you think about this? ๐Ÿ™‚
Best regards.

Cannot navigate back if activity is opening from beagle

Hi)
I faced an interesting issue. In my app, I have Trick Button and by clicking some debug Activity is opening.

Trick.Button(
                text = "test",
                onButtonPressed = {
                    Beagle.currentActivity?.run {
                        startActivity(Intent(this, MotionActivity::class.java) )
                    }
                }
            )

After that, I cannot go back from MotionActivity ๐Ÿ™‚

Looks like a problem in this block of code

private val onBackPressedCallback = object : OnBackPressedCallback(false) {
        override fun handleOnBackPressed() {
            dismiss()
        }
    }

Thank you.

How to disable Beagle at runtime?

I was looking for such a tool, it's too cool, you are really a cool dude. Thumbs up ๐Ÿ‘
I got some issues when checked this -

  1. Not able to disable beagle using Beagle.isEnabled = false
  2. Not able to achieve desired theme for buttons test style and fonts

Custom theme for Beagle

Hello)

I faced with the issue if I set the custom theme for the Beagle library, the theme applies to the whole activity.

Beagle.imprint(
    application = application,
    appearance = Appearance(themeResourceId = resourseId)
)

Can we fix this behaviour and apply that only for Navigation drawer?

Gesture navigation problem OnePlus.

Unfortunately on Android 10 on OnePlus, the new gesture navigation conflicts with the Beagle drawer open action. Can you add some other trigger to open the drawer?

Coil upgrade to 1.0.0.rc1

RC release of coil broke backwards compatibility and after upgrading it in my project - beagle is crashing on initialize. Could you release version with bumped coil version?

Version 0.12.0 does not work too

Missing features from the Gallery screen

  • Add ability to preview images / videos.
  • Add ability to share multiple files.
  • Add ability to delete files.
  • Add section headers for days.
  • Differentiate between images and videos.

EditText equivalent Trick

Does beagle have EditText equivalent for Trick or modules to include that will

Similar like SingleSelectionList, SimpleList but with additional features:

  1. input some text
  2. able to have an action with the provided text

Beagle preventing automatic keyboard opening.

Hey,

In a number of screens we have where the soft input keyboard is working, the focus is "stolen" by Beagle, and for that reason the keyboard doesn't open automatically. Do you have any suggestion on how to solve this?

Thanks.

Drawer does not work with FragNav

I'm using FragNav for fragments navigation (https://github.com/ncapdevi/FragNav) and when i set up MainActivity like this:

@AndroidEntryPoint
class MainActivity : AppCompatActivity(), FragNavController.TransactionListener {
    private val binding by viewBinding(ActivityMainBinding::inflate)

    val fragNavController = FragNavController(supportFragmentManager, R.id.fragmentContainer)

    override fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.AppTheme)
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        fragNavController.apply {
            transactionListener = this@MainActivity
            rootFragments = listOf(HomeFragment())
            fragNavLogger = object : FragNavLogger {
                override fun error(message: String, throwable: Throwable) {
                    Timber.e(throwable, message)
                }
            }

            defaultTransactionOptions = FragNavTransactionOptions.newBuilder().customAnimations(
                R.anim.slide_left_from_right,
                R.anim.slide_left_from_middle,
                R.anim.slide_right_from_left,
                R.anim.slide_right_from_middle
            ).build()
            initialize(savedInstanceState = savedInstanceState)
        }
    }
}

the Beagle.show() returns false. When i inspect layout - no overlay is being added. If i disable FragNav like this:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    private val binding by viewBinding(ActivityMainBinding::inflate)

    override fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.AppTheme)
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        supportFragmentManager.commit {
            replace(R.id.fragmentContainer, HomeFragment())
        }
    }
}

It works perfectly. FragNav is pretty important to me. Is there a way to bypass this issue?

[Bug] NetworkLogManager crashing application with concurrent modification exception

Description
I noticed a crash in my application which seems to be originating from Beagle.
The issue seems to be in the NetworkLogManager, in my case the problem was occurring by the sort function. In line 24 there is a entries.sortByDescending { it.timestamp }.

Repro steps
By the nature of the exception (ConcurrentModificationException) I cannot provide a good repro steps.

Version
the used version is 2.0.0-beta01
Based on the fact that this class has not been modified between beta01 and beta06 I assume the issue would still persist

Suggestion to fix
I suggest to use immutable list in the NetworkLogManager.entries so there is no possibility for concurrent modification.
Other possible solution could be to use other synchronization mechanizm

Stracktrace
java.util.ConcurrentModificationException at java.util.ArrayList.sort(ArrayList.java:1472) at java.util.Collections.sort(Collections.java:206) at kotlin.collections.CollectionsKt__MutableCollectionsJVMKt.sortWith(MutableCollectionsJVM.kt:42) at com.pandulapeter.beagle.core.manager.NetworkLogManager.log(NetworkLogManager.kt:40) at com.pandulapeter.beagle.core.BeagleImplementation.logNetworkEvent(BeagleImplementation.kt:150) at com.pandulapeter.beagle.common.contracts.BeagleContract$DefaultImpls.logNetworkEvent$default(BeagleContract.kt:301) at com.pandulapeter.beagle.core.util.NetworkInterceptor.intercept(NetworkInterceptor.kt:63) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100) at ***.OkHttpClientProvider$provide$1.intercept(OkHttpClientProvider.kt:29) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100) at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:197) at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:502) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:919)

Android 10 gesture navigation conflict on OnePlus devices.

While on many devices there seems to be some sort of awkward gesture to bring up side drawers instead of trigerring the back navigation action (Pixel: hold to peek or swipe diagonally, Samsung: swipe vertically along the edge), the implementation on OnePlus apparently leaves no way of opening Beagle (if gesture navigation is enabled).

While the drawer can be opened programatically using Beagle.fetch(), there should be a better way to deal with the problem. Probably an optional mini FAB will be added to the library in the future.

Ability as all-in-one solutions for QA & Dev debugging task

I've recently used this OkReport features.

Would be nice if this library also support the following features:

  1. multiple screenshot (and able to highlight some area of view) - OkReport
  2. multiple repro steps - OkReport
  3. submit report to email/slack (for QA able to collect all the repro+screenshot) - OkReport
  4. error log crash reporting (no need to check for firebase crashlytics to diagnose the crash, because QA will share the crash log, good condition when e.g: AFK)
  5. network log ui, like Chucker

EDITED:
Point number 3, as you already planned in README.md, that's GREAT!!!

TODO: SendBugReportButton - Sends a pre-formatted message with logs to a specified email address.

Introduce a lifecycle-aware learn() method

Having tricks that only appear on a single screen is a frequent usecase but the only way to implement it currently (saving the trick ID and adding / removing it in the component's lifecycle) is cumbersome and error-prone.

Adding a learn() method that takes a lifecycle parameter and resolves adding / removing the trick under the hood would be a more modern solution.

[Feature Request] Separate logging from Android module

It would be nice if the Logging and NetworkLogging options could be included as java modules:
For multi-module projects where the networking layer is separated from the android-ui layer, either for separation of concerns or reusability, at the moment the main module most know about okhttp in order to provide the interceptor to the networking layer. Ofc this solution works, but it adds an okhttp dependency into the ui module while it shouldn't know anything about networking.

so the idea would be let's say we have a network-layer module:
this includes a beagle-network-loging dependency or something similar
the app module includes beagle the same way as does it now
The network-layer module could provide a BeagleNetworkLogger or something similar which can be added to Beagle itself, and gets the data from the already created interceptor.

This way the app module would not know anything about the networking only that there is a logger it should include, while network logging is still available.
Ofc names and the solution can be changed simplified, this just tries to illustrate the use-case and some rough high-level version of the problem.

Does Beagle doesn't support API 16 & below?

Does Beagle only support minSdk 17?
Same SO Questions regarding marginStart|End: https://stackoverflow.com/a/25749855/3763032
Error Log:

    java.lang.NoSuchMethodError: android.widget.FrameLayout$LayoutParams.setMarginStart
        at com.pandulapeter.beagle.views.BeagleDrawer.<init>(BeagleDrawer.kt:52)
        at com.pandulapeter.beagle.views.BeagleDrawer.<init>(BeagleDrawer.kt:27)
        at com.pandulapeter.beagle.Beagle.createAndAddDrawerLayout(Beagle.kt:355)
        at com.pandulapeter.beagle.Beagle.access$createAndAddDrawerLayout(Beagle.kt:49)
        at com.pandulapeter.beagle.Beagle$lifecycleCallbacks$1.onActivityCreated(Beagle.kt:289)
        at android.app.Application.dispatchActivityCreated(Application.java:154)
        at android.app.Activity.onCreate(Activity.java:887)
        at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:81)
        at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:154)
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:312)
        at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:106)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.