diff --git a/mode/libraries/vr/build.gradle b/mode/libraries/vr/build.gradle index d130e486..55a20e0a 100644 --- a/mode/libraries/vr/build.gradle +++ b/mode/libraries/vr/build.gradle @@ -8,8 +8,13 @@ plugins { dependencies { compileOnly name: "android" compileOnly "org.p5android:processing-core:${modeVersion}" - implementationAar "com.google.vr:sdk-audio:${gvrVersion}" - implementationAar "com.google.vr:sdk-base:${gvrVersion}" + +// commenting due to issue #718 +// implementationAar "com.google.vr:sdk-audio:${gvrVersion}" +// implementationAar "com.google.vr:sdk-base:${gvrVersion}" + +// fix for Issue #718 + implementationAar fileTree(dir: "libs", include: ["*.aar"]) } task sourceJar(type: Jar, dependsOn: classes) { @@ -53,7 +58,7 @@ compileJava.doFirst { libFolder.mkdirs() for (String fn : deps) { Files.copy(file("${rootDir}/build/libs/" + fn).toPath(), - file("library/" + fn).toPath(), REPLACE_EXISTING); + file("library/" + fn).toPath(), REPLACE_EXISTING); } } @@ -61,27 +66,27 @@ build.doLast { // Copying vr jar to library folder File vrJar = file("library/vr.jar") vrJar.mkdirs(); - + // Need to check the existance of the files before using as the files // will get generated only if Task ':mode:libraries:vr:jar' is not being skipped // Task ':mode:libraries:vr:jar' will be skipped if source files are unchanged or jar task is UP-TO-DATE - + if (file("$buildDir/libs/vr.jar").exists()) { Files.copy(file("$buildDir/libs/vr.jar").toPath(), - vrJar.toPath(), REPLACE_EXISTING); + vrJar.toPath(), REPLACE_EXISTING); } // Renaming artifacts for maven publishing if (file("$buildDir/libs/vr.jar").exists()) { Files.move(file("$buildDir/libs/vr.jar").toPath(), - file("$buildDir/libs/processing-vr-${vrLibVersion}.jar").toPath(), REPLACE_EXISTING); + file("$buildDir/libs/processing-vr-${vrLibVersion}.jar").toPath(), REPLACE_EXISTING); } if (file("$buildDir/libs/vr-sources.jar").exists()) { Files.move(file("$buildDir/libs/vr-sources.jar").toPath(), - file("$buildDir/libs/processing-vr-${vrLibVersion}-sources.jar").toPath(), REPLACE_EXISTING); + file("$buildDir/libs/processing-vr-${vrLibVersion}-sources.jar").toPath(), REPLACE_EXISTING); } if (file("$buildDir/libs/vr.jar.MD5").exists()) { Files.move(file("$buildDir/libs/vr.jar.MD5").toPath(), - file("$buildDir/libs/processing-vr-${vrLibVersion}.jar.md5").toPath(), REPLACE_EXISTING); + file("$buildDir/libs/processing-vr-${vrLibVersion}.jar.md5").toPath(), REPLACE_EXISTING); } } diff --git a/mode/libraries/vr/libs/sdk-audio-1.180.0.aar b/mode/libraries/vr/libs/sdk-audio-1.180.0.aar new file mode 100644 index 00000000..007485cf Binary files /dev/null and b/mode/libraries/vr/libs/sdk-audio-1.180.0.aar differ diff --git a/mode/libraries/vr/libs/sdk-base-1.180.0.aar b/mode/libraries/vr/libs/sdk-base-1.180.0.aar new file mode 100644 index 00000000..e9047d22 Binary files /dev/null and b/mode/libraries/vr/libs/sdk-base-1.180.0.aar differ diff --git a/mode/libraries/vr/libs/sdk-common-1.180.0.aar b/mode/libraries/vr/libs/sdk-common-1.180.0.aar new file mode 100644 index 00000000..7ba5cff9 Binary files /dev/null and b/mode/libraries/vr/libs/sdk-common-1.180.0.aar differ diff --git a/mode/tools/SDKUpdater/build.gradle b/mode/tools/SDKUpdater/build.gradle index 107c6c81..a47fffbb 100644 --- a/mode/tools/SDKUpdater/build.gradle +++ b/mode/tools/SDKUpdater/build.gradle @@ -12,21 +12,28 @@ dependencies { implementationCopy group: "com.android.tools", name: "sdklib", version: "${toolsLibVersion}" implementationCopy group: "com.android.tools", name: "repository", version: "${toolsLibVersion}" + implementationCopy group: "com.android.tools", name: "common", version: "${toolsLibVersion}" } // This task copies the gradle tooling jar into the mode folder task copyToLib(type: Copy) { from configurations.implementationCopy.files { - include '**/annotations-*' - include '**/common-*' - include '**/dvlib-*' - include '**/gson-*' - include '**/guava-*' - include '**/httpcore-*' - include '**/kotlin-stdlib-*' - include '**/layoutlib-api-*' - include '**/repository-*' - include '**/sdklib-*' + + include '**/common-*jar' + include '**/commons-compress-*jar' + include '**/guava-*jar' + include '**/httpcore-*jar' + include '**/istack-*jar' + include '**/jakarta.activation-api-*jar' + include '**/jakarta.xml.bind-api-*jar' + include '**/jaxb-runtime-*jar' + include '**/kotlin-stdlib-1*jar' + include '**/shared-*jar' + include '**/protos-*jar' + include '**/protob*jar' + include '**/sdklib-*jar' + include '**/repository-*jar' + } into "lib" } diff --git a/mode/tools/SDKUpdater/src/processing/mode/android/tools/SDKUpdater.java b/mode/tools/SDKUpdater/src/processing/mode/android/tools/SDKUpdater.java index b58ee8b3..685b6716 100644 --- a/mode/tools/SDKUpdater/src/processing/mode/android/tools/SDKUpdater.java +++ b/mode/tools/SDKUpdater/src/processing/mode/android/tools/SDKUpdater.java @@ -4,7 +4,7 @@ Part of the Processing project - http://processing.org Copyright (c) 2017 The Processing Foundation - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. @@ -23,13 +23,12 @@ import com.android.repository.api.*; import com.android.repository.impl.meta.RepositoryPackages; -import com.android.repository.io.FileOpUtils; -import com.android.repository.io.impl.FileSystemFileOp; import com.android.repository.util.InstallerUtil; import com.android.sdklib.repository.AndroidSdkHandler; import com.android.sdklib.repository.installer.SdkInstallerUtil; import com.android.sdklib.repository.legacy.LegacyDownloader; import com.android.sdklib.tool.sdkmanager.SdkManagerCli; +import com.android.prefs.AndroidLocationsSingleton; import processing.app.Base; import processing.app.Preferences; @@ -59,22 +58,22 @@ @SuppressWarnings("serial") public class SDKUpdater extends JFrame implements PropertyChangeListener, Tool { - final static private int NUM_ROWS = 10; + final static private int NUM_ROWS = 10; final static private int COL_WIDTH = Toolkit.zoom(220); - + final static private int BORDER = Toolkit.zoom(13); final static private int GAP = Toolkit.zoom(13); final static private int INSET = Toolkit.zoom(1); - final static private int BUTTON_WIDTH = Toolkit.zoom(75); + final static private int BUTTON_WIDTH = Toolkit.zoom(85); final static private int BUTTON_HEIGHT = Toolkit.zoom(25); - -// private final Vector columns = new Vector<>(Arrays.asList( -// AndroidMode.getTextString("sdk_updater.name_column"), + + // private final Vector columns = new Vector<>(Arrays.asList( +// AndroidMode.getTextString("sdk_updater.name_column"), // AndroidMode.getTextString("sdk_updater.version_column"), -// AndroidMode.getTextString("sdk_updater.available_column"))); +// AndroidMode.getTextString("sdk_updater.available_column"))); private final Vector columns = new Vector<>(Arrays.asList( - "Package name", "Installed version", "Available update" )); - + "Package name", "Installed version", "Available update" )); + private static final String PROPERTY_CHANGE_QUERY = "query"; private File sdkFolder; @@ -84,72 +83,77 @@ public class SDKUpdater extends JFrame implements PropertyChangeListener, Tool { private boolean downloadTaskRunning; private Vector> packageList; - private DefaultTableModel packageTable; + private DefaultTableModel packageTable; private int numUpdates; private JProgressBar progressBar; private JLabel status; + private JLabel statusSecondary; private JButton actionButton; private JTable table; - + @Override public void init(Base base) { createLayout(base.getActiveEditor() == null); } - + @Override public void run() { setVisible(true); String path = Preferences.get("android.sdk.path"); - sdkFolder = new File(path); + sdkFolder = new File(path); queryTask = new QueryTask(); queryTask.addPropertyChangeListener(this); queryTask.execute(); // status.setText(AndroidMode.getTextString("sdk_updater.query_message")); - status.setText("Querying packages..."); + status.setText("Querying packages..."); + statusSecondary.setText(""); } - - + + @Override - public String getMenuTitle() { + public String getMenuTitle() { // return AndroidMode.getTextString("menu.android.sdk_updater"); return "SDK Updater"; } - - + + @Override public void propertyChange(PropertyChangeEvent evt) { switch (evt.getPropertyName()) { - case PROPERTY_CHANGE_QUERY: - progressBar.setIndeterminate(false); - if (numUpdates == 0) { - actionButton.setEnabled(false); -// status.setText(AndroidMode.getTextString("sdk_updater.no_updates_message")); - status.setText("No updates available"); - } else { - actionButton.setEnabled(true); - if (numUpdates == 1) { + case PROPERTY_CHANGE_QUERY: + progressBar.setIndeterminate(false); + if (numUpdates == 0) { + actionButton.setEnabled(false); +// status.setText(AndroidMode.getTextString("sdk_updater.no_updates_message")); + status.setText("No updates available"); + statusSecondary.setText(""); + } else { + actionButton.setEnabled(true); + if (numUpdates == 1) { // status.setText(AndroidMode.getTextString("sdk_updater.one_updates_message")); - status.setText("1 update found!"); - } else { + status.setText("1 update found!"); + statusSecondary.setText(""); + } else { // status.setText(AndroidMode.getTextString("sdk_updater.many_updates_message", numUpdates)); - status.setText(numUpdates + " updates found!"); - } - } - break; + status.setText(numUpdates + " updates found!"); + statusSecondary.setText(""); + } + } + break; } } class QueryTask extends SwingWorker { ProgressIndicator progress; - + QueryTask() { super(); - progress = new ConsoleProgressIndicator(); + progress = new CustomProgressIndicatorToMonitor(); } - + @Override protected Object doInBackground() throws Exception { numUpdates = 0; @@ -158,11 +162,10 @@ protected Object doInBackground() throws Exception { /* Following code is from listPackages() of com.android.sdklib.tool.SdkManagerCli with some changes */ - AndroidSdkHandler mHandler = AndroidSdkHandler.getInstance(sdkFolder); - - FileSystemFileOp fop = (FileSystemFileOp) FileOpUtils.create(); + AndroidSdkHandler mHandler = AndroidSdkHandler.getInstance(AndroidLocationsSingleton.INSTANCE, sdkFolder.toPath()); + RepoManager mRepoManager = mHandler.getSdkManager(progress); - mRepoManager.loadSynchronously(0, progress, new LegacyDownloader(fop, new SettingsController() { + mRepoManager.loadSynchronously(0, progress, new LegacyDownloader(new SettingsController() { @Override public boolean getForceHttp() { return false; @@ -186,7 +189,7 @@ public void setDisableSdkPatches(boolean arg0) { } }), null); - RepositoryPackages packages = mRepoManager.getPackages(); + RepositoryPackages packages = mRepoManager.getPackages(); HashMap> installed = new HashMap>(); for (LocalPackage local : packages.getLocalPackages().values()) { String path = local.getPath(); @@ -202,17 +205,17 @@ public void setDisableSdkPatches(boolean arg0) { String major = ver.substring(0, maj); int pos = name.indexOf(major); if (-1 < pos) { - name = name.substring(0, pos).trim(); + name = name.substring(0, pos).trim(); } } installed.put(path, Arrays.asList(name, ver)); } HashMap> updated = new HashMap>(); - for (UpdatablePackage update : packages.getUpdatedPkgs()) { + for (UpdatablePackage update : packages.getUpdatedPkgs()) { String path = update.getPath(); String loc = update.getLocal().getVersion().toString(); - String rem = update.getRemote().getVersion().toString(); + String rem = update.getRemote().getVersion().toString(); updated.put(path, Arrays.asList(loc, rem)); } @@ -223,12 +226,12 @@ public void setDisableSdkPatches(boolean arg0) { info.add(locInfo.get(1)); if (updated.containsKey(path)) { String upVer = updated.get(path).get(1); - info.add(upVer); + info.add(upVer); numUpdates++; } else { info.add(""); } - packageList.add(info); + packageList.add(info); } return null; @@ -241,7 +244,7 @@ protected void done() { try { get(); firePropertyChange(PROPERTY_CHANGE_QUERY, "query", "SUCCESS"); - + if (packageList != null) { packageTable.setDataVector(packageList, columns); packageTable.fireTableDataChanged(); @@ -251,7 +254,7 @@ protected void done() { } catch (ExecutionException e) { this.cancel(true); JOptionPane.showMessageDialog(null, - e.getCause().toString(), "Error", JOptionPane.ERROR_MESSAGE); + e.getCause().toString(), "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } } @@ -261,10 +264,10 @@ class DownloadTask extends SwingWorker { ProgressIndicator progress; DownloadTask() { - super(); - progress = new ConsoleProgressIndicator(); + super(); + progress = new CustomProgressIndicatorToMonitor(); } - + @Override protected Object doInBackground() throws Exception { downloadTaskRunning = true; @@ -272,15 +275,14 @@ protected Object doInBackground() throws Exception { /* Following code is from installPackages() of com.android.sdklib.tool.SdkManagerCli with some changes */ - AndroidSdkHandler mHandler = AndroidSdkHandler.getInstance(sdkFolder); + AndroidSdkHandler mHandler = AndroidSdkHandler.getInstance(AndroidLocationsSingleton.INSTANCE, sdkFolder.toPath()); - FileSystemFileOp fop = (FileSystemFileOp) FileOpUtils.create(); CustomSettings settings = new CustomSettings(); - Downloader downloader = new LegacyDownloader(fop, settings); + Downloader downloader = new LegacyDownloader(settings); RepoManager mRepoManager = mHandler.getSdkManager(progress); mRepoManager.loadSynchronously(0, progress, downloader, settings); - + List remotes = new ArrayList<>(); for (String path : settings.getPaths(mRepoManager)) { RemotePackage p = mRepoManager.getPackages().getRemotePackages().get(path); @@ -292,18 +294,18 @@ protected Object doInBackground() throws Exception { remotes.add(p); } remotes = InstallerUtil.computeRequiredPackages( - remotes, mRepoManager.getPackages(), progress); + remotes, mRepoManager.getPackages(), progress); if (remotes != null) { for (RemotePackage p : remotes) { Installer installer = SdkInstallerUtil.findBestInstallerFactory(p, mHandler) - .createInstaller(p, mRepoManager, downloader, mHandler.getFileOp()); + .createInstaller(p, mRepoManager, downloader); if (!(installer.prepare(progress) && installer.complete(progress))) { // there was an error, abort. throw new SdkManagerCli.CommandFailedException(); } } } else { -// progress.logWarning(AndroidMode.getTextString("sdk_updater.warning_failed_computing_dependency_list")); +// progress.logWarning(AndroidMode.getTextString("sdk_updater.warning_failed_computing_dependency_list")); progress.logWarning("Unable to compute a complete list of dependencies."); throw new SdkManagerCli.CommandFailedException(); } @@ -320,6 +322,7 @@ protected void done() { actionButton.setEnabled(false); // status.setText(AndroidMode.getTextString("sdk_updater.refresh_package_message")); status.setText("Refreshing packages..."); + statusSecondary.setText(""); queryTask = new QueryTask(); queryTask.addPropertyChangeListener(SDKUpdater.this); queryTask.execute(); @@ -328,7 +331,7 @@ protected void done() { } catch (ExecutionException e) { this.cancel(true); JOptionPane.showMessageDialog(null, - e.getCause().toString(), "Error", JOptionPane.ERROR_MESSAGE); + e.getCause().toString(), "Error", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } finally { downloadTaskRunning = false; @@ -371,14 +374,14 @@ public boolean getDisableSdkPatches() { @Override public void setDisableSdkPatches(boolean arg0) { // TODO Auto-generated method stub - + } } } private void createLayout(final boolean standalone) { setTitle(getMenuTitle()); - + Container outer = getContentPane(); outer.removeAll(); @@ -404,20 +407,20 @@ public Class getColumnClass(int columnIndex) { return String.class; } }; - + table = new JTable(packageTable) { @Override public String getColumnName(int column) { return columns.get(column); } - }; + }; table.setFillsViewportHeight(true); table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); table.setRowHeight(Toolkit.zoom(table.getRowHeight())); - Dimension dim = new Dimension(table.getColumnCount() * COL_WIDTH, - table.getRowHeight() * NUM_ROWS); + Dimension dim = new Dimension(table.getColumnCount() * COL_WIDTH, + table.getRowHeight() * NUM_ROWS); table.setPreferredScrollableViewportSize(dim); - + packagesPanel.add(new JScrollPane(table)); JPanel controlPanel = new JPanel(); @@ -426,20 +429,26 @@ public String getColumnName(int column) { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(INSET, INSET, INSET, INSET); - + status = new JLabel(); status.setText("Starting up..."); gbc.gridx = 0; gbc.gridy = 0; controlPanel.add(status, gbc); - // Using an indeterminate progress bar from now until we learn + statusSecondary = new JLabel(); + statusSecondary.setText("Getting Detailed Information Here..."); + statusSecondary.setFont(new Font("Calibri", Font.PLAIN, 12)); + gbc.gridx = 0; + gbc.gridy = 1; + controlPanel.add(statusSecondary, gbc); + + // Using an indeterminate progress bar from now until we learn // how to update the fraction of the query/download process: // https://github.com/processing/processing-android/issues/362 progressBar = new JProgressBar(); - progressBar.setIndeterminate(true); gbc.gridx = 0; - gbc.gridy = 1; + gbc.gridy = 2; gbc.weightx = 1.0; gbc.fill = GridBagConstraints.HORIZONTAL; controlPanel.add(progressBar, gbc); @@ -451,25 +460,12 @@ public void actionPerformed(ActionEvent e) { cancelTasks(); } else { // i.e button state is Update downloadTask = new DownloadTask(); - progressBar.setIndeterminate(true); downloadTask.execute(); - // getFraction() always returns 0.0, needs to be set somewhere (??) -// Thread update = new Thread() { -// @Override -// public void run() { -// while (downloadTaskRunning) { -// try { -// Thread.sleep(100); -// } catch (InterruptedException e) { } -// System.out.println("Updating: " + downloadTask.progress.getFraction()); -// } -// } -// }; -// update.start(); - + // status.setText(AndroidMode.getTextString("sdk_updater.download_package_message")); status.setText("Downloading available updates..."); + statusSecondary.setText(""); // actionButton.setText(AndroidMode.getTextString("sdk_updater.cancel_button_label")); actionButton.setText("Cancel"); } @@ -478,9 +474,9 @@ public void actionPerformed(ActionEvent e) { actionButton.setEnabled(false); actionButton.setPreferredSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); gbc.gridx = 1; - gbc.gridy = 0; + gbc.gridy = 0; gbc.weightx = 0.0; - gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.fill = GridBagConstraints.HORIZONTAL; controlPanel.add(actionButton, gbc); ActionListener disposer = new ActionListener() { @@ -493,7 +489,7 @@ public void actionPerformed(ActionEvent actionEvent) { } } }; - + // JButton closeButton = new JButton(AndroidMode.getTextString("sdk_updater.close_button_label")); JButton closeButton = new JButton("Close"); closeButton.setPreferredSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); @@ -522,30 +518,31 @@ public void windowClosing(WindowEvent e) { super.windowClosing(e); } }); - - registerWindowCloseKeys(getRootPane(), disposer); - + + registerWindowCloseKeys(getRootPane(), disposer); + setLocationRelativeTo(null); setResizable(false); setVisible(false); } - + public void cancelTasks() { queryTask.cancel(true); if (downloadTaskRunning) { downloadTask.cancel(true); // status.setText(AndroidMode.getTextString("sdk_updater.download_canceled_message")); status.setText("Download canceled"); + statusSecondary.setText(""); JOptionPane.showMessageDialog(null, // AndroidMode.getTextString("sdk_updater.download_canceled_message"), - "Download canceled", - "Warning", JOptionPane.WARNING_MESSAGE); + "Download canceled", + "Warning", JOptionPane.WARNING_MESSAGE); // actionButton.setText(AndroidMode.getTextString("sdk_updater.update_button_label")); - actionButton.setText("Update"); + actionButton.setText("Update"); } } - - + + /** * Registers key events for a Ctrl-W and ESC with an ActionListener * that will take care of disposing the window. @@ -554,11 +551,104 @@ static public void registerWindowCloseKeys(JRootPane root, ActionListener disposer) { KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); root.registerKeyboardAction(disposer, stroke, - JComponent.WHEN_IN_FOCUSED_WINDOW); + JComponent.WHEN_IN_FOCUSED_WINDOW); int modifiers = java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx(); stroke = KeyStroke.getKeyStroke('W', modifiers); root.registerKeyboardAction(disposer, stroke, - JComponent.WHEN_IN_FOCUSED_WINDOW); - } + JComponent.WHEN_IN_FOCUSED_WINDOW); + } + + class CustomProgressIndicatorToMonitor implements com.android.repository.api.ProgressIndicator{ + + int percentage = 0; + String progressTextData = ""; + String progressTextDataDetailed = ""; + + @Override + public void setText(String progressText) { + progressTextData = progressText; + } + + @Override + public boolean isCanceled() { + return false; + } + + @Override + public void cancel() { + + } + + @Override + public void setCancellable(boolean cancellable) { + + } + + @Override + public boolean isCancellable() { + return false; + } + + @Override + public void setIndeterminate(boolean indeterminate) { + + } + + @Override + public boolean isIndeterminate() { + return false; + } + + @Override + public void setFraction(double progress) { + if(progress<=1 && progress>=0) { + percentage = ((int)(progress*100)); + // System.out.println("CustomProgressIndicatorToMonitor:Progress Bar Percentage:"+percentage); + progressBar.setValue(percentage); + status.setText(progressTextData+" "+percentage+" % "); + statusSecondary.setText(progressTextDataDetailed); + } + } + + @Override + public double getFraction() { + return 0; + } + + @Override + public void setSecondaryText(String s) { + progressTextDataDetailed = s; + // System.out.println("CustomProgressIndicatorToMonitor:SecondaryText:"+s); + } + + @Override + public void logWarning(String s) { + progressTextDataDetailed = s; + // System.out.println("CustomProgressIndicatorToMonitor:WarningText:"+s); + } + + @Override + public void logWarning(String s, Throwable e) { + + } + + @Override + public void logError(String s) { + progressTextDataDetailed = s; + // System.out.println("CustomProgressIndicatorToMonitor:ErrorText:"+s); + } + + @Override + public void logError(String s, Throwable e) { + + } + + @Override + public void logInfo(String s) { + progressTextDataDetailed = s; + // System.out.println("CustomProgressIndicatorToMonitor:LogInfoText:"+s); + } + } + } diff --git a/mode/version.properties b/mode/version.properties index f2ae43bb..a3714b2b 100644 --- a/mode/version.properties +++ b/mode/version.properties @@ -1,6 +1,6 @@ # Basics android-platform = 30 -android-toolslib = 27.1.1 +android-toolslib = 30.3.0 android-gradle-plugin = 7.1.0 gradle-wrapper = 7.4.2 @@ -24,4 +24,4 @@ com.google.ar = 1.30.0 org.processing = 4.0.0b7 org.gradle%gradle-tooling-api = 7.2 org.slf4j = 1.7.30 -org.eclipse.jdt = 3.19.300 \ No newline at end of file +org.eclipse.jdt = 3.19.300