dukescript

DukeScript: Android start an intent


We would like to know if it is possible to get the context of Duksecript Android presenter so we can call external elements?

    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    final ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.bluetoothSettings");
    intent.setComponent(cn);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity( intent);

or

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setData(path);
    intent.setType("application/pdf");
    startActivity(intent);

would this be possible short of changing the presenter to suit our needs?

Thanks in advance.


Solution

  • Sorry for the late answer. You don't need to change the presenter. By default DukeScript provides you an activity which handles everything behind the scene automatically. But you can also create a decorating activity that has access to all Android services. E.g.:

    public class AndroidMain extends Activity {
        public AndroidMain() {
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // obtain information you need
            //
            SharedPreferences prefs = getApplicationContext().getSharedPreferences("karel.prefs", 0);
            new AndroidStorage(prefs);
    
            try {
                // delegate to original activity
                startActivity(new Intent(getApplicationContext(), Class.forName("com.dukescript.presenters.Android")));
            } catch (ClassNotFoundException ex) {
                throw new IllegalStateException(ex);
            }
            finish();
         }
       }
    }
    

    You’ll also need to register this Activity in your AndroidManifest.xml, e.g. like this:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="cz.xelfi.karel"
        android:versionCode="1"
        android:versionName="1.0-SNAPSHOT" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="16" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="karel"
            android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
            <activity android:name="cz.xelfi.karel.AndroidMain"
                      android:configChanges="orientation|screenSize">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="com.dukescript.presenters.Android" 
                      android:configChanges="orientation|screenSize"
                      android:exported="false"
                    >
            </activity>
    
            <!-- Configuration section. Defines: 
               - the HTML page to load on start
               - the class that contains the main initialization method
               - name of the initialization method in the given class
            -->
            <meta-data android:name="loadPage" android:value="file:///android_asset/pages/index.html" />
            <meta-data android:name="loadClass" android:value="cz.xelfi.karel.AndroidMain" />
            <meta-data android:name="invoke" android:value="main" />
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
    </manifest>
    

    https://dukescript.com/best/practices/2015/11/20/AndroidBoot.html