package com.cwport.sentencer; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.cwport.sentencer.data.DataException; import com.cwport.sentencer.data.DataHelper; import com.cwport.sentencer.data.DataManager; import com.cwport.sentencer.data.DataProvider; import com.cwport.sentencer.data.SourceType; import com.cwport.sentencer.model.Lesson; import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URI; import java.util.ArrayList; public class MainActivity extends ActionBarActivity { static final String TAG = MainActivity.class.getSimpleName(); SharedPreferences sharedPref; SharedPreferences.Editor sharedPrefEditor; ArrayList<Lesson> lessonList; private DataManager dataManager; private ProgressDialog ringProgressDialog; private DataProvider assetDataProvider; private DataProvider internalDataProvider; LessonAdapter listAdapter; ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dataManager = ((SentencerApp)getApplicationContext()).getDataManager(); listView = (ListView) findViewById(R.id.list_lessons); buildLessonList(); // listening to single list item on click listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { startLesson(position); } }); } private void startLesson(int lessonIndex) { // sending data to new activity Intent i = new Intent(getApplicationContext(), CardActivity.class); i.putExtra(DataHelper.EXTRA_LESSON_INDEX, lessonList.get(lessonIndex).getId()); i.putExtra(DataHelper.EXTRA_LESSON_TITLE, lessonList.get(lessonIndex).getTitle()); i.putExtra(DataHelper.EXTRA_LESSON_SOURCE, lessonList.get(lessonIndex).getSourceType().ordinal()); startActivity(i); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); switch(id) { case R.id.action_add_user_lesson: scanLessonCode(); return true; case R.id.action_help: showHelp(); return true; } return super.onOptionsItemSelected(item); } public void onActivityResult(int requestCode, int resultCode, Intent intent) { IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (scanResult != null) { Log.i(TAG, "QR-code: " + scanResult.getContents()); downloadLesson(scanResult.getContents()); // Toast.makeText(this, scanResult.getContents(), Toast.LENGTH_LONG); } else { Log.e(TAG, "Scan error result code: " + resultCode); Toast.makeText(this, "No data scanned", Toast.LENGTH_LONG); } } private void buildLessonList() { lessonList = new ArrayList<Lesson>(); try { if(assetDataProvider == null) { assetDataProvider = dataManager.getDataProvider(SourceType.ASSET, getApplicationContext()); } if(internalDataProvider == null) { internalDataProvider = dataManager.getDataProvider(SourceType.INTERNAL, getApplicationContext()); } if(lessonList.isEmpty()) { lessonList = internalDataProvider.getLessons(); lessonList.addAll(assetDataProvider.getLessons()); } } catch(DataException de) { Log.e(TAG, de.getMessage()); Toast.makeText(getApplicationContext(), de.getMessage(), Toast.LENGTH_LONG).show(); } listAdapter = new LessonAdapter(lessonList); listAdapter.notifyDataSetChanged(); listView.setAdapter(listAdapter); } private void downloadLesson(String fileUrl) { new DownloadFileTask().execute(fileUrl); } private void scanLessonCode() { if(CommonUtils.isConnectedOrConnectingToNetwork(getApplicationContext())) { IntentIntegrator integrator = new IntentIntegrator(this); integrator.initiateScan(IntentIntegrator.QR_CODE_TYPES); } else { Toast.makeText(getApplicationContext(), R.string.msg_no_internet_connection, Toast.LENGTH_LONG).show(); } } private void showHelp() { Intent helpIntent = new Intent(this, HelpActivity.class); startActivity(helpIntent); } /** * LessonAdapter is intended to provide a list of incorporated lessons from assets */ private class LessonAdapter extends ArrayAdapter<Lesson> { // private LayoutInflater layoutInflater; // private Context mainContext; private ArrayList<Lesson> lessons; public LessonAdapter(ArrayList<Lesson> list) { super(MainActivity.this, R.layout.list_item_user_lesson, list); lessons = list; } public View getView(int position, View convertView, ViewGroup parent) { View row; final Lesson lesson = lessons.get(position); if (convertView == null) { row = getLayoutInflater().inflate(R.layout.list_item_user_lesson, null); } else { row = convertView; } ImageView icon = (ImageView) row.findViewById(R.id.icon); if(lesson.getSourceType() == SourceType.INTERNAL) { icon.setImageResource(R.drawable.ic_action_person); } else { icon.setImageResource(R.drawable.ic_action_attachment); } TextView title = (TextView)row.findViewById(R.id.lesson_title); title.setText(lesson.getTitle()); TextView meta = (TextView)row.findViewById(R.id.lesson_meta); meta.setText(lesson.getDescription() + " (" + MainActivity.this.getString(R.string.label_cards) + ": " + lesson.getCardCount() + ")"); return row; } } private class DownloadFileTask extends AsyncTask<String, Void, String> { @Override protected void onPreExecute() { ringProgressDialog = ProgressDialog.show(MainActivity.this, MainActivity.this.getString(R.string.please_wait), MainActivity.this.getString(R.string.download_lesson_file), true); ringProgressDialog.setCancelable(true); } @Override protected String doInBackground(String... params) { String url = params[0]; InputStream inputStream; String fileName = null; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(); URI uriFile = new URI(url); httpGet.setURI(uriFile); HttpResponse response = httpClient.execute(httpGet); inputStream = response.getEntity().getContent(); byte[] buffer = new byte[1024]; while (true) { int r = inputStream.read(buffer); if (r == -1) break; outputStream.write(buffer, 0, r); } byte[] data = outputStream.toByteArray(); FileOutputStream fileOutputStream; fileName = DataHelper.userLessonFileName(uriFile); if(SentencerApp.DEBUG) { Log.i(TAG, "Create file " + getFilesDir() + "/" + fileName); } fileOutputStream = openFileOutput(fileName, Context.MODE_PRIVATE); fileOutputStream.write(data); fileOutputStream.close(); } catch(Exception e) { Log.e(TAG, e.getMessage()); } return fileName; } @Override protected void onPostExecute(String internalFile) { if(ringProgressDialog.isShowing()) ringProgressDialog.dismiss(); buildLessonList(); } @Override protected void onCancelled() { Log.i(TAG, "AsyncTask Download File has been cancelled."); } } }