17898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/*
27898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
37898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
47898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * you may not use this file except in compliance with the License.
67898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * You may obtain a copy of the License at
77898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
87898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * See the License for the specific language governing permissions and
147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * limitations under the License.
157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpackage com.android.inputmethod.pinyin;
187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport java.util.Vector;
207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.content.Context;
227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/**
247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Class used to cache previously loaded soft keyboard layouts.
257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpublic class SkbPool {
277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private static SkbPool mInstance = null;
287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Vector<SkbTemplate> mSkbTemplates = new Vector<SkbTemplate>();
307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Vector<SoftKeyboard> mSoftKeyboards = new Vector<SoftKeyboard>();
317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private SkbPool() {
337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public static SkbPool getInstance() {
367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == mInstance) mInstance = new SkbPool();
377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mInstance;
387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void resetCachedSkb() {
417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mSoftKeyboards.clear();
427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public SkbTemplate getSkbTemplate(int skbTemplateId, Context context) {
457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int i = 0; i < mSkbTemplates.size(); i++) {
467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            SkbTemplate t = mSkbTemplates.elementAt(i);
477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (t.getSkbTemplateId() == skbTemplateId) {
487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return t;
497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != context) {
537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            XmlKeyboardLoader xkbl = new XmlKeyboardLoader(context);
547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            SkbTemplate t = xkbl.loadSkbTemplate(skbTemplateId);
557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (null != t) {
567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mSkbTemplates.add(t);
577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return t;
587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return null;
617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // Try to find the keyboard in the pool with the cache id. If there is no
647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // keyboard found, try to load it with the given xml id.
657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public SoftKeyboard getSoftKeyboard(int skbCacheId, int skbXmlId,
667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            int skbWidth, int skbHeight, Context context) {
677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int i = 0; i < mSoftKeyboards.size(); i++) {
687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            SoftKeyboard skb = mSoftKeyboards.elementAt(i);
697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (skb.getCacheId() == skbCacheId && skb.getSkbXmlId() == skbXmlId) {
707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                skb.setSkbCoreSize(skbWidth, skbHeight);
717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                skb.setNewlyLoadedFlag(false);
727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return skb;
737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != context) {
767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            XmlKeyboardLoader xkbl = new XmlKeyboardLoader(context);
777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            SoftKeyboard skb = xkbl.loadKeyboard(skbXmlId, skbWidth, skbHeight);
787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (skb != null) {
797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (skb.getCacheFlag()) {
807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    skb.setCacheId(skbCacheId);
817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    mSoftKeyboards.add(skb);
827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return skb;
857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return null;
877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}
89