/** * Created on Feb 9, 2009 * * Copyright 2008 Vuze, Inc. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License only. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.gudy.azureus2.ui.swt.donations; import java.util.Locale; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.*; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.stats.transfer.OverallStats; import org.gudy.azureus2.core3.stats.transfer.StatsFactory; import org.gudy.azureus2.core3.util.*; import org.gudy.azureus2.plugins.utils.FeatureManager; import org.gudy.azureus2.plugins.utils.FeatureManager.FeatureDetails; import org.gudy.azureus2.pluginsimpl.local.PluginInitializer; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.components.shell.ShellFactory; import org.gudy.azureus2.ui.swt.shells.MessageBoxShell; import com.aelitis.azureus.core.AzureusCoreFactory; import com.aelitis.azureus.core.security.CryptoManagerFactory; /** * @author TuxPaper * @created Feb 9, 2009 * */ public class DonationWindow { public static boolean DEBUG = System.getProperty("donations.debug", "0").equals( "1"); private static int reAskEveryHours = 96; private static int initialAskHours = 48; private static boolean pageLoadedOk = false; private static Shell shell = null; private static Browser browser; private static BrowserFunction browserFunction; public static void checkForDonationPopup() { if (shell != null) { if (DEBUG) { new MessageBoxShell(SWT.OK, "Donations Test", "Already Open").open(null); } return; } FeatureManager fm = PluginInitializer.getDefaultInterface().getUtilities().getFeatureManager(); FeatureDetails[] fds = fm.getFeatureDetails( "core" ); for ( FeatureDetails fd: fds ){ if ( !fd.hasExpired()){ return; } } long maxDate = COConfigurationManager.getLongParameter("donations.maxDate", 0); boolean force = maxDate > 0 && SystemTime.getCurrentTime() > maxDate ? true : false; //Check if user has already donated first boolean alreadyDonated = COConfigurationManager.getBooleanParameter( "donations.donated", false); if (alreadyDonated && !force) { if (DEBUG) { new MessageBoxShell(SWT.OK, "Donations Test", "Already Donated! I like you.").open(null); } return; } OverallStats stats = StatsFactory.getStats(); if (stats == null) { return; } long upTime = stats.getTotalUpTime(); int hours = (int) (upTime / (60 * 60)); //secs * mins //Ask every DONATIONS_ASK_AFTER hours. int nextAsk = COConfigurationManager.getIntParameter( "donations.nextAskHours", 0); if (nextAsk == 0) { // First Time COConfigurationManager.setParameter("donations.nextAskHours", hours + initialAskHours); COConfigurationManager.save(); if (DEBUG) { new MessageBoxShell(SWT.OK, "Donations Test", "Newbie. You're active for " + hours + ".").open(null); } return; } if (hours < nextAsk && !force) { if (DEBUG) { new MessageBoxShell(SWT.OK, "Donations Test", "Wait " + (nextAsk - hours) + ".").open(null); } return; } long minDate = COConfigurationManager.getLongParameter("donations.minDate", 0); if (minDate > 0 && minDate > SystemTime.getCurrentTime()) { if (DEBUG) { new MessageBoxShell(SWT.OK, "Donation Test", "Wait " + ((SystemTime.getCurrentTime() - minDate) / 1000 / 3600 / 24) + " days").open(null); } return; } COConfigurationManager.setParameter("donations.nextAskHours", hours + reAskEveryHours); COConfigurationManager.save(); Utils.execSWTThread(new AERunnable() { public void runSupport() { open(false, "check"); } }); } public static void open(final boolean showNoLoad, final String sourceRef) { Utils.execSWTThread(new AERunnable() { public void runSupport() { _open(showNoLoad, sourceRef); } }); } public static void _open(final boolean showNoLoad, final String sourceRef) { if (shell != null && !shell.isDisposed()) { return; } final Shell parentShell = Utils.findAnyShell(); shell = ShellFactory.createShell(parentShell, SWT.BORDER | SWT.APPLICATION_MODAL | SWT.TITLE); shell.setLayout(new FillLayout()); if (parentShell != null) { parentShell.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT)); } shell.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_ESCAPE) { shell.dispose(); e.doit = false; } } }); shell.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { if (parentShell != null) { parentShell.setCursor(e.display.getSystemCursor(SWT.CURSOR_ARROW)); } if (browserFunction != null && !browserFunction.isDisposed()) { browserFunction.dispose(); } shell = null; } }); browser = Utils.createSafeBrowser(shell, SWT.NONE); if (browser == null) { shell.dispose(); return; } browser.addTitleListener(new TitleListener() { public void changed(TitleEvent event) { if (shell == null || shell.isDisposed()) { return; } shell.setText(event.title); } }); browserFunction = new BrowserFunction(browser, "sendDonationEvent") { public Object function(Object[] arguments) { if (shell == null || shell.isDisposed()) { return null; } if (arguments == null) { Debug.out("Invalid sendDonationEvent null "); return null; } if (arguments.length < 1) { Debug.out("Invalid sendDonationEvent length " + arguments.length + " not 1"); return null; } if (!(arguments[0] instanceof String)) { Debug.out("Invalid sendDonationEvent " + (arguments[0] == null ? "NULL" : arguments.getClass().getSimpleName()) + " not String"); return null; } String text = (String) arguments[0]; if (text.contains("page-loaded")) { pageLoadedOk = true; COConfigurationManager.setParameter("donations.count", COConfigurationManager.getLongParameter("donations.count", 1) + 1); Utils.centreWindow(shell); if (parentShell != null) { parentShell.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_ARROW)); } shell.open(); } else if (text.contains("reset-ask-time")) { int time = reAskEveryHours; String[] strings = text.split(" "); if (strings.length > 1) { try { time = Integer.parseInt(strings[1]); } catch (Throwable t) { } } resetAskTime(time); } else if (text.contains("never-ask-again")) { neverAskAgain(); } else if (text.contains("close")) { Utils.execSWTThreadLater(0, new AERunnable() { public void runSupport() { if (shell != null && !shell.isDisposed()) { shell.dispose(); } } }); } else if (text.startsWith("open-url")) { String url = text.substring(9); Utils.launch(url); } else if (text.startsWith("set-size")) { String[] strings = text.split(" "); if (strings.length > 2) { try { int w = Integer.parseInt(strings[1]); int h = Integer.parseInt(strings[2]); Rectangle computeTrim = shell.computeTrim(0, 0, w, h); shell.setSize(computeTrim.width, computeTrim.height); } catch (Exception e) { } } } return null; } }; browser.addStatusTextListener(new StatusTextListener() { String last = null; public void changed(StatusTextEvent event) { String text = event.text.toLowerCase(); if (last != null && last.equals(text)) { return; } last = text; browserFunction.function(new Object[] { text }); } }); browser.addLocationListener(new LocationListener() { public void changing(LocationEvent event) { } public void changed(LocationEvent event) { } }); long upTime = StatsFactory.getStats().getTotalUpTime(); int upHours = (int) (upTime / (60 * 60)); //secs * mins String azid = Base32.encode(CryptoManagerFactory.getSingleton().getSecureID()); final String url = "http://" + System.getProperty("platform_address", "www.vuze.com") + ":" + System.getProperty("platform_port", "80") + "/" + "donate.start?locale=" + MessageText.getCurrentLocale().toString() + "&azv=" + Constants.AZUREUS_VERSION + "&count=" + COConfigurationManager.getLongParameter("donations.count", 1) + "&uphours=" + upHours + "&azid=" + azid + "&sourceref=" + UrlUtils.encode(sourceRef); SimpleTimer.addEvent("donation.pageload", SystemTime.getOffsetTime(6000), new TimerEventPerformer() { public void perform(TimerEvent event) { if (!pageLoadedOk) { Utils.execSWTThread(new AERunnable() { public void runSupport() { Debug.out("Page Didn't Load:" + url); shell.dispose(); if (showNoLoad) { new MessageBoxShell(SWT.OK, MessageText.getString("DonationWindow.noload.title"), MessageText.getString("DonationWindow.noload.text", new String[] { url })).open(null); } } }); } } }); browser.setUrl(url); } /** * * * @since 4.0.0.5 */ protected static void neverAskAgain() { COConfigurationManager.setParameter("donations.donated", true); updateMinDate(); COConfigurationManager.save(); } /** * * * @since 4.0.0.5 */ public static void resetAskTime() { resetAskTime(reAskEveryHours); } public static void resetAskTime(int askEveryHours) { long upTime = StatsFactory.getStats().getTotalUpTime(); int hours = (int) (upTime / (60 * 60)); //secs * mins int nextAsk = hours + askEveryHours; COConfigurationManager.setParameter("donations.nextAskHours", nextAsk); COConfigurationManager.setParameter("donations.lastVersion", Constants.AZUREUS_VERSION); updateMinDate(); COConfigurationManager.save(); } public static void updateMinDate() { COConfigurationManager.setParameter("donations.minDate", SystemTime.getOffsetTime(1000l * 3600 * 24 * 30)); //30d ahead COConfigurationManager.setParameter("donations.maxDate", SystemTime.getOffsetTime(1000l * 3600 * 24 * 120)); //4mo ahead //COConfigurationManager.save(); } //unused //public static void setMinDate(long timestamp) { // COConfigurationManager.setParameter("donations.minDate", timestamp); // COConfigurationManager.save(); //} public static int getInitialAskHours() { return initialAskHours; } public static void setInitialAskHours(int i) { initialAskHours = i; } public static void main(String[] args) { try { AzureusCoreFactory.create().start(); //checkForDonationPopup(); open(true, "test"); } catch (Exception e) { e.printStackTrace(); } Display d = Display.getDefault(); while (true) { if (!d.readAndDispatch()) { d.sleep(); } } } }