package io.nextop; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.content.Context; import android.net.Uri; import android.view.View; import android.view.ViewParent; import com.google.common.annotations.Beta; import javax.annotation.Nullable; import java.net.URI; import java.net.URISyntaxException; @Beta public final class NextopAndroid { public static Nextop getActive() { // FIXME global instance return null; } /** Find the nearest nextop for the view: * - tests the view * - tests the activity * - tests the application * - tests down the view hierarchy, for views and fragments (in that order per level). * Typically there will be one nextop in the application for the entire app. * @see NextopContext */ @Nullable public static Nextop getActive(View view) { Nextop nextop; nextop = opt(view); if (null != nextop) { return nextop; } Activity activity = (Activity) view.getContext(); nextop = opt(activity); if (null != nextop) { return nextop; } nextop = opt(activity.getApplication()); if (null != nextop) { return nextop; } FragmentManager fm = activity.getFragmentManager(); for (ViewParent p = view.getParent(); null != p; p = p.getParent()) { nextop = opt(p); if (null != nextop) { return nextop; } if (p instanceof View) { @Nullable Fragment f = fm.findFragmentById(((View) p).getId()); if (null != f) { nextop = opt(f); if (null != nextop) { return nextop; } } } } assert null == nextop; return getActive(); } @Nullable public static Nextop getActive(Context context) { Nextop nextop; nextop = opt(context); if (null != nextop) { return nextop; } nextop = opt(context.getApplicationContext()); if (null != nextop) { return nextop; } assert null == nextop; return getActive(); } @Nullable private static Nextop opt(Object obj) { if (obj instanceof NextopContext) { @Nullable Nextop nextop = ((NextopContext) obj).getNextop(); if (null != nextop && nextop.isActive()) { return nextop; } } return getActive(); } /////// URI /////// public static URI toURI(Uri uri) throws URISyntaxException { try { return new URI(uri.toString()); } catch (URISyntaxException e) { // FIXME try to recover common/bug cases throw e; } } private NextopAndroid() { } }