diff --git a/VirtualApp/app/src/main/java/io/virtualapp/VApp.java b/VirtualApp/app/src/main/java/io/virtualapp/VApp.java index 28f3ce392..5d2c52d66 100644 --- a/VirtualApp/app/src/main/java/io/virtualapp/VApp.java +++ b/VirtualApp/app/src/main/java/io/virtualapp/VApp.java @@ -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; @@ -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 diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/ClipBoardStub.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/ClipBoardStub.java old mode 100644 new mode 100755 index 7744b3276..c6b5e25c9 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/ClipBoardStub.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/ClipBoardStub.java @@ -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")); diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/MyClipData.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/MyClipData.java new file mode 100644 index 000000000..1dd310f64 --- /dev/null +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/MyClipData.java @@ -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; + } + +} diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/MyGetPrimaryClip.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/MyGetPrimaryClip.java new file mode 100644 index 000000000..232d45ce7 --- /dev/null +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/MyGetPrimaryClip.java @@ -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(); + } +} diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/MySetPrimaryClip.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/MySetPrimaryClip.java new file mode 100644 index 000000000..96a7ba6ac --- /dev/null +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/MySetPrimaryClip.java @@ -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(); + } +}