Android Open Source - kirin-for-android Native Context






From Project

Back to project page kirin-for-android.

License

The source code is released under:

Apache License

If you think the Android project kirin-for-android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.futureplatforms.kirin.internal.core;
//from  ww  w  .j ava2 s  .  c  o m
import java.text.MessageFormat;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;

import android.app.Activity;
import android.os.Handler;
import android.util.Log;
import android.view.View;

import com.futureplatforms.kirin.C;
import com.futureplatforms.kirin.extensions.IKirinExtensionOnNonDefaultThread;
import com.futureplatforms.kirin.extensions.IKirinExtensionOnUiThread;
import com.futureplatforms.kirin.internal.attic.ProxyGenerator;

public class NativeContext implements INativeContext {

  public static final class SettableFuture<T> {
    
    private final CountDownLatch mLatch = new CountDownLatch(1);

    private T mValue;
    
    public T get() {
      try {
        mLatch.await();
      } catch (InterruptedException e) {
        Log.e(C.TAG, "Problem handling return value");
      }
      Log.d(C.TAG, "Getting value: " + mValue);
      return mValue;
    }
    
    public void set(T value) {
      mValue = value;
      Log.d(C.TAG, "Setting value: " + mValue);
      mLatch.countDown();
    }
  }

  private final Map<String, IObjectHolder> mObjectHolders = new ConcurrentHashMap<String, IObjectHolder>();
  
  private final Map<Long, SettableFuture<?>> mFutureMap = new ConcurrentHashMap<Long, SettableFuture<?>>();
  private final AtomicLong mNextId = new AtomicLong(0);
  
  private final Executor mDefaultExecutorService;
  
  
  public NativeContext() {
    this(Executors.newCachedThreadPool());
  }
  
  public NativeContext(Executor defaultExecutor) {
    mDefaultExecutorService = defaultExecutor;
  }

  @Override
  public Collection<String> getMethodNamesForObject(String objectName) {
    return getObjectHolder(objectName).getMethodNames();
  }

  private IObjectHolder getObjectHolder(String objectName) {
    IObjectHolder holder = mObjectHolders.get(objectName);
    if (holder == null) {
      throw new IllegalStateException("No object for " + objectName + " has been registered. This is almost certainly a bug in Kirin.");
    }
    return holder;
  }

  private void logThread(Object object, String threadPoolName) {
    Log.d(C.TAG, MessageFormat.format("Will dispatch to KirinService {0} on a {1} thread(s)", object.getClass().getName(), threadPoolName));
  }
  
  @Override
  public void registerNativeObject(String moduleName, Object object, ProxyGenerator proxyGenerator) {
    IObjectHolder objectHolder = null;
    if (object instanceof View || object instanceof Activity || object instanceof IKirinExtensionOnUiThread) {
      objectHolder = new UiObjectHolder(new Handler(), object, proxyGenerator);
      logThread(object, "UI");
    } else if (object instanceof IKirinExtensionOnNonDefaultThread) {
      Executor executor = ((IKirinExtensionOnNonDefaultThread) object).getExecutor();
      if (executor == null) {
        logThread(object, "default background");
        executor = mDefaultExecutorService;
      } else {
        logThread(object, "custom background");
      }
      objectHolder = new DefaultObjectHandler(executor, object, proxyGenerator);
    } else {
      logThread(object, "default background");
      objectHolder = new DefaultObjectHandler(mDefaultExecutorService, object, proxyGenerator);
    }
    mObjectHolders.put(moduleName, objectHolder);
  }

  @Override
  public void unregisterNativeObject(String moduleName) {
    mObjectHolders.remove(moduleName);
  }

  @Override
  public void executeCommandFromModule(String moduleName, String methodName, Object... args) {
    getObjectHolder(moduleName).invoke(methodName, (Object[]) args);
  }

  @Override
  public <T> SettableFuture<T> getFuture(Long id) {
    @SuppressWarnings("unchecked")
    SettableFuture<T> future = (SettableFuture<T>) mFutureMap.get(id);
    if (future == null) {
      future = new SettableFuture<T>();
      mFutureMap.put(id, future);
    }
    return future;
  }

  @Override
  public <T> void setReturnValue(Long id, T value) {
    @SuppressWarnings("unchecked")
    SettableFuture<Object> future = (SettableFuture<Object>) mFutureMap.remove(id);
    if (future != null) {
      future.set(value);
    }
  }

  @Override
  public Long createNewId() {
    return mNextId.incrementAndGet();
  }

}




Java Source Code List

com.futureplatforms.kirin.C.java
com.futureplatforms.kirin.Kirin.java
com.futureplatforms.kirin.TestingApplication.java
com.futureplatforms.kirin.activities.KirinActivity.java
com.futureplatforms.kirin.activities.KirinListActivity.java
com.futureplatforms.kirin.application.IKirinApplication.java
com.futureplatforms.kirin.application.KirinApplication.java
com.futureplatforms.kirin.extensions.IKirinExtensionOnNonDefaultThread.java
com.futureplatforms.kirin.extensions.IKirinExtensionOnUiThread.java
com.futureplatforms.kirin.extensions.IKirinExtension.java
com.futureplatforms.kirin.extensions.IProguardImmunity.java
com.futureplatforms.kirin.extensions.KirinExtensionAdapter.java
com.futureplatforms.kirin.extensions.KirinExtensions.java
com.futureplatforms.kirin.extensions.databases.DBStatement.java
com.futureplatforms.kirin.extensions.databases.DBTransaction.java
com.futureplatforms.kirin.extensions.databases.DatabasesBackend.java
com.futureplatforms.kirin.extensions.databases.IDatabasesBackend.java
com.futureplatforms.kirin.extensions.fs.KirinFilesystemExtensionImpl.java
com.futureplatforms.kirin.extensions.localnotifications.ILocalNotificationsBackend.java
com.futureplatforms.kirin.extensions.localnotifications.LocalNotificationAlarmReceiver.java
com.futureplatforms.kirin.extensions.localnotifications.LocalNotificationsBackend.java
com.futureplatforms.kirin.extensions.networking.INetworkingBackend.java
com.futureplatforms.kirin.extensions.networking.KirinXHRExtensionImpl.java
com.futureplatforms.kirin.extensions.networking.NetworkingBackend.java
com.futureplatforms.kirin.extensions.settings.ISettingsBackend.java
com.futureplatforms.kirin.extensions.settings.PreferencesBackendImpl.java
com.futureplatforms.kirin.extensions.settings.SettingsBackend.java
com.futureplatforms.kirin.generated.fs.KirinCallback.java
com.futureplatforms.kirin.generated.fs.KirinFile.java
com.futureplatforms.kirin.generated.fs.KirinFilesystemExtension.java
com.futureplatforms.kirin.generated.fs.KirinFilesystem.java
com.futureplatforms.kirin.generated.fs.KirinFoundFile.java
com.futureplatforms.kirin.generated.fs.KirinOptionalCallback.java
com.futureplatforms.kirin.generated.location.KirinLocationBackend.java
com.futureplatforms.kirin.generated.location.KirinLocationData.java
com.futureplatforms.kirin.generated.location.KirinLocationListener.java
com.futureplatforms.kirin.generated.location.KirinLocationPermissions.java
com.futureplatforms.kirin.generated.location.KirinLocation.java
com.futureplatforms.kirin.generated.preferences.KirinPreferenceListener.java
com.futureplatforms.kirin.generated.preferences.KirinPreferencesBackend.java
com.futureplatforms.kirin.generated.preferences.KirinPreferences.java
com.futureplatforms.kirin.generated.xhr.KirinXHRExtension.java
com.futureplatforms.kirin.generated.xhr.KirinXHRProgressEvent.java
com.futureplatforms.kirin.generated.xhr.KirinXHRResponse.java
com.futureplatforms.kirin.generated.xhr.KirinXHRequest.java
com.futureplatforms.kirin.generated.xhr.KirinXMLHTTPRequest.java
com.futureplatforms.kirin.helpers.IKirinExtensionHelper.java
com.futureplatforms.kirin.helpers.IKirinHelper.java
com.futureplatforms.kirin.helpers.KirinApplicationHelper.java
com.futureplatforms.kirin.helpers.KirinExtensionHelper.java
com.futureplatforms.kirin.helpers.KirinHelper.java
com.futureplatforms.kirin.helpers.KirinScreenHelper.java
com.futureplatforms.kirin.helpers.KirinUiFragmentHelper.java
com.futureplatforms.kirin.internal.JSONUtils.java
com.futureplatforms.kirin.internal.KirinPaths.java
com.futureplatforms.kirin.internal.attic.IOUtils.java
com.futureplatforms.kirin.internal.attic.KirinDropbox.java
com.futureplatforms.kirin.internal.attic.ProxyGenerator.java
com.futureplatforms.kirin.internal.attic.SDCardFileUtils.java
com.futureplatforms.kirin.internal.core.AbstractObjectHolder.java
com.futureplatforms.kirin.internal.core.DefaultObjectHandler.java
com.futureplatforms.kirin.internal.core.IJsContext.java
com.futureplatforms.kirin.internal.core.IKirinState.java
com.futureplatforms.kirin.internal.core.INativeContext.java
com.futureplatforms.kirin.internal.core.IObjectHolder.java
com.futureplatforms.kirin.internal.core.JsCommands.java
com.futureplatforms.kirin.internal.core.KirinAppState.java
com.futureplatforms.kirin.internal.core.KirinWebViewHolder.java
com.futureplatforms.kirin.internal.core.NativeContext.java
com.futureplatforms.kirin.internal.core.UiObjectHolder.java
com.futureplatforms.kirin.internal.fragmentation.CursorCoercer4.java
com.futureplatforms.kirin.internal.fragmentation.CursorCoercer5.java
com.futureplatforms.kirin.internal.fragmentation.CursorCoercer.java
com.futureplatforms.kirin.internal.fragmentation.WebChromeClient7.java
com.futureplatforms.kirin.internal.fragmentation.WebChromeClient8.java
com.futureplatforms.kirin.state.IKirinDropbox.java
com.futureplatforms.kirin.state.IKirinFileSystem.java
com.futureplatforms.kirin.ui.DebugMenuActions.java
com.futureplatforms.kirin.ui.JSListAdapter.java
com.futureplatforms.kirin.ui.JSOnClickListener.java
com.futureplatforms.kirin.ui.KirinRowRenderer.java