Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.stirante.soundcloudmodule;
- import android.app.Application;
- import android.app.DownloadManager;
- import android.content.Context;
- import android.net.Uri;
- import android.os.Build;
- import android.os.Environment;
- import android.view.MenuItem;
- import android.widget.PopupMenu;
- import android.widget.Toast;
- import java.io.File;
- import de.robv.android.xposed.IXposedHookLoadPackage;
- import de.robv.android.xposed.XC_MethodHook;
- import de.robv.android.xposed.XposedBridge;
- import de.robv.android.xposed.XposedHelpers;
- import de.robv.android.xposed.callbacks.XC_LoadPackage;
- /**
- * Created by stirante
- */
- public class XposedMain implements IXposedHookLoadPackage {
- private Object urlBuilder;
- public static final File DEFAULT_DIR = new File(Environment.getExternalStorageDirectory() + "/SoundCloud files/");
- public static void download(String src, String title, String creator, Context context) {
- File dst = new File(DEFAULT_DIR, creator + "/" + title + ".mp3");
- if (dst.exists()) dst.delete();
- DownloadManager.Request request = new DownloadManager.Request(Uri.parse(src));
- request.setTitle("Downloading " + creator + " - " + title);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- request.allowScanningByMediaScanner();
- request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
- }
- request.setDestinationUri(Uri.fromFile(dst));
- DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
- manager.enqueue(request);
- }
- @Override
- public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam packageParam) throws Throwable {
- if (packageParam.packageName.equalsIgnoreCase("com.soundcloud.android")) {
- XposedBridge.log("In SoundCloud");
- XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
- @Override
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
- final Context ctx = (Context) param.args[0];
- XposedHelpers.findAndHookMethod("com.soundcloud.android.playback.ui.TrackPageMenuController", packageParam.classLoader, "setupMenu", new XC_MethodHook() {
- @Override
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
- PopupMenu menu = (PopupMenu) XposedHelpers.getObjectField(XposedHelpers.getObjectField(param.thisObject, "popupMenuWrapper"), "popupMenu");
- menu.getMenu().add("Download");
- }
- });
- XposedHelpers.findAndHookMethod("com.soundcloud.android.playback.ui.TrackPageMenuController", packageParam.classLoader, "onMenuItemClick", XposedHelpers.findClass("android.view.MenuItem", packageParam.classLoader), XposedHelpers.findClass("android.content.Context", packageParam.classLoader), new XC_MethodHook() {
- @Override
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
- MenuItem item = (MenuItem) param.args[0];
- if (item.getTitle().toString().equalsIgnoreCase("Download")) {
- Object urn = XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "track"), "getUrn");
- String title = (String) XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "track"), "getTitle");
- String creator = (String) XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "track"), "getUserName");
- if (urlBuilder != null) {
- String url = (String) XposedHelpers.callMethod(urlBuilder, "buildHttpsStreamUrl", new Class[]{XposedHelpers.findClass("com.soundcloud.android.model.Urn", packageParam.classLoader)}, urn);
- download(url, title, creator, ctx);
- }
- else {
- Toast.makeText(ctx, "Failed to download!", Toast.LENGTH_SHORT).show();
- }
- param.setResult(true);
- }
- }
- });
- XposedHelpers.findAndHookConstructor("com.soundcloud.android.playback.StreamUrlBuilder", packageParam.classLoader, XposedHelpers.findClass("com.soundcloud.android.accounts.AccountOperations", packageParam.classLoader), XposedHelpers.findClass("com.soundcloud.android.api.ApiUrlBuilder", packageParam.classLoader), new XC_MethodHook() {
- @Override
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
- urlBuilder = param.thisObject;
- }
- });
- }
- });
- }
- }
- }
Add Comment
Please, Sign In to add comment