// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/observer/Observer.java
// public class Observer implements IObserver{
//     private String Tag = this.getClass().getName();
// 
//     private Method method = null;
//     private Object context = null;
// 
//     public static IObserver withNotifyMethod(Method method, Object context) {
//         return new Observer(method, context);
//     }
// 
//     public Observer(Method method, Object context) {
//         this.method = method;
//         this.context = context;
//     }
// 
//     @Override
//     public boolean comparedNotifyContext(Object context) {
//         return this.context.equals(context);
//     }
// 
//     @Override
//     public void setNotifyContext(Object context) {
//         this.context = context;
//     }
// 
//     @Override
//     public void setNotifyMethod(Method method) {
//         this.method = method;
//     }
// 
//     @Override
//     public void notifyObserver(INotification notification) {
//         if (null == context) {
//             Log.e(Tag, "Notify observer failed content is null");
//             return;
//         }
// 
//         if (null == method) {
//             Log.e(Tag, "Notify observer failed method is null");
//             return;
//         }
// 
//         if (null == notification) {
//             Log.e(Tag, "Notify observer failed notification is null");
//             return;
//         }
//         try {
//             method.invoke(context, notification);
//         } catch (IllegalAccessException e) {
//             e.printStackTrace();
//         } catch (InvocationTargetException e) {
//             e.printStackTrace();
//         }
//     }
// 
// }
// 
// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/protocol/IMediator.java
// public interface IMediator {
//     String Method_Name = "handleNotification";
// 
//     void onRegister();
//     void onRemove();
// 
//     void setViewComponent(Object viewComponent);
//     Object getViewComponent();
// 
//     void setMediatorName(String name);
//     String getMediatorName();
// 
//     void initializeMediator();
//     void handleNotification(INotification notification);
//     String[] listNotificationInterests();
// }
// 
// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/protocol/INotification.java
// public interface INotification {
// 
//     void setName(String name);
//     String getName();
// 
//     void setObject(Object object);
//     Object getObject();
// 
//     void setType(String type);
//     String getType();
// }
// 
// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/protocol/IObserver.java
// public interface IObserver {
// 
//     boolean comparedNotifyContext(Object context);
//     void setNotifyContext(Object context);
//     void notifyObserver(INotification notification);
//     void setNotifyMethod(Method method);
// }
// 
// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/protocol/IView.java
// public interface IView {
//     void registerMediator(String key, Class cls);
//     void removeMediator(String key);
// 
//     IMediator getMediator(String key);
//     boolean hasMediator(String key);
// 
//     void notifyObservers(INotification notification);
//     void registerObserver(IObserver observer, String notificationName);
//     void removeObserver(Object context, String notificationName);
// }


import android.util.Log;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import com.example.puremvc_appfacade.Runs.observer.Observer;
import com.example.puremvc_appfacade.Runs.protocol.IMediator;
import com.example.puremvc_appfacade.Runs.protocol.INotification;
import com.example.puremvc_appfacade.Runs.protocol.IObserver;
import com.example.puremvc_appfacade.Runs.protocol.IView;
            return;
        }
        if (!hasMediator(key)) {
            Log.e(TAG, "Remove Mediator with " + key + " failed");
            return;
        }
        IMediator mediator = iMediatorMap.remove(key);
        if (null == mediator) {
            return;
        }

        String notificationList[] = mediator.listNotificationInterests();
        for (String notificationName : notificationList) {
            this.removeObserver(mediator, notificationName);
        }
        mediator.onRemove();
    }


    @Override
    public void registerObserver(IObserver observer, String notificationName) {
        ArrayList<IObserver> observers = iObserverMap.get(notificationName);
        if (null == observers || observers.size() <= 0) {
            observers = new ArrayList<>();
            iObserverMap.put(notificationName, observers);
        }
        observers.add(observer);
    }

    @Override
// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/observer/Observer.java
// public class Observer implements IObserver{
//     private String Tag = this.getClass().getName();
// 
//     private Method method = null;
//     private Object context = null;
// 
//     public static IObserver withNotifyMethod(Method method, Object context) {
//         return new Observer(method, context);
//     }
// 
//     public Observer(Method method, Object context) {
//         this.method = method;
//         this.context = context;
//     }
// 
//     @Override
//     public boolean comparedNotifyContext(Object context) {
//         return this.context.equals(context);
//     }
// 
//     @Override
//     public void setNotifyContext(Object context) {
//         this.context = context;
//     }
// 
//     @Override
//     public void setNotifyMethod(Method method) {
//         this.method = method;
//     }
// 
//     @Override
//     public void notifyObserver(INotification notification) {
//         if (null == context) {
//             Log.e(Tag, "Notify observer failed content is null");
//             return;
//         }
// 
//         if (null == method) {
//             Log.e(Tag, "Notify observer failed method is null");
//             return;
//         }
// 
//         if (null == notification) {
//             Log.e(Tag, "Notify observer failed notification is null");
//             return;
//         }
//         try {
//             method.invoke(context, notification);
//         } catch (IllegalAccessException e) {
//             e.printStackTrace();
//         } catch (InvocationTargetException e) {
//             e.printStackTrace();
//         }
//     }
// 
// }
// 
// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/protocol/IMediator.java
// public interface IMediator {
//     String Method_Name = "handleNotification";
// 
//     void onRegister();
//     void onRemove();
// 
//     void setViewComponent(Object viewComponent);
//     Object getViewComponent();
// 
//     void setMediatorName(String name);
//     String getMediatorName();
// 
//     void initializeMediator();
//     void handleNotification(INotification notification);
//     String[] listNotificationInterests();
// }
// 
// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/protocol/INotification.java
// public interface INotification {
// 
//     void setName(String name);
//     String getName();
// 
//     void setObject(Object object);
//     Object getObject();
// 
//     void setType(String type);
//     String getType();
// }
// 
// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/protocol/IObserver.java
// public interface IObserver {
// 
//     boolean comparedNotifyContext(Object context);
//     void setNotifyContext(Object context);
//     void notifyObserver(INotification notification);
//     void setNotifyMethod(Method method);
// }
// 
// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/protocol/IView.java
// public interface IView {
//     void registerMediator(String key, Class cls);
//     void removeMediator(String key);
// 
//     IMediator getMediator(String key);
//     boolean hasMediator(String key);
// 
//     void notifyObservers(INotification notification);
//     void registerObserver(IObserver observer, String notificationName);
//     void removeObserver(Object context, String notificationName);
// }


// Path: puremvc_appfacade/src/main/java/com/example/puremvc_appfacade/Runs/core/View.java
import android.util.Log;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import com.example.puremvc_appfacade.Runs.observer.Observer;
import com.example.puremvc_appfacade.Runs.protocol.IMediator;
import com.example.puremvc_appfacade.Runs.protocol.INotification;
import com.example.puremvc_appfacade.Runs.protocol.IObserver;
import com.example.puremvc_appfacade.Runs.protocol.IView;

            return;
        }
        if (!hasMediator(key)) {
            Log.e(TAG, "Remove Mediator with " + key + " failed");
            return;
        }
        IMediator mediator = iMediatorMap.remove(key);
        if (null == mediator) {
            return;
        }

        String notificationList[] = mediator.listNotificationInterests();
        for (String notificationName : notificationList) {
            this.removeObserver(mediator, notificationName);
        }
        mediator.onRemove();
    }


    @Override
    public void registerObserver(IObserver observer, String notificationName) {
        ArrayList<IObserver> observers = iObserverMap.get(notificationName);
        if (null == observers || observers.size() <= 0) {
            observers = new ArrayList<>();
            iObserverMap.put(notificationName, observers);
        }
        observers.add(observer);
    }

    @Override
    public void removeObserver(Object context, String notificationName) {