Sm.java revision 52cd1c5717b6f3761307f26d433902f2ee6406f6
17d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey/*
27d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Copyright (C) 2015 The Android Open Source Project
37d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *
47d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
57d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * you may not use this file except in compliance with the License.
67d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * You may obtain a copy of the License at
77d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *
87d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
97d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *
107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Unless required by applicable law or agreed to in writing, software
117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * See the License for the specific language governing permissions and
147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * limitations under the License.
157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey */
167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeypackage com.android.commands.sm;
187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
19b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkeyimport static android.os.storage.StorageManager.PROP_ADOPTABLE_FBE;
20b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkeyimport static android.os.storage.StorageManager.PROP_HAS_ADOPTABLE;
21b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkeyimport static android.os.storage.StorageManager.PROP_VIRTUAL_DISK;
22b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey
237e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkeyimport android.os.IBinder;
247e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkeyimport android.os.IVoldTaskListener;
257e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkeyimport android.os.PersistableBundle;
267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.RemoteException;
277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.ServiceManager;
280d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkeyimport android.os.SystemProperties;
297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.storage.DiskInfo;
302250d56a0b47b93016018340c8f4040325aa5611Sudheer Shankaimport android.os.storage.IStorageManager;
310d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkeyimport android.os.storage.StorageManager;
327d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.storage.VolumeInfo;
337d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.util.Log;
347d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
357e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkeyimport java.util.concurrent.CompletableFuture;
367e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey
377d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeypublic final class Sm {
387d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private static final String TAG = "Sm";
397d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
402250d56a0b47b93016018340c8f4040325aa5611Sudheer Shanka    IStorageManager mSm;
417d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
427d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private String[] mArgs;
437d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private int mNextArg;
447d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private String mCurArgData;
457d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
467d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public static void main(String[] args) {
477d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        boolean success = false;
487d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        try {
497d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            new Sm().run(args);
507d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            success = true;
517d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } catch (Exception e) {
527d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            if (e instanceof IllegalArgumentException) {
537d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey                showUsage();
5482bfca4609244f2b8169bd779765791d6638b448Brian Carlstrom                System.exit(1);
557d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            }
567d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            Log.e(TAG, "Error", e);
577d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            System.err.println("Error: " + e);
587d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
597d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.exit(success ? 0 : 1);
607d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
617d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
627d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void run(String[] args) throws Exception {
637d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if (args.length < 1) {
647d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new IllegalArgumentException();
657d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
667d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
672250d56a0b47b93016018340c8f4040325aa5611Sudheer Shanka        mSm = IStorageManager.Stub.asInterface(ServiceManager.getService("mount"));
687d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if (mSm == null) {
697d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new RemoteException("Failed to find running mount service");
707d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
717d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
727d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mArgs = args;
737d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        String op = args[0];
747d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mNextArg = 1;
757d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
767d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("list-disks".equals(op)) {
777d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runListDisks();
787d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("list-volumes".equals(op)) {
797d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runListVolumes();
800d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey        } else if ("has-adoptable".equals(op)) {
810d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey            runHasAdoptable();
827d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("get-primary-storage-uuid".equals(op)) {
837d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runGetPrimaryStorageUuid();
844c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey        } else if ("set-force-adoptable".equals(op)) {
854c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey            runSetForceAdoptable();
8633dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey        } else if ("set-sdcardfs".equals(op)) {
8733dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey            runSetSdcardfs();
887d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("partition".equals(op)) {
897d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runPartition();
907d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("mount".equals(op)) {
917d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runMount();
927d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("unmount".equals(op)) {
937d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runUnmount();
947d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("format".equals(op)) {
957d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runFormat();
9685ced632680642fce680d141ddd10299ff849233Jeff Sharkey        } else if ("benchmark".equals(op)) {
9785ced632680642fce680d141ddd10299ff849233Jeff Sharkey            runBenchmark();
987d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("forget".equals(op)) {
997d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runForget();
100f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey        } else if ("set-emulate-fbe".equals(op)) {
101f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey            runSetEmulateFbe();
102b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey        } else if ("get-fbe-mode".equals(op)) {
103b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey            runGetFbeMode();
10452cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian        } else if ("idle-maint".equals(op)) {
10552cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian            runIdleMaint();
10631d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey        } else if ("fstrim".equals(op)) {
10731d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey            runFstrim();
108e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey        } else if ("set-virtual-disk".equals(op)) {
109e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey            runSetVirtualDisk();
1107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
1117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new IllegalArgumentException();
1127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runListDisks() throws RemoteException {
11685ced632680642fce680d141ddd10299ff849233Jeff Sharkey        final boolean onlyAdoptable = "adoptable".equals(nextArg());
1177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final DiskInfo[] disks = mSm.getDisks();
1187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        for (DiskInfo disk : disks) {
11985ced632680642fce680d141ddd10299ff849233Jeff Sharkey            if (!onlyAdoptable || disk.isAdoptable()) {
12085ced632680642fce680d141ddd10299ff849233Jeff Sharkey                System.out.println(disk.getId());
12185ced632680642fce680d141ddd10299ff849233Jeff Sharkey            }
1227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1247d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1257d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runListVolumes() throws RemoteException {
1267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String filter = nextArg();
1277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final int filterType;
1287d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("public".equals(filter)) {
1297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = VolumeInfo.TYPE_PUBLIC;
1307d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("private".equals(filter)) {
1317d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = VolumeInfo.TYPE_PRIVATE;
1327d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("emulated".equals(filter)) {
1337d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = VolumeInfo.TYPE_EMULATED;
1347d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
1357d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = -1;
1367d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1377d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1387d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final VolumeInfo[] vols = mSm.getVolumes(0);
1397d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        for (VolumeInfo vol : vols) {
1407d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            if (filterType == -1 || filterType == vol.getType()) {
1417d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey                final String envState = VolumeInfo.getEnvironmentForState(vol.getState());
1427d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey                System.out.println(vol.getId() + " " + envState + " " + vol.getFsUuid());
1437d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            }
1447d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1457d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1467d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1470d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey    public void runHasAdoptable() {
148b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey        final boolean hasHardware = SystemProperties.getBoolean(PROP_HAS_ADOPTABLE, false)
149b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey                || SystemProperties.getBoolean(PROP_VIRTUAL_DISK, false);
150b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey        final boolean hasSoftware;
151b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey        if (StorageManager.isFileEncryptedNativeOnly()) {
152b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey            hasSoftware = SystemProperties.getBoolean(PROP_ADOPTABLE_FBE, false);
153b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey        } else {
154b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey            hasSoftware = true;
155b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey        }
156b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey        System.out.println(hasHardware && hasSoftware);
1570d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey    }
1580d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey
1590d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey    public void runGetPrimaryStorageUuid() throws RemoteException {
1607d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.out.println(mSm.getPrimaryStorageUuid());
1617d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1627d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1634c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey    public void runSetForceAdoptable() throws RemoteException {
1644c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey        final boolean forceAdoptable = Boolean.parseBoolean(nextArg());
1654c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey        mSm.setDebugFlags(forceAdoptable ? StorageManager.DEBUG_FORCE_ADOPTABLE : 0,
1664c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey                StorageManager.DEBUG_FORCE_ADOPTABLE);
1674c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey    }
16833dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey
16933dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey    public void runSetSdcardfs() throws RemoteException {
17033dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey        final int mask = StorageManager.DEBUG_SDCARDFS_FORCE_ON
17133dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                | StorageManager.DEBUG_SDCARDFS_FORCE_OFF;
17233dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey        switch (nextArg()) {
17333dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey            case "on":
17433dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                mSm.setDebugFlags(StorageManager.DEBUG_SDCARDFS_FORCE_ON, mask);
17533dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                break;
17633dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey            case "off":
17733dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                mSm.setDebugFlags(StorageManager.DEBUG_SDCARDFS_FORCE_OFF, mask);
17833dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                break;
17933dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey            case "default":
18033dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                mSm.setDebugFlags(0, mask);
18133dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey                break;
18233dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey        }
18333dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey    }
1844c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey
185f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey    public void runSetEmulateFbe() throws RemoteException {
186f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey        final boolean emulateFbe = Boolean.parseBoolean(nextArg());
187f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey        mSm.setDebugFlags(emulateFbe ? StorageManager.DEBUG_EMULATE_FBE : 0,
188f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey                StorageManager.DEBUG_EMULATE_FBE);
189f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey    }
190f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey
191b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey    public void runGetFbeMode() {
192b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey        if (StorageManager.isFileEncryptedNativeOnly()) {
193b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey            System.out.println("native");
194b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey        } else if (StorageManager.isFileEncryptedEmulatedOnly()) {
195b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey            System.out.println("emulated");
196b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey        } else {
197b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey            System.out.println("none");
198b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey        }
199b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey    }
200b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey
2017d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runPartition() throws RemoteException {
2027d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String diskId = nextArg();
2037d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String type = nextArg();
2047d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("public".equals(type)) {
2057d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.partitionPublic(diskId);
2067d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("private".equals(type)) {
2077d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.partitionPrivate(diskId);
2087d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("mixed".equals(type)) {
2097d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            final int ratio = Integer.parseInt(nextArg());
2107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.partitionMixed(diskId, ratio);
2117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
2127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new IllegalArgumentException("Unsupported partition type " + type);
2137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
2147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
2157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
2167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runMount() throws RemoteException {
2177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String volId = nextArg();
2187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm.mount(volId);
2197d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
2207d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
2217d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runUnmount() throws RemoteException {
2227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String volId = nextArg();
2237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm.unmount(volId);
2247d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
2257d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
2267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runFormat() throws RemoteException {
2277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String volId = nextArg();
2287d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm.format(volId);
2297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
2307d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
2317e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey    public void runBenchmark() throws Exception {
23285ced632680642fce680d141ddd10299ff849233Jeff Sharkey        final String volId = nextArg();
2337e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey        final CompletableFuture<PersistableBundle> result = new CompletableFuture<>();
2347e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey        mSm.benchmark(volId, new IVoldTaskListener.Stub() {
2357e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            @Override
2367e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            public void onStatus(int status, PersistableBundle extras) {
2377e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey                // Ignored
2387e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            }
2397e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey
2407e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            @Override
2417e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            public void onFinished(int status, PersistableBundle extras) {
2427e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey                // Touch to unparcel
2437e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey                extras.size();
2447e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey                result.complete(extras);
2457e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            }
2467e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey        });
2477e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey        System.out.println(result.get());
24885ced632680642fce680d141ddd10299ff849233Jeff Sharkey    }
24985ced632680642fce680d141ddd10299ff849233Jeff Sharkey
25031d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey    public void runForget() throws RemoteException {
2517d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String fsUuid = nextArg();
2527d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("all".equals(fsUuid)) {
2537d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.forgetAllVolumes();
2547d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
2557d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.forgetVolume(fsUuid);
2567d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
2577d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
2587d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
2597e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey    public void runFstrim() throws Exception {
2607e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey        final CompletableFuture<PersistableBundle> result = new CompletableFuture<>();
2617e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey        mSm.fstrim(0, new IVoldTaskListener.Stub() {
2627e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            @Override
2637e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            public void onStatus(int status, PersistableBundle extras) {
2647e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey                // Ignored
2657e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            }
2667e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey
2677e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            @Override
2687e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            public void onFinished(int status, PersistableBundle extras) {
2697e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey                // Touch to unparcel
2707e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey                extras.size();
2717e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey                result.complete(extras);
2727e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey            }
2737e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey        });
2747e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey        System.out.println(result.get());
27531d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey    }
27631d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey
277e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey    public void runSetVirtualDisk() throws RemoteException {
278e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey        final boolean virtualDisk = Boolean.parseBoolean(nextArg());
279e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey        mSm.setDebugFlags(virtualDisk ? StorageManager.DEBUG_VIRTUAL_DISK : 0,
280e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey                StorageManager.DEBUG_VIRTUAL_DISK);
281e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey    }
282e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey
28352cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian    public void runIdleMaint() throws RemoteException {
28452cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian        final boolean im_run = "run".equals(nextArg());
28552cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian        if (im_run) {
28652cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian            mSm.runIdleMaintenance();
28752cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian        } else {
28852cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian            mSm.abortIdleMaintenance();
28952cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian        }
29052cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian    }
29152cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian
2927d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private String nextArg() {
2937d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if (mNextArg >= mArgs.length) {
2947d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            return null;
2957d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
2967d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        String arg = mArgs[mNextArg];
2977d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mNextArg++;
2987d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        return arg;
2997d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
3007d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
3017d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private static int showUsage() {
30285ced632680642fce680d141ddd10299ff849233Jeff Sharkey        System.err.println("usage: sm list-disks [adoptable]");
3037d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm list-volumes [public|private|emulated|all]");
3040d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey        System.err.println("       sm has-adoptable");
3057d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm get-primary-storage-uuid");
3064c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey        System.err.println("       sm set-force-adoptable [true|false]");
307e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey        System.err.println("       sm set-virtual-disk [true|false]");
3087d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("");
3097d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm partition DISK [public|private|mixed] [ratio]");
3107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm mount VOLUME");
3117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm unmount VOLUME");
3127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm format VOLUME");
31385ced632680642fce680d141ddd10299ff849233Jeff Sharkey        System.err.println("       sm benchmark VOLUME");
31452cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian        System.err.println("       sm idle-maint [run|abort]");
31531d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey        System.err.println("       sm fstrim");
3167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("");
3177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm forget [UUID|all]");
3187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("");
319f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey        System.err.println("       sm set-emulate-fbe [true|false]");
320f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey        System.err.println("");
3217d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        return 1;
3227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
3237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey}
324