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";
4474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar
4574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar    private IVrManager mVrService;
4674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar
4774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar    @Override
4874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar    public void onShowUsage(PrintStream out) {
4974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        out.println(
5074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar                "usage: vr [subcommand]\n" +
5133f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar                "usage: vr set-persistent-vr-mode-enabled [true|false]\n" +
5233f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar                "usage: vr set-display-props [width] [height] [dpi]\n"
5374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar                );
5474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar    }
5574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar
5674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar    @Override
5774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar    public void onRun() throws Exception {
5874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        mVrService = IVrManager.Stub.asInterface(ServiceManager.getService(Context.VR_SERVICE));
5974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        if (mVrService == null) {
6074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar            showError("Error: Could not access the Vr Manager. Is the system running?");
6174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar            return;
6274db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        }
6374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar
6474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        String command = nextArgRequired();
6574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        switch (command) {
662b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar            case COMMAND_SET_VR2D_DISPLAY_PROPERTIES:
672b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar                runSetVr2dDisplayProperties();
6833f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar                break;
6974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar            case COMMAND_SET_PERSISTENT_VR_MODE_ENABLED:
7074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar                runSetPersistentVrModeEnabled();
7174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar                break;
7274db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar            default:
7374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar                throw new IllegalArgumentException ("unknown command '" + command + "'");
7474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        }
7574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar    }
7674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar
772b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar    private void runSetVr2dDisplayProperties() throws RemoteException {
7833f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar        String widthStr = nextArgRequired();
7933f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar        int width = Integer.parseInt(widthStr);
8033f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar
8133f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar        String heightStr = nextArgRequired();
8233f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar        int height = Integer.parseInt(heightStr);
8333f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar
8433f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar        String dpiStr = nextArgRequired();
8533f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar        int dpi = Integer.parseInt(dpiStr);
8633f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar
872b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar        Vr2dDisplayProperties vr2dDisplayProperties =
882b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar                new Vr2dDisplayProperties(width, height, dpi);
8933f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar
9033f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar        try {
912b9aaedf6310694de31301659ce604ff195b32eeKarthik Ravi Shankar            mVrService.setVr2dDisplayProperties(vr2dDisplayProperties);
9233f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar        } catch (RemoteException re) {
9333f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar            System.err.println("Error: Can't set persistent mode " + re);
9433f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar        }
9533f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar    }
9633f70c16eb99534ffd9338f7bf03f23d19fe6611Karthik Ravi Shankar
9774db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar    private void runSetPersistentVrModeEnabled() throws RemoteException {
9874db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        String enableStr = nextArg();
9974db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        boolean enabled = Boolean.parseBoolean(enableStr);
10074db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        try {
10174db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar            mVrService.setPersistentVrModeEnabled(enabled);
10274db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        } catch (RemoteException re) {
10374db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar            System.err.println("Error: Can't set persistent mode " + re);
10474db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar        }
10574db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar    }
10674db2a3667e69138e2af8ea4ff053a43cc262aa8Karthik Ravi Shankar}
107