18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 George Staikos <staikos@kde.org>
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Charles Samuels <charles@kde.org>
5cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * Copyright (C) 2008, 2009 Holger Hans Peter Freyther
6e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * Copyright (C) 2010 University of Szeged
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * All rights reserved.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Cursor.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Image.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntPoint.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h>
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdlib.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#undef CopyCursor
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCursor::Cursor(const Cursor& other)
48e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    : m_type(other.m_type)
49e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_image(other.m_image)
50e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_hotSpot(other.m_hotSpot)
51e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#ifndef QT_NO_CURSOR
52e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_platformCursor(other.m_platformCursor ? new QCursor(*other.m_platformCursor)  : 0)
53e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCursor::~Cursor()
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_CURSOR
60e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    delete m_platformCursor;
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCursor& Cursor::operator=(const Cursor& other)
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_type = other.m_type;
67e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_image = other.m_image;
68e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_hotSpot = other.m_hotSpot;
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef QT_NO_CURSOR
70e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_platformCursor = other.m_platformCursor ? new QCursor(*other.m_platformCursor)  : 0;
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
72e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return *this;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
75a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#ifndef QT_NO_CURSOR
76e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockstatic QCursor* createCustomCursor(Image* image, const IntPoint& hotSpot)
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
78e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    IntPoint effectiveHotSpot = determineHotSpot(image, hotSpot);
79e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return new QCursor(*(image->nativeImageForCurrentFrame()), effectiveHotSpot.x(), effectiveHotSpot.y());
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
81a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
83e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid Cursor::ensurePlatformCursor() const
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
85e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#ifndef QT_NO_CURSOR
86e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (m_platformCursor)
87e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return;
88e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
89e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    switch (m_type) {
90e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Pointer:
91e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::ArrowCursor);
92e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
93e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Cross:
94e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::CrossCursor);
95e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
96e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Hand:
97e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::PointingHandCursor);
98e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
99e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case IBeam:
100e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::IBeamCursor);
101e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
102e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Wait:
103e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::WaitCursor);
104e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
105e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Help:
106e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::WhatsThisCursor);
107e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
108e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case EastResize:
109e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case EastPanning:
110e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeHorCursor);
111e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
112e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NorthResize:
113e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NorthPanning:
114e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeVerCursor);
115e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
116e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NorthEastResize:
117e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NorthEastPanning:
118e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeBDiagCursor);
119e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
120e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NorthWestResize:
121e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NorthWestPanning:
122e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeFDiagCursor);
123e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
124e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case SouthResize:
125e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case SouthPanning:
126e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeVerCursor);
127e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
128e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case SouthEastResize:
129e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case SouthEastPanning:
130e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeFDiagCursor);
131e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
132e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case SouthWestResize:
133e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case SouthWestPanning:
134e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeBDiagCursor);
135e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
136e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case WestResize:
137e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case WestPanning:
138e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeHorCursor);
139e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
140e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NorthSouthResize:
141e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeVerCursor);
142e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
143e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case EastWestResize:
144e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeHorCursor);
145e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
146e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NorthEastSouthWestResize:
147e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeBDiagCursor);
148e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
149e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NorthWestSouthEastResize:
150e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeFDiagCursor);
151e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
152e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case ColumnResize:
153e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SplitHCursor);
154e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
155e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case RowResize:
156e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SplitVCursor);
157e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
158e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case MiddlePanning:
159e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Move:
160e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::SizeAllCursor);
161e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
162e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case None:
163e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::BlankCursor);
164e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
165e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NoDrop:
166e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case NotAllowed:
167e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::ForbiddenCursor);
168e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
169e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Grab:
170e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Grabbing:
171e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        notImplemented();
172e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(Qt::ArrowCursor);
173e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
174e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case VerticalText:
175e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(QPixmap(QLatin1String(":/webkit/resources/verticalTextCursor.png")), 7, 7);
176e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
177e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Cell:
178e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(QPixmap(QLatin1String(":/webkit/resources/cellCursor.png")), 7, 7);
179e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
180e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case ContextMenu:
181e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(QPixmap(QLatin1String(":/webkit/resources/contextMenuCursor.png")), 3, 2);
182e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
183e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Alias:
184e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(QPixmap(QLatin1String(":/webkit/resources/aliasCursor.png")), 11, 3);
185e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
186e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Progress:
187e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(QPixmap(QLatin1String(":/webkit/resources/progressCursor.png")), 3, 2);
188e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
189e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Copy:
190e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(QPixmap(QLatin1String(":/webkit/resources/copyCursor.png")), 3, 2);
191e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
192e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case ZoomIn:
193e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(QPixmap(QLatin1String(":/webkit/resources/zoomInCursor.png")), 7, 7);
194e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
195e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case ZoomOut:
196e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = new QCursor(QPixmap(QLatin1String(":/webkit/resources/zoomOutCursor.png")), 7, 7);
197e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
198e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    case Custom:
199e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_platformCursor = createCustomCursor(m_image.get(), m_hotSpot);
200e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        break;
201e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    default:
202e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        ASSERT_NOT_REACHED();
203e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
204e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// vim: ts=4 sw=4 et
210