35 Commits
v1.2.0 ... dev

Author SHA1 Message Date
oxmc
bf44cf9432 Update AssetsDownloader.cs 2023-01-14 14:46:58 -08:00
oxmc
d7e4e679f7 Update AssetsDownloader.cs 2023-01-14 14:35:12 -08:00
oxmc
f4debfca32 Update AssetsDownloader.cs 2023-01-13 17:11:13 -08:00
oxmc
b270433188 Update AssetsDownloader.cs 2023-01-13 16:53:01 -08:00
oxmc
ef98228aab Delete installapk.cs 2023-01-13 12:14:20 -08:00
oxmc
7135691a01 Update installapk.cs 2023-01-13 12:13:46 -08:00
oxmc
7c50d183f3 Update AndroidManifest.xml 2023-01-13 11:40:42 -08:00
oxmc
72b3f4212c Create installapk.cs 2023-01-13 11:35:49 -08:00
oxmc
6c3d5543b3 Update ProjectSettings.asset 2022-12-31 18:59:30 -08:00
oxmc
07b3b9ec40 Update build.yml 2022-12-31 05:00:54 -08:00
oxmc
59caa0e6dc Update build.yml 2022-12-31 04:42:48 -08:00
oxmc
0429d18c1d Update AssetsDownloader.cs 2022-12-31 04:28:32 -08:00
oxmc
0027452b92 Update AssetsDownloader.cs 2022-12-31 04:18:30 -08:00
oxmc
62c3569aef Update ProjectSettings.asset 2022-12-31 04:07:38 -08:00
oxmc
82421eb690 Update AssetsDownloader.cs 2022-12-31 04:04:21 -08:00
oxmc
64c243fb2a Update AssetsDownloader.cs 2022-12-31 03:56:01 -08:00
oxmc
14e44e456a Update AssetsDownloader.cs 2022-12-31 03:48:37 -08:00
oxmc
bd39092926 Update AssetsDownloader.cs 2022-12-31 03:38:33 -08:00
oxmc
83b9844fa7 Update AssetsDownloader.cs 2022-12-31 03:32:55 -08:00
oxmc
95c1f824ca Update AssetsDownloader.cs 2022-12-31 03:23:50 -08:00
oxmc
24632b9342 Update AssetsDownloader.cs 2022-12-31 02:30:29 -08:00
oxmc
d172c2446b Update AssetsDownloader.cs 2022-12-31 02:19:55 -08:00
oxmc
4563d42668 Update AssetsDownloader.cs 2022-12-31 02:04:24 -08:00
oxmc
9076e52a30 Update build.yml 2022-12-31 01:51:41 -08:00
oxmc
667d69ff79 Update build.yml 2022-12-31 01:42:22 -08:00
oxmc
833701faeb Update build.yml 2022-12-31 01:38:14 -08:00
oxmc
97aa3b9fdb Update build.yml 2022-12-31 01:37:56 -08:00
oxmc
4a1d666855 Update build.yml 2022-12-31 01:31:55 -08:00
oxmc
a2c0ec0747 Update build.yml 2022-12-31 01:27:03 -08:00
oxmc
72b499d08d Update build.yml 2022-12-31 01:26:40 -08:00
oxmc
6cb04f2574 Update README.md 2022-12-31 01:24:35 -08:00
oxmc
2d5d73c90a Update QuestAppLauncher.unity 2022-12-29 09:25:39 -08:00
oxmc
d4bc25c8cd Update Config.cs 2022-12-29 09:19:22 -08:00
oxmc
a8b4bcd17c Add files via upload 2022-12-29 09:17:11 -08:00
a9247df300 Test 1 2022-12-29 07:51:19 -08:00
9 changed files with 97 additions and 189 deletions

View File

@@ -2,9 +2,9 @@ name: Build
on:
push:
branches: [ "master" ]
branches: [ "dev" ]
pull_request:
branches: [ "master" ]
branches: [ "dev" ]
workflow_dispatch: {}
jobs:
@@ -33,6 +33,7 @@ jobs:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
if: ${{ github.ref_name == 'master' }}
# Build
- name: Build project
@@ -44,11 +45,20 @@ jobs:
with:
targetPlatform: Android
allowDirtyBuild: true
buildName: "HooverHighQuestAppLauncher-DEV"
# Output
- name: Upload build
uses: softprops/action-gh-release@v1
with:
files: build/Android/*.apk
token: ${{ secrets.GITHUB_TOKEN }}
tag_name: "1.0.0-dev"
# Upload dir
- uses: actions/upload-artifact@v2
with:
name: Build
name: Build-dev
path: build
# Return License

View File

@@ -10,6 +10,7 @@
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-feature android:name="android.hardware.vr.headtracking" android:required="false" android:version="1" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
</manifest>
</manifest>

View File

@@ -20857,7 +20857,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &2124784240
RectTransform:
m_ObjectHideFlags: 0
@@ -20934,7 +20934,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 883330328}
m_MethodName: OpenSettings
m_MethodName: ""
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
@@ -14,6 +14,55 @@ using Newtonsoft.Json.Linq;
namespace QuestAppLauncher
{
public class InstallAPK
{
private bool installApp(string apkPath)
{
bool success = true;
//GameObject.Find("TextDebug").GetComponent<Text>().text = "Installing App";
try
{
//Get Activity then Context
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject unityContext = currentActivity.Call<AndroidJavaObject>("getApplicationContext");
//Get the package Name
string packageName = unityContext.Call<string>("getPackageName");
string authority = packageName + ".fileprovider";
AndroidJavaClass intentObj = new AndroidJavaClass("android.content.Intent");
string ACTION_VIEW = intentObj.GetStatic<string>("ACTION_VIEW");
AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", ACTION_VIEW);
int FLAG_ACTIVITY_NEW_TASK = intentObj.GetStatic<int>("FLAG_ACTIVITY_NEW_TASK");
int FLAG_GRANT_READ_URI_PERMISSION = intentObj.GetStatic<int>("FLAG_GRANT_READ_URI_PERMISSION");
//File fileObj = new File(String pathname);
AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", apkPath);
//FileProvider object that will be used to call it static function
AndroidJavaClass fileProvider = new AndroidJavaClass("android.support.v4.content.FileProvider");
//getUriForFile(Context context, String authority, File file)
AndroidJavaObject uri = fileProvider.CallStatic<AndroidJavaObject>("getUriForFile", unityContext, authority, fileObj);
intent.Call<AndroidJavaObject>("setDataAndType", uri, "application/vnd.android.package-archive");
intent.Call<AndroidJavaObject>("addFlags", FLAG_ACTIVITY_NEW_TASK);
intent.Call<AndroidJavaObject>("addFlags", FLAG_GRANT_READ_URI_PERMISSION);
currentActivity.Call("startActivity", intent);
//GameObject.Find("TextDebug").GetComponent<Text>().text = "Success";
}
catch (System.Exception e)
{
//GameObject.Find("TextDebug").GetComponent<Text>().text = "Error: " + e.Message;
success = false;
}
return success;
}
}
/// <summary>
/// Downloads assets (app icons packs and names files) from configured repos.
/// </summary>
@@ -29,7 +78,12 @@ namespace QuestAppLauncher
const string TempDownloadFileExtention = ".tmp_download";
// GitHub API url
const string GithubApiUrl = @"http://api.github.com/repos/";
const string GithubApiUrl = @"http://api.github.com/";
// If Github account is a org set this to true
public bool isorg = true;
public string GithubUrl = "";
// Rate limit in minutes
const int RateLimitInMins = 5;
@@ -187,9 +241,9 @@ namespace QuestAppLauncher
var configRepos = new HashSet<string>();
foreach (var item in config.downloadRepos)
{
if (null == item.type || !string.Equals(item.type, Config.DownloadRepo_Type_GitHub, StringComparison.OrdinalIgnoreCase))
if (null == item.type || !string.Equals(item.type, Config.DownloadRepo_Type_GitHub, StringComparison.OrdinalIgnoreCase) || !string.Equals(item.type, Config.DownloadRepo_Type_PrivUrl, StringComparison.OrdinalIgnoreCase))
{
// For now, we only support GitHub repos
// For now, we only support GitHub repos, or our private update url
continue;
}
@@ -294,7 +348,12 @@ namespace QuestAppLauncher
private async Task<bool> GetAssetsInfoFromGithubRepoAsync(string repoUri,
Dictionary<string, AssetInfo> assetsInfo, IDownloadProgress downloadProgress = null)
{
var requestUrl = GithubApiUrl + repoUri;
if (isorg == true) {
GithubUrl = GithubApiUrl + "orgs/";
} else {
GithubUrl = GithubApiUrl;
}
var requestUrl = GithubUrl + repoUri;
Debug.LogFormat("Reading assets from {0}", requestUrl);
try

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
@@ -26,10 +26,11 @@ namespace QuestAppLauncher
// Download repos
public const string DownloadRepo_Type_GitHub = "github";
public const string DownloadRepo_Type_PrivUrl = "hhsupserver";
public const string DownloadRepo_Default = @"hooverhigh/QuestAppLauncher_Assets/releases/latest";
// Background
public const string Background_Default = "default";
public const string Background_Default = "background.jpg";
/// <summary>
/// Grid size
@@ -37,8 +38,8 @@ namespace QuestAppLauncher
[Serializable]
public class GridSize
{
public int rows = 3;
public int cols = 3;
public int rows = 4;
public int cols = 4;
}
/// <summary>
@@ -61,7 +62,7 @@ namespace QuestAppLauncher
public bool show2D = true;
// Auto Category: Apps are automatically categorized into 3 tabs - Quest, Go/GearVr, 2D
public string autoCategory = Category_Top;
public string autoCategory = Category_Off;
// Custom Category: Apps are categorized according to appnames.txt file
public string customCategory = Category_Right;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

View File

@@ -12,8 +12,8 @@ PlayerSettings:
targetDevice: 2
useOnDemandResources: 0
accelerometerFrequency: 60
companyName: AAA
productName: .Quest App Launcher
companyName: hooverhigh
productName: Quest App Launcher
defaultCursor: {fileID: 0}
cursorHotspot: {x: 0, y: 0}
m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}
@@ -165,8 +165,8 @@ PlayerSettings:
androidSupportedAspectRatio: 1
androidMaxAspectRatio: 2.1
applicationIdentifier:
Android: aaa.QuestAppLauncher.App
Standalone: com.DefaultCompany.QuestAppLauncher
Android: HooverHigh.QuestAppLauncher
Standalone: com.HooverHigh.QuestAppLauncher
buildNumber: {}
AndroidBundleVersionCode: 1
AndroidMinSdkVersion: 25

175
README.md
View File

@@ -1,174 +1,8 @@
# Quest App Launcher
[Latest download](https://sidequestvr.com/#/app/199) | [Patreon](https://www.patreon.com/questapplauncher) | [PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=FYFMN7N3PTCJE&currency_code=USD&source=url)
An app launcher for Oculus Quest implemented in Unity.
[![Build](https://github.com/HooverHigh/QuestAppLauncher/actions/workflows/build.yml/badge.svg?branch=dev)](https://github.com/HooverHigh/QuestAppLauncher/actions/workflows/build.yml)
## Features
* Supports launching both 3D and 2D apps
* Auto-categorizes apps as Quest, Go / GearVR or 2D
* Support for custom categorization
* Support for custom app icons and names (by default, uses app name and icon from the app's apk)
* Support for resizable grid
* Support for downloading app icons and names, including auto-updating
* Support for sorting alphabetically or by most recently used
* Support for renaming apps
* Support for custom 360/cubemap 3D backgrounds
* Supports hand tracking
## Settings
There are various options available in Settings. These are:
* Automatic Tabs: By default, the launcher will display automatic tabs (Quest, Go/GrearVr and 2D). This setting allows you to specify the position of these tabs (left, top, right or off).
* Custom Tabs: Custom tabs allow for arbitrary categorization (like genre etc). See below for how to configure these. This setting, like the above, allows you to specify the position of these tabs (left, top, right or off).
* Sort By: Whether to sort alphabetically or most recent.
* Show 2D: Whether to show 2D apps.
* Grid Size: How many columns & rows to display.
* Background: Pick a custom 3D background (see below).
* Auto Update & Update Now: Whether to auto-update app icons & names and whether to update these now -- see above.
* Reset Hidden Apps: This setting un-hides any hidden apps. See below regarding hiding apps.
* Reset Renamed Apps: This setting changes app names back to their default. See below regarding renaming apps.
## Other Features
### Auto-update / Downloading app icons and names
By default, the launcher uses the built-in app name and icon (from the installed apps). Oculus Store apps, however, sometimes do not contain correct names or icons. To address this, download these assets by going to Settings and choosing "Update Now". If "Auto-Update" is enabled, this will automatically download new app names and icons as they become available.
Note: Auto-update is enabled by default.
Note: Default repository for app icons and names is [https://github.com/tverona1/QuestAppLauncher_assets]. This can be configured in config.json (see below).
### Custom 3D Backgrounds
Custom 3D background images are supported. Both equirectangular (360 degree) and cubemap (6-side) images are supported. This is automatically detected based on aspect ratio (with cubemap having a 6:1 aspect ratio).
To set up custom 3D backgrounds:
1. Copy your background images (either jpg or png) to the following location on your Quest: **Android/data/aaa.QuestAppLauncher.App/files/backgrounds**
2. In "Settings", select the custom background.
#### Equirectangular (360 degree) images
For equirectangular (360 degree) images, here's a good source for free images: http://photopin.com/free-photos/equirectangular
#### Cubemap (6-sided) images
For cubemap (6-sides) images, it must be a single image that represents the 6-sided cube with the following horizontal layout:
[ +x ] [ -x ] [ +y ] [ -y ] [ +z ] [ -z ]
Here's a good source for free cubemap images: http://humus.name/index.php?page=Textures
To set up the cubemap image, download an image (zip) file from the above site and extract the 6 individual images. Then use ImageMagick (https://imagemagick.org) to stitch together the six images into a single image with the following command:
```
magick montage posx.jpg negx.jpg posy.jpg negy.jpg posz.jpg negz.jpg -tile 6x1 -geometry "1x1+0+0<" -background none out.jpg
```
### Hiding Apps
If there is an app that you would like to hide, highlight the app and press either the B or Y button on your controller. You can reset any hidden apps in Settings.
### Renaming Apps
To rename an app (i.e. to pick a different app name / icon for it), highlight the app and press either A or X on the controller. This will show a list of apps from you can choose an alternate app name / icon. You can reset these changes back to default in Settings.
Note: It is recommended that you download the app names / icon packs first (see above) in order to populate a full list of app to choose from.
## Manually configuring the launcher (for advanced users only)
The below sections described ways to manually configure the launcher. This is intended for advanced users only and is typically not necessary, as everything is supported via the Settings UI within the app.
### Manually overriding app icons and names
It is possible to manually configure app icons and names rather than automatically downloading them. This section describes how.
#### Override app names
Create a file called **appnames.json**. Add an entry with package-id as key and the desired name. Example:
```
"com.company.myapp":{"name": "My Application"}
"com.othercompany.myapp":{"name": "Other Application"}
```
Copy this file (appnames.json) to the following location on your Quest: **Android/data/aaa.QuestAppLauncher.App/files**
Note: Multiple appnames*.json files are supported. If multiple files are present, they are applied in sorted order of the filenames. This allows for a single "master" appnames.json file and then additional files to override it (like appnames_custom.json).
Note: Text format is also supported. See below.
#### Appnames.json syntax
This section describes the syntax for appnames.json. The syntax for these entries are as follows:
"com.mycompany.myapp":{"name": "My Application"}
#### Custom Categories (Tabs)
The launcher supports custom categories (tabs). This can be specified in the **appnames.json** file by adding up to two custom categories per entry. The syntax is:
"com.mycompany.myapp":{"name": "My Application", "category": "Action", "category2" : "Puzzle"}
The above example will categorize the two entries below in Action and Puzzle tabs:
#### Appnames.txt syntax
Alternatively, txt format is also supported for appnames instead of json. The syntax is:
packageName,appName[,category1[, category2]]
Comments can be added to appnames.txt by prepending "#".
#### Override app icons
Create an iconpack.zip file that contains a jpg file per app with the package-id as the filename. Example:
com.mycompany.myapp.jpg
com.thirdcompany.yetanotherapp.jpg
Copy the iconpack.zip to the following location on your Quest: **Android/data/aaa.QuestAppLauncher.App/files**
Note: Multiple iconpack*.zip files are supported. If multiple files are present, they are applied in sorted order of the filenames. This allows for a single "master" iconpack.zip file and then additional files to override it (like iconpack_custom.zip).
Note: Individual jpg files are also supported at the /Android/data/aaa.QuestAppLauncher.app/files path. These override any corresponding jpgs in iconpack*.zip files.
### config.json: Configuration file
The launcher can be customized by creating a **config.json** file and copying it to the following location on your Quest: Android/data/aaa.QuestAppLauncher.App/files. Note: These configuration options are accessible via the Settings UI, so typically you would not need to manually configure this file.
#### Format of config.json
Here's an example config.json:
```
{
"gridSize": {
"rows": 3,
"cols": 4
},
"sortMode": "mostRecent",
"show2D": true,
"autoCategory": "top",
"customCategory": "right"
"autoUpdate": true,
"background": "backgrounds/my_background_360.jpg",
"downloadRepos": [
{
"repoUri": "tverona1/QuestAppLauncher_Assets/releases/latest",
"type": "github"
}
]
}
```
#### gridSize: Setting Grid Size
The default grid size is 3x3 cells. The grid size can be customized by specifying grid rows and columns as in the following example:
```
{
"gridSize": {
"rows": 2,
"cols": 4
}
}
```
#### sortMode: Sorting order
Whether to sort apps alphabetically or by most recently used. Key is "sortMode" and valid values are "az" (default) or "mostRecent".
#### show2D: Showing / Hiding 2D apps
To show or hide 2D apps, set the "show2D" field to true (default) or false.
#### autoCategory and customCategory
By default, the launcher will display automatic tabs (Quest, Go/GrearVr and 2D) and any custom tabs specified in appnames.txt file. These can be overridden with two fields - "autoCategory" and "customCategory". Both fields support the following values:
"off": No not display the categories
"top": Display categories on top
"left": Display categories on left-side
"right": Display categories on right-side
#### autoUpdate and downloadRepos
To enable automatic updating of new app icons and names, set autoUpdate to true. downloadRepos lists the repos from which to download. FOr now, we only support github repos.
#### background
The "background" field specifies a relative path to use as a custom 3D background. See earlier section on custom backgrounds.
An app launcher for hoover high Oculus Quests, implemented in Unity.
## Source structure:
- Assets/Scenes/QuestAppLauncher.unity: The main scene
@@ -176,6 +10,9 @@ The "background" field specifies a relative path to use as a custom 3D backgroun
- Assets/Scripts: Main set of C# scripts for grid population, scroll handling etc.
## Credits
Thank you to tverona1 [https://github.com/tverona1] for creating this,
A huge thank you to fecheva [https://github.com/fecheva] for creating / maintaining the app names & icon packs!
Also thank you to noxx for creating the app's icon!
Also thank you to noxx for creating the app's original icon!