174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar/* 274db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * Copyright (C) 2017 The Android Open Source Project 374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * 474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * Licensed under the Apache License, Version 2.0 (the "License"); 574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * you may not use this file except in compliance with the License. 674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * You may obtain a copy of the License at 774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * 874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * http://www.apache.org/licenses/LICENSE-2.0 974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * 1074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * Unless required by applicable law or agreed to in writing, software 1174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * distributed under the License is distributed on an "AS IS" BASIS, 1274db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * See the License for the specific language governing permissions and 1474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * limitations under the License. 1574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar */ 1674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 1774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankarpackage com.android.commands.vr; 1874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 192b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankarimport android.app.Vr2dDisplayProperties; 2074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankarimport android.content.Context; 2174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankarimport android.os.RemoteException; 2274db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankarimport android.os.ServiceManager; 2374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 2474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankarimport android.service.vr.IVrManager; 2574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankarimport com.android.internal.os.BaseCommand; 2674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 2774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankarimport java.io.PrintStream; 2874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 2974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankarpublic final class Vr extends BaseCommand { 3074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 3174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar /** 3274db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * Command-line entry point. 3374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * 3474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar * @param args The command-line arguments 3574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar */ 3674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar public static void main(String[] args) { 3774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar (new Vr()).run(args); 3874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar } 3974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 4033f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar private static final String COMMAND_SET_PERSISTENT_VR_MODE_ENABLED = 4133f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar "set-persistent-vr-mode-enabled"; 422b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar private static final String COMMAND_SET_VR2D_DISPLAY_PROPERTIES = 4333f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar "set-display-props"; 44627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon private static final String COMMAND_ENABLE_VD = "enable-virtual-display"; 4574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 4674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar private IVrManager mVrService; 4774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 4874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar @Override 4974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar public void onShowUsage(PrintStream out) { 5074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar out.println( 5174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar "usage: vr [subcommand]\n" + 5233f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar "usage: vr set-persistent-vr-mode-enabled [true|false]\n" + 53627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon "usage: vr set-display-props [width] [height] [dpi]\n" + 54627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon "usage: vr enable-virtual-display [true|false]\n" 5574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar ); 5674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar } 5774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 5874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar @Override 5974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar public void onRun() throws Exception { 6074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar mVrService = IVrManager.Stub.asInterface(ServiceManager.getService(Context.VR_SERVICE)); 6174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar if (mVrService == null) { 6274db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar showError("Error: Could not access the Vr Manager. Is the system running?"); 6374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar return; 6474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar } 6574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 6674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar String command = nextArgRequired(); 6774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar switch (command) { 682b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar case COMMAND_SET_VR2D_DISPLAY_PROPERTIES: 692b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar runSetVr2dDisplayProperties(); 7033f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar break; 7174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar case COMMAND_SET_PERSISTENT_VR_MODE_ENABLED: 7274db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar runSetPersistentVrModeEnabled(); 7374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar break; 74627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon case COMMAND_ENABLE_VD: 75627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon runEnableVd(); 76627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon break; 7774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar default: 7874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar throw new IllegalArgumentException ("unknown command '" + command + "'"); 7974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar } 8074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar } 8174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar 822b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar private void runSetVr2dDisplayProperties() throws RemoteException { 8333f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar String widthStr = nextArgRequired(); 8433f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar int width = Integer.parseInt(widthStr); 8533f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar 8633f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar String heightStr = nextArgRequired(); 8733f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar int height = Integer.parseInt(heightStr); 8833f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar 8933f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar String dpiStr = nextArgRequired(); 9033f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar int dpi = Integer.parseInt(dpiStr); 9133f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar 922b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar Vr2dDisplayProperties vr2dDisplayProperties = 932b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar new Vr2dDisplayProperties(width, height, dpi); 9433f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar 9533f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar try { 962b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar mVrService.setVr2dDisplayProperties(vr2dDisplayProperties); 9733f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar } catch (RemoteException re) { 9833f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar System.err.println("Error: Can't set persistent mode " + re); 9933f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar } 10033f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar } 10133f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar 102627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon private void runEnableVd() throws RemoteException { 103627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon Vr2dDisplayProperties.Builder builder = new Vr2dDisplayProperties.Builder(); 104627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon 105627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon String value = nextArgRequired(); 106627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon if ("true".equals(value)) { 107627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon builder.setEnabled(true); 108627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon } else if ("false".equals(value)) { 109627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon builder.setEnabled(false); 110627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon } // Don't do anything if not exactly true/false 111627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon 112627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon try { 113627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon mVrService.setVr2dDisplayProperties(builder.build()); 114627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon } catch (RemoteException re) { 115627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon System.err.println("Error: Can't enable (" + value +") virtual display" + re); 116627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon } 117627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon } 118627a68f8525d3d0125f23f83e88bb9682da7b0a4Santos Cordon 11974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar private void runSetPersistentVrModeEnabled() throws RemoteException { 12074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar String enableStr = nextArg(); 12174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar boolean enabled = Boolean.parseBoolean(enableStr); 12274db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar try { 12374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar mVrService.setPersistentVrModeEnabled(enabled); 12474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar } catch (RemoteException re) { 12574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar System.err.println("Error: Can't set persistent mode " + re); 12674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar } 12774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar } 12874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar} 129