package android.taobao.atlas.runtime.newcomponent.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ResolveInfo;
import android.os.Handler;
import android.os.Looper;
import android.taobao.atlas.runtime.RuntimeVariables;
import android.taobao.atlas.runtime.newcomponent.AdditionalPackageManager;
import android.taobao.atlas.runtime.newcomponent.service.ServiceBridge;
import java.util.List;
/**
* Created by guanjie on 2017/4/12.
*/
public class ReceiverBridge {
private static DelegateReceiver receiver;
private static Handler sMainHandler = new Handler(Looper.getMainLooper());
public synchronized static void registerAdditionalReceiver() {
if(receiver == null){
receiver = new DelegateReceiver();
IntentFilter additionalFilter = AdditionalPackageManager.getInstance().getAdditionIntentFilter();
RuntimeVariables.androidApplication.registerReceiver(receiver,additionalFilter);
}
}
public static void postOnReceived(final Intent intent,final ActivityInfo info){
sMainHandler.post(new Runnable() {
@Override
public void run() {
try{
Class clazz = RuntimeVariables.androidApplication.getClassLoader().loadClass(info.name);
BroadcastReceiver receiver = (BroadcastReceiver) clazz.newInstance();
receiver.onReceive(RuntimeVariables.androidApplication,intent);
}catch(Throwable e){
e.printStackTrace();
}
}
});
}
public static class DelegateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent==null){
return;
}
List<ResolveInfo> infos = AdditionalPackageManager.getInstance().queryIntentReceivers(intent);
if(infos!=null){
for(ResolveInfo info : infos){
if(info.activityInfo.processName.equals(context.getPackageName())){
// main process
postOnReceived(intent,info.activityInfo);
}else{
// remote process
ServiceBridge.notifyonReceived(intent,info.activityInfo);
}
}
}
}
}
}