New Baka-Tsuki Android App: Development

Forum for volunteer developers working on Baka-Tsuki related applications (Baka-Reader, BTprince, etc).

Moderators: thelastguardian, Fringe Security Bureau, Senior Editors, Senior Translators, Alt. Language Translator/Editor, Executive Council, Project Translators, Project Editors

Post Reply
User avatar
Nandaka
Digitalizer Editor
Posts: 535
Joined: Thu Aug 09, 2012 9:46 am
Favourite Light Novel: Ahouka!
Location: Singapore
Contact:

Re: New Light Novel Reader Android App (In the works)

Post by Nandaka »

Change log:
  • Refactor code for checking orientation
  • Refactor getActionBar(), and recreate()
APK: http://www.mediafire.com/?n3fy0do520mcw53
Full change log: https://github.com/calvinaquino/LNReade ... its/master

@erakk: cannot do the checking in Application level, because the method is under Activity Class, so I create an UIHelper class to reduce the redudant code. This class also used for those method which only available in Honeycomb, this also to clean up the SuppressLint warning so we can run the apk in Android 2.2 (API Level 8).

To All: we need more tester, esp. for those different version. Currently I'm only tested the code in ICS (Android 4.0), and I think erakk is running Jelly Beans (Android 4.1). I see someone in the GitHub Issue Tracker is running using Honeycomb (3.1) and Gingerbread (2.3)
Visit my blog for other applications.
User avatar
Nandaka
Digitalizer Editor
Posts: 535
Joined: Thu Aug 09, 2012 9:46 am
Favourite Light Novel: Ahouka!
Location: Singapore
Contact:

Re: New Light Novel Reader Android App (In the works)

Post by Nandaka »

Change Log:
  • Update for compability with Android 2.3.3 (tested in VM)
  • Clean-up unused resources
Full Change log: https://github.com/calvinaquino/LNReade ... its/master
APK: http://www.mediafire.com/?8r4rd234ibiue51
Visit my blog for other applications.
User avatar
EusthEnoptEron
Project Translator
Posts: 836
Joined: Mon Jul 13, 2009 10:39 am
Favourite Light Novel: Ahouka!
Location: Switzerland

Re: New Light Novel Reader Android App (In the works)

Post by EusthEnoptEron »

Running on 2.2.1 here.
- No chapters in Gekkou and Tabi ni Deyou
- Back button closes app when in settings or ln list.
- "unable to close db due to unfinalised statements" in some projects. (toradora, hakomari) Followed by an "attempt to reopen a closed object" error.
- empty bitmap warning on some project pages (observed in the projects mentioned above)
- layout is messed up in tsukumodo (displaced)
- edit button still visible
- loading message looks kinda ugly here (surrounded by a white rect)
User avatar
Nandaka
Digitalizer Editor
Posts: 535
Joined: Thu Aug 09, 2012 9:46 am
Favourite Light Novel: Ahouka!
Location: Singapore
Contact:

Re: New Light Novel Reader Android App (In the works)

Post by Nandaka »

EusthEnoptEron wrote:Running on 2.2.1 here.
- No chapters in Gekkou and Tabi ni Deyou
Should be fixed in the latest commit. Those novel uses different format for listing the chapter.
EusthEnoptEron wrote: - Back button closes app when in settings or ln list.
This one I'm not so sure. It is behave normally in in ICS.
EusthEnoptEron wrote: - "unable to close db due to unfinalised statements" in some projects. (toradora, hakomari) Followed by an "attempt to reopen a closed object" error.
Need log file,
EusthEnoptEron wrote: - empty bitmap warning on some project pages (observed in the projects mentioned above)
Fixed, this is because of the url is encoded with % but it is being saved with decoded filename.
EusthEnoptEron wrote: - layout is messed up in tsukumodo (displaced)
need more information(which chapter?) + screen shot
EusthEnoptEron wrote: - edit button still visible
Only for light theme, currently I'm using it as benchmark to the dark theme. Technically, you only need to update the css. Tested in Hyouka.
EusthEnoptEron wrote: - loading message looks kinda ugly here (surrounded by a white rect)
For android version below 3.0, it uses the default theme, else it will the newer theme (Holo).
Need someone who can design Android UI :)

APK: http://www.mediafire.com/?rgjlk57uc0a5a1d
Visit my blog for other applications.
User avatar
EusthEnoptEron
Project Translator
Posts: 836
Joined: Mon Jul 13, 2009 10:39 am
Favourite Light Novel: Ahouka!
Location: Switzerland

Re: New Light Novel Reader Android App (In the works)

Post by EusthEnoptEron »

Those novel uses different format for listing the chapter.
And guess who's responsible for them. :D

Need log file,
Douzo~
Spoiler! :

Code: Select all

Device model: GT-I9000
Firmware version: 2.2.1
Kernel version: 2.6.32.9
root@sep-60 )
#1 Fri Dec 17 17:26:31 KST 2010
Build number: FROYO.XXJPX

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-07 20:18:27.090 E/Cursor (21229): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
09-07 20:18:27.090 E/Cursor (21229): at java.lang.Thread.run(Thread.java:1096)
09-07 20:18:27.090 D/Cursor (21229): 
09-07 20:18:27.090 D/Cursor (21229): Database path: /data/data/com.erakk.lnreader/databases/pages.db
09-07 20:18:27.090 D/Cursor (21229): 
09-07 20:18:27.090 D/Cursor (21229): Table name : null
09-07 20:18:27.090 D/Cursor (21229): 
09-07 20:18:27.090 D/Cursor (21229): SQL : SQLiteQuery: select * from pages where lower(page) = lower(?)
09-07 20:18:27.090 I/dalvikvm(21229): Uncaught exception thrown by finalizer (will be discarded):
09-07 20:18:27.090 I/dalvikvm(21229): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@483598f0 on null that has not been deactivated or closed
09-07 20:18:27.090 I/dalvikvm(21229): at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:613)
09-07 20:18:27.090 I/dalvikvm(21229): at dalvik.system.NativeStart.run(Native Method)
09-07 20:18:27.094 E/Cursor (21229): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.erakk.lnreader/databases/pages.db, table = null, query = select * from pages where page = ?
09-07 20:18:27.094 E/Cursor (21229): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
09-07 20:18:27.094 E/Cursor (21229): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:212)
09-07 20:18:27.094 E/Cursor (21229): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
09-07 20:18:27.094 E/Cursor (21229): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1454)
09-07 20:18:27.094 E/Cursor (21229): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1424)
09-07 20:18:27.094 E/Cursor (21229): at com.erakk.lnreader.helper.DBHelper.rawQuery(DBHelper.java:663)
09-07 20:18:27.094 E/Cursor (21229): at com.erakk.lnreader.helper.DBHelper.getPageModel(DBHelper.java:170)
09-07 20:18:27.094 E/Cursor (21229): at com.erakk.lnreader.helper.DBHelper.insertNovelDetails(DBHelper.java:373)
09-07 20:18:27.094 E/Cursor (21229): at com.erakk.lnreader.dao.NovelsDao.getNovelDetailsFromInternet(NovelsDao.java:332)
09-07 20:18:27.094 E/Cursor (21229): at com.erakk.lnreader.dao.NovelsDao.getNovelDetails(NovelsDao.java:279)
09-07 20:18:27.094 E/Cursor (21229): at com.erakk.lnreader.activity.DisplayLightNovelDetailsActivity$LoadNovelDetailsTask.doInBackground(DisplayLightNovelDetailsActivity.java:290)
09-07 20:18:27.094 E/Cursor (21229): at com.erakk.lnreader.activity.DisplayLightNovelDetailsActivity$LoadNovelDetailsTask.doInBackground(DisplayLightNovelDetailsActivity.java:1)
09-07 20:18:27.094 E/Cursor (21229): at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-07 20:18:27.094 E/Cursor (21229): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-07 20:18:27.094 E/Cursor (21229): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-07 20:18:27.094 E/Cursor (21229): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-07 20:18:27.094 E/Cursor (21229): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
09-07 20:18:27.094 E/Cursor (21229): at java.lang.Thread.run(Thread.java:1096)
09-07 20:18:27.094 D/Cursor (21229): 
09-07 20:18:27.094 D/Cursor (21229): Database path: /data/data/com.erakk.lnreader/databases/pages.db
09-07 20:18:27.094 D/Cursor (21229): 
09-07 20:18:27.094 D/Cursor (21229): Table name : null
09-07 20:18:27.094 D/Cursor (21229): 
09-07 20:18:27.094 D/Cursor (21229): SQL : SQLiteQuery: select * from pages where page = ?
09-07 20:18:27.094 I/dalvikvm(21229): Uncaught exception thrown by finalizer (will be discarded):
09-07 20:18:27.094 I/dalvikvm(21229): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@481d6560 on null that has not been deactivated or closed
09-07 20:18:27.094 I/dalvikvm(21229): at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:613)
09-07 20:18:27.094 I/dalvikvm(21229): at dalvik.system.NativeStart.run(Native Method)
09-07 20:18:27.125 D/dalvikvm(21229): GC_FOR_MALLOC freed 5517 objects / 550248 bytes in 31ms
09-07 20:18:27.125 E/Cursor (21229): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.erakk.lnreader/databases/pages.db, table = null, query = select * from pages where lower(page) = lower(?)
09-07 20:18:27.125 E/Cursor (21229): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
09-07 20:18:27.125 E/Cursor (21229): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:212)
09-07 20:18:27.125 E/Cursor (21229): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
09-07 20:18:27.125 E/Cursor (21229): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1454)
09-07 20:18:27.125 E/Cursor (21229): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1424)
09-07 20:18:27.125 E/Cursor (21229): at com.erakk.lnreader.helper.DBHelper.rawQuery(DBHelper.java:663)
09-07 20:18:27.125 E/Cursor (21229): at com.erakk.lnreader.helper.DBHelper.getPageModel(DBHelper.java:180)
09-07 20:18:27.125 E/Cursor (21229): at com.erakk.lnreader.helper.DBHelper.insertNovelDetails(DBHelper.java:373)
09-07 20:18:27.125 E/Cursor (21229): at com.erakk.lnreader.dao.NovelsDao.getNovelDetailsFromInternet(NovelsDao.java:332)
09-07 20:18:27.125 E/Cursor (21229): at com.erakk.lnreader.dao.NovelsDao.getNovelDetails(NovelsDao.java:279)
09-07 20:18:27.125 E/Cursor (21229): at com.erakk.lnreader.activity.DisplayLightNovelDetailsActivity$LoadNovelDetailsTask.doInBackground(DisplayLightNovelDetailsActivity.java:290)
09-07 20:18:27.125 E/Cursor (21229): at com.erakk.lnreader.activity.DisplayLightNovelDetailsActivity$LoadNovelDetailsTask.doInBackground(DisplayLightNovelDetailsActivity.java:1)
09-07 20:18:27.125 E/Cursor (21229): at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-07 20:18:27.125 E/Cursor (21229): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-07 20:18:27.125 E/Cursor (21229): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-07 20:18:27.125 E/Cursor (21229): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-07 20:18:27.125 E/Cursor (21229): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
09-07 20:18:27.125 E/Cursor (21229): at java.lang.Thread.run(Thread.java:1096)
09-07 20:18:27.125 D/Cursor (21229): 
09-07 20:18:27.125 D/Cursor (21229): Database path: /data/data/com.erakk.lnreader/databases/pages.db
09-07 20:18:27.125 D/Cursor (21229): 
09-07 20:18:27.125 D/Cursor (21229): Table name : null
09-07 20:18:27.125 D/Cursor (21229): 
09-07 20:18:27.125 D/Cursor (21229): SQL : SQLiteQuery: select * from pages where lower(page) = lower(?)
09-07 20:18:27.125 I/dalvikvm(21229): Uncaught exception thrown by finalizer (will be discarded):
09-07 20:18:27.125 I/dalvikvm(21229): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@48328cd8 on null that has not been deactivated or closed
09-07 20:18:27.125 I/dalvikvm(21229): at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:613)
09-07 20:18:27.125 I/dalvikvm(21229): at dalvik.system.NativeStart.run(Native Method)
09-07 20:18:27.129 E/Cursor (21229): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.erakk.lnreader/databases/pages.db, table = null, query = select * from pages where page = ?
09-07 20:18:27.129 E/Cursor (21229): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
09-07 20:18:27.129 E/Cursor (21229): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:212)
09-07 20:18:27.129 E/Cursor (21229): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
09-07 20:18:27.129 E/Cursor (21229): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1454)
09-07 20:18:27.129 E/Cursor (21229): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1424)
09-07 20:18:27.129 E/Cursor (21229): at com.erakk.lnreader.helper.DBHelper.rawQuery(DBHelper.java:663)
09
For android version below 3.0, it uses the default theme, else it will the newer theme (Holo).
Ah, I see. But is it intentional that the background isn't entirely black/white? Because that's pretty much the cause for the box around the message (different levels of white/black).

need more information(which chapter?) + screen shot
I tested with "Coincidence," but it's no big issue. I was too lazy to make a photo of my phone, so I tried with an AVD of Android 4.1 -- this time I got a NullPointer Exception. (I've built this myself, though, so maybe I broke something here)
Spoiler! :

Code: Select all

09-07 18:25:56.668: W/System.err(607): java.lang.NullPointerException
09-07 18:25:56.668: W/System.err(607): 	at com.erakk.lnreader.helper.DownloadFileTask.downloadImage(DownloadFileTask.java:124)
09-07 18:25:56.689: W/System.err(607): 	at com.erakk.lnreader.dao.NovelsDao.getNovelContentFromInternet(NovelsDao.java:414)
09-07 18:25:56.689: W/System.err(607): 	at com.erakk.lnreader.dao.NovelsDao.getNovelContent(NovelsDao.java:374)
09-07 18:25:56.689: W/System.err(607): 	at com.erakk.lnreader.activity.DisplayLightNovelContentActivity$LoadNovelContentTask.doInBackground(DisplayLightNovelContentActivity.java:282)
09-07 18:25:56.689: W/System.err(607): 	at com.erakk.lnreader.activity.DisplayLightNovelContentActivity$LoadNovelContentTask.doInBackground(DisplayLightNovelContentActivity.java:1)
09-07 18:25:56.689: W/System.err(607): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
09-07 18:25:56.689: W/System.err(607): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-07 18:25:56.698: W/System.err(607): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-07 18:25:56.698: W/System.err(607): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-07 18:25:56.698: W/System.err(607): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-07 18:25:56.698: W/System.err(607): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-07 18:25:56.698: W/System.err(607): 	at java.lang.Thread.run(Thread.java:856)
User avatar
Nandaka
Digitalizer Editor
Posts: 535
Joined: Thu Aug 09, 2012 9:46 am
Favourite Light Novel: Ahouka!
Location: Singapore
Contact:

Re: New Light Novel Reader Android App (In the works)

Post by Nandaka »

EusthEnoptEron wrote:I tested with "Coincidence," but it's no big issue. I was too lazy to make a photo of my phone, so I tried with an AVD of Android 4.1 -- this time I got a NullPointer Exception. (I've built this myself, though, so maybe I broke something here)
try again? usually network problem is the culprit.

and about the db problem, probably because I don't close the cursor after done querying. I will update it.

EDIT:
Change Log:
  • Close the Cursor object
  • Update ProgressDialog, should be look nicer now
APK: http://www.mediafire.com/?n83gi7sh0o5i7jc
Full Change Log: https://github.com/calvinaquino/LNReade ... its/master
Visit my blog for other applications.
User avatar
EusthEnoptEron
Project Translator
Posts: 836
Joined: Mon Jul 13, 2009 10:39 am
Favourite Light Novel: Ahouka!
Location: Switzerland

Re: New Light Novel Reader Android App (In the works)

Post by EusthEnoptEron »

Tested again - works like a charm now. :D
try again? usually network problem is the culprit.
Catch it? :P Seriously though, I tried again on my 2.2.1 and it looked fine now. It might have something to do with my zoom level, who knows.

It's really low-priority, but: the loading dialog looks even worse now. Here's a screenie.
Spoiler! :
Image
User avatar
Nandaka
Digitalizer Editor
Posts: 535
Joined: Thu Aug 09, 2012 9:46 am
Favourite Light Novel: Ahouka!
Location: Singapore
Contact:

Re: New Light Novel Reader Android App (In the works)

Post by Nandaka »

EusthEnoptEron wrote:Tested again - works like a charm now. :D
try again? usually network problem is the culprit.
Catch it? :P Seriously though, I tried again on my 2.2.1 and it looked fine now. It might have something to do with my zoom level, who knows.
need the log file :)
EusthEnoptEron wrote: It's really low-priority, but: the loading dialog looks even worse now. Here's a screenie.
Spoiler! :
Image
Weiirrd, but then I only tested it in 2.3.3 (VM) and ICS. It should centered in the screen with dimmed background.
refer to http://imgur.com/G65Ik (ICS) http://imgur.com/6pbpF (2.3.3 VM)
Visit my blog for other applications.
User avatar
EusthEnoptEron
Project Translator
Posts: 836
Joined: Mon Jul 13, 2009 10:39 am
Favourite Light Novel: Ahouka!
Location: Switzerland

Re: New Light Novel Reader Android App (In the works)

Post by EusthEnoptEron »

Nandaka wrote:
EusthEnoptEron wrote: Catch it? :P Seriously though, I tried again on my 2.2.1 and it looked fine now. It might have something to do with my zoom level, who knows.
need the log file :)
I posted one when I first reported the exception. ;)
Nandaka wrote:
EusthEnoptEron wrote: It's really low-priority, but: the loading dialog looks even worse now. Here's a screenie.
Spoiler! :
Image
Weiirrd, but then I only tested it in 2.3.3 (VM) and ICS. It should centered in the screen with dimmed background.
refer to http://imgur.com/G65Ik (ICS) http://imgur.com/6pbpF (2.3.3 VM)
Strictly speaking, the 2.3.3 one does look the same as mine -- or has similar issues at least-- save for the blue BG color of the dialog title. That being said and on an unrelated note, I really need to upgrade my Android one of these days. :D


[edit]
Another screenie,illustrating a minor problem with displaying the "star"-buttons:
Spoiler! :
Image
User avatar
Nandaka
Digitalizer Editor
Posts: 535
Joined: Thu Aug 09, 2012 9:46 am
Favourite Light Novel: Ahouka!
Location: Singapore
Contact:

Re: New Light Novel Reader Android App (In the works)

Post by Nandaka »

Nandaka wrote:Another screenie,illustrating a minor problem with displaying the "star"-buttons:
woopsie, probably need to disable wrapping and change the ordering.
Visit my blog for other applications.
User avatar
larethian
I.D.S.E Humanoid Interface [LSB]
Posts: 2191
Joined: Tue Aug 31, 2010 10:50 pm
Favourite Light Novel:

Re: New Light Novel Reader Android App (In the works)

Post by larethian »

I'll be getting note 2 btw, hope it works with jellybean and up :lol:
User avatar
Nandaka
Digitalizer Editor
Posts: 535
Joined: Thu Aug 09, 2012 9:46 am
Favourite Light Novel: Ahouka!
Location: Singapore
Contact:

Re: New Light Novel Reader Android App (In the works)

Post by Nandaka »

Should be ok on Jelly Bean, tested using my friend phone :)
Visit my blog for other applications.
User avatar
Nandaka
Digitalizer Editor
Posts: 535
Joined: Thu Aug 09, 2012 9:46 am
Favourite Light Novel: Ahouka!
Location: Singapore
Contact:

Re: New Light Novel Reader Android App (In the works)

Post by Nandaka »

Change log:
  • Update layout for small screen
APK: https://github.com/calvinaquino/LNReade ... andaka.apk

That's all
Visit my blog for other applications.
User avatar
Erakk
Digitalizer Editor
Posts: 152
Joined: Sat Jan 21, 2012 3:12 am
Favourite Light Novel:

Re: New Light Novel Reader Android App (In the works)

Post by Erakk »

It's ok on Jelly Beans, the only thing is that sometimes locking orientation crashes the app.
I'm currently running 4.0.4 and tested on a friend's 4.1 SIII. Runs the same but we both are getting this problem on change orientation. Ill check the code, there must be something we forgot.

I feel soo depressed i don't know why.

EDIT: we need an Icon. and a new name. not that the current one is bad.
In theory, practice and theory are the same.
but, practically, they arent.
User avatar
Nandaka
Digitalizer Editor
Posts: 535
Joined: Thu Aug 09, 2012 9:46 am
Favourite Light Novel: Ahouka!
Location: Singapore
Contact:

Re: New Light Novel Reader Android App (In the works)

Post by Nandaka »

Erakk wrote:It's ok on Jelly Beans, the only thing is that sometimes locking orientation crashes the app.
I'm currently running 4.0.4 and tested on a friend's 4.1 SIII. Runs the same but we both are getting this problem on change orientation. Ill check the code, there must be something we forgot.

I feel soo depressed i don't know why.
Any trace log to share :) I'm using ICS/CM9 on HP Touchpad, haven't encounter such error.
Erakk wrote: EDIT: we need an Icon. and a new name. not that the current one is bad.
Create a pool and vote? Also a contest to create the App Icon? :D
Visit my blog for other applications.
Post Reply

Return to “Developers and Code”