diff --git a/metadata/com.frostwire.android.txt b/metadata/com.frostwire.android.txt index 4fb413fce6..3358d58b5b 100644 --- a/metadata/com.frostwire.android.txt +++ b/metadata/com.frostwire.android.txt @@ -36,8 +36,9 @@ echo -e "\nandroid.library.reference.1=$$MobAdMob$$" >> project.properties Build Version:1.0.7,85,b1a6dde89,encoding=utf-8,srclibs=MobAdMob@2d5736,target=android-13,prebuild=\ rm -f libs/GoogleAdMob* && echo "android.library.reference.1=$$MobAdMob$$" >> project.properties && \ echo "source.dir=src;common/components" >> ant.properties -Build Version:1.1.0,94,a608ec69a422c,encoding=utf-8,srclibs=MobAdMob@2d5736,prebuild=\ -rm -f libs/GoogleAdMob* && echo "android.library.reference.1=$$MobAdMob$$" >> project.properties && \ +Build Version:1.1.1,96,!WIP patch at 1.1.1-b96,encoding=utf-8,\ +patch=update.patch;offercasts.patch,prebuild=\ +rm libs/offercast-mobile-sdk.jar && \ echo "source.dir=src;common/components" >> ant.properties Auto Update Mode:None diff --git a/metadata/com.frostwire.android/offercasts.patch b/metadata/com.frostwire.android/offercasts.patch new file mode 100644 index 0000000000..ab7e14bf78 --- /dev/null +++ b/metadata/com.frostwire.android/offercasts.patch @@ -0,0 +1,166 @@ +diff --git a/AndroidManifest.xml b/AndroidManifest.xml +index fab6564..07b7e63 100644 +--- a/AndroidManifest.xml ++++ b/AndroidManifest.xml +@@ -39,14 +39,6 @@ + + + +- +- +- +- +- +- + +@@ -161,34 +153,6 @@ + + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + + + + + +- +\ No newline at end of file ++ +diff --git a/src/core/com/frostwire/android/core/ConfigurationDefaults.java b/src/core/com/frostwire/android/core/ConfigurationDefaults.java +index a4e5bc0..f207a31 100644 +--- a/src/core/com/frostwire/android/core/ConfigurationDefaults.java ++++ b/src/core/com/frostwire/android/core/ConfigurationDefaults.java +@@ -66,7 +66,6 @@ final class ConfigurationDefaults { + defaultValues.put(Constants.PREF_KEY_GUI_SUPPORT_FROSTWIRE, true); + defaultValues.put(Constants.PREF_KEY_GUI_SUPPORT_FROSTWIRE_THRESHOLD, true); + defaultValues.put(Constants.PREF_KEY_GUI_SHOW_TV_MENU_ITEM,true); +- defaultValues.put(Constants.PREF_KEY_GUI_INITIALIZE_OFFERCAST,true); + + defaultValues.put(Constants.PREF_KEY_SEARCH_COUNT_DOWNLOAD_FOR_TORRENT_DEEP_SCAN, 20); + defaultValues.put(Constants.PREF_KEY_SEARCH_COUNT_ROUNDS_FOR_TORRENT_DEEP_SCAN, 10); +diff --git a/src/core/com/frostwire/android/core/Constants.java b/src/core/com/frostwire/android/core/Constants.java +index 8e21b68..26ba5a6 100644 +--- a/src/core/com/frostwire/android/core/Constants.java ++++ b/src/core/com/frostwire/android/core/Constants.java +@@ -85,7 +85,6 @@ public final class Constants { + public static final String PREF_KEY_GUI_SUPPORT_FROSTWIRE = "frostwire.prefs.gui.support_frostwire"; + public static final String PREF_KEY_GUI_SUPPORT_FROSTWIRE_THRESHOLD = "frostwire.prefs.gui.support_frostwire_threshold"; + public static final String PREF_KEY_GUI_SHOW_TV_MENU_ITEM = "frostwire.prefs.gui.show_tv_menu_item"; +- public static final String PREF_KEY_GUI_INITIALIZE_OFFERCAST = "frostwire.prefs.gui.initialize_offercast"; + + public static final String PREF_KEY_TORRENT_MAX_DOWNLOAD_SPEED = "frostwire.prefs.torrent.max_download_speed"; + public static final String PREF_KEY_TORRENT_MAX_UPLOAD_SPEED = "frostwire.prefs.torrent.max_upload_speed"; +@@ -151,4 +150,4 @@ public final class Constants { + public static final int DEVICE_MAJOR_TYPE_DESKTOP = CommonConstants.DEVICE_MAJOR_TYPE_DESKTOP; + public static final int DEVICE_MAJOR_TYPE_PHONE = CommonConstants.DEVICE_MAJOR_TYPE_PHONE; + public static final int DEVICE_MAJOR_TYPE_TABLET = CommonConstants.DEVICE_MAJOR_TYPE_TABLET; +-} +\ No newline at end of file ++} +diff --git a/src/gui/com/frostwire/android/gui/activities/MainActivity.java b/src/gui/com/frostwire/android/gui/activities/MainActivity.java +index fb76e43..1e131dc 100644 +--- a/src/gui/com/frostwire/android/gui/activities/MainActivity.java ++++ b/src/gui/com/frostwire/android/gui/activities/MainActivity.java +@@ -65,7 +65,6 @@ import com.frostwire.android.gui.views.Refreshable; + import com.frostwire.android.gui.views.ShareIndicationDialog; + import com.frostwire.android.gui.views.TOS; + import com.frostwire.android.gui.views.TOS.OnTOSAcceptListener; +-import com.offercast.android.sdk.OffercastSDK; + import com.slidingmenu.lib.SlidingMenu; + import com.slidingmenu.lib.SlidingMenu.CanvasTransformer; + import com.slidingmenu.lib.SlidingMenu.OnOpenListener; +@@ -82,7 +81,6 @@ public class MainActivity extends AbstractSlidingActivity { + private static final String FRAGMENT_STACK_TAG = "fragment_stack"; + private static final String CURRENT_FRAGMENT_KEY = "current_fragment"; + private static final String DUR_TOKEN_KEY = "dur_token"; +- private static final String OFFERCAST_STARTED_KEY = "offercast_started"; + + private static boolean firstTime = true; + +@@ -97,7 +95,6 @@ public class MainActivity extends AbstractSlidingActivity { + // not sure about this variable, quick solution for now + private String durToken; + +- private boolean offercastStarted = false; + + public MainActivity() { + super(R.layout.activity_main, false, 2); +@@ -123,7 +120,6 @@ public class MainActivity extends AbstractSlidingActivity { + + if (savedInstanceState != null) { + durToken = savedInstanceState.getString(DUR_TOKEN_KEY); +- offercastStarted = savedInstanceState.getBoolean(OFFERCAST_STARTED_KEY); + } + + addRefreshable((Refreshable) findView(R.id.activity_main_player_notifier)); +@@ -178,10 +174,6 @@ public class MainActivity extends AbstractSlidingActivity { + protected void onResume() { + super.onResume(); + +- if (!offercastStarted && ConfigurationManager.instance().getBoolean(Constants.PREF_KEY_GUI_INITIALIZE_OFFERCAST)) { +- startOffercast(); +- } +- + if (ConfigurationManager.instance().getBoolean(Constants.PREF_KEY_GUI_TOS_ACCEPTED)) { + if (ConfigurationManager.instance().getBoolean(Constants.PREF_KEY_GUI_INITIAL_SETTINGS_COMPLETE)) { + mainResume(); +@@ -197,18 +189,6 @@ public class MainActivity extends AbstractSlidingActivity { + } + } + +- private void startOffercast() { +- try { +- OffercastSDK offercast = OffercastSDK.getInstance(getApplicationContext()); +- offercast.authorize(); +- offercastStarted = true; +- LOG.info("Offercast started."); +- } catch (Exception e) { +- offercastStarted = false; +- LOG.error("Offercast could not start.",e); +- } +- } +- + @Override + protected void onPause() { + super.onPause(); +@@ -224,7 +204,6 @@ public class MainActivity extends AbstractSlidingActivity { + saveLastFragment(outState); + + outState.putString(DUR_TOKEN_KEY, durToken); +- outState.putBoolean(OFFERCAST_STARTED_KEY, offercastStarted); + } + + @Override diff --git a/metadata/com.frostwire.android/update.patch b/metadata/com.frostwire.android/update.patch new file mode 100644 index 0000000000..0a098bae80 --- /dev/null +++ b/metadata/com.frostwire.android/update.patch @@ -0,0 +1,468 @@ +diff --git a/src/gui/com/frostwire/android/gui/SoftwareUpdater.java b/src/gui/com/frostwire/android/gui/SoftwareUpdater.java +deleted file mode 100644 +index 21f26d7..0000000 +--- a/src/gui/com/frostwire/android/gui/SoftwareUpdater.java ++++ /dev/null +@@ -1,364 +0,0 @@ +-/* +- * Created by Angel Leon (@gubatron), Alden Torres (aldenml) +- * Copyright (c) 2011, 2012, FrostWire(TM). 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, either version 3 of the License, or +- * (at your option) any later version. +- * +- * 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, see . +- */ +- +-package com.frostwire.android.gui; +- +-import java.io.BufferedInputStream; +-import java.io.File; +-import java.io.FileInputStream; +-import java.io.InputStream; +-import java.math.BigInteger; +-import java.security.MessageDigest; +-import java.util.HashSet; +-import java.util.Map; +-import java.util.Set; +- +-import android.content.Context; +-import android.content.DialogInterface; +-import android.content.DialogInterface.OnClickListener; +-import android.content.Intent; +-import android.net.Uri; +-import android.os.AsyncTask; +-import android.util.Log; +- +-import com.frostwire.android.R; +-import com.frostwire.android.core.ConfigurationManager; +-import com.frostwire.android.core.Constants; +-import com.frostwire.android.core.HttpFetcher; +-import com.frostwire.android.gui.services.Engine; +-import com.frostwire.android.gui.util.SystemUtils; +-import com.frostwire.android.gui.util.UIUtils; +-import com.frostwire.android.util.ByteUtils; +-import com.frostwire.android.util.StringUtils; +-import com.frostwire.util.JsonUtils; +- +-/** +- * +- * @author gubatron +- * @author aldenml +- * +- */ +-public final class SoftwareUpdater { +- +- public interface ConfigurationUpdateListener { +- void onConfigurationUpdate(); +- } +- +- private static final String TAG = "FW.SoftwareUpdater"; +- +- private static final long UPDATE_MESSAGE_TIMEOUT = 30 * 60 * 1000; // 30 minutes +- +- private static final String UPDATE_ACTION_OTA = "ota"; +- private static final String UPDATE_ACTION_MARKET = "market"; +- +- private boolean oldVersion; +- private String latestVersion; +- private Update update; +- +- private long updateTimestamp; +- private AsyncTask updateTask; +- +- private final Set configurationUpdateListeners; +- +- private static SoftwareUpdater instance; +- +- public static SoftwareUpdater instance() { +- if (instance == null) { +- instance = new SoftwareUpdater(); +- } +- return instance; +- } +- +- private SoftwareUpdater() { +- this.oldVersion = false; +- this.latestVersion = Constants.FROSTWIRE_VERSION_STRING; +- this.configurationUpdateListeners = new HashSet(); +- } +- +- public boolean isOldVersion() { +- return oldVersion; +- } +- +- public String getLatestVersion() { +- return latestVersion; +- } +- +- public void checkForUpdate(final Context context) { +- long now = System.currentTimeMillis(); +- +- if (now - updateTimestamp < UPDATE_MESSAGE_TIMEOUT) { +- return; +- } +- +- updateTimestamp = now; +- updateTask = new AsyncTask() { +- @Override +- protected Boolean doInBackground(Void... params) { +- try { +- byte[] jsonBytes = new HttpFetcher(Constants.SERVER_UPDATE_URL).fetch(); +- update = JsonUtils.toObject(new String(jsonBytes), Update.class); +- +- latestVersion = update.v; +- String[] latestVersionArr = latestVersion.split("\\."); +- +- // lv = latest version +- byte[] lv = new byte[] { Byte.valueOf(latestVersionArr[0]), Byte.valueOf(latestVersionArr[1]), Byte.valueOf(latestVersionArr[2]) }; +- +- // mv = my version +- byte[] mv = Constants.FROSTWIRE_VERSION; +- +- oldVersion = isFrostWireOld(mv, lv); +- +- updateConfiguration(update); +- +- if (oldVersion) { +- if (update.a == null) { +- update.a = UPDATE_ACTION_OTA; // make it the old behavior +- } +- +- if (update.a.equals(UPDATE_ACTION_OTA)) { +- // did we download the newest already? +- if (downloadedLatestFrostWire(update.md5)) { +- return true; +- } +- // didn't download it? go get it now +- else { +- new HttpFetcher(update.u).save(SystemUtils.getUpdateInstallerPath()); +- +- if (downloadedLatestFrostWire(update.md5)) { +- return true; +- } +- } +- } else if (update.a.equals(UPDATE_ACTION_MARKET)) { +- return update.m != null; +- } +- } +- +- } catch (Throwable e) { +- Log.e(TAG, "Failed to check/retrieve/update the update information", e); +- } +- +- return false; +- } +- +- @Override +- protected void onPostExecute(Boolean result) { +- if (result && !isCancelled()) { +- notifyUpdate(context); +- } +- +- //nav menu always needs to be updated after we read the config. +- notifyConfigurationUpdateListeners(); +- } +- }; +- +- updateTask.execute(); +- } +- +- public void addConfigurationUpdateListener(ConfigurationUpdateListener listener) { +- try { +- configurationUpdateListeners.add(listener); +- } catch (Throwable t) { +- +- } +- } +- +- private void notifyUpdate(final Context context) { +- try { +- if (update.a == null) { +- update.a = UPDATE_ACTION_OTA; // make it the old behavior +- } +- +- if (update.a.equals(UPDATE_ACTION_OTA)) { +- if (!SystemUtils.getUpdateInstallerPath().exists()) { +- return; +- } +- +- String message = StringUtils.getLocaleString(update.updateMessages, context.getString(R.string.update_message)); +- +- UIUtils.showYesNoDialog(context, R.drawable.app_icon, message, R.string.update_title, new OnClickListener() { +- public void onClick(DialogInterface dialog, int which) { +- Engine.instance().stopServices(false); +- UIUtils.openFile(context, SystemUtils.getUpdateInstallerPath().getAbsolutePath(), Constants.MIME_TYPE_ANDROID_PACKAGE_ARCHIVE); +- } +- }); +- } else if (update.a.equals(UPDATE_ACTION_MARKET)) { +- +- String message = StringUtils.getLocaleString(update.marketMessages, context.getString(R.string.update_message)); +- +- UIUtils.showYesNoDialog(context, R.drawable.app_icon, message, R.string.update_title, new OnClickListener() { +- public void onClick(DialogInterface dialog, int which) { +- Intent intent = new Intent(Intent.ACTION_VIEW); +- intent.setData(Uri.parse(update.m)); +- context.startActivity(intent); +- } +- }); +- } +- } catch (Throwable e) { +- Log.e(TAG, "Failed to notify update", e); +- } +- } +- +- /** +- * +- * @param md5 +- * - Expected MD5 hash as a string. +- * @return +- */ +- private boolean downloadedLatestFrostWire(String md5) { +- if (!SystemUtils.getUpdateInstallerPath().exists()) { +- return false; +- } +- return checkMD5(SystemUtils.getUpdateInstallerPath(), md5); +- } +- +- /** +- * mv = my version +- * lv = latest version +- * +- * returns true if mv is older. +- */ +- private boolean isFrostWireOld(byte[] mv, byte[] lv) { +- if (mv[0] < lv[0]) { +- return true; +- } +- +- if (mv[0] == lv[0] && mv[1] < lv[1]) { +- return true; +- } +- +- if (mv[0] == lv[0] && mv[1] == lv[1] && mv[2] < lv[2]) { +- return true; +- } +- +- return false; +- } +- +- private static String getMD5(File f) { +- try { +- MessageDigest m = MessageDigest.getInstance("MD5"); +- +- // We read the file in buffers so we don't +- // eat all the memory in case we have a huge plugin. +- byte[] buf = new byte[65536]; +- int num_read; +- +- InputStream in = new BufferedInputStream(new FileInputStream(f)); +- +- while ((num_read = in.read(buf)) != -1) { +- m.update(buf, 0, num_read); +- } +- +- in.close(); +- +- String result = new BigInteger(1, m.digest()).toString(16); +- +- // pad with zeros if until it's 32 chars long. +- if (result.length() < 32) { +- int paddingSize = 32 - result.length(); +- for (int i = 0; i < paddingSize; i++) { +- result = "0" + result; +- } +- } +- +- return result; +- } catch (Exception e) { +- return null; +- } +- } +- +- private static boolean checkMD5(File f, String expectedMD5) { +- if (expectedMD5 == null) { +- return false; +- } +- +- if (expectedMD5.length() != 32) { +- return false; +- } +- +- String checkedMD5 = getMD5(f); +- if (checkedMD5 == null) { +- return false; +- } +- +- return checkedMD5.trim().equalsIgnoreCase(expectedMD5.trim()); +- } +- +- private void updateConfiguration(Update update) { +- if (update.config == null) { +- return; +- } +- +- ConfigurationManager.instance().setBoolean(Constants.PREF_KEY_GUI_SUPPORT_FROSTWIRE_THRESHOLD, ByteUtils.randomInt(0, 100) < update.config.supportThreshold); +- +- for (String name : update.config.activeSearchEngines.keySet()) { +- SearchEngine engine = SearchEngine.forName(name); +- if (engine != null) { +- engine.setActive(update.config.activeSearchEngines.get(name)); +- } +- } +- +- ConfigurationManager.instance().setBoolean(Constants.PREF_KEY_GUI_SHOW_TV_MENU_ITEM,update.config.tv); +- ConfigurationManager.instance().setBoolean(Constants.PREF_KEY_GUI_INITIALIZE_OFFERCAST, update.config.offercast); +- } +- +- private void notifyConfigurationUpdateListeners() { +- for (ConfigurationUpdateListener listener : configurationUpdateListeners) { +- try { +- listener.onConfigurationUpdate(); +- } catch (Throwable t) { +- +- } +- } +- } +- +- private static class Update { +- public String v; +- public String u; +- public String md5; +- +- /** +- * Address from the market +- */ +- public String m; +- +- /** +- * Action for the update message +- * - "ota" is download from 'u' (a regular http) +- * - "market" go to market page +- */ +- public String a; +- +- public Map updateMessages; +- public Map marketMessages; +- public Config config; +- } +- +- private static class Config { +- public int supportThreshold = 100; +- public Map activeSearchEngines; +- public boolean tv = true; +- public boolean offercast = true; +- } +- +- public void removeConfigurationUpdateListener(Object slideMenuFragment) { +- if (configurationUpdateListeners.size() > 0) { +- configurationUpdateListeners.remove(slideMenuFragment); +- } +- } +-} +\ No newline at end of file +diff --git a/src/gui/com/frostwire/android/gui/activities/MainActivity.java b/src/gui/com/frostwire/android/gui/activities/MainActivity.java +index 433a447..fb76e43 100644 +--- a/src/gui/com/frostwire/android/gui/activities/MainActivity.java ++++ b/src/gui/com/frostwire/android/gui/activities/MainActivity.java +@@ -47,7 +47,6 @@ import com.frostwire.android.core.DesktopUploadRequestStatus; + import com.frostwire.android.core.FileDescriptor; + import com.frostwire.android.gui.Librarian; + import com.frostwire.android.gui.PeerManager; +-import com.frostwire.android.gui.SoftwareUpdater; + import com.frostwire.android.gui.fragments.AboutFragment; + import com.frostwire.android.gui.fragments.BrowsePeerFragment; + import com.frostwire.android.gui.fragments.BrowsePeersFragment; +@@ -539,6 +538,5 @@ public class MainActivity extends AbstractSlidingActivity { + Engine.instance().startServices(); // it's necessary for the first time after wizard + } + +- SoftwareUpdater.instance().checkForUpdate(this); + } +-} +\ No newline at end of file ++} +diff --git a/src/gui/com/frostwire/android/gui/adapters/PeerListAdapter.java b/src/gui/com/frostwire/android/gui/adapters/PeerListAdapter.java +index acf1d6b..a5fc333 100644 +--- a/src/gui/com/frostwire/android/gui/adapters/PeerListAdapter.java ++++ b/src/gui/com/frostwire/android/gui/adapters/PeerListAdapter.java +@@ -33,7 +33,6 @@ import android.widget.TextView; + import com.frostwire.android.R; + import com.frostwire.android.core.Constants; + import com.frostwire.android.gui.Peer; +-import com.frostwire.android.gui.SoftwareUpdater; + import com.frostwire.android.gui.activities.BrowsePeerActivity; + import com.frostwire.android.gui.activities.MainActivity; + import com.frostwire.android.gui.adapters.menu.BrowsePeerMenuAction; +@@ -85,12 +84,6 @@ public class PeerListAdapter extends AbstractListAdapter { + } else { + title.setTextColor(0xff54afe4); + +- // show my version in red If I'm old to encourage user to update. +- if (SoftwareUpdater.instance().isOldVersion()) { +- version.setTextColor(Color.RED); +- version.setText(getContext().getString(R.string.please_update_to_v, SoftwareUpdater.instance().getLatestVersion())); +- } +- + howtoShareButton.setVisibility(View.VISIBLE); + howtoShareButton.setImageResource(R.drawable.share_howto); + } +@@ -166,4 +159,4 @@ public class PeerListAdapter extends AbstractListAdapter { + + return new MenuAdapter(context, peer.getNickname(), items); + } +-} +\ No newline at end of file ++} +diff --git a/src/gui/com/frostwire/android/gui/fragments/SlideMenuFragment.java b/src/gui/com/frostwire/android/gui/fragments/SlideMenuFragment.java +index 345d2d9..1681c07 100644 +--- a/src/gui/com/frostwire/android/gui/fragments/SlideMenuFragment.java ++++ b/src/gui/com/frostwire/android/gui/fragments/SlideMenuFragment.java +@@ -45,8 +45,6 @@ import android.widget.TextView; + import com.frostwire.android.R; + import com.frostwire.android.core.ConfigurationManager; + import com.frostwire.android.core.Constants; +-import com.frostwire.android.gui.SoftwareUpdater; +-import com.frostwire.android.gui.SoftwareUpdater.ConfigurationUpdateListener; + import com.frostwire.android.gui.activities.MainActivity; + import com.frostwire.android.gui.activities.MediaPlayerActivity; + import com.frostwire.android.gui.activities.PreferencesActivity; +@@ -58,7 +56,7 @@ import com.frostwire.android.gui.views.PlayerMenuItemView; + * @author aldenml + * + */ +-public class SlideMenuFragment extends ListFragment implements ConfigurationUpdateListener { ++public class SlideMenuFragment extends ListFragment { + + private static final Logger LOG = LoggerFactory.getLogger(SlideMenuFragment.class); + +@@ -82,7 +80,6 @@ public class SlideMenuFragment extends ListFragment implements ConfigurationUpda + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); +- SoftwareUpdater.instance().addConfigurationUpdateListener(this); + initMenuItems(); + } + +@@ -296,11 +293,4 @@ public class SlideMenuFragment extends ListFragment implements ConfigurationUpda + initMenuItems(); + } + +- @Override +- public void onDestroy() { +- super.onDestroy(); +- +- //avoid memory leaks when the device is tilted and the menu gets recreated. +- SoftwareUpdater.instance().removeConfigurationUpdateListener(this); +- } +-} +\ No newline at end of file ++}