/*
* Copyright 2015-2016, Institute of Cybernetics at Tallinn University of Technology
*
* 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 ee.ioc.phon.android.speak.activity;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import ee.ioc.phon.android.speak.R;
import ee.ioc.phon.android.speechutils.editor.UtteranceRewriter;
import ee.ioc.phon.android.speechutils.utils.PreferenceUtils;
/**
* Loads the rewrites from the EXTRAs of an incoming VIEW- or SEND-intent, or if they are missing,
* then launches ACTION_GET_CONTENT to load the rewrites from its result data.
* In case of an incoming VIEW/SEND-intent we only accept "text/tab-separated-values" (see the manifest).
* However, if the user explicitly launches a file picker from Kõnele, then any "text/*" files
* can be picked.
*/
public class RewritesLoaderActivity extends Activity {
//private static final String TYPE = "text/tab-separated-values";
private static final String TYPE = "text/*";
private static final int GET_CONTENT_REQUEST_CODE = 1;
private UtteranceRewriter utteranceRewriter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rewrites_loader);
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
final Resources res = getResources();
final Button bRewritesLoader = (Button) findViewById(R.id.bRewritesNameOk);
final AutoCompleteTextView et = (AutoCompleteTextView) findViewById(R.id.etRewritesNameText);
et.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
bRewritesLoader.performClick();
return true;
}
return false;
}
});
bRewritesLoader.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
saveAndShow(prefs, res, et.getText().toString());
}
});
List<String> keysSorted = new ArrayList<>(PreferenceUtils.getPrefMapKeys(prefs, res, R.string.keyRewritesMap));
// If there are already some rewrites then we show their names as well
if (!keysSorted.isEmpty()) {
Collections.sort(keysSorted);
String[] names = keysSorted.toArray(new String[0]);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, names);
et.setAdapter(adapter);
final LinearLayout ll = (LinearLayout) findViewById(R.id.llRewritesChooser);
ll.setVisibility(View.VISIBLE);
final ListView lv = (ListView) findViewById(R.id.lvRewrites);
lv.setAdapter(new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, names));
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
saveAndShow(prefs, res, (String) lv.getItemAtPosition(position));
}
});
}
Intent intent = getIntent();
Uri uri = intent.getData();
if (uri == null && intent.getExtras() == null) {
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(TYPE);
intent.addCategory(Intent.CATEGORY_OPENABLE);
Intent chooser = Intent.createChooser(intent, "");
startActivityForResult(chooser, GET_CONTENT_REQUEST_CODE);
} else {
// Responding to SEND and VIEW actions
String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT);
if (subject != null) {
et.setText(subject);
et.setSelection(subject.length());
}
String text = intent.getStringExtra(Intent.EXTRA_TEXT);
if (text == null) {
if (uri == null) {
uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
}
if (uri != null) {
utteranceRewriter = loadFromUri(uri);
}
} else {
utteranceRewriter = new UtteranceRewriter(text);
}
finishIfFailed();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == GET_CONTENT_REQUEST_CODE && resultCode == Activity.RESULT_OK && resultData != null) {
Uri uri = resultData.getData();
if (uri != null) {
utteranceRewriter = loadFromUri(uri);
}
}
finishIfFailed();
}
private UtteranceRewriter loadFromUri(Uri uri) {
try {
return new UtteranceRewriter(getContentResolver(), uri);
} catch (IOException e) {
String errorMessage = String.format(getString(R.string.errorLoadRewrites), e.getLocalizedMessage());
toast(errorMessage);
}
return null;
}
private void finishIfFailed() {
if (utteranceRewriter == null) {
finish();
}
}
private void saveAndShow(SharedPreferences prefs, Resources res, String name) {
if (utteranceRewriter != null) {
PreferenceUtils.putPrefMapEntry(prefs, res, R.string.keyRewritesMap, name, utteranceRewriter.toTsv());
Intent intent = new Intent(this, RewritesActivity.class);
intent.putExtra(RewritesActivity.EXTRA_NAME, name);
intent.putExtra(RewritesActivity.EXTRA_ERRORS, utteranceRewriter.getErrorsAsStringArray());
startActivity(intent);
}
finish();
}
private void toast(String message) {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
}
}