Giter Site home page Giter Site logo

hyperion-android's Introduction

Hyperion

Build & Release to Maven Central Maven Central License MIT Public Yes

Hyperion Logo

Hyperion - App Inspection Tool

What is it?

Hyperion is a hidden plugin drawer that can easily be integrated into any app. The drawer sits discreetly 🙊 under the app so that it is there when you need it and out of the way when you don't. Hyperion plugins are designed to make inspection of your app quick and simple.

Please see our announcement blog post for a feature showcase.

Demo Attribute inspector

Third-Party Plugins

Be one of the first to create a third-party plugin. The plugin creation guide is a work in progress, but if you are feeling ambitious you can reference the plugins we have already created.

To create your own plugin, implement the Plugin interface and expose the implementation as a service. The plugins made available in this repository leverage Google's AutoService annotation processor to generate the service metadata and simplify the process.

How To Show Hyperion Plugin List

Once Hyperion is integrated into your app, simply shake your phone to activate. If you are running your app on an emulator, you can manually open the menu by calling Hyperion.open(Activity activity). You can also open the menu by selecting the foreground notification that appears while the client app is in the foreground.

Conditional Startup

Hyperion enables itself automatically for all Activities in your application. To disable for specific Activities, annotate them with @HyperionIgnore. To disable for all Activities, set a meta-data field in your AndroidManifest.xml:

    <meta-data
        android:name="com.willowtreeapps.hyperion.core.enableOnStart"
        android:value="false"/>

Hyperion#open(Activity) will have no affect if Hyperion has not been enabled. You can reenable for future Activities with Hyperion.enable().

To embed the Hyperion Plugin Menu into your own Activity, acquire a PluginViewFactory from Hyperion#getPluginViewFactory and call create(Activity):

View pluginView = Hyperion.getPluginViewFactory().create(activity);

See FactoryActivity for more details.

Sample App

Want to learn how to use Hyperion? The sample app will teach you!

Build the example project by cloning the repo, run ./gradlew assemble from the root directory, then open in Android Studio and run.

Requirements

min SDK 15

Download


Download via Maven:

<dependency>
  <groupId>com.willowtreeapps.hyperion</groupId>
  <artifactId>hyperion-core</artifactId>
  <version>0.9.38</version>
</dependency>

or Gradle:

debugImplementation 'com.willowtreeapps.hyperion:hyperion-core:0.9.38'

If you reference Hyperion from your code, you should also compile the no-op artifact for release variants. For most users, this will not be necessary:

releaseImplementation 'com.willowtreeapps.hyperion:hyperion-core-no-op:0.9.38'

Usage


Include the core library along with any number of plugins.

debugImplementation 'com.willowtreeapps.hyperion:hyperion-core:0.9.38'
debugImplementation 'com.willowtreeapps.hyperion:hyperion-attr:0.9.38'
debugImplementation 'com.willowtreeapps.hyperion:hyperion-build-config:0.9.38'
debugImplementation 'com.willowtreeapps.hyperion:hyperion-crash:0.9.38'
debugImplementation 'com.willowtreeapps.hyperion:hyperion-disk:0.9.38'
debugImplementation 'com.willowtreeapps.hyperion:hyperion-geiger-counter:0.9.38'
debugImplementation 'com.willowtreeapps.hyperion:hyperion-measurement:0.9.38'
debugImplementation 'com.willowtreeapps.hyperion:hyperion-phoenix:0.9.38'
debugImplementation 'com.willowtreeapps.hyperion:hyperion-recorder:0.9.38'
debugImplementation 'com.willowtreeapps.hyperion:hyperion-shared-preferences:0.9.38'
debugImplementation 'com.willowtreeapps.hyperion:hyperion-timber:0.9.38'

Adding Plugins

Hyperion plugins need to be added into the app at build time. By default, Hyperion automatically finds every plugin that is available in the project using the Java Service Locator.

Contributing to Hyperion

Contributions are welcome. Please see the Contributing guidelines.

Hyperion has adopted a code of conduct defined by the Contributor Covenant, the same used by the Swift language and countless other open source software teams.

Plugin Descriptions

The following is a list of all plugins that integrate with Hyperion. Please make a pull request if you would like to see your plugin here:

Core Plugins

Third Party Plugins

License

Hyperion is available under the MIT license. See the LICENSE file for more info.

About WillowTree

WillowTree Logo

We build apps, responsive sites, bots—any digital product that lives on a screen—for the world’s leading companies. Our elite teams challenge themselves to build extraordinary experiences by bridging the latest strategy and design thinking with enterprise-grade software development.

Interested in working on more unique projects like Hyperion? Check out our careers page.

hyperion-android's People

Contributors

andrewowen avatar benalderfer avatar benjamin-alderfer-willowtree avatar evant avatar jawnnypoo avatar kconner avatar koral-- avatar kritarie avatar kvithayathil avatar matsudamper avatar michaelmwhite avatar misikora avatar mmartin101 avatar mrk-han avatar mxalbert1996 avatar nicholas-cook avatar nishtahir avatar numeroanddev avatar patjackson52 avatar paulklauser avatar pedronveloso avatar rationalrank avatar realdadfish avatar ssharyk avatar star-zero avatar takahirom avatar tiwiz avatar toxicbakery avatar v-mas avatar wajahatkarim3 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hyperion-android's Issues

Add support for minimum required API

Plugins should be able to easily define a minimum required API level so the UI does not display unsupported plugins and as a side effect require plugins to display error messages explaining they do not work on a specific device.

Network Plugin

One big piece of missing functionality is a plugin for inspecting and interacting with network traffic. Ideal features for this plugin:

  • Persist network request / response with relevant data via an OkHttpInterceptor.
  • Allow user to view a live list of request / response pairs, tapping into an item shows all associated data.
  • Allow user to modify the environment at runtime from a spinner populated with predefined base urls (potential dependency on #54)
  • Will likely need a no-op implementation of this plugin since the host app must reference the interceptor.

Phoenix Plugin

This plugin would provide a button in the debug menu which would delete local cache / data and restart the app via the LAUNCH intent. Ideally this would be configurable, so the user could optionally only clear cache but not data, for instance. Even better if we could completely end the process before restarting somehow. Maybe a separate process running a service that we send an intent to?

Phoenix Plugin: confirmation dialog

Currently the Phoenix Plugin's menu view will restart the process when it is tapped. It turns out this is pretty easy to do on accident. Would like to move the current options in the dropdown menu to a dialog prompted when the view is tapped.

Disk plugin rework

Part of this work depends on the Core redesign work.

The Disk plugin is at a very alpha / experimental, I'm not at all attached to the code or design around it. Right now the view overlays the drawer, but I think it would be better for the explorer view to display as its own activity.

  • custom mimetype recognition and handling (eg. display thumbnail for image / video files)
  • sharing
  • fully navigable
  • delete

5 0 file explorer

Add support for disabling the default shake to open

Some applications may already have shake gesture reserved for a feature, so this would be useful in cases where the host application wants to open the Hyperion menu exclusively via Hyperion.open(Activity)

Handle Typeface for Attribute Inspector

The Attribute Inspector does not handle displaying the Typeface of a TextView very well. Ideally, the property would be displayed as Typeface Roboto-Bold with the right-aligned value text styled with the Typeface. This is made a bit complex because the Typeface class doesn't contain methods for querying the name. A possible implementation could read from assets until it finds a font file whose Typeface == the TextView's Typeface, and we can use the name of the file as the value.

Lint issue

The resource @string/app_name is marked as private in com.willowtreeapps.hyperion:hyperion-core

SharedPreferences plugin

A SharedPreferences viewer/editor would be handy. I believe the only questions would be how to support non default preferences and how to support editing Set<String> types.

I began working on this with just a simple RecyclerView and inline editing for the basic types but I am open to input.

Missing Features

  • Editing Set
  • Adding new preferences
  • Removing preferences
  • Viewing other preferences than the default application instance

Messing with themes

Here's what's happening and how to reproduce it:

In my AndroidManifest.xml, under <application> tag's theme attribute I have the following theme:

<style name="AppBaseTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/accent_dark</item>
        <item name="colorAccent">@color/primary</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

The specific items under the theme don't matter, however I'm providing my users the option to switch themes in runtime, the theme being switched to (before calling setContentView in my activities):

<style name="AppBaseThemeLight" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/accent_dark</item>
        <item name="colorAccent">@color/primary</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

Again, the items don't matter. The bug is that when I switch to, in my case, light theme in runtime, the app continues to use the android:windowBackgroundColor attribute as declared by the theme in the manifest file.

I've confirmed that this behaviour occurs only due to hyperion (by making a release build without hyperion and by removing hyperion altogether). So for some reason, hyperion is messing with setTheme(), the changes made by the call to this function a

Plugin order is inconsistent

Plugin order is defined by whatever order the plugin HashSet defines. Ideally, plugins would be alphabetical or in another predictable order.

Report / Drawing Plugin

Name TBD? This plugin would, on activation, create an overlay that allows the user to draw on the screen. The user should be able to select a color. This will assist with QA highlighting UI bugs.

Future features would include having the client app specify a JIRA endpoint and allow the user to screenshot and upload their drawing as a ticket with provided device metadata (SDK version, OEM, screen size, etc).

Allow manual wiring-up of AttributeCollectors

Similar to #62, I noticed that AttributeCollectors also used Java ServiceLoader. Could an API also be added here to allow for manual hooking up of AttributeCollectors so that non-Gradle build systems like Buck can use this functionality?

Location plugin

No functional implementation of this plugin has been created yet, and no designs have been specified. The following are my initial thoughts for how this should function.

  • Allow location mocking selection either via lat lng, address, city, or map selection
  • Maintain an LRU of recently mocked locations for ease of access
  • Display some UI to make it clear that location is being mocked (notification?)

Sample crashes on Oreo

Run sample on Oreo, an error occurred. Below log is on 8.0.

04-03 13:12:36.188 8973-8973/com.willowtreeapps.hyperion.sample E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.willowtreeapps.hyperion.sample, PID: 8973
    java.lang.RuntimeException: Unable to get provider com.willowtreeapps.hyperion.core.internal.HyperionInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.willowtreeapps.hyperion.core.internal.HyperionInitProvider" on path: DexPathList[[zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/base.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_dependencies_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_resources_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_0_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_1_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_2_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_3_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_4_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_5_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_6_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_7_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_8_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/lib/x86, /system/lib, /vendor/lib]]
        at android.app.ActivityThread.installProvider(ActivityThread.java:6288)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5851)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5772)
        at android.app.ActivityThread.-wrap1(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
04-03 13:12:36.194 8973-8973/com.willowtreeapps.hyperion.sample E/AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.willowtreeapps.hyperion.core.internal.HyperionInitProvider" on path: DexPathList[[zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/base.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_dependencies_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_resources_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_0_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_1_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_2_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_3_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_4_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_5_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_6_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_7_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_8_apk.apk", zip file "/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/lib/x86, /system/lib, /vendor/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.app.ActivityThread.installProvider(ActivityThread.java:6273)
        	... 10 more
    	Suppressed: java.io.IOException: No original dex files found for dex location /data/app/com.willowtreeapps.hyperion.sample-uhNFZxrsW8fZdK9L2YJebQ==/split_lib_resources_apk.apk
        at dalvik.system.DexFile.openDexFileNative(Native Method)
        at dalvik.system.DexFile.openDexFile(DexFile.java:353)
        at dalvik.system.DexFile.<init>(DexFile.java:100)
        at dalvik.system.DexFile.<init>(DexFile.java:74)
        at dalvik.system.DexPathList.loadDexFile(DexPathList.java:374)
        at dalvik.system.DexPathList.makeDexElements(DexPathList.java:337)
        at dalvik.system.DexPathList.<init>(DexPathList.java:157)
        at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:65)
        at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
        at com.android.internal.os.PathClassLoaderFactory.createClassLoader(PathClassLoaderFactory.java:43)
        at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:69)
        at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:36)
        at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:676)
        at android.app.LoadedApk.getClassLoader(LoadedApk.java:709)
        at android.app.LoadedApk.getResources(LoadedApk.java:936)
        at android.app.ContextImpl.createAppContext(ContextImpl.java:2242)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5672)
        		... 8 more

Properties Support

Hyperion Core should support parsing a hyperion.properties file from res/raw which it surfaces to plugins via the PluginExtension API. This would allow users to configure plugins with various metadata such as API keys, endpoint urls, preferences, etc. Once this functionality is in place, we can also move many of the configuration options from the Hyperion class to the properties file and document supported keys.

Geiger Counter plugin needs a published explanation

This plugin doesn't make much sense at first blush. Why do I want my app to click like it's radioactive?

  • Explain the plugin in the example app
  • Explain the plugin in the readme or wherever other plugins are documented

For source material, see the description of #68.

Status Bar Icon color

When <item name="android:windowLightStatusBar">true</item> status bar icon does not change its color.
photo_2018-05-11_11-01-31
And it would be great if the icon was much fatter.

Kotlin

Without beating a drum everyone's already heard, any reservations against using Kotlin for plugin development?

Logger without Timber

In the case that the host app is not able/willing to use Timber for logging, Hyperion isn't able to grab those logs. A possible solution could be to run logcat which would pick up all logs from the host app regardless of the host app's implementation of logging. Maybe Hyperion could detect if the host app was using Timber and if not then fallback to using a logcat solution. What are your thoughts @ToxicBakery ?

Recorder Plugin redesign

Contact me here or on Slack for Zeplin access. This work depends on the Core drawer redesign.

  • import new recorder icon
  • display notification while recording (allow stop record from within notification?)

4 0 screen recorder

Sample app redesign

Contact me here or on Slack for Zeplin access. The Sample app does not necessarily depend on the Core work being completed.

  • splash screen (2s)
  • welcome screen (logo animation)
  • what's in this version? screen
  • plugin detail pages

0 0 loading screen


1 0 welcome


1 1 1 gestures


1 2 example app features


1 3


1 4

Multi Dex issue.

Can't compile in Android Studio 3.0.1+. Getting below error. Enable multidex support on gradle file as well. And the issue is intermitted, for some, it is working in our team and for others, it doesn't. Please fix!
Error:Execution failed for task ‘:app:transformDexArchiveWithExternalLibsDexMergerForDebug’.> com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

Attribute Inspector plugin redesign

Contact me here or on Slack for Zeplin access. Part of this work depends on the Core redesign work.

  • import new attribute inspector icon
  • implement UI for popup menu targeting selected view
  • refactor AttributeCollectors to support "promoted" attributes, eg. attributes they will be displayed in the primary popup as opposed to the "show more" expanded popup

3 0 attribute inspector


3 1


3 2


3 1 1 more info

Bug: Debug menu hides behind certain dialog fragments

Using version: 0.9.18
Device: Nexus 5X, Android Version 8.1.0

Steps To Recreate:

  • Launch app that has a popup dialog fragment
  • Trigger the dialog fragment
  • Shake to open Hyperion Debug Menu

Actual Result: Debug menu hidden behind fragment
Expected Result: Debug menu shows overtop debug fragment

Saw this occur when trying to measure views in a dialog fragment, see screenshot below.

image

Proguard issue for Plugin

Since the app uses AutoService, the plugin class needs to be added to the consumer proguard config like so.

-keep class * implements com.willowtreeapps.hyperion.plugin.v1.Plugin { *; }
-keep class com.willowtreeapps.hyperion.plugin.v1.Plugin { *; }
-keep class com.willowtreeapps.hyperion.attr.collectors.TypedAttributeCollector { *; }
-keep class * implements com.willowtreeapps.hyperion.plugin.v1.PluginModule { *; }
-keep class com.willowtreeapps.hyperion.plugin.v1.PluginModule { *; }

Try haptics in Geiger Counter

Try playing haptic bumps in addition to / instead of tick sounds, and see how it feels. Haptics will have to work at high frequency for this to be worthwhile.

If it works, consider adding a submenu for selecting sounds, haptics, or both, and think about how to persist the setting across runs.

Error on Dagger project build

I'm trying to integrate hyperion in a big project that uses Dagger Android modules and submodules. but after I sync the dependencies my project doesn't build. What should I try? Does hyperion change anything on the build folder that interferes Dagger?

error: cannot find symbol
    return MembersInjectors.injectMembers(
                           ^
  symbol:   method injectMembers(MembersInjector<DetailsViewModel>,DetailsViewModel)
  location: class MembersInjectors

Timber Log Plugin

It may be useful to have a plugin that provides a Timber tree for logging in a UI displayable format

Additional Feature Ideas

  • Searchable log
  • Filterable log
  • Automatic log sessions with sane defaults for cleanup such as 1mb log max and last 5 runs
  • Log level coloring

Sample app crashes on launch on API level 15

The Geiger counter plugin crashes on launch because it instantiates an API 16+ class during onApplicationCreated. It looks like maybe onApplicationCreated is called regardless of whether the minimumRequiredApi is satisfied?

screen shot 2018-04-13 at 1 54 04 pm

Core drawer redesign

Contact me here or on Slack for Zeplin access.

  • refactor UI around embedded drawer to match new Zeplin design.
  • remove right-swipe to open in favor of shake to open as default.
  • allow adjustable sensitivity for the shake gesture (non-UI for now, as public API to host app)

1 1 menu

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.