DEV Community

Oarabile Koore
Oarabile Koore

Posted on

Expo Is The Peep Squeak To DroidScript.

Firstly, What Is DroidScript


DroidScript also formerly known as AndroidScript, is a javascript framework (more of a bridge between native android api's and jacvascript using V8 normally*.
That means you can create interfaces natively, no mimicking using HTML or using another rendering engine.

That also means the hundreds of lines of Java or Kotlin (XML or Using Jetpack Compose) you have to write can be reduced to 1 to 10 for every Api and component.

Everything is as clear as daytime.
Please note i am not affiliate with DroidScript, i am not an employee, and i just build plugins for use by other developers for free.


Why then Isn't it a Mammoth ?, given its powers 😮‍💨

That comes down to timing, just like Haxe its initial release never gained it traction, even though both are good.
But that doesn't mean its not being used widely.

Also its path has been a rocky one, the following trials and tribulations have contributed:

DroidScript is an offline ide that allows access to Api's like file exposure and given this state, it means bad actors could do illegal activities and could be tired to the application using its package name

Because of this DroidScript has been outed for AdMob Misuse, which could have came from bad actors running unbuilt projects on the IDE, which exploit AdMob. Therefore after the 2020 Incident, Almost banning it, its not supported anymore.

I've tried to summarize the AdMob Misuse Issue, its very controversial debate. Hacker News Thread


Why Compare Open Source And Almost Open Source

DroidScript code is available to view fully, the java Implementation, js Bridge (app.js) and Documentation can all be found on GitHub, however its a paid platform.

I'm a for free and open things guy, but i have a special case here, given maintenance of the project since 2014 and supporting alot of the messy javascript ecosystem.
To Me 0.49$ is great, remember you can use it even without paying, only payment required for building projects.


Why Over Everything Else

This code block, creates a layout and adds a progress bar.

DroidScript

/* Use J2V8 Instead Of V8 */
cfg.Fast
/* Import Material 2 */
cfg.MUI

/* Import Material 3 Plugin, 
Built By Me */

app.LoadPlugin('Material3')

function OnStart(){

    app.CreateMaterial3();

    lay = ui.createLayout('Linear','FillXY')

    progressLoader = ui.addProgressBar('linear',0.85,lay)
    progressLoader.SetMargins(null,0.4)
    progressLoader.SetValue(79)

    app.AddLayout(lay)
}
Enter fullscreen mode Exit fullscreen mode

Java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

    private RelativeLayout mainLayout;
    private ProgressBar progressLoader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mainLayout = findViewById(R.id.main_layout);
        progressLoader = findViewById(R.id.progressLoader);
        progressLoader.setPadding(0, 0, 0, 0); // Adjust padding if needed
    }
}

Enter fullscreen mode Exit fullscreen mode

And :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <ProgressBar
        android:id="@+id/progressLoader"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:progress="79"
        android:layout_marginTop="160dp" />

</RelativeLayout>

Enter fullscreen mode Exit fullscreen mode

On a large project i.e Reddit, it would be easier to do this on DroidScript, less time swapping between XML and Java, just statements.

Another Example Using Camera :

DroidScript

function OnStart()
{
    lay = app.CreateLayout( "Linear", "VCenter,FillXY" );

    cam = app.CreateCameraView( 0.8, 0.4 );
    cam.SetOnReady( cam_OnReady );
    lay.AddChild( cam );

    app.AddLayout( lay );
}

function cam_OnReady() {
cam.StartPreview();
}
Enter fullscreen mode Exit fullscreen mode

Java

  • Android Manifest
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="true"/>

Enter fullscreen mode Exit fullscreen mode
  • Java
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;

public class CameraActivity extends Activity implements SurfaceHolder.Callback {

    private Camera mCamera;
    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);

        mSurfaceView = findViewById(R.id.surfaceView);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mCamera = Camera.open();
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // No need to handle this for simplicity
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mCamera.release();
    }
}

Enter fullscreen mode Exit fullscreen mode
  • Layout XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

Enter fullscreen mode Exit fullscreen mode

Quick OverView

  • DroidScript detects what you need and takes care of permissions
  • DroidScript supports native android development and in the future a WORA viewpoint, except backend lol 😭😭😭.

I will do a much better explained part 2 if this does well
or i can squeeze whatever motivation i have.

Sorry For Mentioning Expo, You Wouldn't Read 🫠
Ill cover it on the next so you better follow, or else you will break a database and have your code sql injected and fired. 🫠

Top comments (0)