/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.renderscript;


import java.lang.reflect.Field;
import java.lang.Class;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;

import android.util.Log;

class RSReflect {
    Class mElement;
    Class mElementBuilder;
    Class mElementDataType;
    Class mElementDataKind;
    Method mElement_createUser;
    Method mElement_createVector;
    Method mElement_createPixel;
    Constructor mElementBuilder_constructor;
    Method mElementBuilder_add;
    Method mElementBuilder_create;

    Class mType;
    Class mTypeBuilder;
    Class mTypeCubemapFace;
    Constructor mTypeBuilder_constructor;
    Method mTypeBuilder_setX;
    Method mTypeBuilder_setY;
    Method mTypeBuilder_setMipmaps;
    Method mTypeBuilder_setFaces;

    Class mAllocation;
    Class mAllocationMipmapControl;
    Method mAllocation_syncAll;
    Method mAllocation_copyFrom_O;
    Method mAllocation_copyFromUnchecked_I;
    Method mAllocation_copyFromUnchecked_S;
    Method mAllocation_copyFromUnchecked_B;
    Method mAllocation_copyFromUnchecked_F;
    Method mAllocation_copyFrom_I;
    Method mAllocation_copyFrom_S;
    Method mAllocation_copyFrom_B;
    Method mAllocation_copyFrom_F;
    Method mAllocation_setFromFieldPacker;
    Method mAllocation_setFromFieldPacker_component;
    Method mAllocation_generateMipmaps;
    Method mAllocation_copy1DRangeFromUnchecked;


    Class mBaseObj;
    Class mRenderScript;
    Class mSampler;
    Class mScript;
    Class mScriptC;
    Class mScriptGroup;


    private RSReflect() {
    }

    private boolean init() {
        try {
            Method m[];

            mElement = Class.forName("android.renderscript.Element");
            mElementBuilder = Class.forName("android.renderscript.Element$Builder");
            mElementDataType = Class.forName("android.renderscript.Element$DataType");
            mElementDataKind = Class.forName("android.renderscript.Element$DataKind");

            mType = Class.forName("android.renderscript.Type");
            mTypeBuilder = Class.forName("android.renderscript.Type$Builder");
            mTypeCubemapFace = Class.forName("android.renderscript.Type$CubemapFace");

            mAllocation = Class.forName("android.renderscript.Allocation");
            mBaseObj = Class.forName("android.renderscript.BaseObj");
            mRenderScript = Class.forName("android.renderscript.RenderScript");
            mSampler = Class.forName("android.renderscript.Sampler");
            mScript = Class.forName("android.renderscript.Script");
            mScriptC = Class.forName("android.renderscript.ScriptC");

            mElement_createUser = mElement.getDeclaredMethod("createUser",
                        new Class[] { mRenderScript, mElementDataType });
            mElement_createVector = mElement.getDeclaredMethod("createVector",
                        new Class[] { mRenderScript, mElementDataType, Integer.TYPE });
            mElement_createPixel = mElement.getDeclaredMethod("createPixel",
                        new Class[] { mRenderScript, mElementDataType, mElementDataKind });
            mElementBuilder_constructor = mElementBuilder.getDeclaredConstructor(
                            new Class[] { mRenderScript });
            mElementBuilder_add = mElementBuilder.getDeclaredMethod("add",
                            new Class[] { mElement, String.class, Integer.TYPE });
            mElementBuilder_create = mElementBuilder.getDeclaredMethod("create",
                            new Class[] {});

            mTypeBuilder_constructor = mTypeBuilder.getDeclaredConstructor(
                            new Class[] { mRenderScript, mElement });
            mTypeBuilder_setX = mTypeBuilder.getDeclaredMethod("setX",
                            new Class[] { Integer.TYPE });
            mTypeBuilder_setY = mTypeBuilder.getDeclaredMethod("setY",
                            new Class[] { Integer.TYPE });
            mTypeBuilder_setMipmaps = mTypeBuilder.getDeclaredMethod("setMipmaps",
                            new Class[] { Boolean.TYPE });
            mTypeBuilder_setFaces = mTypeBuilder.getDeclaredMethod("setFaces",
                            new Class[] { Boolean.TYPE });





            //mScriptGroup = Class.forName("android.renderscript.Element");


        } catch (Throwable e) {
            android.util.Log.w("RSR", "Using native RS failed. " + e);
            return false;
        }
        return true;
    }

    static RSReflect create() {
        android.util.Log.v("RSR", "create");
        RSReflect r = new RSReflect();
        if (r.init()) {
            android.util.Log.v("RSR", "create ok");
            return r;
        }
        android.util.Log.v("RSR", "create fail");
        return null;
    }

    private Method findMethod(Method m[], String name) {
        for (int ct=0; ct < m.length; ct++) {
            if (m[ct].getName().equals(name)) {
                return m[ct];
            }
        }
        return null;
    }


    //Class c = Class.forName("java.lang.String");

}

@@ -622,32 +622,43 @@
 package android.
+support.v8.
 renderscript;%0A%0A%0A
@@ -656,17 +656,16 @@
 cript;%0A%0A
-%0A
 import j

Fix minor package <-> directory discrepancy