{"id":23109324,"url":"https://github.com/sangeethnandakumar/testtube","last_synced_at":"2026-04-24T12:03:58.238Z","repository":{"id":142980309,"uuid":"91712339","full_name":"sangeethnandakumar/TestTube","owner":"sangeethnandakumar","description":"Highly  simplified Android programming helper library","archived":false,"fork":false,"pushed_at":"2018-06-13T05:56:29.000Z","size":6250,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-03T23:15:41.416Z","etag":null,"topics":["android","app","distance","distance-matrix-api","file-download","google","gps","grdview","library","listview","permission","settings","webpage"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sangeethnandakumar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-05-18T15:56:05.000Z","updated_at":"2021-01-07T09:22:00.000Z","dependencies_parsed_at":"2023-04-07T04:16:08.129Z","dependency_job_id":null,"html_url":"https://github.com/sangeethnandakumar/TestTube","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/sangeethnandakumar/TestTube","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sangeethnandakumar%2FTestTube","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sangeethnandakumar%2FTestTube/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sangeethnandakumar%2FTestTube/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sangeethnandakumar%2FTestTube/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sangeethnandakumar","download_url":"https://codeload.github.com/sangeethnandakumar/TestTube/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sangeethnandakumar%2FTestTube/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261039081,"owners_count":23100969,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","app","distance","distance-matrix-api","file-download","google","gps","grdview","library","listview","permission","settings","webpage"],"created_at":"2024-12-17T01:35:45.434Z","updated_at":"2026-04-24T12:03:58.232Z","avatar_url":"https://github.com/sangeethnandakumar.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Introducing TestTube \t\nThe TestTube library project for easy Android implimentations\n\n[![](https://jitpack.io/v/sangeethnandakumar/TestTube.svg)](https://jitpack.io/#sangeethnandakumar/TestTube)\n[![Travis branch](https://img.shields.io/badge/devolopment-android%20studio-brightgreen.svg)]()\n[![Travis branch](https://img.shields.io/badge/package-bullyfox.sangeeth.testube-blue.svg)]()\n[![Travis branch](https://img.shields.io/badge/year-2017-red.svg)]()\n\n![TestTube Logo](https://github.com/sangeethnandakumar/TestTube/blob/master/logo.png)\n\n**HIT THAT STAR ONLY AFTER THIS HELPS YOU | **\n**FIRE A MAIL DIRECTLY : sangeethnandakumar@gmail.com | **\n**DROP A MSG ON WHATSAPP: +91 9495661468**\n\n\u003c!-- Place this tag where you want the button to render. --\u003e\n\u003ca class=\"github-button\" href=\"https://github.com/sangeethnandakumar/TestTube\" data-size=\"large\" aria-label=\"Star sangeethnandakumar/TestTube on GitHub\"\u003eStar\u003c/a\u003e\n\n# Include the Gradle Dependency\n1. On project level Gradle, add\n```gradle\n        allprojects\n\t{\n\t\trepositories \n\t\t{\n\t\t\t...\n\t\t\tmaven { url 'https://jitpack.io' }\n\t\t}\n\t}\n```\n2. In app/module level Gradle, add\n```gradle\n        dependencies \n\t{\n\t        compile 'com.github.sangeethnandakumar:TestTube:[LATEST_VERSION]' \n\t}\n```\n3. **LATEST_VERSION (Use this version on dependency)** : [![](https://jitpack.io/v/sangeethnandakumar/TestTube.svg)](https://jitpack.io/#sangeethnandakumar/TestTube)\n\nLibrary Version | Improvements | Dependency\n------------ | ------------- | -------------\nPrior to v2.0.1 | Not available on GitHub | Not available on GitHub\nv2.0.1 | New : Standard listview (SLV)\u003cbr\u003eRemoved : Old WebServer class | com.github.sangeethnandakumar:TestTube:v2.0.1\nv2.0.2 | Upgraded : SLV now supports linear/card layerings\u003cbr\u003eUpgraded : Specification added to adapter | com.github.sangeethnandakumar:TestTube:v2.0.2\nv2.0.3 | New : Fully implemented FileDownloader class for url downloads\u003cbr\u003eMinor bug fixes and improvements\u003cbr\u003eNew : WebDoc class to convert a webpage to pdf | com.github.sangeethnandakumar:TestTube:v2.0.3\nv2.0.4 | New : Standard gridview (SGV)\u003cbr\u003eNew : Support for gridview card/linear layering\u003cbr\u003eNew : SGV supports drawable or web resource\u003cbr\u003eUpgraded : Code optimised | com.github.sangeethnandakumar:TestTube:v2.0.4\nv2.0.5 | New : Android runtime permission helper\u003cbr\u003eUpgraded : Permit class to support multimple permissions at once\u003cbr\u003eUpgraded : Permission reponce interface | com.github.sangeethnandakumar:TestTube:v2.0.5\nv2.1.0 | New : Permanant settings\u003cbr\u003eNew : Autostack page stack\u003cbr\u003eBeta : Google Distance Metrix initial phase (GDM) | com.github.sangeethnandakumar:TestTube:v2.1.0\nv2.5.0 | Upgraded : Google Distance Metrix fully implemented\u003cbr\u003eNew : Support for Http GET request\u003cbr\u003eNew : Support for Http POST request\u003cbr\u003eUpgraded : POST request to send a DataRack | com.github.sangeethnandakumar:TestTube:v2.5.0\nv2.5.1 | Removed : RW External storage permission\u003cbr\u003eNew : 'SuperDatabase', a pure local SQL database\u003cbr\u003eUpgraded : injectSQL to do non returning SQL queries\u003cbr\u003eUpgraded : ejectSQL to do returning SQL queries\u003cbr\u003eUpgraded : ArrayString, JSON and XML out from Database\u003cbr\u003eBeta : Ability to import 'Asset DB' and use\u003cbr\u003eBeta : Importing .db database with existing control\u003cbr\u003eNew : Syntax highlighter with a number of language support | com.github.sangeethnandakumar:TestTube:v2.5.1\nv2.5.2 | Applied : Minor bug fixes | com.github.sangeethnandakumar:TestTube:v2.5.2\nv2.5.3 | Applied : Major bug fixes | com.github.sangeethnandakumar:TestTube:v2.5.3\n\nImportant:\n\n[![Travis branch](https://img.shields.io/badge/compiled%20sdk-25-brightgreen.svg)]()\n[![Travis branch](https://img.shields.io/badge/min%20sdk-18-brightgreen.svg)]()\n[![Travis branch](https://img.shields.io/badge/target%20sdk-25-brightgreen.svg)]()\n[![Travis branch](https://img.shields.io/badge/min%20android%20OS-Android%204.3%20Jellybean-brightgreen.svg)]()\n\n#\n\n## SIMPLE STANDARD LISTVIEW (adapter)\n![Runtime permission demo](https://github.com/sangeethnandakumar/TestTube/blob/master/StandardListview.gif)\n\nIts very simple to use a standard list now\n1. Declare your listview\n```java\n        ListView list=(ListView)findViewById(R.id.listview);\n```\n2. Add your items in a SimpleItem list\n```java\n        List\u003cSimpleItem\u003e simpleItems=new ArrayList\u003c\u003e();\n        simpleItems.add(new SimpleItem(\"United States\"));\n        simpleItems.add(new SimpleItem(\"India\"));\n        simpleItems.add(new SimpleItem(\"Russia\"));\n        simpleItems.add(new SimpleItem(\"China\"));\n```\n3. Create a SimpleAdapter\n```java\n        SimpleAdapter simpleAdapter=new SimpleAdapter(getApplicationContext(),simpleItems, AdapterType.LISTVIEW, AdapterLayering.LINEAR);\n```\n4. Just attach the Adapter to your listview and its over\n```java\n        list.setAdapter(simpleAdapter);\n```\n### You done everything.!!!, For further minimal customizing\na) Add optional resource image if you want it\n```java\n        simpleItems.add(new SimpleItem(\"Lotus Flower\",R.drawable.lotus));\n        simpleItems.add(new SimpleItem(\"Lilly Flower\",R.drawable.lilly));\n        simpleItems.add(new SimpleItem(\"Rose Flower\",R.drawable.rose));\n```\nb) Add optional web image if you want it (requires internet)\n```java\n        simpleItems.add(new SimpleItem(\"Google\",\"https://www.google.com/something.png\"));\n        simpleItems.add(new SimpleItem(\"Facebook\",\"https://www.facebook.com/something.png\"));\n        simpleItems.add(new SimpleItem(\"YouTube\",\"https://www.youtube.com/something.png\"));   \n```\nc) Feel free to mix all these\n```java\n        simpleItems.add(new SimpleItem(\"Simply text\"));\n        simpleItems.add(new SimpleItem(\"Resource image\",R.drawable.elephant));\n        simpleItems.add(new SimpleItem(\"Web image\",\"https://www.google.com/something.png\"));\n```\n### Another way\na) You can change the AdapterLayering to CARD if you need it\n```java\n        SimpleAdapter simpleAdapter=new SimpleAdapter(getApplicationContext(),simpleItems, AdapterType.LISTVIEW, AdapterLayering.CARD);\n```\n\n### DUAL STANDARD LISTVIEW (adapter)\nLike Simple Standard listview before, Use a standard dual list view\n1. Previous statements are same except here\n```java\n        List\u003cDualItem\u003e dualItems=new ArrayList\u003c\u003e();\n\t\n        dualItems.add(new DualItem(\"Samsung\",\"User in Korea\"));\n        dualItems.add(new DualItem(\"Pixel\",\"User in California\"));\n        dualItems.add(new DualItem(\"Sony Xperia\",\"User in Japan\"));\n\t\n        DualAdapter dualAdapter=new DualAdapter(getApplicationContext(),dualItems,AdapterType.LISTVIEW,AdapterLayering.CARD);\n\t\n\tlist.setAdapter(dualAdapter);\n```\nNOTE : Images from resources and web are also compatable here\n\n### TRIPLE STANDARD LISTVIEW (adapter)\nLike Dual Standard listview before, Use a standard triple list view\n1. Statements are changed like\n```java\n        List\u003cTripleItem\u003e tripleItems=new ArrayList\u003c\u003e();\n\t\n        tripleItems.add(new TripleItem(\"Billy\",\"Cat\",\"At Kerala\"));\n        tripleItems.add(new TripleItem(\"Snoory\",\"Cat\",\"At Banglore\"));\n        tripleItems.add(new TripleItem(\"Dingi\",\"Dog\",\"At Mumbai\"));\n        tripleItems.add(new TripleItem(\"Pupy\",\"Dog\",\"At Jammu\"));\n\t\n        TripleAdapter tripleAdapter=new TripleAdapter(getApplicationContext(),tripleItems,AdapterType.LISTVIEW,AdapterLayering.LINEAR);\n\t\n\tlist.setAdapter(tripleAdapter);\n```\nNOTE : Images from resources and web are also compatable here\n\n## SIMPLE/DUAL/TRIPLE STANDARD GRIDVIEW (adapter)\n![Runtime permission demo](https://github.com/sangeethnandakumar/TestTube/blob/master/StandardGridview.gif)\n\nLike Simple/Dual/Tripple Standard listview before, Simple change this to make into a GridView\n1. Previous statements are same except here\n```java\n        DualAdapter dualAdapter=new DualAdapter(getApplicationContext(),dualItems,AdapterType.GRIDVIEW,AdapterLayering.CARD);\n\tgrid.setAdapter(dualAdapter);\n```\n## ASKING RUNTIME PERMISSIONS (permissions)\n![Runtime permission demo](https://github.com/sangeethnandakumar/TestTube/blob/master/RuntimePermission.gif)\n\nAndroid runtime permissions are no longer RoCketScience\n1. Initialise the Permit object, passing your current activity\n```java\n\tPermit permit=new Permit(MainActivity.this);\n```\n2. Simply listen to the permission events using event listner\n```java\n                permit.setOnPermitStatusListner(new Permit.OnPermitStatusListner()\n                {\n                    @Override\n                    public void onAllPermitsGranded()\n                    {\n                        // ALL PERMITS ACCEPTED\n                    }\n\n                    @Override\n                    public void onSomePermitsDenied(ArrayList\u003cString\u003e deniedPermits)\n                    {\n                       // SOME PERMITS ACCEPTED\n                    }\n\n                    @Override\n                    public void onAllPermitsDenied()\n                    {\n                        // ALL PERMITS DENIED\n                    }\n                });\n```\n3. Now just ask for what permissions you need. Yes, It's over\n```java\n                permit.askPermitsFor(\n                        Manifest.permission.CAMERA,\n                        Manifest.permission.READ_CALENDAR,\n                        Manifest.permission.READ_CONTACTS);\n```\n## PERMANANT SETTINGS FOR YOUR APP (managers)\n![App Settings Demo](https://github.com/sangeethnandakumar/TestTube/blob/master/AppSettings.gif)\n\n1. Wan't to store/retrive your application settings? Simple initialise the AppSettings class with any context\n```java\n\tAppSettings settings=new AppSettings(getApplicationContext());\n```\n2. Store what all stuffs you want like (KEY-VALUE) style\n```java\n                settings.saveSettings(\"username\",\"sangeeth\");\n                settings.saveSettings(\"password\",\"sangeeth@123\");\n                settings.saveSettings(\"points\",\"250\");\n                settings.saveSettings(\"level\",\"5\");\n                settings.saveSettings(\"gender\",\"male\");\n```\n3. Retrive what all stored\n```java\n                String username=settings.retriveSettings(\"username\");\n                Toast.makeText(MainActivity.this, \"Username is - \" + username, Toast.LENGTH_SHORT).show();\n```\nNOTE : The settings stores here will persist even the app is closed. (Until uninstalled)\n\n## AUTOSTACK FOR YOUR PAGE MANAGEMENTS (managers)\nIts simply a string stack. When you are on a page, then push that PAGE_KEY. When user press BACK button, pop out the PAGE_KEY and check. If nothing to pop out, exit the app. Don't undersatand? It's simple like catching a frog from your pond.\n1. Just initialise the AutoStack\n```java\n\tAutoStack stack=new AutoStack();\n```\n2. Push while you traverse each pages of something (Assume a book)\n```java\n                // Assume user is presented with a menu\n                // As he enters each menu another menu is appearing (Like a directory)\n\n                // User at page SPACE (SPACE)\n                page.push(\"space\");\n                // User clicks on EARTH (SPACE/EARTH)\n                page.push(\"earth\");\n                // User clicks on ASIA (SPACE/EARTH/ASIA)\n                page.push(\"asia\");\n                // User clicks on INDIA (SPACE/EARTH/ASIA/INDIA)\n                page.push(\"india\");\n```\n3. Override the onBackPressed() methord of your activity\n```java\n    @Override\n    public void onBackPressed()\n    {\n        if (page.isEmpty())\n        {\n            super.onBackPressed();\n        }\n        else\n        {\n            switch (page.pop())\n            {\n                case \"india\" :\n                    showAsiaMenu();\n                    break;\n                case \"asia\" :\n                    showEarthMenu();\n                    break;\n                case \"space\" :\n                    showSpaceMenu();\n                    break;\n            }\n        }\n    }\n```\nNOTE : STACK space used is not persistant and will be cleared when app restarts or context switched\n\n## GOOGLE DISTANCE MATRIX FOR YOUR ADDRESSES (extended)\n![Runtime permission demo](https://github.com/sangeethnandakumar/TestTube/blob/master/GDM.gif)\n\nNew feature that brings you the address of locations, distance to travel on road along with units and time to travel along with units from Google Servers in its most simplest way\n\n0. Look at the GoogleDistanceMatrix class initialisation syntax\n```java\n\tGoogleDistanceMatrix gdm=new GoogleDistanceMatrix(\"\u003cYOUR_GOOGLE_KEY\u003e\",\"\u003cORIGIN_LATTITUDE\u003e\",\"\u003cORIGIN_LONGITUDE\u003e\",\"\u003cDESTINATION_LATTITUDE\u003e\",\"\u003cDESTINATION_LONGITUDE\u003e\",\u003cANY CONTEXT\u003e);\n\n```\n1. Now initialise it as depected\n```java\n\t//Initialise key. You will get this key from here : https://developers.google.com/maps/documentation/distance-matrix/get-api-key\n\tString key = \"ABcdEfGHIJ7L4YhXw01INDIAHbVlgIhjmouSeVc\";\n\t\n\t//Set origin to \n\tString origin_lat=\"36.752071\";\n\tString origin_lng=\"-119.823064\";\n\t// Set destination to \n\tString dest_lat=\"36.773276\";\n\tString dest_lng=\"-119.845252\";\n\t\n\tGoogleDistanceMatrix gdm = new GoogleDistanceMatrix(key,origin_lat,origin_lng,dest_lat,dest_lng,getApplicationContext());\n\n```\n2. Simplicity starts right now. Attach that listner\n```java\n\tgdm.setOnGDMStatusListner(new GoogleDistanceMatrix.OnGDMStatusListner()\n\t{\n\t\t@Override\n\t\tpublic void onGDMAvailable(GoogleDistanceMatrix gdm)\n\t\t{\n\t\t\t//Quickly collect details\n                        String origin_address = gdm.getOrgin_address();\n                        String dest_address = gdm.getDest_address();\n                        String distance = gdm.getDistance();\n                        String duration = gdm.getDuration();\n                }\n\t\t\n                @Override\n                public void onGDMFailed()\n                {\n                       //Failed due to some resons\n                }\n         });\n```\n3. Now send that request to GoogleServers via Our server (Complex codes are implimented on our server to keep you smiling). Now just request.!\n```java\n\tgdm.getDistanceMatrix();\n```\nNOTE : Details will be arrived at the listners as soon us our server sends it back\n\n## DOWNLOAD A FILE (network)\n![File Downloading Demo](https://github.com/sangeethnandakumar/TestTube/blob/master/FileDownloader.gif)\n\nThinking for an ultimate simple way to download an file from an URL? With multithreading and simultanious download features, Here comes the new FileDownloader class\n0. Look at the initialisation syntax\n```java\n\tFileDownloader downloader=new FileDownloader(\u003cANY_CONTEXT\u003e,\u003cURL\u003e);\n```\n1. Now initialise the object like before\n```java\n        FileDownloader downloader=new FileDownloader(getApplicationContext(),\"http://www.example.com/test.pdf\")\n```\n2. Keep track of downloader with these event listners\n```java\n                downloader.setOnDownloadStatusListner(new FileDownloader.OnDownloadStatusListner() {\n                    @Override\n                    public void onStarted()\n                    {\n                    }\n\n                    @Override\n                    public void onConnecting()\n                    {\n                    }\n\n                    @Override\n                    public void onConnected(long total, boolean isRangeSupport)\n                    {\n                    }\n\n                    @Override\n                    public void onDownloading(long finished, long total, int progress)\n                    {\n                    }\n\n                    @Override\n                    public void onCompleted()\n                    {\n                    }\n\n                    @Override\n                    public void onFailed(String message)\n                    {\n                    }\n\n                    @Override\n                    public void onPaused()\n                    {\n                    }\n\n                    @Override\n                    public void onCancelled()\n                    {\n                    }\n                });\n\n```\n3. This is the last step to download. So simple...\n```java\n        downloader.downloadFile(\"/storage/emulated/0\",\"newfile.pdf\");\n```\nNOTE : The construction and devolopment of this class is in BETA. Unfortunatelly, Pause and Cancel is not working as of now. You can use without any other problems. Pause and Cancel support will be added soon.\n\n## HTTP GET REQUEST (network)\n![Http GET Demo](https://github.com/sangeethnandakumar/TestTube/blob/master/HttpGET.gif)\n\nHttp GET methord requests a server with inline parameters on its URL. DOn't use Http GET to transfer passwords!. Http GET is best for visible parameters and easy to debug\n1. Initialise a WebServer instance and start its listners\n```java\n\t\tWebServer server=new WebServer(getApplicationContext());\n                \n                server.setOnServerStatusListner(new WebServer.OnServerStatusListner() {\n                    @Override\n                    public void onServerResponded(String responce) {\n                        \n                    }\n\n                    @Override\n                    public void onServerRevoked() {\n\n                    }\n                });\n````\n2. Now just call the server with GET parameters\n```java\n\t\tserver.connectWithGET(\"https://www.google.com/test.php?name=Sangeeth\u0026loc=India\");\n```\n\n## HTTP POST REQUEST (network)\n![Http GET Demo](https://github.com/sangeethnandakumar/TestTube/blob/master/HttpPOST.gif)\n\nHttp POST methord requests a server with unvisible parameters. Usefull to transport passwords.\n1. Initialise a WebServer instance and start its listners\n```java\n\t\tWebServer server=new WebServer(getApplicationContext());\n                \n                server.setOnServerStatusListner(new WebServer.OnServerStatusListner() {\n                    @Override\n                    public void onServerResponded(String responce) {\n                        \n                    }\n\n                    @Override\n                    public void onServerRevoked() {\n\n                    }\n                });\n````\n3. Create a list of DataRack for your key-value pairs\n```java\n                List\u003cDataRack\u003e racks=new ArrayList\u003cDataRack\u003e();\n                racks.add(new DataRack(\"name\",\"Simon\"));\n                racks.add(new DataRack(\"age\",\"40\"));\n                racks.add(new DataRack(\"location\",\"Canada\"));\n````\n2. Now just call the server with POST rack along caller activity\n```java\n                server.connectWithPOST(MainActivity.this,\"http://sangeethnandakumar.esy.es/PROJECTS/PUBLIC_SERVICE/posttest.php\",racks);\n```\n\n## SUPER DATABASE (managers)\n![Runtime permission demo](https://github.com/sangeethnandakumar/TestTube/blob/master/superlocaldatabase.gif)\n\nMessed up with Android database implementations? Here is the perfect pure simple SQL database\n0. Look at the syntax\n```java\n\tSuperDatabase database=new SuperDatabase(\u003cCONTEXT\u003e,\u003cDATABASE_NAME\u003e,\u003cDB_SCHEMA\u003e);\n```\n1. Declare the SuperDatabase\n```java\n\tSuperDatabase database=new SuperDatabase(getApplicationContext(),\"Foods\",\"CREATE TABLE IF NOT EXISTS food('name' VARCHAR(20),'vitamin' VARCHAR(20);\");\n\n```\nNow fire the queries\n\na). Create an INJECT statement, If you have a non returning query\n```java\n                    database.sqlInject(\"INSERT INTO food VALUES('Banana','Vitamin A');\");\n                    database.sqlInject(\"INSERT INTO food VALUES('Apple','Vitamin B');\");\n                    database.sqlInject(\"INSERT INTO food VALUES('Grapes','Vitamin C');\");\n```\nIt will simply executes...\n\nb). Create an EJECT statement, If you have a returning query\n```java\n                    \u003creturn_var\u003e = database.sqlEjectCSV(\"SELECT * FROM food;\");\n```\nb). EJECT statement can eject data in CSV, JSON \u0026 XML formats. CSV needs an ArrayList\u003cSrtings\u003e\n\n**CSV**\n```java\n                    ArrayList\u003cString\u003e rows=new ArrayList\u003cString\u003e();\n                    rows=database.sqlEjectCSV(\"SELECT * FROM food;\");\n                    for (int i=0;i\u003crows.size();i++)\n                    {\n                        //Do stuffs with each row\n                    }\n```\n**JSON**\n```java\n                    String json=database.sqlEjectJSON(\"SELECT * FROM food;\");\n```\n**XML**\n```java\n                    String xml=database.sqlEjectXML(\"SELECT * FROM food;\");\n```\n\n## SUPER ASSET DATABASE (managers)\n![Runtime permission demo](https://github.com/sangeethnandakumar/TestTube/blob/master/superlocaldatabase.gif)\n\nAlready have a database with you? Here is the simplest solution to make in Android\n0. Look at the syntax\n```java\n\tSuperDatabase database=new SuperDatabase(\u003cCONTEXT\u003e,\u003cDATABASE_NAME\u003e,\u003cDB_SCHEMA\u003e,\u003cASSET_IMPORT_MODE\u003e);\n```\n1 a). If your app runs for the first time after installation, Then import the database from asset. So declare like this\n```java\n\tSuperDatabase database=new SuperDatabase(getApplicationContext(),\"foods.db\", AssetDatabaseMode.COPY_TO_SYSTEM);\n```\n1 b). If your app runs after first time, Never import the asset database again. So declare like this\n```java\n\tSuperDatabase database=new SuperDatabase(getApplicationContext(),\"foods.db\", AssetDatabaseMode.READ_FROM_DEVICE);\n\n```\n**NOTE : Now do the INJECT and EJECT queries as before (Also supports CSV, JSON and XML)**\n\nIMPORTANT NOTE\n```xml\n1. You need a .db database for this\n2. Download DB Browser For SQLite (Recomended Windows) - http://sqlitebrowser.org/\n3. Click on 'New Database'\n4. On save prompt - Include \".db\" extension after filename\n5. Done, Now import to assets folder\n```\n\n## SYNTAX HIGHLIGHTING (extended)\n![Runtime permission demo](https://github.com/sangeethnandakumar/TestTube/blob/master/SyntaxHighlight.gif)\n\nOnline syntax highlighting highlights any language code segment with HTML that you can render on a WebView easly\n1. Create the object\n```java\n\tSyntaxLight syntax=new SyntaxLight(getApplicationContext(),\"PHP\",\"\u003c?php echo 'Hello world'; ?\u003e\");\n```\n2. Implement the listners\n```java\n                    syntax.setOnCodeStatusListner(new SyntaxLight.OnCodeStatusListner() {\n                        @Override\n                        public void parsedToHTML(String s) {\n                            //You got HTML here\n                        }\n\n                        @Override\n                        public void parseError() {\n\n                        }\n                    });\n```\n3. Now highlight the code\n```java\n\tsyntax.highlightCode();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsangeethnandakumar%2Ftesttube","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsangeethnandakumar%2Ftesttube","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsangeethnandakumar%2Ftesttube/lists"}