Home | History | Annotate | Download | only in hierarchyviewer
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.hierarchyviewer;
     18 
     19 import com.android.ddmlib.IDevice;
     20 import com.android.hierarchyviewer.device.Window;
     21 import com.android.hierarchyviewer.scene.CaptureLoader;
     22 import com.android.hierarchyviewer.ui.Workspace;
     23 import com.android.hierarchyviewer.device.DeviceBridge;
     24 
     25 import javax.swing.SwingUtilities;
     26 import javax.swing.UIManager;
     27 import javax.swing.UnsupportedLookAndFeelException;
     28 import java.io.File;
     29 
     30 public class HierarchyViewer {
     31     private static final CharSequence OS_WINDOWS = "Windows";
     32     private static final CharSequence OS_MACOSX = "Mac OS X";
     33 
     34     private static boolean sProfilingEnabled = true;
     35 
     36     public static boolean isProfilingEnabled() {
     37         return sProfilingEnabled;
     38     }
     39 
     40     private static void initUserInterface() {
     41         System.setProperty("apple.laf.useScreenMenuBar", "true");
     42         System.setProperty("apple.awt.brushMetalLook", "true");
     43         System.setProperty("com.apple.mrj.application.apple.menu.about.name", "HierarchyViewer");
     44 
     45         final String os = System.getProperty("os.name");
     46 
     47         try {
     48             if (os.contains(OS_WINDOWS) || os.contains(OS_MACOSX)) {
     49                 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
     50             } else {
     51                 UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
     52             }
     53         } catch (ClassNotFoundException e) {
     54             e.printStackTrace();
     55         } catch (InstantiationException e) {
     56             e.printStackTrace();
     57         } catch (IllegalAccessException e) {
     58             e.printStackTrace();
     59         } catch (UnsupportedLookAndFeelException e) {
     60             e.printStackTrace();
     61         }
     62     }
     63 
     64     private static void listDevices() {
     65         System.out.println("List of devices attached");
     66         try {
     67             Thread.sleep(500);
     68         } catch (InterruptedException e) {
     69             e.printStackTrace();
     70         }
     71         for (IDevice device : DeviceBridge.getDevices()) {
     72             printDevice(device);
     73         }
     74         DeviceBridge.terminate();
     75     }
     76 
     77     private static void printDevice(IDevice device) {
     78         System.out.println(device.toString() + "\t\t" +
     79                 (device.isEmulator() ? "emulator" : "device"));
     80     }
     81 
     82     private static void outputPsd(String deviceName, String file) {
     83         IDevice device = selectDevice(deviceName);
     84         if (device != null) {
     85             if (DeviceBridge.isViewServerRunning(device)) {
     86                 DeviceBridge.stopViewServer(device);
     87             }
     88             DeviceBridge.startViewServer(device);
     89             DeviceBridge.setupDeviceForward(device);
     90             System.out.println("Capturing layers to " + file);
     91             CaptureLoader.saveLayers(device, Window.FOCUSED_WINDOW, new File(file));
     92         } else {
     93             System.out.println("The selected device does not exist");
     94         }
     95         DeviceBridge.terminate();
     96     }
     97 
     98     private static IDevice selectDevice(String deviceName) {
     99         try {
    100             Thread.sleep(500);
    101         } catch (InterruptedException e) {
    102             e.printStackTrace();
    103         }
    104         if (DeviceBridge.getDevices() == null) return null;
    105         if (deviceName == null) return DeviceBridge.getDevices()[0];
    106         for (IDevice device : DeviceBridge.getDevices()) {
    107             if (device.getSerialNumber().equalsIgnoreCase(deviceName)) {
    108                 return device;
    109             }
    110         }
    111         return null;
    112     }
    113 
    114     public static void main(String[] args) {
    115         DeviceBridge.initDebugBridge();
    116 
    117         if (args.length > 0) {
    118             for (int i = 0; i < args.length; i++) {
    119                 String arg = args[i];
    120                 if ("--help".equalsIgnoreCase(arg)) {
    121                     System.out.println("Usage: hierarchyviewer1 [options]\n");
    122                     System.out.println("Options:");
    123                     System.out.println("  --help\t\t\t Show this help message and exit");
    124                     System.out.println("  --no-profiling\t Disable views profiling");
    125                     System.out.println("  --devices\t\t\t Show the list of available devices");
    126                     System.out.println("  --psd [device] <file>\t Export psd and exit");
    127                     System.exit(0);
    128                 } else if ("--no-profiling".equalsIgnoreCase(arg)) {
    129                     sProfilingEnabled = false;
    130                 } else if ("--devices".equalsIgnoreCase(arg)) {
    131                     listDevices();
    132                     System.exit(0);
    133                 } else if ("--psd".equalsIgnoreCase(arg)) {
    134                     if (i == args.length - 1) {
    135                         System.out.println("You must specify at least an output file with --psd");
    136                         System.exit(1);
    137                     }
    138                     String device = null;
    139                     String file = null;
    140                     if (i < args.length - 2) {
    141                         device = args[++i];
    142                     }
    143                     if (i < args.length - 1) {
    144                         file = args[++i];
    145                     }
    146                     outputPsd(device, file);
    147                     System.exit(0);
    148                 }
    149             }
    150         }
    151 
    152         initUserInterface();
    153         SwingUtilities.invokeLater(new Runnable() {
    154             public void run() {
    155                 Workspace workspace = new Workspace();
    156                 workspace.setDefaultCloseOperation(Workspace.EXIT_ON_CLOSE);
    157                 workspace.setLocationRelativeTo(null);
    158                 workspace.setVisible(true);
    159             }
    160         });
    161     }
    162 }
    163