Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions VirtualApp/app/src/main/java/io/virtualapp/VApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import com.flurry.android.FlurryAgent;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.client.hook.proxies.clipboard.ClipBoardStub;
import com.lody.virtual.client.stub.VASettings;

import io.virtualapp.delegate.MyAppRequestListener;
Expand Down Expand Up @@ -44,6 +45,15 @@ public void onCreate() {
gApp = this;
super.onCreate();
VirtualCore virtualCore = VirtualCore.get();

//剪切板
ClipBoardStub clipBoardStub=new ClipBoardStub();
try {
clipBoardStub.inject();
} catch (Throwable throwable) {
throwable.printStackTrace();
}

virtualCore.initialize(new VirtualCore.VirtualInitializer() {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,11 @@ private static IInterface getInterface() {
@Override
protected void onBindMethods() {
super.onBindMethods();
addMethodProxy(new ReplaceLastPkgMethodProxy("getPrimaryClip"));
//addMethodProxy(new ReplaceLastPkgMethodProxy("getPrimaryClip"));
addMethodProxy(new MyGetPrimaryClip("getPrimaryClip"));
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
addMethodProxy(new ReplaceLastPkgMethodProxy("setPrimaryClip"));
//addMethodProxy(new ReplaceLastPkgMethodProxy("setPrimaryClip"));
addMethodProxy(new MySetPrimaryClip("setPrimaryClip"));
addMethodProxy(new ReplaceLastPkgMethodProxy("getPrimaryClipDescription"));
addMethodProxy(new ReplaceLastPkgMethodProxy("hasPrimaryClip"));
addMethodProxy(new ReplaceLastPkgMethodProxy("addPrimaryClipChangedListener"));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.lody.virtual.client.hook.proxies.clipboard;

import java.io.Serializable;

public class MyClipData implements Serializable{
public String clipData="";

public void ClipString(){}

public void setClipData(String clipData){
this.clipData=clipData;

}

public String getClipData(){
return clipData;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.lody.virtual.client.hook.proxies.clipboard;

import android.content.ClipData;
import android.os.Environment;
import android.util.Log;

import com.lody.virtual.client.hook.base.ReplaceLastPkgMethodProxy;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.lang.reflect.Method;


public class MyGetPrimaryClip extends ReplaceLastPkgMethodProxy {
final MyClipData myClipData =new MyClipData();

public MyGetPrimaryClip(String name) {
super(name);
}

@Override
public Object call(Object who, Method method, Object... args) throws Throwable {

if ("getPrimaryClip".equals(method.getName())){
getClipData();
Thread.sleep(100);
if (myClipData ==null){
return ClipData.newPlainText(null, null);
}else {
String s= myClipData.getClipData().toString();
return ClipData.newPlainText(null, s);
}
}
return super.call(who, method, args);
}

private void getClipData() {
new Thread(new Runnable() {
@Override
public void run() {
File file=new File(Environment.getExternalStorageDirectory().getPath()+"/cd.tx");
if (file.exists()){
ObjectInputStream objectInputStream=null;
try {
objectInputStream=new ObjectInputStream(new FileInputStream(file));
MyClipData clipData = (MyClipData) objectInputStream.readObject();
myClipData.setClipData(clipData.getClipData());

} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
try {
if (objectInputStream != null){
objectInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package com.lody.virtual.client.hook.proxies.clipboard;

import android.content.ClipData;
import android.os.Environment;
import android.util.Log;

import com.lody.virtual.client.hook.base.ReplaceLastPkgMethodProxy;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;


public class MySetPrimaryClip extends ReplaceLastPkgMethodProxy {
private static final String TAG="MySetPrimaryClip";
public MySetPrimaryClip(String name) {
super(name);
}


@Override
public Object call(Object who, Method method, Object... args) throws Throwable {

Object object=args[0];
String str=object.toString();
String s="";

if (str.startsWith("ClipData { text/plain")){
String[] ss=str.split("T:",2);
if (ss.length != 1){
if (ss[1].endsWith("} }")){
s=ss[1].substring(0,ss[1].length()-3);
}else {
s="";
}
}else {
s="";
}
}else if (str.startsWith("ClipData { text/html")){
String[] ss=str.split(">");
String[] sss=ss[1].split("<");
s=sss[0];
}else {
s="";
}
putFile(s);

if ("setPrimaryClip".equals(method.getName())){
return ClipData.newPlainText(null,s);
}
return super.call(who, method, args);
}

private void putFile(final String s) {
new Thread(new Runnable() {
@Override
public void run() {
MyClipData myClipData =new MyClipData();
myClipData.setClipData(s);
File sdcardDir=Environment.getExternalStorageDirectory();
String path=sdcardDir.getPath();
File ClipPath=new File(path+"/cd.tx");
if (!sdcardDir.exists()){
sdcardDir.mkdirs();
}
if (!ClipPath.exists()){
try {
ClipPath.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}else if (ClipPath.exists()){
ClipPath.delete();
try {
ClipPath.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}

ObjectOutputStream objectOutputStream=null;
try {
objectOutputStream=new ObjectOutputStream(new FileOutputStream(ClipPath));
objectOutputStream.writeObject(myClipData);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (objectOutputStream !=null){
objectOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
}