|
Android example source code file (TranslateActivity.java)
The TranslateActivity.java Android example source code
/*
* Copyright (C) 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.beust.android.translate;
import com.beust.android.translate.Languages.Language;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.provider.Contacts;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.zip.GZIPInputStream;
/**
* Main activity for the Translate application.
*
* @author Cedric Beust
* @author Daniel Rall
*/
public class TranslateActivity extends Activity implements OnClickListener {
static final String TAG = "Translate";
private EditText mToEditText;
private EditText mFromEditText;
private Button mFromButton;
private Button mToButton;
private Button mTranslateButton;
private Button mSwapButton;
private Handler mHandler = new Handler();
private ProgressBar mProgressBar;
private TextView mStatusView;
// true if changing a language should automatically trigger a translation
private boolean mDoTranslate = true;
// Dialog id's
private static final int LANGUAGE_DIALOG_ID = 1;
private static final int ABOUT_DIALOG_ID = 2;
// Saved preferences
private static final String FROM = "from";
private static final String TO = "to";
private static final String INPUT = "input";
private static final String OUTPUT = "output";
// Default language pair if no saved preferences are found
private static final String DEFAULT_FROM = Language.ENGLISH.getShortName();
private static final String DEFAULT_TO = Language.GERMAN.getShortName();
private Button mLatestButton;
private OnClickListener mClickListener = new OnClickListener() {
public void onClick(View v) {
mLatestButton = (Button) v;
showDialog(LANGUAGE_DIALOG_ID);
}
};
// Translation service handle.
private ITranslate mTranslateService;
// ServiceConnection implementation for translation.
private ServiceConnection mTranslateConn = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
mTranslateService = ITranslate.Stub.asInterface(service);
/* TODO(dlr): Register a callback to assure we don't lose our svc.
try {
mTranslateervice.registerCallback(mTranslateCallback);
} catch (RemoteException e) {
log("Failed to establish Translate service connection: " + e);
return;
}
*/
if (mTranslateService != null) {
mTranslateButton.setEnabled(true);
} else {
mTranslateButton.setEnabled(false);
mStatusView.setText(getString(R.string.error));
log("Unable to acquire TranslateService");
}
}
public void onServiceDisconnected(ComponentName name) {
mTranslateButton.setEnabled(false);
mTranslateService = null;
}
};
// Dictionary
private static byte[] mWordBuffer;
private static int mWordCount;
private static ArrayList<Integer> mWordIndices;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.translate_activity);
mFromEditText = (EditText) findViewById(R.id.input);
mToEditText = (EditText) findViewById(R.id.translation);
mFromButton = (Button) findViewById(R.id.from);
mToButton = (Button) findViewById(R.id.to);
mTranslateButton = (Button) findViewById(R.id.button_translate);
mSwapButton = (Button) findViewById(R.id.button_swap);
mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
mStatusView = (TextView) findViewById(R.id.status);
//
// Install the language adapters on both the From and To spinners.
//
mFromButton.setOnClickListener(mClickListener);
mToButton.setOnClickListener(mClickListener);
mTranslateButton.setOnClickListener(this);
mSwapButton.setOnClickListener(this);
mFromEditText.selectAll();
connectToTranslateService();
}
private void connectToTranslateService() {
Intent intent = new Intent(Intent.ACTION_VIEW);
bindService(intent, mTranslateConn, Context.BIND_AUTO_CREATE);
}
@Override
public void onResume() {
super.onResume();
SharedPreferences prefs = getPrefs(this);
mDoTranslate = false;
//
// See if we have any saved preference for From
//
Language from = Language.findLanguageByShortName(prefs.getString(FROM, DEFAULT_FROM));
updateButton(mFromButton, from, false /* don't translate */);
//
// See if we have any saved preference for To
//
//
Language to = Language.findLanguageByShortName(prefs.getString(TO, DEFAULT_TO));
updateButton(mToButton, to, true /* translate */);
//
// Restore input and output, if any
//
mFromEditText.setText(prefs.getString(INPUT, ""));
setOutputText(prefs.getString(OUTPUT, ""));
mDoTranslate = true;
}
private void setOutputText(String string) {
log("Setting output to " + string);
mToEditText.setText(new Entities().unescape(string));
}
private void updateButton(Button button, Language language, boolean translate) {
language.configureButton(this, button);
if (translate) maybeTranslate();
}
/**
* Launch the translation if the input text field is not empty.
*/
private void maybeTranslate() {
if (mDoTranslate && !TextUtils.isEmpty(mFromEditText.getText().toString())) {
doTranslate();
}
}
@Override
public void onPause() {
super.onPause();
//
// Save the content of our views to the shared preferences
//
Editor edit = getPrefs(this).edit();
String f = ((Language) mFromButton.getTag()).getShortName();
String t = ((Language) mToButton.getTag()).getShortName();
String input = mFromEditText.getText().toString();
String output = mToEditText.getText().toString();
savePreferences(edit, f, t, input, output);
}
static void savePreferences(Editor edit, String from, String to, String input, String output) {
log("Saving preferences " + from + " " + to + " " + input + " " + output);
edit.putString(FROM, from);
edit.putString(TO, to);
edit.putString(INPUT, input);
edit.putString(OUTPUT, output);
edit.commit();
}
static SharedPreferences getPrefs(Context context) {
return context.getSharedPreferences(TAG, Context.MODE_PRIVATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mTranslateConn);
}
public void onClick(View v) {
if (v == mTranslateButton) {
maybeTranslate();
} else if (v == mSwapButton) {
Object newFrom = mToButton.getTag();
Object newTo = mFromButton.getTag();
mFromEditText.setText(mToEditText.getText());
mToEditText.setText("");
setNewLanguage((Language) newFrom, true /* from */, false /* don't translate */);
setNewLanguage((Language) newTo, false /* to */, true /* translate */);
mFromEditText.requestFocus();
mStatusView.setText(R.string.languages_swapped);
}
}
private void doTranslate() {
mStatusView.setText(R.string.retrieving_translation);
mHandler.post(new Runnable() {
public void run() {
mProgressBar.setVisibility(View.VISIBLE);
String result = "";
try {
Language from = (Language) mFromButton.getTag();
Language to = (Language) mToButton.getTag();
String fromShortName = from.getShortName();
String toShortName = to.getShortName();
String input = mFromEditText.getText().toString();
log("Translating from " + fromShortName + " to " + toShortName);
result = mTranslateService.translate(input, fromShortName, toShortName);
if (result == null) {
throw new Exception(getString(R.string.translation_failed));
}
History.addHistoryRecord(TranslateActivity.this, from, to, input, result);
mStatusView.setText(R.string.found_translation);
setOutputText(result);
mProgressBar.setVisibility(View.INVISIBLE);
mFromEditText.selectAll();
} catch (Exception e) {
mProgressBar.setVisibility(View.INVISIBLE);
mStatusView.setText("Error:" + e.getMessage());
}
}
});
}
@Override
protected void onPrepareDialog(int id, Dialog d) {
if (id == LANGUAGE_DIALOG_ID) {
boolean from = mLatestButton == mFromButton;
((LanguageDialog) d).setFrom(from);
}
}
@Override
protected Dialog onCreateDialog(int id) {
if (id == LANGUAGE_DIALOG_ID) {
return new LanguageDialog(this);
} else if (id == ABOUT_DIALOG_ID) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.about_title);
builder.setMessage(getString(R.string.about_message));
builder.setIcon(R.drawable.babelfish);
builder.setPositiveButton(android.R.string.ok, null);
builder.setNeutralButton(R.string.send_email,
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:cedric@beust.com"));
startActivity(intent);
}
});
builder.setCancelable(true);
return builder.create();
}
return null;
}
/**
* Pick a random word and set it as the input word.
*/
public void selectRandomWord() {
BufferedReader fr = null;
try {
GZIPInputStream is =
new GZIPInputStream(getResources().openRawResource(R.raw.dictionary));
if (mWordBuffer == null) {
mWordBuffer = new byte[601000];
int n = is.read(mWordBuffer, 0, mWordBuffer.length);
int current = n;
while (n != -1) {
n = is.read(mWordBuffer, current, mWordBuffer.length - current);
current += n;
}
is.close();
mWordCount = 0;
mWordIndices = Lists.newArrayList();
for (int i = 0; i < mWordBuffer.length; i++) {
if (mWordBuffer[i] == '\n') {
mWordCount++;
mWordIndices.add(i);
}
}
log("Found " + mWordCount + " words");
}
int randomWordIndex = (int) (System.currentTimeMillis() % (mWordCount - 1));
log("Random word index:" + randomWordIndex + " wordCount:" + mWordCount);
int start = mWordIndices.get(randomWordIndex);
int end = mWordIndices.get(randomWordIndex + 1);
byte[] b = new byte[end - start - 2];
System.arraycopy(mWordBuffer, start + 1, b, 0, (end - start - 2));
String randomWord = new String(b);
mFromEditText.setText(randomWord);
updateButton(mFromButton,
Language.findLanguageByShortName(Language.ENGLISH.getShortName()),
true /* translate */);
} catch (FileNotFoundException e) {
Log.e(TAG, e.getMessage(), e);
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
}
}
public void setNewLanguage(Language language, boolean from, boolean translate) {
updateButton(from ? mFromButton : mToButton, language, translate);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.translate_activity_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.about:
showDialog(ABOUT_DIALOG_ID);
break;
case R.id.show_history:
showHistory();
break;
case R.id.random_word:
selectRandomWord();
break;
// We shouldn't need this menu item but because of a bug in 1.0, neither SMS nor Email
// filter on the ACTION_SEND intent. Since they won't be shown in the activity chooser,
// I need to make an explicit menu for SMS
case R.id.send_with_sms: {
Intent i = new Intent(Intent.ACTION_PICK, Contacts.Phones.CONTENT_URI);
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(Contacts.Phones.CONTENT_TYPE);
startActivityForResult(intent, 42 /* not used */);
break;
}
case R.id.send_with_email:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, mToEditText.getText());
startActivity(Intent.createChooser(intent, null));
break;
}
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultIntent) {
if (resultIntent != null) {
Uri contactURI = resultIntent.getData();
Cursor cursor = getContentResolver().query(contactURI,
new String[] { Contacts.PhonesColumns.NUMBER },
null, null, null);
if (cursor.moveToFirst()) {
String phone = cursor.getString(0);
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto://" + phone));
intent.putExtra("sms_body", mToEditText.getText().toString());
startActivity(intent);
}
}
}
private void showHistory() {
startActivity(new Intent(this, HistoryActivity.class));
}
private static void log(String s) {
Log.d(TAG, "[TranslateActivity] " + s);
}
}
Other Android examples (source code examples)Here is a short list of links related to this Android TranslateActivity.java source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.