1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.hellospellchecker;
18 
19 import android.app.Activity;
20 import android.content.Context;
21 import android.os.Build;
22 import android.os.Bundle;
23 import android.util.Log;
24 import android.view.textservice.SentenceSuggestionsInfo;
25 import android.view.textservice.SpellCheckerSession;
26 import android.view.textservice.SuggestionsInfo;
27 import android.view.textservice.TextInfo;
28 import android.view.textservice.TextServicesManager;
29 import android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener;
30 import android.widget.TextView;
31 import java.lang.StringBuilder;
32 
33 public class HelloSpellCheckerActivity extends Activity implements SpellCheckerSessionListener {
34     private static final String TAG = HelloSpellCheckerActivity.class.getSimpleName();
35     private static final int NOT_A_LENGTH = -1;
36     private TextView mMainView;
37     private SpellCheckerSession mScs;
38 
39     /** Called when the activity is first created. */
40     @Override
onCreate(Bundle savedInstanceState)41     public void onCreate(Bundle savedInstanceState) {
42         super.onCreate(savedInstanceState);
43         setContentView(R.layout.main);
44         mMainView = (TextView)findViewById(R.id.main);
45     }
46 
isSentenceSpellCheckSupported()47     private boolean isSentenceSpellCheckSupported() {
48         return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
49     }
50 
51     @Override
onResume()52     public void onResume() {
53         super.onResume();
54         final TextServicesManager tsm = (TextServicesManager) getSystemService(
55                 Context.TEXT_SERVICES_MANAGER_SERVICE);
56         mScs = tsm.newSpellCheckerSession(null, null, this, true);
57 
58         if (mScs != null) {
59             // Instantiate TextInfo for each query
60             // TextInfo can be passed a sequence number and a cookie number to identify the result
61             if (isSentenceSpellCheckSupported()) {
62                 // Note that getSentenceSuggestions works on JB or later.
63                 Log.d(TAG, "Sentence spellchecking supported.");
64                 mScs.getSentenceSuggestions(new TextInfo[] {new TextInfo("tgisis")}, 3);
65                 mScs.getSentenceSuggestions(new TextInfo[] {new TextInfo(
66                         "I wold like to here form you")}, 3);
67                 mScs.getSentenceSuggestions(new TextInfo[] {new TextInfo("hell othere")}, 3);
68             } else {
69                 // Note that getSuggestions() is a deprecated API.
70                 // It is recommended for an application running on Jelly Bean or later
71                 // to call getSentenceSuggestions() only.
72                 mScs.getSuggestions(new TextInfo("tgis"), 3);
73                 mScs.getSuggestions(new TextInfo("hllo"), 3);
74                 mScs.getSuggestions(new TextInfo("helloworld"), 3);
75             }
76         } else {
77             Log.e(TAG, "Couldn't obtain the spell checker service.");
78         }
79     }
80 
81     @Override
onPause()82     public void onPause() {
83         super.onPause();
84         if (mScs != null) {
85             mScs.close();
86         }
87     }
88 
dumpSuggestionsInfoInternal( final StringBuilder sb, final SuggestionsInfo si, final int length, final int offset)89     private void dumpSuggestionsInfoInternal(
90             final StringBuilder sb, final SuggestionsInfo si, final int length, final int offset) {
91         // Returned suggestions are contained in SuggestionsInfo
92         final int len = si.getSuggestionsCount();
93         sb.append('\n');
94         for (int j = 0; j < len; ++j) {
95             if (j != 0) {
96                 sb.append(", ");
97             }
98             sb.append(si.getSuggestionAt(j));
99         }
100         sb.append(" (" + len + ")");
101         if (length != NOT_A_LENGTH) {
102             sb.append(" length = " + length + ", offset = " + offset);
103         }
104     }
105 
106     /**
107      * Callback for {@link SpellCheckerSession#getSuggestions(TextInfo, int)}
108      * and {@link SpellCheckerSession#getSuggestions(TextInfo[], int, boolean)}
109      * @param results an array of {@link SuggestionsInfo}s.
110      * These results are suggestions for {@link TextInfo}s queried by
111      * {@link SpellCheckerSession#getSuggestions(TextInfo, int)} or
112      * {@link SpellCheckerSession#getSuggestions(TextInfo[], int, boolean)}
113      */
114     @Override
onGetSuggestions(final SuggestionsInfo[] arg0)115     public void onGetSuggestions(final SuggestionsInfo[] arg0) {
116         Log.d(TAG, "onGetSuggestions");
117         final StringBuilder sb = new StringBuilder();
118         for (int i = 0; i < arg0.length; ++i) {
119             dumpSuggestionsInfoInternal(sb, arg0[i], 0, NOT_A_LENGTH);
120         }
121         runOnUiThread(new Runnable() {
122             @Override
123             public void run() {
124                 mMainView.append(sb.toString());
125             }
126         });
127     }
128 
129     /**
130      * Callback for {@link SpellCheckerSession#getSentenceSuggestions(TextInfo[], int)}
131      * @param results an array of {@link SentenceSuggestionsInfo}s.
132      * These results are suggestions for {@link TextInfo}s
133      * queried by {@link SpellCheckerSession#getSentenceSuggestions(TextInfo[], int)}.
134      */
135     @Override
onGetSentenceSuggestions(final SentenceSuggestionsInfo[] arg0)136     public void onGetSentenceSuggestions(final SentenceSuggestionsInfo[] arg0) {
137         if (!isSentenceSpellCheckSupported()) {
138             Log.e(TAG, "Sentence spell check is not supported on this platform, "
139                     + "but accidentially called.");
140             return;
141         }
142         Log.d(TAG, "onGetSentenceSuggestions");
143         final StringBuilder sb = new StringBuilder();
144         for (int i = 0; i < arg0.length; ++i) {
145             final SentenceSuggestionsInfo ssi = arg0[i];
146             for (int j = 0; j < ssi.getSuggestionsCount(); ++j) {
147                 dumpSuggestionsInfoInternal(
148                         sb, ssi.getSuggestionsInfoAt(j), ssi.getOffsetAt(j), ssi.getLengthAt(j));
149             }
150         }
151         runOnUiThread(new Runnable() {
152             @Override
153             public void run() {
154                 mMainView.append(sb.toString());
155             }
156         });
157     }
158 }
159