package idv.Zero.KerKerInput.Methods; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import idv.Zero.KerKerInput.IKerKerInputMethod; import idv.Zero.KerKerInput.KerKerInputCore; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; /** * 此 class 提供 .cin-based 輸入法一共同的處理機制,輸入法只需繼承 * 此 class 針對 UI 優化即可。 * * @author Zero * */ public class CINBasedInput extends IKerKerInputMethod { public enum InputState {STATE_INPUT, STATE_CHOOSE}; // CINBasedInput wrapper data private String _strIMEIdentifier = null; private SQLiteDatabase _db = null; private String _dbPath = null; // CIN data private HashMap<String, String> keyToName; // State Data private InputState currentState; private String inputBufferRaw = ""; private List<CharSequence> _currentCandidates; private int _currentPage; private int _totalPages; /* IME entry point and some metadata accessors */ public CINBasedInput(String imeIdentifier, String dbPath) { _strIMEIdentifier = imeIdentifier; if (dbPath != null) _dbPath = dbPath; } public void initInputMethod(KerKerInputCore core) { super.initInputMethod(core); Context c = core.getFrontend(); if (_dbPath == null) _dbPath = c.getDatabasePath("cin.db").toString(); _db = SQLiteDatabase.openDatabase(_dbPath, null, SQLiteDatabase.OPEN_READONLY); _db.setLocale(Locale.TRADITIONAL_CHINESE); readKeyMapping(); _db.close(); } @Override public void onEnterInputMethod() { _db = SQLiteDatabase.openDatabase(_dbPath, null, SQLiteDatabase.OPEN_READONLY); _db.setLocale(Locale.TRADITIONAL_CHINESE); resetState(); } @Override public void onLeaveInputMethod() { _db.close(); } @Override public String getName() { String name = readMetadata("name"); if (name == null) return "無名"; else return name; } @Override public void commitCandidate(int currentCandidate) { // TODO Auto-generated method stub } @Override public void commitCurrentComposingBuffer() { // TODO Auto-generated method stub } @Override public boolean onKeyEvent(int keyCode, int[] keyCodes) { // TODO Auto-generated method stub return false; } @Override public void setCurrentPage(int currentPage) { // TODO Auto-generated method stub } @Override public void setTotalPages(int totalPages) { // TODO Auto-generated method stub } // Private methods private void resetState() { currentState = InputState.STATE_INPUT; inputBufferRaw = ""; _currentPage = 0; _totalPages = 0; _currentCandidates = new ArrayList<CharSequence>(); } private String readMetadata(String key) { Cursor currentQuery = _db.rawQuery("SELECT " + key + " FROM metadata_" + _strIMEIdentifier, null); if (currentQuery.getCount() == 0) return null; else return currentQuery.getString(0); } private void readKeyMapping() { Cursor currentQuery = _db.rawQuery("SELECT key, name FROM keyname_" + _strIMEIdentifier, null); for(int i=0; i < currentQuery.getCount();i++) keyToName.put(currentQuery.getString(0), currentQuery.getString(1)); } }