Type.java revision 768bc02d815a94ad29146f1ed60c847d1af118cc
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.renderscript;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Field;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert/**
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project **/
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Type extends BaseObj {
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mDimX;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mDimY;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mDimZ;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mDimLOD;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mDimFaces;
31112d339673c379b71a989bd33b73648aafe58ce1Jesse Wilson    int mElementCount;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Element mElement;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNativeCache;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Class mJavaClass;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getX() {
39761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        return mDimX;
40963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    }
41963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    public int getY() {
42963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        return mDimY;
43963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    }
44761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    public int getZ() {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDimZ;
46c20cadbdad0cdfe8e56431c22bd26ae666101e89Ashok Bhat    }
47963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    public boolean getLOD() {
48c20cadbdad0cdfe8e56431c22bd26ae666101e89Ashok Bhat        return mDimLOD;
49761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    }
50c20cadbdad0cdfe8e56431c22bd26ae666101e89Ashok Bhat    public boolean getFaces() {
519fc2e9c965c68d56a0caf812f7f6d38d15317063Bjorn Bringert        return mDimFaces;
52c20cadbdad0cdfe8e56431c22bd26ae666101e89Ashok Bhat    }
539fc2e9c965c68d56a0caf812f7f6d38d15317063Bjorn Bringert    public int getElementCount() {
54761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        return mElementCount;
557bcbd511731e13b9f2778e6aa6c633417d266f5eMarco Nelissen    }
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    void calcElementCount() {
58c20cadbdad0cdfe8e56431c22bd26ae666101e89Ashok Bhat        boolean hasLod = getLOD();
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int x = getX();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int y = getY();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int z = getZ();
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int faces = 1;
63963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        if(getFaces()) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            faces = 6;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(x == 0) {
679fc2e9c965c68d56a0caf812f7f6d38d15317063Bjorn Bringert            x = 1;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
699fc2e9c965c68d56a0caf812f7f6d38d15317063Bjorn Bringert        if(y == 0) {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            y = 1;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
72a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert        if(z == 0) {
73a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert            z = 1;
74a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert        }
75a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert
76963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        int count = x * y * z * faces;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(hasLod && (x > 1) && (y > 1) && (z > 1)) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(x > 1) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                x >>= 1;
80963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert            }
81963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert            if(y > 1) {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                y >>= 1;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
84761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            if(z > 1) {
85761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert                z >>= 1;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count += x * y * z * faces;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
90963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        mElementCount = count;
91963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    }
92963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert
93963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert
94963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    Type(int id, RenderScript rs) {
95963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        super(rs);
96963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        mID = id;
97a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert        mNativeCache = 0;
98761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    }
99761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
100761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    protected void finalize() throws Throwable {
101761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        if(mNativeCache != 0) {
102761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            mRS.nTypeFinalDestroy(this);
103761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            mNativeCache = 0;
104761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        }
105761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        super.finalize();
106761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    }
107761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
108761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    public static Type createFromClass(RenderScript rs, Class c, int size) {
109761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        Element e = Element.createFromClass(rs, c);
110761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        Builder b = new Builder(rs, e);
111761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        b.add(Dimension.X, size);
112761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        Type t = b.create();
113761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        e.destroy();
114761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
115761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        // native fields
116761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        {
117761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            Field[] fields = c.getFields();
118761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            int[] arTypes = new int[fields.length];
119761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            int[] arBits = new int[fields.length];
120761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
121761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            for(int ct=0; ct < fields.length; ct++) {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Field f = fields[ct];
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Class fc = f.getType();
124761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert                if(fc == int.class) {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    arTypes[ct] = Element.DataType.SIGNED.mID;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    arBits[ct] = 32;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if(fc == short.class) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    arTypes[ct] = Element.DataType.SIGNED.mID;
129112d339673c379b71a989bd33b73648aafe58ce1Jesse Wilson                    arBits[ct] = 16;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if(fc == byte.class) {
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    arTypes[ct] = Element.DataType.SIGNED.mID;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    arBits[ct] = 8;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if(fc == float.class) {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    arTypes[ct] = Element.DataType.FLOAT.mID;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    arBits[ct] = 32;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("Unkown field type");
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rs.nTypeSetupFields(t, arTypes, arBits, fields);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        t.mJavaClass = c;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return t;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Type t = createFromClass(rs, c, size);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        t.setName(scriptName);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return t;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Builder {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RenderScript mRS;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Entry[] mEntries;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mEntryCount;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Element mElement;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class Entry {
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Dimension mDim;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mValue;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Builder(RenderScript rs, Element e) {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRS = rs;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEntries = new Entry[4];
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mElement = e;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void add(Dimension d, int value) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(mEntries.length >= mEntryCount) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Entry[] en = new Entry[mEntryCount + 8];
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(mEntries, 0, en, 0, mEntries.length);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mEntries = en;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEntries[mEntryCount] = new Entry();
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEntries[mEntryCount].mDim = d;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEntries[mEntryCount].mValue = value;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEntryCount++;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static synchronized Type internalCreate(RenderScript rs, Builder b) {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rs.nTypeBegin(b.mElement.mID);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ct=0; ct < b.mEntryCount; ct++) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Entry en = b.mEntries[ct];
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rs.nTypeAdd(en.mDim.mID, en.mValue);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int id = rs.nTypeCreate();
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Type(id, rs);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
191761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Type create() {
193112d339673c379b71a989bd33b73648aafe58ce1Jesse Wilson            Type t = internalCreate(mRS, this);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            t.mElement = mElement;
195761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
196761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            for(int ct=0; ct < mEntryCount; ct++) {
197761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert                if(mEntries[ct].mDim == Dimension.X) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mDimX = mEntries[ct].mValue;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(mEntries[ct].mDim == Dimension.Y) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mDimY = mEntries[ct].mValue;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(mEntries[ct].mDim == Dimension.Z) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mDimZ = mEntries[ct].mValue;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(mEntries[ct].mDim == Dimension.LOD) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mDimLOD = mEntries[ct].mValue != 0;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(mEntries[ct].mDim == Dimension.FACE) {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mDimFaces = mEntries[ct].mValue != 0;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            t.calcElementCount();
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
215761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
219761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert