sdkstats

16:52:19.232 INFO  jd.cli.Main - Decompiling sdkstats.jar
package com.android.sdkstats;

import com.android.prefs.AndroidLocation;
import com.android.prefs.AndroidLocation.AndroidLocationException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Random;
import org.eclipse.jface.preference.PreferenceStore;

public class DdmsPreferenceStore
{
  public static final String PING_OPT_IN = "pingOptIn";
  private static final String PING_TIME = "pingTime";
  private static final String PING_ID = "pingId";
  private static final String ADT_USED = "adtUsed";
  private static final String LAST_SDK_PATH = "lastSdkPath";
  private static volatile PreferenceStore sPrefStore;
  
  public PreferenceStore getPreferenceStore()
  {
    synchronized (DdmsPreferenceStore.class)
    {
      if (sPrefStore == null)
      {
        String homeDir = null;
        try
        {
          homeDir = AndroidLocation.getFolder();
        }
        catch (AndroidLocation.AndroidLocationException e1) {}
        if (homeDir == null)
        {
          sPrefStore = new PreferenceStore();
          return sPrefStore;
        }
        assert (homeDir != null);
        
        String rcFileName = homeDir + "ddms.cfg";
        
        String oldPrefPath = System.getProperty("user.home") + File.separator + ".ddmsrc";
        
        File oldPrefFile = new File(oldPrefPath);
        if (oldPrefFile.isFile())
        {
          FileOutputStream fileOutputStream = null;
          try
          {
            PreferenceStore oldStore = new PreferenceStore(oldPrefPath);
            oldStore.load();
            
            fileOutputStream = new FileOutputStream(rcFileName);
            oldStore.save(fileOutputStream, "");
            oldPrefFile.delete();
            
            PreferenceStore newStore = new PreferenceStore(rcFileName);
            newStore.load();
            sPrefStore = newStore;
          }
          catch (IOException e)
          {
            sPrefStore = new PreferenceStore(rcFileName);
          }
          finally
          {
            if (fileOutputStream != null) {
              try
              {
                fileOutputStream.close();
              }
              catch (IOException e) {}
            }
          }
        }
        sPrefStore = new PreferenceStore(rcFileName);
        try
        {
          sPrefStore.load();
        }
        catch (IOException e)
        {
          System.err.println("Error Loading DDMS Preferences");
        }
      }
      assert (sPrefStore != null);
      return sPrefStore;
    }
  }
  
  public void save()
  {
    PreferenceStore prefs = getPreferenceStore();
    synchronized (DdmsPreferenceStore.class)
    {
      try
      {
        prefs.save();
      }
      catch (IOException ioe) {}
    }
  }
  
  public boolean hasPingId()
  {
    PreferenceStore prefs = getPreferenceStore();
    synchronized (DdmsPreferenceStore.class)
    {
      return (prefs != null) && (prefs.contains("pingId"));
    }
  }
  
  public long getPingId()
  {
    PreferenceStore prefs = getPreferenceStore();
    synchronized (DdmsPreferenceStore.class)
    {
      return prefs == null ? 0L : prefs.getLong("pingId");
    }
  }
  
  public long generateNewPingId()
  {
    PreferenceStore prefs = getPreferenceStore();
    
    Random rnd = new Random();
    long id = rnd.nextLong();
    synchronized (DdmsPreferenceStore.class)
    {
      prefs.setValue("pingId", id);
      try
      {
        prefs.save();
      }
      catch (IOException e) {}
    }
    return id;
  }
  
  public boolean isPingOptIn()
  {
    PreferenceStore prefs = getPreferenceStore();
    synchronized (DdmsPreferenceStore.class)
    {
      return (prefs != null) && (prefs.contains("pingOptIn"));
    }
  }
  
  public void setPingOptIn(boolean optIn)
  {
    PreferenceStore prefs = getPreferenceStore();
    synchronized (DdmsPreferenceStore.class)
    {
      prefs.setValue("pingOptIn", optIn);
      try
      {
        prefs.save();
      }
      catch (IOException e) {}
    }
  }
  
  public long getPingTime(String app)
  {
    PreferenceStore prefs = getPreferenceStore();
    String timePref = "pingTime." + app;
    synchronized (DdmsPreferenceStore.class)
    {
      return prefs == null ? 0L : prefs.getLong(timePref);
    }
  }
  
  public void setPingTime(String app, long timeStamp)
  {
    PreferenceStore prefs = getPreferenceStore();
    String timePref = "pingTime." + app;
    synchronized (DdmsPreferenceStore.class)
    {
      prefs.setValue(timePref, timeStamp);
      try
      {
        prefs.save();
      }
      catch (IOException ioe) {}
    }
  }
  
  public boolean isAdtUsed()
  {
    PreferenceStore prefs = getPreferenceStore();
    synchronized (DdmsPreferenceStore.class)
    {
      if ((prefs == null) || (!prefs.contains("adtUsed"))) {
        return false;
      }
      return prefs.getBoolean("adtUsed");
    }
  }
  
  public void setAdtUsed(boolean used)
  {
    PreferenceStore prefs = getPreferenceStore();
    synchronized (DdmsPreferenceStore.class)
    {
      prefs.setValue("adtUsed", used);
      try
      {
        prefs.save();
      }
      catch (IOException ioe) {}
    }
  }
  
  public String getLastSdkPath()
  {
    PreferenceStore prefs = getPreferenceStore();
    synchronized (DdmsPreferenceStore.class)
    {
      return prefs == null ? null : prefs.getString("lastSdkPath");
    }
  }
  
  public void setLastSdkPath(String osSdkPath)
  {
    PreferenceStore prefs = getPreferenceStore();
    synchronized (DdmsPreferenceStore.class)
    {
      prefs.setValue("lastSdkPath", osSdkPath);
      try
      {
        prefs.save();
      }
      catch (IOException ioe) {}
    }
  }
}

/* Location:
 * Qualified Name:     com.android.sdkstats.DdmsPreferenceStore
 * Java Class Version: 6 (50.0)
 * JD-Core Version:    0.7.1
 */
package com.android.sdkstats;

import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;

class SdkStatsPermissionDialog$1
  extends SelectionAdapter
{
  SdkStatsPermissionDialog$1(SdkStatsPermissionDialog paramSdkStatsPermissionDialog) {}
  
  public void widgetSelected(SelectionEvent event)
  {
    SdkStatsPermissionDialog.openUrl(text);
  }
}

/* Location:
 * Qualified Name:     com.android.sdkstats.SdkStatsPermissionDialog.1
 * Java Class Version: 6 (50.0)
 * JD-Core Version:    0.7.1
 */
package com.android.sdkstats;

import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;

class SdkStatsPermissionDialog$2
  extends SelectionAdapter
{
  SdkStatsPermissionDialog$2(SdkStatsPermissionDialog paramSdkStatsPermissionDialog, Button paramButton) {}
  
  public void widgetSelected(SelectionEvent event)
  {
    SdkStatsPermissionDialog.access$002(this$0, val$checkbox.getSelection());
  }
}

/* Location:
 * Qualified Name:     com.android.sdkstats.SdkStatsPermissionDialog.2
 * Java Class Version: 6 (50.0)
 * JD-Core Version:    0.7.1
 */
package com.android.sdkstats;

import java.io.IOException;

final class SdkStatsPermissionDialog$3
  extends Thread
{
  SdkStatsPermissionDialog$3(String paramString) {}
  
  public void run()
  {
    for (String cmd : )
    {
      cmd = cmd.replaceAll("%URL%", val$url);
      try
      {
        Process proc = Runtime.getRuntime().exec(cmd);
        if (proc.waitFor() == 0) {
          break;
        }
      }
      catch (InterruptedException e)
      {
        throw new RuntimeException(e);
      }
      catch (IOException e) {}
    }
  }
}

/* Location:
 * Qualified Name:     com.android.sdkstats.SdkStatsPermissionDialog.3
 * Java Class Version: 6 (50.0)
 * JD-Core Version:    0.7.1
 */
package com.android.sdkstats;

import java.io.IOException;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;

public class SdkStatsPermissionDialog
  extends Dialog
{
  private static final String HEADER_TEXT = "Thanks for using the Android SDK!";
  public static final String NOTICE_TEXT = "We know you just want to get started but please read this first.";
  public static final String BODY_TEXT = "By choosing to send certain usage statistics to Google, you can help us improve the Android SDK. These usage statistics lets us measure things like active usage of the SDK, and let us know things like which versions of the SDK are in use and which tools are the most popular with developers. This limited data is not associated with personal information about you, and is examined on an aggregate basis, and is maintained in accordance with the Google Privacy Policy.";
  public static final String PRIVACY_POLICY_LINK_TEXT = "<a href=\"http://www.google.com/intl/en/privacy.html\">Google Privacy Policy</a>";
  public static final String CHECKBOX_TEXT = "Send usage statistics to Google.";
  public static final String FOOTER_TEXT = "If you later decide to change this setting, you can do so in the\"ddms\" tool under \"File\" > \"Preferences\" > \"Usage Stats\".";
  private static final String BUTTON_TEXT = "Proceed";
  private static final String[] LINUX_BROWSERS = { "firefox -remote openurl(%URL%,new-window)", "mozilla -remote openurl(%URL%,new-window)", "firefox %URL%", "mozilla %URL%", "kfmclient openURL %URL%", "opera -newwindow %URL%" };
  private static final boolean ALLOW_PING_DEFAULT = true;
  private boolean mAllowPing = true;
  
  public SdkStatsPermissionDialog(Shell parentShell)
  {
    super(parentShell);
    setBlockOnOpen(true);
  }
  
  protected void createButtonsForButtonBar(Composite parent)
  {
    createButton(parent, 0, "Proceed", true);
  }
  
  protected Control createDialogArea(Composite parent)
  {
    Composite composite = (Composite)super.createDialogArea(parent);
    composite.setLayout(new GridLayout(1, false));
    
    Label title = new Label(composite, 16777280);
    FontData[] fontdata = title.getFont().getFontData();
    for (int i = 0; i < fontdata.length; i++) {
      fontdata[i].setHeight(fontdata[i].getHeight() * 4 / 3);
    }
    title.setFont(new Font(getShell().getDisplay(), fontdata));
    title.setLayoutData(new GridData(768));
    title.setText("Thanks for using the Android SDK!");
    
    Label notice = new Label(composite, 64);
    notice.setFont(title.getFont());
    notice.setForeground(new Color(getShell().getDisplay(), 255, 0, 0));
    notice.setLayoutData(new GridData(768));
    notice.setText("We know you just want to get started but please read this first.");
    notice.pack();
    
    Label bodyText = new Label(composite, 64);
    GridData gd = new GridData();
    widthHint = getSizex;
    grabExcessHorizontalSpace = true;
    bodyText.setLayoutData(gd);
    bodyText.setText("By choosing to send certain usage statistics to Google, you can help us improve the Android SDK. These usage statistics lets us measure things like active usage of the SDK, and let us know things like which versions of the SDK are in use and which tools are the most popular with developers. This limited data is not associated with personal information about you, and is examined on an aggregate basis, and is maintained in accordance with the Google Privacy Policy.");
    
    Link privacyLink = new Link(composite, 524288);
    privacyLink.setText("<a href=\"http://www.google.com/intl/en/privacy.html\">Google Privacy Policy</a>");
    privacyLink.addSelectionListener(new SelectionAdapter()
    {
      public void widgetSelected(SelectionEvent event)
      {
        SdkStatsPermissionDialog.openUrl(text);
      }
    });
    final Button checkbox = new Button(composite, 32);
    checkbox.setSelection(true);
    checkbox.setText("Send usage statistics to Google.");
    checkbox.addSelectionListener(new SelectionAdapter()
    {
      public void widgetSelected(SelectionEvent event)
      {
        mAllowPing = checkbox.getSelection();
      }
    });
    checkbox.setFocus();
    
    Label footer = new Label(composite, 64);
    gd = new GridData();
    widthHint = getSizex;
    grabExcessHorizontalSpace = true;
    footer.setLayoutData(gd);
    footer.setText("If you later decide to change this setting, you can do so in the\"ddms\" tool under \"File\" > \"Preferences\" > \"Usage Stats\".");
    
    return composite;
  }
  
  public static void openUrl(String url)
  {
    if (!Program.launch(url)) {
      new Thread()
      {
        public void run()
        {
          for (String cmd : SdkStatsPermissionDialog.LINUX_BROWSERS)
          {
            cmd = cmd.replaceAll("%URL%", val$url);
            try
            {
              Process proc = Runtime.getRuntime().exec(cmd);
              if (proc.waitFor() == 0) {
                break;
              }
            }
            catch (InterruptedException e)
            {
              throw new RuntimeException(e);
            }
            catch (IOException e) {}
          }
        }
      }.start();
    }
  }
  
  public boolean getPingUserPreference()
  {
    return mAllowPing;
  }
}

/* Location:
 * Qualified Name:     com.android.sdkstats.SdkStatsPermissionDialog
 * Java Class Version: 6 (50.0)
 * JD-Core Version:    0.7.1
 */
package com.android.sdkstats;

import org.eclipse.swt.widgets.Shell;

class SdkStatsService$1
  implements Runnable
{
  SdkStatsService$1(SdkStatsService paramSdkStatsService, Shell paramShell) {}
  
  public void run()
  {
    SdkStatsPermissionDialog dialog = new SdkStatsPermissionDialog(val$parent);
    dialog.open();
    SdkStatsService.access$000(this$0).setPingOptIn(dialog.getPingUserPreference());
  }
}

/* Location:
 * Qualified Name:     com.android.sdkstats.SdkStatsService.1
 * Java Class Version: 6 (50.0)
 * JD-Core Version:    0.7.1
 */
package com.android.sdkstats;

import java.io.IOException;
import java.net.URL;
import java.util.Map;

class SdkStatsService$2
  extends Thread
{
  SdkStatsService$2(SdkStatsService paramSdkStatsService, String paramString1, String paramString2, long paramLong, Map paramMap) {}
  
  public void run()
  {
    try
    {
      URL url = this$0.createPingUrl(val$nApp, val$nVersion, val$id, val$extras);
      SdkStatsService.access$100(this$0, url);
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }
}

/* Location:
 * Qualified Name:     com.android.sdkstats.SdkStatsService.2
 * Java Class Version: 6 (50.0)
 * JD-Core Version:    0.7.1
 */
package com.android.sdkstats;

import java.io.IOException;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class SdkStatsService
{
  protected static final String SYS_PROP_OS_ARCH = "os.arch";
  protected static final String SYS_PROP_JAVA_VERSION = "java.version";
  protected static final String SYS_PROP_OS_VERSION = "os.version";
  protected static final String SYS_PROP_OS_NAME = "os.name";
  private static final long PING_INTERVAL_MSEC = 86400000L;
  private static final boolean DEBUG = System.getenv("ANDROID_DEBUG_PING") != null;
  private DdmsPreferenceStore mStore = new DdmsPreferenceStore();
  
  public void ping(String app, String version)
  {
    doPing(app, version, null);
  }
  
  public void ping(String[] arguments)
  {
    if ((arguments == null) || (arguments.length < 3)) {
      throw new IllegalArgumentException("Invalid ping arguments: expected ['ping', app, version] but got " + (arguments == null ? "null" : Arrays.toString(arguments)));
    }
    int len = arguments.length;
    String app = arguments[1];
    String version = arguments[2];
    
    Map<String, String> extras = new HashMap();
    if ("emulator".equals(app))
    {
      if (len > 3) {
        extras.put("glm", sanitizeGlArg(arguments[3]));
      }
      if (len > 4) {
        extras.put("glr", sanitizeGlArg(arguments[4]));
      }
      if (len > 5) {
        extras.put("glv", sanitizeGlArg(arguments[5]));
      }
    }
    doPing(app, version, extras);
  }
  
  private String sanitizeGlArg(String arg)
  {
    if (arg == null) {
      arg = "";
    } else {
      try
      {
        arg = arg.trim();
        arg = arg.replaceAll("[^A-Za-z0-9\\s_()./-]", " ");
        arg = arg.replaceAll("\\s\\s+", " ");
        if (arg.length() > 128) {
          arg = arg.substring(0, 128);
        }
        arg = URLEncoder.encode(arg, "UTF-8");
      }
      catch (UnsupportedEncodingException e)
      {
        arg = "";
      }
    }
    return arg;
  }
  
  public void checkUserPermissionForPing(Shell parent)
  {
    if (!mStore.hasPingId())
    {
      askUserPermissionForPing(parent);
      mStore.generateNewPingId();
    }
  }
  
  private void askUserPermissionForPing(final Shell parent)
  {
    Display display = parent.getDisplay();
    display.syncExec(new Runnable()
    {
      public void run()
      {
        SdkStatsPermissionDialog dialog = new SdkStatsPermissionDialog(parent);
        dialog.open();
        mStore.setPingOptIn(dialog.getPingUserPreference());
      }
    });
  }
  
  protected void doPing(String app, String version, Map<String, String> extras)
  {
    final String nApp = normalizeAppName(app);
    final String nVersion = normalizeVersion(version);
    if (!mStore.isPingOptIn()) {
      return;
    }
    long now = System.currentTimeMillis();
    long then = mStore.getPingTime(app);
    if (now - then < 86400000L) {
      return;
    }
    mStore.setPingTime(app, now);
    
    final long id = mStore.getPingId();
    new Thread()
    {
      public void run()
      {
        try
        {
          URL url = createPingUrl(nApp, nVersion, id, val$extras);
          SdkStatsService.this.actuallySendPing(url);
        }
        catch (IOException e)
        {
          e.printStackTrace();
        }
      }
    }.start();
  }
  
  private void actuallySendPing(URL url)
    throws IOException
  {
    assert (url != null);
    if (DEBUG) {
      System.err.println("Ping: " + url.toString());
    }
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    if ((conn.getResponseCode() != 200) && (conn.getResponseCode() != 404)) {
      throw new IOException(conn.getResponseMessage() + ": " + url);
    }
  }
  
  protected URL createPingUrl(String app, String version, long id, Map<String, String> extras)
    throws UnsupportedEncodingException, MalformedURLException
  {
    String osName = URLEncoder.encode(getOsName(), "UTF-8");
    String osArch = URLEncoder.encode(getOsArch(), "UTF-8");
    String jvmArch = URLEncoder.encode(getJvmInfo(), "UTF-8");
    
    String extraStr = "";
    if ((extras != null) && (!extras.isEmpty()))
    {
      StringBuilder sb = new StringBuilder();
      for (Map.Entry<String, String> entry : extras.entrySet()) {
        sb.append('&').append((String)entry.getKey()).append('=').append((String)entry.getValue());
      }
      extraStr = sb.toString();
    }
    URL url = new URL("http", "tools.google.com", "/service/update?as=androidsdk_" + app + "&id=" + Long.toHexString(id) + "&version=" + version + "&os=" + osName + "&osa=" + osArch + "&vma=" + jvmArch + extraStr);
    
    return url;
  }
  
  protected String getOsName()
  {
    String os = getSystemProperty("os.name");
    if ((os == null) || (os.length() == 0)) {
      return "unknown";
    }
    String os2 = os.toLowerCase(Locale.US);
    if (os2.startsWith("mac"))
    {
      os = "mac";
      String osVers = getOsVersion();
      if (osVers != null) {
        os = os + '-' + osVers;
      }
    }
    else if (os2.startsWith("win"))
    {
      os = "win";
      String osVers = getOsVersion();
      if (osVers != null) {
        os = os + '-' + osVers;
      }
    }
    else if (os2.startsWith("linux"))
    {
      os = "linux";
    }
    else if (os.length() > 32)
    {
      os = os.substring(0, 32);
    }
    return os;
  }
  
  protected String getOsArch()
  {
    String arch = getJvmArch();
    if ("x86_64".equals(arch)) {
      return arch;
    }
    if ("x86".equals(arch))
    {
      String os = getOsName();
      if (os.startsWith("win"))
      {
        String w6432 = getSystemEnv("PROCESSOR_ARCHITEW6432");
        if ((w6432 != null) && (w6432.indexOf("64") != -1)) {
          return "x86_64";
        }
      }
      else if (os.startsWith("linux"))
      {
        String s = getSystemEnv("HOSTTYPE");
        
        s = sanitizeOsArch(s);
        if (s.indexOf("86") != -1) {
          arch = s;
        }
      }
    }
    return arch;
  }
  
  protected String getOsVersion()
  {
    Pattern p = Pattern.compile("(\\d+)\\.(\\d+).*");
    String osVers = getSystemProperty("os.version");
    if ((osVers != null) && (osVers.length() > 0))
    {
      Matcher m = p.matcher(osVers);
      if (m.matches()) {
        return m.group(1) + '.' + m.group(2);
      }
    }
    return null;
  }
  
  protected String getJvmInfo()
  {
    return getJvmVersion() + '-' + getJvmArch();
  }
  
  protected String getJvmVersion()
  {
    String version = getSystemProperty("java.version");
    if ((version == null) || (version.length() == 0)) {
      return "unknown";
    }
    Pattern p = Pattern.compile("(\\d+)\\.(\\d+).*");
    Matcher m = p.matcher(version);
    if (m.matches()) {
      return m.group(1) + '.' + m.group(2);
    }
    if (version.length() > 8) {
      version = version.substring(0, 8);
    }
    return version;
  }
  
  protected String getJvmArch()
  {
    String arch = getSystemProperty("os.arch");
    return sanitizeOsArch(arch);
  }
  
  private String sanitizeOsArch(String arch)
  {
    if ((arch == null) || (arch.length() == 0)) {
      return "unknown";
    }
    if ((arch.equalsIgnoreCase("x86_64")) || (arch.equalsIgnoreCase("ia64")) || (arch.equalsIgnoreCase("amd64"))) {
      return "x86_64";
    }
    if ((arch.length() >= 4) && (arch.charAt(0) == 'i') && (arch.indexOf("86") == 2)) {
      return "x86";
    }
    if (arch.equalsIgnoreCase("PowerPC")) {
      return "ppc";
    }
    if (arch.length() > 32) {
      arch = arch.substring(0, 32);
    }
    return arch;
  }
  
  protected String normalizeAppName(String app)
  {
    String app2 = app.replaceAll("\\W", "");
    if (app.length() == 0) {
      throw new IllegalArgumentException("Bad app name: " + app);
    }
    return app2;
  }
  
  protected String normalizeVersion(String version)
  {
    Pattern regex = Pattern.compile("^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:\\.(\\d+)| +rc(\\d+))?");
    
    Matcher m = regex.matcher(version);
    if ((m != null) && (m.lookingAt()))
    {
      StringBuilder normal = new StringBuilder();
      for (int i = 1; i <= 4; i++)
      {
        int v = 0;
        if ((i == 4) && (i < m.groupCount()) && (m.group(i) == null) && (m.group(i + 1) != null)) {
          i++;
        }
        if (m.group(i) != null) {
          try
          {
            v = Integer.parseInt(m.group(i));
          }
          catch (Exception ignore) {}
        }
        if (i > 1) {
          normal.append('.');
        }
        normal.append(v);
      }
      return normal.toString();
    }
    throw new IllegalArgumentException("Bad version: " + version);
  }
  
  protected String getSystemProperty(String name)
  {
    return System.getProperty(name);
  }
  
  protected String getSystemEnv(String name)
  {
    return System.getenv(name);
  }
}

/* Location:
 * Qualified Name:     com.android.sdkstats.SdkStatsService
 * Java Class Version: 6 (50.0)
 * JD-Core Version:    0.7.1
 */
1

Further reading...

For more information on Java 1.5 Tiger, you may find Java 1.5 Tiger, A developer's Notebook by D. Flanagan and B. McLaughlin from O'Reilly of interest.

New!JAR listings


Copyright 2006-2017. Infinite Loop Ltd