content: package com.antfortune.freeline.idea.utils;
  
  import com.intellij.openapi.project.Project;
  import com.antfortune.freeline.idea.models.GradleSyncHandler;
  
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  import java.lang.reflect.Proxy;
  
  /**
   * Created by pengwei on 2016/11/25.
   */
  public class GradleSyncUtil {
  
      /**
       * 获取GradleSyncListener
       * android studio 2.3 GradleSyncListener类换包名了
       *
       * @return
       */
      private static Object getGradleSyncAdapter(GradleSyncHandler mHandler) {
          Class<?> adapter = null;
          Class<?> listener = null;
          try {
              adapter = Class.forName("com.android.tools.idea.gradle.project.sync.GradleSyncListener$Adapter");
              listener = Class.forName("com.android.tools.idea.gradle.project.sync.GradleSyncListener");
          } catch (ClassNotFoundException e) {
              try {
                  adapter = Class.forName("com.android.tools.idea.gradle.project.GradleSyncListener$Adapter");
                  listener = Class.forName("com.android.tools.idea.gradle.project.GradleSyncListener");
              } catch (ClassNotFoundException e1) {
  
              }
          }
          if (adapter != null && listener != null) {
              Object mObj = Proxy.newProxyInstance(GradleSyncUtil.class.getClassLoader(), new Class[]{listener}, mHandler);
              System.out.println("Proxy=" + mObj);
              try {
                  Method successMethod = listener.getDeclaredMethod("syncSucceeded", new Class[]{Project.class});
                  Method failureMethod = listener.getDeclaredMethod("syncFailed", new Class[]{Project.class, String.class});
                  Object result = adapter.newInstance();
                  successMethod.invoke(result, new Object[]{mObj});
                  failureMethod.invoke(result, new Object[]{mObj});
                  return result;
              } catch (NoSuchMethodException e) {
                  e.printStackTrace();
              } catch (IllegalAccessException e) {
                  e.printStackTrace();
              } catch (InstantiationException e) {
                  e.printStackTrace();
              } catch (InvocationTargetException e) {
                  e.printStackTrace();
              }
          }
          return null;
      }
  
      /**
       * 同步gradle
       * android studio 2.3之前用GradleProjectImporter.getInstance().requestProjectSync(project, listener)
       * android studio 2.3后用GradleSyncInvoker.getInstance().requestProjectSync(project, null, listener);
       * @param project
       * @param mHandler
       */
      @Deprecated
      public static void startSync(Project project, GradleSyncHandler mHandler) {
          if (mHandler == null) {
              LogUtil.d("GradleSyncHandler == null");
              return;
          }
          Object adapter = getGradleSyncAdapter(mHandler);
          if (adapter == null) {
              LogUtil.d("getGradleSyncAdapter() return == null");
              return;
          }
          try {
              Class<?> syncClass = Class.forName("com.android.tools.idea.gradle.project.sync.GradleSyncInvoker");
              if (syncClass != null) {
                  Method instance = syncClass.getMethod("getInstance", null);
                  Object value = instance.invoke(null);
                  Method syncMethod = syncClass.getMethod("requestProjectSyncAndSourceGeneration", new Class[]{Project.class, adapter.getClass()});
                  syncMethod.invoke(value, project, adapter);
              }
          } catch (ClassNotFoundException e) {
              startSyncForOldVersion(project, adapter);
          } catch (NoSuchMethodException e) {
              e.printStackTrace();
          } catch (InvocationTargetException e) {
              e.printStackTrace();
          } catch (IllegalAccessException e) {
              e.printStackTrace();
          }
      }
  
      /**
       * 支持旧版本startSync
       * @param project
       * @param adapter
       */
      private static void startSyncForOldVersion(Project project, Object adapter) {
          try {
              Class<?> syncClass = Class.forName("com.android.tools.idea.gradle.project.GradleProjectImporter");
              if (syncClass != null) {
                  Method instance = syncClass.getMethod("getInstance", null);
                  Object value = instance.invoke(null);
                  Method syncMethod = syncClass.getMethod("requestProjectSync", new Class[]{Project.class, adapter.getClass()});
                  syncMethod.invoke(value, project, adapter);
              }
          } catch (ClassNotFoundException e) {
              e.printStackTrace();
          } catch (NoSuchMethodException e) {
              e.printStackTrace();
          } catch (InvocationTargetException e) {
              e.printStackTrace();
          } catch (IllegalAccessException e) {
              e.printStackTrace();
          }
      }
  
  }
  