package view_inspector; import android.app.Activity; import android.app.Application; import android.content.Context; import android.util.Log; import android.view.View; import android.view.WindowManager; import com.f2prateek.rx.preferences.Preference; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.inject.Inject; import view_inspector.dagger.ActivityComponent; import view_inspector.dagger.ActivityModule; import view_inspector.dagger.ApplicationComponent; import view_inspector.dagger.ApplicationModule; import view_inspector.dagger.DaggerActivityComponent; import view_inspector.dagger.DaggerApplicationComponent; import view_inspector.dagger.qualifier.BypassInterceptor; import view_inspector.dagger.qualifier.ProbeMeasures; import view_inspector.dagger.qualifier.Scalpel3D; import view_inspector.dagger.qualifier.ShowOutline; import view_inspector.probe.Probe; import view_inspector.probe.ViewInspectorInterceptor; import view_inspector.ui.ViewInspectorToolbar; public final class ViewInspector { public static final String TAG = "ViewInspector"; public static ApplicationComponent applicationComponent; public static Set<Context> contextSet = new HashSet<>(); public static Map<Context, ActivityComponent> runtimeComponentMap = new HashMap<>(); public static Map<Context, ViewInspectorToolbar> toolbarMap = new HashMap<>(); public static View viewRoot; @Inject WindowManager windowManager; @Inject @ShowOutline Preference<Boolean> showOutline; @Inject @ProbeMeasures Preference<Boolean> probeMeasures; @Inject @BypassInterceptor Preference<Boolean> bypassInterceptor; @Inject @Scalpel3D Preference<Boolean> scalpelEnabled; @Inject ViewInspectorInterceptor interceptor; @Inject ViewInspectorToolbar toolbar; public static ViewInspector create() { return new ViewInspector(); } public void onCreate(Context context) { if (!contextSet.contains(context)) { contextSet.add(context); if (applicationComponent == null) { // create dagger component for the application Application application = (Application) context.getApplicationContext(); applicationComponent = DaggerApplicationComponent.builder() .applicationModule(new ApplicationModule(application)) .build(); } if (!runtimeComponentMap.containsKey(context)) { // create dagger components per activity ActivityComponent activityComponent = DaggerActivityComponent.builder() .applicationComponent(applicationComponent) .activityModule(new ActivityModule((Activity) context)) .build(); runtimeComponentMap.put(context, activityComponent); activityComponent.inject(this); } // Reset preferences showOutline.set(false); probeMeasures.set(false); bypassInterceptor.set(false); scalpelEnabled.set(false); Probe.deploy(context, interceptor); windowManager.addView(toolbar, ViewInspectorToolbar.createLayoutParams(context)); toolbarMap.put(context, toolbar); } } public void onResume() { toolbar.setVisibility(View.VISIBLE); } public void onPause() { toolbar.closeMenu(); toolbar.setVisibility(View.GONE); } public void onDestroy(Context context) { // remove dagger component map runtimeComponentMap.remove(context); ViewInspectorToolbar toolbarInstance = toolbarMap.get(context); if (toolbarInstance != null) windowManager.removeViewImmediate(toolbarInstance); } }