Summary:
1. JL is a stand-alone app. All of your data is stored on your device. JL does not share your data, or acquire data from third party providers.
2. One Dangerous Permission: Access to Microphone. JL never records audio in the background or when the app is paused.
3. Besides audio, no other personal or sensitive information is collected.
4. JL is committed to the Play Families policy, and fully respects your privacy regardless of the Android version of your device.
JL is a stand-alone app: JL is not web- or cloud-based; JL does not store any of your information in the cloud; JL does not share or acquire any information with or from any other apps or service providers or database servers. JL does not rely upon remote storage or communications for its operation. Via menu selection you can choose to export files from JL. (File import and export is discussed further down.) JL will work perfectly well forever without you importing or exporting a single file, on a device without any internet connection.
JL allows you to record audio into audio files. These files are inserted into your current folder where you have full management control of them, including playback, copy and delete. Starting with Android 6.0 Marshmallow released in 2015 you must explicitly grand permission for apps to use the microphone. Regardless of the Android version of your device JL never records audio in the background unbeknownst to you. All audio recording is initiated by you via "record audio …" menu selections, and at all times during recording a "stop recording" button is prominent on the screen. Recording is automatically stopped when the app is paused for any reason, such as a phone call.
Regardless of the Android version or age of your device JL conforms to the spirit of the strict privacy constraints of the latest Android versions. All versions of Android have always allocated and automatically granted each app full access to its own semi-private directories (folders): "internal" and "external" storage sandbox areas where the app is free to do its own thing without affecting other apps. But apps running on older versions of Android can literally "grant themselves" permission to fully access many other parts of a device's storage including shared directories and those created by other apps. Starting with Android 10 apps can no longer grant themselves permission to access areas of storage outside of their own internal and external sandboxes. Regardless of the Android version of your device JL limits its storage operations to these two semi-private directories (folders) granted to it by Android. These two JL storage folders are here called Internal JL store and External JL store. You can choose to import or export particular files into or out of JL storage, in which case JL gains access only to those files that you choose, as is discussed further down.
Upon your command JL will initiate phone calls, text messages and emails, and open web pages - all using your device's default providers of these four basic services. It is up to you to complete or else to cancel every particular call, text or email so initiated.
JL does not run any persistent background tasks or services or notifications of any sort. When you pause or close JL or when you get a phone call, JL will save your current file before it pauses: Except when the size of this file is estimated to be very large (several megabytes or more) or especially when the file contains large amounts of encrypted data, JL will instead start a separate temporary process (a separate thread) to encrypt the data as the case may be, and then to save the file. This separate process runs in the background for just as long as is required to reach completion - OR until you return to the app after the pause or the phone call - whichever comes first. (Especially on older devices encryption or decryption can take upwards of one second per megabyte of data.)
All the information that JL operates upon and requires for its operation resides in files stored in JL storage on your device. All of these files are fully accessible to you and manageable by you from within JL.
Import and export of files: The Android File Chooser is how you import files, import references to local files, and export files. When importing, JL is granted read permission only to those files that you explicitly select via the Chooser. For export, JL is granted write permission only to the specific destination file name that you choose. If you choose a location that resides on cloud storage then it is the cloud storage provider that executes the actual transfer (download or upload) of data to or from your device, while JL handles the local copying of the file data into or out of JL storage.
You can import references to local files such as videos when you only wish to read or view the files. This avoids the duplication of potentially large amounts of data on your device. The textual URI's for the referenced files are placed in rows inserted into your current folder in JL storage. JL retains the read access granted by you to the referenced outside files so that you can view them at any time. (Note that Android can later under certain conditions revoke these read permissions.) File references can be made a part of an arrangement of media files that you create using the JL built-in 12-track media player.
JL is a true multi-tool in the app world.
JL will manage your information! Notes, to-do lists, birthdays, addresses, JSON files of any size or depth, a table of thirty thousands parts imported as CSV from Excel, clients and job details, sports team information, expiry and due dates, banking information, … the list is endless because JL is easily customized by you.
JL is a stand-alone app. No data is collected or shared. All of your information is stored locally, in rows in the branches of tree structures, in files in folders in the JL storage area on your device. All of these files are immediately accessible and fully manageable by you from within JL. You can export or import any files (transfer or share them).
Your information can be edited and sorted, searched, labelled and bookmarked. (In JL bookmarks are called "treemarks".)
Your information can be cross-referenced: Individual rows can be cross-referenced, as can whole branches using keys in the current row's branch: These keyed cross-references are an important feature because they relate for example the separate branches of birthdays and addresses using two keys: last name and first name.
JL offers industry-standard GCM 128-bit password-based encryption for sensitive information such as banking passwords - you can easily create a password manager or vault by encrypting any branch with your master password. You can encrypt information ranging from single rows of text up to large files and folders.
JL's built-in 12-track media player allows you to easily place voice over media, and to create slide shows and arrangements of media files stored on your device. These voice-overs and arrangements can be bundled into a single file to be exported and shared with other JL users.
JL preserves the exact structure and format of your information as entered or imported. All white space in fields is preserved. You can insert blank or whitespace rows anywhere in JL.
JL is at its core a JSON editor. It can efficiently manage JSON or CSV files up to 30 megabytes or more in size (memory being the limiting factor). In JL you navigate within the tree structure defined by the objects and arrays in your JSON data. There are a wide range of options when loading JSON or CSV data. You can edit the data then save new versions, or save as JSON or CSV (convert the data). Or you can simply use the data in JL. You can create JSON data from scratch. You can create easy-to-read custom reports of two-level information such as birthdays, saved to text files. And JSON, CSV and text report files can be saved with custom margins and indentation.
The built-in media player running in "OneRow" mode allows you to view any file as text, regardless of its type. This text can be selected and copied to the clipboard. Many more options are available.
Please explore JL JsonLive. It provides many ways for you to manage and be creative with your information!
Other key words, phrases and information:
• JL is a personal information manager.
• JL encryption uses the following technology: AES-GCM, PBKDF2 with HMAC SHA1 at 32769 iterations, with key length 128 bits, and salt length 256 bits, and with random padding of plaintext so its length is at least 700 bytes.
• JL is a tree-structured database (a hierarchical database with a tree structure). Every branch in the JL tree is a sparse array.
• A keyed cross-reference is also called a relational cross-reference.
• Arrange and play media using five audio tracks and seven video/image/text tracks. Video tracks, image tracks, text tracks. Create musical arrangements.
• Voice-over, instant audio overlay, audio over video, audio over image.
• JSON: JavaScript Object Notation. JL is a JSON editor.
• CSV: Comma-Separated Values. JL is a CSV editor.
• JL is a basic text editor, for files under 10K.
• Navigation latency is the term that JL uses to describe the time-delay between a navigation directive (such as the user clicking on a navigation button such as back or forward in location history) and the time that the directive is executed. Navigation latency allows for the bulk-execution of successive navigation directives falling "close together," within the latency period, so for example, the user can navigate three locations back in location history all at once. The navigation latency can be adjusted in Settings.
• Clipbranch is the JL analog of the clipboard. The clipbranch is where JL places all branches and rows that are clipped (copied or cut) during normal editing operations.
• Scroll pump is the term that JL uses to describe a unique branch scrolling capability implemented by the row-up and row-down buttons at the left side of the footer. By pumping these buttons with your finger you can scroll up or down at a steady rate. To double the rate you tap the buttons while continuing to scroll.
JL uses the UTF-8 character encoding.
JL is fundamentally two things:
1: A JSON editor. JSON is a lightweight data-interchange format that's been around for over 20 years. ✱
2: A tree-structured information manager, with rows of info organized into branches at successive levels starting at the root level zero (L0).
Rows & Branches & Levels: Every row at level 'L' is a branch at level "L+1", and vice versa.
Every row has a name field, a value field and an "L+1 report" field which reports on the contents of the row or its L+1 branch.
The text contents of the name and value fields are editable right in place, and also editable are the rows and branches as a whole.
In JL you are always in edit mode, and all edits are saved unless you explicitly choose to close without save.
JL has two modes of operation:
1. File Store (FS) mode - with the gray header.
FS mode provides a "details-list-view" access to all files and folders in JL storage. FS mode is a file manager for all files in JL.
JL storage consists of two root folders called Internal JL store and External JL store, plus all files and subfolders therein.
Files can be imported to - and exported from JL storage.
2. Json mode - with the blue header.
Json mode operates inside FS mode. Json mode is where you edit individual JSON files, and edit and manage your personal or business info contained in same.
Your current mode and level and row# is indicated in the title bar.
Encryption is available in both modes. In FS mode you can encrypt-lock files or whole folders. In json mode you can lock rows or whole branches.
Navigation:
The rows in each branch are divided into pages. There are page Up and page Down buttons, as well as the page# button in the header.
Your current location is recorded in the first of four "meta-branches" in the root L0 branch:
"meta1: loc history" records your recent locations by branch and page. You can navigate back and forward in location history.
meta2 stores your "treemarks" and cross-references, and meta3 stores your searches. When you cross-reference or do a search you are placed at each match in the tree.
"meta4: clipbranch" stores all recent row/branch (Sel) copies and cuttings. You can move or paste the clipbranch contents (rows) anywhere.
There is built-in and adjustable navigation latency, which means you can page up or down, go leafward or rootward, or back or forward multiple steps at once.
All changes/edits that you make are automatically saved when you pause the app or you get a phone call.
✱ JSON (JavaScript Object Notation) is formally defined at http://json.org and https://ecma-international.org/publications-and-standards/standards/ecma-404
JL uses the UTF-8 character encoding.
JL is highly customizable by you; it can serve many purposes.
JL is fundamentally two things:
1: A JSON editor. JSON is a lightweight data-interchange format that’s been around for over 20 years. ✱
JSON data is structured data. Moreover, JSON data has a hierarchical (tree) structure.
2: A tree-structured information manager, with rows of info organized into branches at successive levels starting at the root level zero (L0).
Rows & Branches & Levels: Every row at level ‘L’ is a branch at level “L+1”, and vice versa.
in JL all root L0 rows can become branches at level L1 containing their own rows, which in turn can become branches at the next level L2, and so on.
When not referencing a specific level such as root L0, your current level is referred to by the capital letter ‘L’ by itself.
The next higher or “leafward” “child” level is called level “L+1”, and the next “L+2”.
Conversely “L-1” refers to the next lower or “rootward” “parent” level in the tree.
Empty or blank whitespace rows count as rows and are preserved.
Every row has a name field which is always visible. When the name is empty its hint text is “r#5” to indicate row#5, etc.
Every row also has a value field which will be hidden unless it is non-empty or the branch flag [Show all value fields] has been set in the overflow menu.
Tags are bits of text placed at the start of the name and value fields.
Tags are info and instructions used by you and JL. Tags have the format “JL012:” where “012” is the 3-digit tag# (000-999).
For example, the name field might contain “JL007: 2022-05-18” followed on the next line by “Smith”. “Smith” alone is considered to be the name.
There is also a tag without a number: “+JL:” can be used by itself, or to continue a numbered tag on the next line.
Every row also has a third “L+1 report” field which shows info about the row or branch contents if any, as discussed below.
The text contents of the name and value fields are editable right in place, and also editable are the rows and branches as a whole.
Rows can be selected and unselected. All the selected rows in a branch are called the Sel, and a contiguous range of selected rows is called a Sel block.
Operations such as cut, copy and paste can be performed on the current Sel block (the one if any that contains the current row) or the Sel as a whole.
The current Sel block can be bundled, sorted, saved, etc.
In JL you are always in edit mode, and all edits are saved unless you explicitly choose to close without save, as is discussed at the end of this intro.
JL has two modes of operation.
1. File Store (FS) mode – with the gray header.
FS mode provides a “details-list-view” access to all files and folders in JL storage. FS mode is a file manager for all files in JL.
JL storage consists of two root folders called Internal JL store and External JL store, plus all files and subfolders therein.
Files can be imported to – and exported from JL storage.
And just like rows in general, files and folders can be created, moved, copied and pasted, edited, bundled and encrypted, etc.
Files can be viewed with OneRow, and arranged and played using a built-in 12-track media player.
In FS mode the report field will show the size and date of files.
2. Json mode – with the blue header.
Json mode operates inside FS mode. Json mode is where you edit individual JSON files, and edit and manage your personal or business info contained in same.
In json mode the report field will show a default report on the contents of the leafward L+1 branch.
This report can be fully customized with the use of the JL515: tag, placed in the value field of the rootward L-1 row.
Tag#515 is used by the birthdays branch in the “my stuff.json” file installed in this folder.
Your current mode and level and row# is indicated in the title bar.
Encryption is available to lock files and whole folders, and in json mode to lock rows and whole branches.
Navigation:
The rows in each branch are divided into pages. There are page Up and page Down buttons in the title bar and footer respectively.
There is the large page# button at the top-right of the header. Click on it to open the Pg# dialog with its options including page size.
You move leafward into files/folder/branches by clicking the ‘>’ at the right of the row, or the large > symbol at the right side of the footer.
You move rootward by clicking the home button – the app icon at the top-left corner in the title bar.
Move up and down one or multiple rows at a time with the “scroll pump,” the up-down-arrow symbols at the left side of the footer.
Click to move up or down one row. Click and hold while steadily “pumping” up and down to scroll up or down at a steady rate.
Click and hold again while continuing to pump to increase the rate of scrolling. Scrolling stops at the page boundary.
Your current location is recorded in the first of four “meta-branches” in the root L0 branch:
“meta1: loc history” records your recent locations by branch and page. The back key moves you back in location history.
The forward key, a large open V symbol at the right side of the footer immediately above the back key, will move you forward in loc history.
meta2 stores your “treemarks” and cross-references, and meta3 stores your searches. When you cross-reference or do a search you are placed at each match in the tree.
“meta4: clipbranch” stores all recent row/branch (Sel) copies and cuttings. You can move or paste the clipbranch contents (Sels) anywhere.
There is built-in and adjustable navigation latency, which means you can page up or down, go leafward or rootward, or back or forward multiple steps at once.
The overflow menu (at top-right corner, or on older phones the bottom-left hard key) provides options for [Save and Close this file] when in json mode.
This will return you to FS mode, while [Save.. Exit] will save and exit the app as a whole.
In any event all changes/edits that you make are automatically saved when you pause the app or you get a phone call.
In case however you made changes that you do not want to save then choose [Menu: No-Save Options] at the very bottom of the overflow menu.
Make this selection before you get that phone call!
Thanks for choosing JL JsonLive. Please explore.
Open the “my stuff.json” file to check out the Birthdays and Contacts branches, or the Clients and Job Details branches. Good examples here of tag#515 usage.
✱ JSON (JavaScript Object Notation) is formally defined at http://json.org and https://ecma-international.org/publications-and-standards/standards/ecma-404
(Similar in many respects to Clients and Job Details. Please see that introduction.)
Summary:
1: Open a json file containing your personal info
2: Search for birthdays falling in the current month (in birthdays✱ branch)
3: Get the address for a person listed in birthdays
4: Find the birthday for a given contact
5: Add a new birthday or contact
Confirm that you are in file store (FS) mode, as indicated by the gray header.
And confirm that you are in either Internal or External JL storage: the words “Internal” or “External” will be in the header.
If you are not in either Internal or External storage:
a. Open the overflow menu (at top-right corner, or on older phones the bottom-left hard key) and select [Goto Internal JL store] or [Goto External JL store]
– done –
1: Open a json file containing your personal info (when in FS mode)
a. Open the file “my stuff.json” by clicking the ‘>>’ at the right side of the row.
– done – you are now in json mode (indicated by a blue header) in the open json file.
2: Search for birthdays falling in the current month
The birthdays branch is sorted by month with month titles.
Title rows are indicated by a black bar at the left of the row. (You can flag any row as a title, as priority or as done.)
– Simple approach: Manually enter the birthdays branch and scroll or page to the current month.
– A second approach – lets assume you’ve recorded hundreds of birthdays! – is to search for the current month from anywhere in my stuff.json:
a. Open the overflow menu (at top-right corner, or on older phones the bottom-left hard key) and select [Srch menu: create new srch]
b. Select [JL034: srch whole tree fr/root]
– You are now in the search branch of your json file. meta3: search contains all your searches.
c. At cursor in the current field enter the month or part thereof, for example “aug” for August.
d. Long press on the row and from the menu more than half way down select [JL341: Title]
e. Click the [srch] action button in footer.
– done – You will be taken to the title “August” in birthdays.
3: Get the address for a person listed in birthdays
The birthdays and contacts branches are related by a keyed cross-reference (keyed xref or keyed xr for short) which specifies the L+1 row#’s for the keys in each branch.
The unique xref keys that relates these two particular branches are “AA key1: last name” + “AA key2: first name”.
In this case key1 and key2 reside on L+1 row numbers 1 and 2 respectively, for both branches.
– You want to send John Smith a birthday card. You need his address:
a. Long press on the John Smith row and from the menu more than half way down select [keyed xr: match cur br & row]
– done – You will be taken to the corresponding row in the contacts branch, with the same first and last name.
b. In the event that you know two John Smith’s click [key xr] in the footer for the next match.
Note: As you will often know multiple people living at the same address, for example all members of the Smith family, then in the L+1 branch for the Smiths the row for first name (row two in this case) will list, separated by commas, “John, Mary, Sue, Fred”. It is important to separate the names by commas (spaces are optional).
4: Find the birthday for a given contact
When there is only one person living at the current contact address, then simply start the keyed xref as per step 3 above.
– done – This will bring you to their birthday.
However for the Smith family, with four first names listed, the keyed xref as started above will not find a match because each birthday is for one person. The xref does not know which person “John”, “Mary”, “Sue” or “Fred” is the birthday you want. So for the Smiths contact:
a. Enter the L+1 branch for the Smiths where on row two are listed the four first names.
b. Place the cursor (insert point) in the row#2 text of the name for whom you want the birthday, for example “Mary”.
c. Long press on the row and from the menu towards the bottom select [keyed xr: match L-1 br & sel’d text]
– done – This will bring you to the birthday for Mary Smith.
5: Add a new birthday or contact
Both branches include a template row called “AAA Template …”.
Scenario One: You’ve already made an entry in contacts for someone, and you want to add their birthday:
Assume it’s the Smiths family, and you want to add a birthday for Sue.
a. Initiate a keyed xref as per step 4 above, except this time place the cursor in the text for “Sue”.
When the keyed xref does not find a match for Sue in birthdays it will ask if you wish to insert a new matching entry. If you select “Yes” then JL will place a copy of the birthdays AAA template row into meta4: clipbranch with key1 and key2 already set, and you will be placed in the birthdays branch.
b. Follow the message instructions to insert the new birthday and then add the actual birth date YYYY-MM-DD in the L+1 branch.
Scenario Two: You want to add someone’s birthday, and there is no existing entry for them in either birthdays or contacts:
a. Copy the “AAA Template …” row or any existing row in birthdays: Long press on the row then select [c Copy row to clipbr]
b. Go to the row where you want to insert the new birthday, preferably in the correct order (by month then day-of-month for birthdays).
c. Long press on the Insert button (the large ‘+’ symbol in the footer), then select [Move clipbranch Sel here], or [Paste …] if you will be adding multiple rows.
If this is a copy of the template then delete the instructions text in the name field.
d. Enter the L+1 branch for the row just inserted. Edit all fields as required.
– done –
✱ The L0 birthdays row has tag JL515: which shows how to display the birthdays info from L+2 at L+1 inside the branch. You can fully customize the instructions in this tag.
(Similar in many respects to Birthdays and Contacts. Please see that introduction.)
A self-employed electrician or plumber will have a number of local clients, each with a profile including address and contact info, etc.
Over time they may do multiple jobs for the same client, so there is a one-to-many relationship here: each client – many jobs.
Summary:
1: Open a json file containing your small business info, and go to Clients
2: Add another client using the template or an existing client
3: Get the job details for a given client
4: Start a new job for the client
5: Add today’s date and hours worked to the current job details
1: Open a json file containing your small business info, and go to Clients
– You are currently in File Store mode, as indicated by the gray header.
a. Open the file “my stuff.json” by clicking the ‘>>’ at the right side of the row.
– You are now in json mode (indicated by a blue header) in the open json file.
b. Go to the Clients row in the root branch, then enter the row’s branch by clicking the ‘>’ at the right side of the row.
– Clients are listed alphabetically with A-Z title rows. Title rows are indicated by a black bar at the left of the row. You can flag any row as a title row.
Both the clients and job details branches include a custom “AAA Template …” row, used to create new entries.
2: Add another client using the template or an existing client
a. Copy the “AAA Template – clients addrs” row or any existing row in clients: Long press on the row then select [c Copy row to clipbr]
b. Go to the row where you want to insert the client, preferably in order – to preserve the alphabetical ordering of clients.
c. Long press on the Insert button (the large ‘+’ symbol in the footer) then select [Move clipbranch Sel here], or [Paste…] if you will be adding multiple rows.
If this is a copy of the template then delete the instructions text in the name field.
d. Enter the branch for the row just inserted then edit all fields as required: Set key1 to “Century Paints”. If there are multiple outlets for Century Paints and each one is considered separate for billing then set key2 to the outlet location, in order to uniquely identify the outlet. Otherwise key2 can be empty, and the location if needed can be specified in row#3 which is not a key row.
– done –
3: Get the job details for a given client
The clients and job details branches are related by a keyed cross-reference (keyed xref or keyed xr for short).
The unique xref keys that relates these two particular branches are “AA key1: last or bus name” + “AA key2: first n or location”.
Xrefs specify the L+1 row#’s for the keys. In this case key1 and key2 reside on L+1 row numbers 1 and 2 respectively.
(You can modify this xref or define your own to relate any two or more branches, with up to three separate row#’s defining the key)
– You want to go to the job details for Century Paints:
a. Back at L1 in the clients branch long press on the Century Paints row and from the menu more than half way down select [keyed xr: match cur br & row]
– done – You will be taken to the first matching row in the job details branch, if any.
Job details are primarily ordered alphabetically by key1 and key2, and thirdly by the job date as specified on row#7 of the details. It makes sense for you to maintain this ordering as you add new jobs, by placing the newest job at the top of the list for the client (that is, so job dates are descending).
4: Start a new job for the client
If there is an xref match then you are in job details at the client’s most recent (top-listed) job, as found by the keyed xref above.
So to start a new job:
a. Copy this top row: Long press on the row then select [c Copy row to clipbr]
b. Long press on the Insert button then select [Move clipbranch Sel here]
– The new row is inserted at the current row.
c. Enter the new row’s branch then edit the fields to define the new job.
d. Proceed to step 5 below to add a date on row#7.
If there is no match in job detail for Century Paints (you have just added the new client, as per step 2 above), then the keyed xref will ask if you wish to insert a new matching entry. If you select “Yes” then JL will place a copy of the job details AAA template row into meta4: clipbranch with key1 and key2 set for Century Paints, and you will be placed in the job details branch.
e. Follow the message instructions to insert and edit the new entry.
5: Add today’s date and hours worked to the current job details
a. Go to row#7 in the L2 branch for this particular job.
b. If row#7 is not empty then enter a line feed (Lf) at the start of the field, then move the cursor to position 0.
(Tip: use the keys in the footer, ‘Lf’ then ‘<‘)
This will place an empty line at the start of the field and also put the insert point at the start, for the date to be added next…
c. Long press on the clipboard in the footer to insert the current (today’s) date at the insert point. Add some spaces then the number of hours worked today.
– done –
A keyed xref can be used to relate any two or more lists of associative information stored in JL json mode branches. The separate branches must share key values such as “last name” and “first name”. The keyed xref specifies the L+1 row#’s holding the keys in each branch belonging to the xref. A keyed xref can have up to three keys – three separate row numbers.
From either the overflow menu or the row context menu select the option [keyed xr: match br & row]. This option will find any matches in the other branches belonging to the keyed xref for the current branch, using the instantiated keys found in the current (i.e. starting) row’s L+1 branch, for example, last name “Smith” and first name “John”.
If there are other branches belonging to the keyed xref but no matches in any of them, then the keyed xref will ask if you wish to insert a new matching entry in the first of the other branches. If you select “Yes” then JL will help you add a new entry created from a copy of the AAA Template row for the information in that branch: You will be placed in the branch. Then follow the message instructions to insert and edit the new entry.
please review the introductions to Birthdays and Contacts and to Clients and Job Details, both of which use a keyed xref.
(Please review the introduction to Birthdays and Contacts.)
This introduction uses Birthdays as an example, but the exact same procedure applies to Contacts, or to Clients or Job Details – to any lists of information that you maintain.
Summary:
1: Start keeping track of people’s middle names: insert the middle name at row#2 between first and last names.
2: Duplicate the changes in siblings: Automatically update all sibling profiles to match.
3: Update the report instructions in the JL515: tag in the root L0 Birthdays row.
4: Update the keyed xref so it works properly.
You are in json mode in “my stuff.json” at L2 in the birthdays template profile which includes last name (row 1), first name (row 2), birth date (row 3) and notes (row 4).
All of your birthdays have the same information in the same order. This ordering is important because both the L+1 report as specified in tag#515 of the root L0 Birthdays row and the keyed xref that relates Birthdays and Contacts rely upon the correct order of the profile information. These specify row#’s where information such as first name or date is expected to be found.
1: You decide you want to keep track of people’s middle names. The natural place to put the middle name is on row#2, inserted between last name and first name:
a. In the template profile (or in the profile for any person already in Birthdays – it doesn’t matter which profile) go to row#2 and click the large ‘+’ insert button in the footer.
– A blank row has now been inserted and first name has moved to row#3 and birth date is now at row#4.
b. Enter the words “middle name” on row#2 to fill-out the template.
– done –
You already have many birthdays entered and you don’t want to have to manually update all the rows one-by-one…
✱✱ Note: When you make a profile change as above and you intend to duplicate this change in all sibling profiles you should be concise and deliberate about the change, and then without undue delay perform the [Duplicate chng’s in siblings] operation as per step 2 next. This operation is time-sensitive and limited to the same app session in which the changes in the first profile are made. (The operation may not work if you make too many changes on top of each other beforehand.)
2: Duplicate the changes in siblings: Automatically update all sibling profiles so that the order and row#’s of their information match up:
a. From within the profile branch you just edited, open the overflow menu and towards the bottom select [Duplicate chng’s in siblings].
b. Click “Go” in the dialog. (The options in the dialog are probably good as is.)
– done – all the sibling profiles now have row#2 blank, ready to accept the middle name for each person. And all first names have moved to row#3 and birth dates to row#4.
3: Update the report instructions in the JL515: tag in the root L0 Birthdays row so that the birthdays are reported correctly at L1:
a. Hit the home key top-left a couple times quickly to move to the L0 Birthdays row.
– Birth date has moved from row#3 to row#4 and first name has moved from row#2 to row#3, so…
b. In the tag#515 formula first change all 3’s to 4’s, then change all 2’s to 3’s.
– done – the L+2 birthdays info will show correctly at L+1.
4: Update the keyed xref so it works properly:
a. Hit the ‘>’ at the right of the Birthdays row and enter the Birthdays branch.
– You are now at level L1 in Birthdays…
b. Open the overflow menu and above the middle select [keyed xr: goto for this br].
– You are now in the “meta2: treemark xref” branch at the L1 keyed xref row that relates Birthdays and Contacts.
c. Enter this xref’s L2 branch.
– Your current L2 row should be the row for Birthdays…
d. In the JL022: tag of the Birthdays row change the 2 (in “first 2”) to a 3 (to read “first 3”) to indicate that first name is now on row#3 in all Birthdays profiles.
– done – the keyed xref will now properly cross-reference with the Contacts branch. Hit the back key twice to return to the Birthdays branch.
Summary:
1: Any row at any level can be flagged as a title, as priority, or as done
2: Search for done rows, or for not-done rows
3: Re-use or re-do the same list
1: Any row at any level can be flagged as a title, as priority, or as done – meaning branches as a whole can be so flagged.
a. To flag as done, long press on the row and select [Strikethrough – “done”]
b. Or to flag a bunch of rows in the current branch long press the action button in footer and select [Done – Row-by-Row, “Ctrl”]
The action button is now set to “Done” and active. Touch every row you want to flag as done.
When finished click the “Done” action button to make it not active.
2: Search for done rows, or for not-done rows
a. Open the overflow menu (at top-right corner, or on older phones the bottom-left hard key) and select [Srch menu: create new srch]
b. Select [JL035: srch home br only] to restrict the search to the current branch.
– You are now in the the search branch of your json file: [meta3: search] contains all your searches.
c. Long press on the current field and select [JL343: Done/Strikethrough] about mid-way down the menu.
d. To search for not-done rows place the cursor (insert point) before the ‘D’ of “Done”, hit the keyboard in footer and insert an exclamation mark ‘!’
(The ‘!’ exclamation mark logically negates the criterion.)
e. Click the [srch] action button in footer.
– done – you will be taken to the first done (or not-done as per step d. above) match if any. Click [srch] again for the next match.
3: Re-use or re-do the same list
a. Long press on the done row and select [Strikethrough – “done”] to toggle/clear the flag.
Or to clear all done flags in the current branch long press the action button in footer and select [Clear all Done (…)]
– ! done ! –
Summary:
These dates can be placed anywhere.
1: Typically placed in json mode
2: Search for approaching expiry dates
1: Typically placed in json mode, in a json file containing your personal records and info, such as “my stuff.json”.
a. Either open your personal json file, or on any empty row (r#) click the ‘>’ at the right of row and [Open new empty JL json file]
– You are now in json mode (indicated by a blue header) in the open json file.
b. Long press on any row and select [JL099: expiry/due date]
– If the row was empty then today’s date will also be added.
– The date is placed IN THE SAME FIELD, on a SEPARATE ROW AFTER the tag.
– The date must be found within 75 character following the last tag.
– The date format is either YYYY-MM-DD, or MM-DD for annuals.
c. Edit the date in the field, as required.
(Tip: You can modify numbers and dates using the backspace and digits keys in footer. Swipe left or right for other digits.)
(Tip: You can insert today’s date anywhere by long-pressing the clipboard in the footer.)
d. Identify the date: Add a description such as “driver’s 123456-789” after the date.
– done –
2: Search for approaching expiry dates
a. Open the overflow menu (at top-right corner, or on older phones the bottom-left hard key) and select [Srch menu: create new srch]
b. Select [JL034: srch whole tree fr/root]
– You are now in the the search branch of your json file: [meta3: search] contains all your searches.
c. Long press on the current field and select [Expires or due in next 15mo] towards the bottom of the menu.
– Note: you can edit the 15 to specify any number of months into future.
d. Click the [srch] action button in footer.
– done – you will be taken to the first match if any. Click [srch] again for the next match.
Summary:
1: Encrypt any file or folder
2: A password vault is typically placed in a json file
3: Open a locked vault
Confirm that you are in file store (FS) mode, as indicated by the gray header.
And confirm that you are in either Internal or External JL storage: the words “Internal” or “External” will be in the header.
If you are not in either Internal or External storage:
a. Open the overflow menu (at top-right corner, or on older phones the bottom-left hard key) and select [Goto Internal JL store] or [Goto External JL store]
– done –
1: Encrypt any file or folder (when in FS mode, in either External or Internal JL storage)
a. Long press on the file or folder you want to lock and select [pwd: add locks – encrypt file/folder]
b. Enter your new password twice and click [Go]
< time to encrypt will vary >
– done – a closed padlock is now at the right of the row.
2: A password vault is typically placed in a json file containing your personal info
a. Either open your personal json file such as “my stuff.json”, or on any empty row (r#) click the ‘>’ at the right of row and [Open new empty JL json file]
– You are now in json mode (indicated by a blue header) in the open json file.
– Here in json mode you can lock any row or branch, even empty ones.
b. Long press on the row you want to lock and select [pwd: add locks – encrypt branch]
c. Enter your new password twice and click [Go]
– done – a closed padlock is now at the right of the row.
– You can name your vault anything you like.
3: Open a locked vault
a. Click the ‘>’ beside the padlock at right of row.
b. Enter your password and click [Go]
< time to decrypt will vary >
– done – you are automatically placed inside the open branch/vault (at level L+1).
Summary:
1: Import the file if it is not already in JL (when in FS mode)
2: Proceed with encryption
3: Export the file
Confirm that you are in file store (FS) mode, as indicated by the gray header.
And confirm that you are in either Internal or External JL storage: the words “Internal” or “External” will be in the header.
If you are not in either Internal or External storage:
a. Open the overflow menu (at top-right corner, or on older phones the bottom-left hard key) and select [Goto Internal JL store] or [Goto External JL store]
– done –
1: Import the file if it is not already in JL (when in FS mode)
a. Go to the folder and row where you want to place the file.
b. Long press the insert button in the footer (the large ‘+’ symbol) and from the menu select [+ Import file]
c. Navigate to and choose your file.
– done – the file is imported and inserted at the current row.
2: Proceed with encryption (see the separate introduction called Encryption + Password Vault)
a. Long press on the file or folder you want to lock and select [pwd: add locks – encrypt file/folder]
b. Enter your new password twice and click [Go]
< time to encrypt will vary >
– done – a closed padlock is now at the right of the row.
3: Export the file if you wish
a. Long press on the file’s row and select [e Export this file]
b. Choose your destination and name. Hit Save.
– done – exported.
Plays an arrangement of up to 12 tracks of your media. The tracks play concurrently.
The arrangement consists of rows in a folder, with a start row (usually designated with tag#700) and a row where the play ends (either at tag#799 or past the last play row in the folder). Or you can design your play to run continuously (with tag#798 REPLAY).
Play rows that are media rows: Media rows consist of files and/or references to files on your device, and/or text in a row’s value field (along with name tag#792).
Play rows that are not – and cannot be – associated with media: These are control or “orchestration” rows, an example being the row with the tag JL700: Play start.
There are 5 audio tracks (aud0 to aud4) and 7 video/image/text (“vi”) tracks (vi0 to vi6).
Aud0 and vi0 are background tracks. These don’t interact with other tracks.
So the working or non-zero tracks are aud1-4 and vi1-6. There must be at least one working track in the play.
Tags 700 to 799 ✱✱ are used by rows in the play. There are over 50 of these tags. They control characteristics of the play as a whole, of individual tracks, and they control the interaction of the tracks with each other. For example, if the current vi2 row contains the tag “JL763: frwd vi1 to here”, then track vi1 will be forwarded to the vi2 row if vi1 is not already at or past that row. The Play menu (i.e. the row context menu for play) lists all the play tags. It is available from the normal row context menu, as the option [Play menu: + arrangement tags]. ✱
✱ Note: When in FS mode in JL storage there are two row context menus that you will see when you long press on any row: the normal row context menu and the Play context menu.
When one of these menus opens you can switch to the other: Near the top of each menu is the selection [Play menu: + arrangement tags] or [Menu: open normal context menu] respectively.
Aud1 is the default track assigned to audio files, and vi1 is the default track assigned to video/image/text files. The default aud and vi tracks can be changed (tag#723). Media and play rows are assigned to specific (other) tracks using the 730’s tags, primarily tag JL733: “ths aud2 audio”, or “ths vi56 video/img” to assign the row to tracks vi5 and vi6, for example. You edit the track numbers as required.
How it works: From the start row (JL700:) JL Play advances each of the twelve tracks to the first row assigned to – or defaulting to – that track. If found then the row is run/played on its assigned/default track in accordance with its 700-series tags and/or its media type and/or all defaults set at that point in the play – and in accordance with any influence from other tracks at that point in time: Control of flow is discussed below. When a particular row finishes playing (for example, the video reached its end) then play advances the track to the next row assigned to that track, and so on. This process runs concurrently for all twelve tracks. The play concludes only when all tracks reach the END row (tag#799) or they all advance past the last play row in the folder.
Chorus and chorus calls: Tags 710 and 719 define the beginning and end of a chorus. Every chorus is defined by a unique label, for example “chorusA” in JL710: “chorusA” Start.
Tag#715 calls “chorusA”. The chorus is played by all working tracks, then all working tracks return together and advance from the point of the chorus call. A chorus can be called any number of times during a play.
Control of flow: Besides the chorus call, the 750’s tags make tracks wait for other tracks, the 760’s tags forward other tracks, the 770’s tags can pause or stop other tracks, the 780’s tags can resume or force other tracks to their next rows, and finally the 790’s tags control the flow for all tracks: Play can: JL795: skip forward to “label1”, or: JL796: go back to “label1”. Or the play as a whole can be replayed a set number of times or continuously (tag#798). (Frog Chorus included in the JL install plays continuously.)
Tag#794 tells Play to skip the row: This can be useful when you are building your play arrangement and you want Play to temporarily ignore a particular row: You do not want to delete the row because you may use it again later.
As mentioned above, JL799: END Play ends play when all tracks reach this row. Media or Play rows that come after the END row will not be played. This means that you can “store” unused row there.
You can insert any number of voice-overs (audio overlays) into the active play: Tap on the screen to pause play, then long press on the screen and from the menu select [+ Rec aud from you w/play muted]. Record your audio (voice) then hit “Stop recording”. The recorded audio has become a part of the play. Building a slide show is a good place to employ this voice-over capability.
– JL slide shows: Slide shows are a part of JL Play, presenting your video/image/text media one-at-a-time with audio commentary. Tag JL707 is used to set slides behaviour. The back key advances play to the next slide. Please review the separate introduction to JL slide shows.
– Seeking forward and backward in play: Swipe the screen up or down (or left or right) to seek forward or back in the play. The seek target play time is displayed at the top. There are buttons on the screen to seek by increments of audios or videos instead of by time, and buttons to change the delta for setting the seek time. Hold the screen between swipes when setting the seek target, then release the screen to allow seeking to commence. Hit the back key to cancel seek. Play is dynamic with multiple tracks interacting in time, so if you seek backward Play will often fast-forward from the beginning to recreate the state of the play at the target time. Whether it’s seeking forward or backward, the media player does so in fast time to the target seek time, then play resumes at normal speed.
– OneRow: OneRow is another part of JL Play, allowing you to view or listen to media one-row-at-a-time, in isolation from the rest of a play. To start OneRow simply click on the “>>” or the “JL792:” at the right side of the audio/video/image/text row . Hit the back key to advance to the next media row – OneRow skips over non-media rows.
– The included JLshare bundles, Frog Chorus and The JL Song, are two simple examples of play arrangements. The “JL Play demo of video image tracks.jlshare” bundle illustrates the position and order of the media player’s six vi tracks.
✱✱ Tags are bits of text placed at the start of the name and value fields.
Tags are info and instructions used by you and JL. Tags have the format “JL012:” where “012” is the 3-digit tag# (000-999).
For example, the name field might contain “JL007: 2022-05-18” followed on the next line by “Smith”. “Smith” alone is considered to be the name.
There is also a tag without a number: “+JL:” can be used by itself, or to continue a numbered tag on the next line.
(Please review the separate introduction to JL structure and navigation.)
Slide shows are a part of JL Play, with tag JL707 used to start slides behavior.
Please review the introduction to JL Play: JL’s 12-track media player.
JL slide shows are a sequential presentation of your selected media slides where you manually advance to the next slide by hitting the back key.
Slides consist of videos, images, or text such as a title stored in a file or stored in a row’s value field (with tag#792), or audio files without the “.audio” secondary extension.
You can add any number of voice-overs (audio overlays) to each slide. For example, you can explain different things at different points in a video.
Voice-overs do have the “.audio” secondary extension (for example, “overlay next (2).audio.3pg”)
Summary:
1: Add the JL700: Play start row, then a row with the slides tag.
2: Add and arrange your media slides.
3: Start play, and as the slide show progresses add your voice-overs wherever you want.
4: Start play again to test run your show with voice-overs.
5. Bundle the slide show and then export it.
1: Add the JL700: Play start row, then a row with the slides tag:
You can create a slide show anywhere in either Internal or External JL stores.
The cleanest approach is to create a new folder and put it there: Click the ‘>’ at the right of any empty row and select [Enter new empty folder]. You can rename this folder later.
(If you are not in a new folder then give yourself lots of room: Insert a bunch of empty rows by clicking the ‘+’ insert button in the footer.)
a. Long press on an empty row where you want to start and from the Play context menu select [JL700: Play start verse ij=0]. ✱
b. Insert an empty row after the above row, then long press on it and from the Play context menu select [JL707: Slides on].
– done –
✱ Note: When in FS mode in JL storage there are two row context menus that you will see when you long press on any row: the normal row context menu and the Play context menu.
When one of these menus opens you can switch to the other: Near the top of each menu is the selection [Play menu: + arrangement tags] or [Menu: open normal context menu] respectively.
2: Add and arrange your media slides:
– If you don’t already have your slides in placed then import them or copy or move them from elsewhere in JL.
a. To import go to the next line then long press the ‘+’ insert button in the footer and select [+ Import refs to files (content)] or [+ Import file].
(Import refs (references) only works with files stored on your device, not on cloud storage.)
b. If the files or file references are not in the correct order then simply cut and move them:
To move a row (file or ref) up or down click the ‘X’ cut button in the footer, then “Yes” to cut, then go to the row where you want to insert it, then long press the ‘+’ insert button and select [+ Move I-m4 Sel to here]. (The “I-m4” or “E-m4” stands for “Internal meta4 folder” or “External meta4 folder” respectively, which is where Internal and External JL store cuttings of files/folders/rows/Sel blocks are moved.)
– done – all your slides are in place and in order.
3: Start play, and as the slide show progresses add your voice-overs (audio overlays) wherever you want.
a. If the center action button in the footer does not say [Play] then long press on the action button and select [Play: start at current row].
b. Go back to the JL700: Play start row and hit the [Play] button.
c. As each slide/video/image shows tap the screen to pause play where you want to add your voice-over.
You can back up by swiping down on the screen. One swipe will give you about five seconds.
Long press on the screen and from the menu select [+ Rec aud from you w/play muted].
d. When finished hit “Stop recording”. Your voice-over is inserted in the slide show.
e. Repeat from step c. above whenever you want another voice-over. Hit the back key to advance to the next slide.
Double-tap the back key to stop play after the last slide.
All your voice-over audio files are inserted in order into your sequence of slides. They are called “overlay next (i).audio.3pg”
So the number of rows in your slide show grows proportionately.
4: Start play again from the JL700: Play start row to test run your show with voice-overs.
5. Bundle the slide show and then export it:
a. Create the bundle: Long press the ‘+’ insert button in the footer and select either [+ Shareable bundle of Sel block] or [+ Shareable bundle of all rows], as appropriate.
Select the bundle option to start play when the bundle is opened – review the introduction called Create a file bundle for export.
– The new bundle is inserted at the current row.
b. Long press on the new bundle file and from the normal context menu past-mid-way-down select [e Export this file].
– done –
In FS mode (with the gray header) you can bundle all the files in the current folder or just the files in the current Sel block.
Subfolders are not included in bundles.
Long press on the large ‘+’ insert button in the footer and select [+ Shareable bundle of all rows].
Or with your current row in a Sel block long press on the insert button in the footer and select [+ Shareable bundle of Sel block].
In the dialog for creating a bundle, if you are bundling a slide show, voice over or other media arrangement then you may want to select one of the options to Start play or OneRow when the bundle is opened.
And in the next dialog you can select wrapping paper and “unwrap audio” for the bundle. Selections in this dialog are additive.
When all options are added to your liking hit “Create bundle”.
Your new “.jlshare” bundle file will be inserted at the current row in the folder and you will be asked if you want to export it.
– done –
✱✱ Note: Bundles are not encrypted or compressed. The size of the bundle will be more than the sum-total size of all files in the bundle.
Summary:
1: Sort all rows in the current branch
OR
2: Sort a selected block of rows
3: Set your sort criteria and hit [Go]
1: Sort all rows in the current branch: Open the overflow menu and choose [Sort all rows…]
OR
2: Sort a selected block of rows
a. First select the rows: Long press on the center action button in the footer and select action “Sel2” for range selection that includes empty rows.
b. Select the range of rows (define the Sel).
c. Long press on any row in the Sel and from the menu select [Sort this Sel block]
The sort dialog will state the number of rows to be sorted…
The primary sort has defaults set. The secondary sort is optional.
3: Set your sort criteria and hit [Go]
Rows that cannot be sorted based on your criteria will be placed at the end of the sorted rows.
For example, if you specify [2nd field – value] then rows that don’t have value field text will be placed at the end.
– done –
Summary
1: Edit an existing json file
2: Create a new json branch
3: Save a json row or branch to file
Terminology: Annotated JL json files, or “.JLAnno” files, are the terms here given to files created by JL in FS mode, for example by clicking the ‘>’ at the right side of an empty row then selecting [Open new empty JL json file]. Annotated json files are JSON standard ✱ files that contain extra json to allow editing.
JL recognizes annotated “.JLAnno” files primarily because they contain an opening array whose first value is the unique string “JL{0-n}”. ✱✱
JSON files created elsewhere and imported into JL will most certainly not be annotated as defined above; they will be “.NotJL” json files.
1: Edit an existing json file
To edit any json file “as is,” as a “.NotJL” file, and without knowing where it was created: ✱✱
a. Long press on the file and select [500: open json file as a “.NotJL”]
– If you intend to edit then re-save this json file then leave the option “read with extra tags” selected.
c. Hit [Go].
– done –
– The file will be loaded into a new annotated json file with the same base name.
– You are now in json mode and the opening row in the new annotated json file is the root array or object for the .NotJL file you just opened.
You navigate, edit names and value, cut, copy and paste rows and branches (i.e. arrays and objects), etc. as is normal in json mode.
You can change or add json value types at any row or branch at any level, as is described in step 2 next…
2: Create a new json branch (in json mode)
a. Long press on any row, empty or not, then at the top of the row context menu select [550’s: set json value type flag]
If you are defining the top-level object or array then select tag JL553: or tag JL554: respectively.
b. Move into the row’s L+1 branch and proceed as per step a. If you defined this branch as an object then first select tag JL558:… name:val pair, then select one of the tags JL551-557 as you require. (JSON standard objects only contain name:val pair, and standard arrays only contain values. ✱)
c. Add names and values where appropriate.
d. If you require multiple rows of the same json type in the branch then use row/Sel copy and paste to make the duplicates.
e. Proceed to finish the json tree structure with all the levels of your json model.
– done –
Note: All tree branches are by default json arrays unless explicitly flagged as objects as per step 2 above.
3: Save a json row or branch to file
a. If you are on the row whose branch you want to save then long press on the row and select [50X: save this row’s text or L+1 br].
Otherwise if you are in the row’s L+1 branch then open the overflow menu and select [50X: save prev L- or cur br].
b. Select the option “JL500: save json to file”.
– Here you have the option of allowing nonstandard json in the output, as is described.
c. Hit [Go].
– done –
✱ JSON (JavaScript Object Notation) is formally defined at http://json.org and https://ecma-international.org/publications-and-standards/standards/ecma-404
✱✱ Note: An annotated json file can be opened as a “.NotJL”: When you select [500: open json file as a “.NotJL”] as per step 1 above, JL will recognize this file as an annotated “.JLAnno” file and ask you if you want to open it as a “.NotJL”.
Please see the introduction: Edit and Create JSON files.
There are three ways to view or edit these files:
1. For json or csv files, in file store mode click on the ‘>>’ at the right side of the file’s row.
a. If the file is an annotated json file then you will be placed directly into json mode inside the open file.
b. If the file is a “.NotJL” json file then the [500: open json file as a “.NotJL”] dialog will open. Proceed to load the file into a new or existing annotated json file.
c. Finally if the file has the .csv extension then the [501: load csv into json file] dialog will open. Set the field and record delimiters if not already correct, then hit “Go”.
The CSV data will be loaded into a new branch in a new or existing annotated json file.
2. Long press on the row and select [View this file as text (OneRow)]. The JL media player will be started in OneRow mode, which shows one media row at a time starting at the current row. The first 10000 characters of the file will be loaded into a text view, where you can scroll and select the text. You cannot edit a file in OneRow.
Hit the back key to advance to the next media row – OneRow skips over non-media rows. Double tap the back key to end OneRow viewing.
3. To view or edit the flat contents of a JSON, CSV or text file long press on the row and select [508: load cur file into value field]. When you select “Go” the first 10000 characters of the file will be placed into the value field where you can edit the text. To save the changes to the same file (i.e. to overwrite the file) select [508: save cur field text to cur file].
Summary:
1: Import a CSV file into JL (when in FS mode)
2: Load a CSV file into a JL json file
3: Save any branch as a CSV file (when inside the branch, in json mode)
4: Export a CSV file from JL (when in FS mode)
( MS Excel can export and import data in CSV format.
To export a table from Excel to a CSV file:
a. Click on “File” in the top menu bar, then “Export”, then “Change File Type”
b. Under “Other File Types” click “CSV (Comma delimited)”
c. Click the “Save As” button at bottom. )
Note the following distinction:
1: CSV files are imported/exported to/from JL when in file store (FS) mode.
2: CSV files are viewed, edited or created, and saved in json mode: An existing CSV file is loaded into a standard JL json file to be viewed or edited.
Confirm that you are in file store (FS) mode, as indicated by the gray header.
And confirm that you are in either Internal or External JL storage: the words “Internal” or “External” will be in the header.
If you are not in either Internal or External storage:
a. Open the overflow menu (at top-right corner, or on older phones the bottom-left hard key) and select [Goto Internal JL store] or [Goto External JL store]
– done –
1: Import a CSV file into JL (when in FS mode)
a. Go to the folder and row where you want to place the CSV file.
b. Long press the insert button in the footer (the large ‘+’ symbol) and from the menu select [+ Import file]
c. Navigate to and choose your CSV file.
– done – the file is imported and inserted at the current row.
2: Load a CSV file into a JL json file
a. Click on the “>>” at the right side of the imported row.
– The “501: load csv…” dialog allows you to specify the field and record delimiters used in the csv file.
The defaults, comma and CrLf respectively, should usually work for Excel-generated csv files.
b. Hit the Go button.
– You are now in json mode (with the blue header), in a standard new JL json file at root level L0, with the csv data placed in the new branch at the current row.
– Enter the branch to view or modify the data.
3: Save any branch as a CSV file (when inside the branch, in json mode)
a. Open the overflow menu and select [50X: save prev L- or cur br]
b. Select the “JL501: save csv to file” option.
c. Click “Go”
d. The “save csv” dialog options will be set to match the import options if the branch was originally imported from a csv file.
(If you do not want to overwrite the file you imported earlier, then navigate rootward to the L-1 row and update the name spec in the JL501: tag,
then return leafward to be inside the branch, then start again at step a. above.)
e. When you close the JLAnno json file you are currently editing and return to FS mode, you will find the new csv file on the row following your current row, unless you chose to overwrite an existing csv file, as discussed in step d. above.
4: Export a CSV file from JL (when in FS mode)
a. Long press on the file’s row and select [e Export this file]
b. Choose your destination and name. Hit Save.
– done – exported.
Summary:
1. JL is a stand-alone app. All of your data is stored on your device. JL does not share your data, or acquire data from third party providers.
2. One Dangerous Permission: Access to Microphone. JL never records audio in the background or when the app is paused.
3. Besides audio, no other personal or sensitive information is collected.
4. JL is committed to the Play Families policy, and fully respects your privacy regardless of the Android version of your device.
JL is a stand-alone app: JL is not web- or cloud-based; JL does not store any of your information in the cloud; JL does not share or acquire any information with or from any other apps or service providers or database servers. JL does not rely upon remote storage or communications for its operation. Via menu selection you can choose to export files from JL. (File import and export is discussed further down.) JL will work perfectly well forever without you importing or exporting a single file, on a device without any internet connection.
JL allows you to record audio into audio files. These files are inserted into your current folder where you have full management control of them, including playback, copy and delete. Starting with Android 6.0 Marshmallow released in 2015 you must explicitly grand permission for apps to use the microphone. Regardless of the Android version of your device JL never records audio in the background unbeknownst to you. All audio recording is initiated by you via "record audio …" menu selections, and at all times during recording a "stop recording" button is prominent on the screen. Recording is automatically stopped when the app is paused for any reason, such as a phone call.
Regardless of the Android version or age of your device JL conforms to the spirit of the strict privacy constraints of the latest Android versions. All versions of Android have always allocated and automatically granted each app full access to its own semi-private directories (folders): "internal" and "external" storage sandbox areas where the app is free to do its own thing without affecting other apps. But apps running on older versions of Android can literally "grant themselves" permission to fully access many other parts of a device's storage including shared directories and those created by other apps. Starting with Android 10 apps can no longer grant themselves permission to access areas of storage outside of their own internal and external sandboxes. Regardless of the Android version of your device JL limits its storage operations to these two semi-private directories (folders) granted to it by Android. These two JL storage folders are here called Internal JL store and External JL store. You can choose to import or export particular files into or out of JL storage, in which case JL gains access only to those files that you choose, as is discussed further down.
Upon your command JL will initiate phone calls, text messages and emails, and open web pages - all using your device's default providers of these four basic services. It is up to you to complete or else to cancel every particular call, text or email so initiated.
JL does not run any persistent background tasks or services or notifications of any sort. When you pause or close JL or when you get a phone call, JL will save your current file before it pauses: Except when the size of this file is estimated to be very large (several megabytes or more) or especially when the file contains large amounts of encrypted data, JL will instead start a separate temporary process (a separate thread) to encrypt the data as the case may be, and then to save the file. This separate process runs in the background for just as long as is required to reach completion - OR until you return to the app after the pause or the phone call - whichever comes first. (Especially on older devices encryption or decryption can take upwards of one second per megabyte of data.)
All the information that JL operates upon and requires for its operation resides in files stored in JL storage on your device. All of these files are fully accessible to you and manageable by you from within JL.
Import and export of files: The Android File Chooser is how you import files, import references to local files, and export files. When importing, JL is granted read permission only to those files that you explicitly select via the Chooser. For export, JL is granted write permission only to the specific destination file name that you choose. If you choose a location that resides on cloud storage then it is the cloud storage provider that executes the actual transfer (download or upload) of data to or from your device, while JL handles the local copying of the file data into or out of JL storage.
You can import references to local files such as videos when you only wish to read or view the files. This avoids the duplication of potentially large amounts of data on your device. The textual URI's for the referenced files are placed in rows inserted into your current folder in JL storage. JL retains the read access granted by you to the referenced outside files so that you can view them at any time. (Note that Android can later under certain conditions revoke these read permissions.) File references can be made a part of an arrangement of media files that you create using the JL built-in 12-track media player.