Advertisement
stirante

NowPlaying

Jan 22nd, 2016
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.00 KB | None | 0 0
  1. package com.stirante.quizcheat;
  2.  
  3. import android.app.Application;
  4. import android.app.PendingIntent;
  5. import android.content.BroadcastReceiver;
  6. import android.content.ContentResolver;
  7. import android.content.ContentUris;
  8. import android.content.Context;
  9. import android.content.Intent;
  10. import android.content.IntentFilter;
  11. import android.content.res.XModuleResources;
  12. import android.content.res.XResources;
  13. import android.database.Cursor;
  14. import android.database.DatabaseUtils;
  15. import android.graphics.Bitmap;
  16. import android.graphics.BitmapFactory;
  17. import android.graphics.Canvas;
  18. import android.graphics.Paint;
  19. import android.net.Uri;
  20. import android.os.Bundle;
  21. import android.os.Handler;
  22. import android.os.ParcelFileDescriptor;
  23. import android.os.RemoteException;
  24. import android.provider.MediaStore;
  25. import android.util.TypedValue;
  26. import android.view.LayoutInflater;
  27. import android.view.View;
  28. import android.view.ViewGroup;
  29. import android.widget.ImageView;
  30. import android.widget.LinearLayout;
  31. import android.widget.RelativeLayout;
  32. import android.widget.TextView;
  33.  
  34. import java.io.FileNotFoundException;
  35. import java.io.IOException;
  36. import java.lang.ref.WeakReference;
  37. import java.util.List;
  38.  
  39. import de.robv.android.xposed.XC_MethodHook;
  40. import de.robv.android.xposed.XposedBridge;
  41. import de.robv.android.xposed.XposedHelpers;
  42. import de.robv.android.xposed.callbacks.XC_InitPackageResources;
  43. import de.robv.android.xposed.callbacks.XC_LayoutInflated;
  44. import de.robv.android.xposed.callbacks.XC_LoadPackage;
  45.  
  46. /**
  47.  * Created by stirante
  48.  */
  49. public class NowPlayingFilter {
  50.  
  51.     private static String artist = "No data";
  52.     private static String album = "No data";
  53.     private static String title = "No data";
  54.     private static boolean playing;
  55.     private static boolean isBitmapReady = false;
  56.     private static Bitmap bitmap;
  57.     private static View nowPlaying;
  58.  
  59.     public static void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) throws Throwable {
  60.         resparam.res.hookLayout("com.snapchat.android", "layout", "battery_view", new XC_LayoutInflated() {
  61.             LinearLayout.LayoutParams batteryLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
  62.  
  63.             @Override
  64.             public void handleLayoutInflated(LayoutInflatedParam liparam) throws Throwable {
  65.                 View battery = liparam.view.findViewById(liparam.res.getIdentifier("battery_icon", "id", "com.snapchat.android"));
  66.                 battery.setLayoutParams(batteryLayoutParams);
  67.                 battery.setPadding(0, 0, 0, 0);
  68.             }
  69.         });
  70.     }
  71.  
  72.     public static void handleLoadPackage(final XC_LoadPackage.LoadPackageParam packageParam, Context ctx) throws Throwable {
  73.         Context myContext = ctx.createPackageContext("com.stirante.quizcheat", Context.CONTEXT_IGNORE_SECURITY);
  74.         nowPlaying = LayoutInflater.from(myContext).inflate(R.layout.now_playing, null);
  75.         IntentFilter iF = new IntentFilter();
  76.         iF.addAction("com.android.music.metachanged");
  77.         iF.addAction("com.android.music.playstatechanged");
  78.         iF.addAction("com.android.music.playbackcomplete");
  79.         iF.addAction("com.android.music.queuechanged");
  80.  
  81.         iF.addAction("com.htc.music.metachanged");
  82.  
  83.         iF.addAction("fm.last.android.metachanged");
  84.         iF.addAction("com.sec.android.app.music.metachanged");
  85.         iF.addAction("com.nullsoft.winamp.metachanged");
  86.         iF.addAction("com.amazon.mp3.metachanged");
  87.         iF.addAction("com.miui.player.metachanged");
  88.         iF.addAction("com.real.IMP.metachanged");
  89.         iF.addAction("com.sonyericsson.music.metachanged");
  90.         iF.addAction("com.rdio.android.metachanged");
  91.         iF.addAction("com.samsung.sec.android.MusicPlayer.metachanged");
  92.         iF.addAction("com.andrew.apollo.metachanged");
  93.  
  94.         iF.addAction("com.android.music.playstatechanged");
  95.         iF.addAction("com.android.music.playbackcomplete");
  96.         iF.addAction("com.android.music.metachanged");
  97.         //HTC Music
  98.         iF.addAction("com.htc.music.playstatechanged");
  99.         iF.addAction("com.htc.music.playbackcomplete");
  100.         iF.addAction("com.htc.music.metachanged");
  101.         //MIUI Player
  102.         iF.addAction("com.miui.player.playstatechanged");
  103.         iF.addAction("com.miui.player.playbackcomplete");
  104.         iF.addAction("com.miui.player.metachanged");
  105.         //Real
  106.         iF.addAction("com.real.IMP.playstatechanged");
  107.         iF.addAction("com.real.IMP.playbackcomplete");
  108.         iF.addAction("com.real.IMP.metachanged");
  109.         //SEMC Music Player
  110.         iF.addAction("com.sonyericsson.music.playbackcontrol.ACTION_TRACK_STARTED");
  111.         iF.addAction("com.sonyericsson.music.playbackcontrol.ACTION_PAUSED");
  112.         iF.addAction("com.sonyericsson.music.TRACK_COMPLETED");
  113.         iF.addAction("com.sonyericsson.music.metachanged");
  114.         iF.addAction("com.sonyericsson.music.playbackcomplete");
  115.         iF.addAction("com.sonyericsson.music.playstatechanged");
  116.         //rdio
  117.         iF.addAction("com.rdio.android.metachanged");
  118.         iF.addAction("com.rdio.android.playstatechanged");
  119.         //Samsung Music Player
  120.         iF.addAction("com.samsung.sec.android.MusicPlayer.playstatechanged");
  121.         iF.addAction("com.samsung.sec.android.MusicPlayer.playbackcomplete");
  122.         iF.addAction("com.samsung.sec.android.MusicPlayer.metachanged");
  123.         iF.addAction("com.sec.android.app.music.playstatechanged");
  124.         iF.addAction("com.sec.android.app.music.playbackcomplete");
  125.         iF.addAction("com.sec.android.app.music.metachanged");
  126.         //Winamp
  127.         iF.addAction("com.nullsoft.winamp.playstatechanged");
  128.         //Amazon
  129.         iF.addAction("com.amazon.mp3.playstatechanged");
  130.         //Rhapsody
  131.         iF.addAction("com.rhapsody.playstatechanged");
  132.         //PowerAmp
  133.         iF.addAction("com.maxmpz.audioplayer.playstatechanged");
  134.         //Last.fm
  135.         iF.addAction("fm.last.android.metachanged");
  136.         iF.addAction("fm.last.android.playbackpaused");
  137.         iF.addAction("fm.last.android.playbackcomplete");
  138.         //A simple last.fm scrobbler
  139.         iF.addAction("com.adam.aslfms.notify.playstatechanged");
  140.         //Scrobble Droid
  141.         iF.addAction("net.jjc1138.android.scrobbler.action.MUSIC_STATUS");
  142.         //Spotify
  143.         iF.addAction("com.spotify.music.metadatachanged");
  144.         iF.addAction("com.spotify.music.playbackstatechanged");
  145.         iF.addAction("com.spotify.music.queuechanged");
  146.         ctx.registerReceiver(new BroadcastReceiver() {
  147.             @Override
  148.             public void onReceive(Context context, Intent intent) {
  149.                 for (String key : intent.getExtras().keySet()) {
  150.                     XposedBridge.log(key + ": " + intent.getExtras().get(key));
  151.                 }
  152.                 XposedBridge.log("----");
  153.                 String artist = intent.getStringExtra("artist");
  154.                 String album = intent.getStringExtra("album");
  155.                 String title = intent.getStringExtra("track");
  156.                 if (artist == null || album == null || title == null) {
  157.                     playing = false;
  158.                     return;
  159.                 }
  160.                 if (!artist.equalsIgnoreCase(NowPlayingFilter.artist) || !album.equalsIgnoreCase(NowPlayingFilter.album) || !title.equalsIgnoreCase(NowPlayingFilter.title)) {
  161.                     isBitmapReady = false;
  162.                 }
  163.                 NowPlayingFilter.artist = artist;
  164.                 NowPlayingFilter.album = album;
  165.                 NowPlayingFilter.title = title;
  166.                 playing = intent.getBooleanExtra("playing", true);
  167.             }
  168.         }, iF);
  169.         initFilter(packageParam);
  170.     }
  171.  
  172.     public static void initFilter(final XC_LoadPackage.LoadPackageParam packageParam) {
  173.         final Class<?> fc = XposedHelpers.findClass("SR", packageParam.classLoader);
  174.         final Class<?> el = XposedHelpers.findClass("RY", packageParam.classLoader);
  175.         XposedHelpers.findAndHookMethod("Te", packageParam.classLoader, "a", Context.class, XposedHelpers.findClass("PX", packageParam.classLoader), new XC_MethodHook() {
  176.             @Override
  177.             protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  178.                 XposedBridge.log("Adding now playing");
  179.                 Object elObj = XposedHelpers.newInstance(el, param.args[1]);
  180.                 View view = (View) XposedHelpers.callMethod(param.args[1], "a", new Class[]{int.class, ViewGroup.class, boolean.class}, 2130968587, null, false);
  181.                 XposedHelpers.setObjectField(elObj, "a", view);
  182.                 ImageView image = (ImageView) XposedHelpers.callMethod(view, "findViewById", 2131558548);
  183.                 if (!isBitmapReady)
  184.                     generateBitmap((Context) param.args[0]);
  185.                 image.setImageBitmap(bitmap);
  186.                 image.setTranslationY(0);
  187.                 ((List) param.getResult()).add(XposedHelpers.newInstance(fc, elObj));
  188.             }
  189.         });
  190.     }
  191.  
  192.     private final static int WIDTH = 886;
  193.     private final static int HEIGHT = 1575;
  194.  
  195.     private static void generateBitmap(Context ctx) {
  196.         bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888);
  197.         Canvas c = new Canvas(bitmap);
  198.         ((ImageView) nowPlaying.findViewById(R.id.albumImage)).setImageBitmap(albumArt);
  199.         ((TextView) nowPlaying.findViewById(R.id.album)).setText(album);
  200.         ((TextView) nowPlaying.findViewById(R.id.title)).setText(title);
  201.         ((TextView) nowPlaying.findViewById(R.id.artist)).setText(artist);
  202.         nowPlaying.setLayoutParams(new RelativeLayout.LayoutParams(WIDTH, HEIGHT));
  203.         nowPlaying.measure(View.MeasureSpec.makeMeasureSpec(nowPlaying.getLayoutParams().width, View.MeasureSpec.EXACTLY),
  204.                 View.MeasureSpec.makeMeasureSpec(nowPlaying.getLayoutParams().height, View.MeasureSpec.EXACTLY));
  205.         nowPlaying.layout(0, 0, WIDTH, HEIGHT);
  206.         nowPlaying.draw(c);
  207.     }
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement