package net.bible.android.view.activity.readingplan; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.TableLayout; import android.widget.TextView; import net.bible.android.activity.R; import net.bible.android.control.readingplan.ReadingPlanControl; import net.bible.android.control.readingplan.ReadingStatus; import net.bible.android.view.activity.base.CustomTitlebarActivityBase; import net.bible.android.view.activity.base.Dialogs; import net.bible.android.view.activity.readingplan.actionbar.ReadingPlanActionBarManager; import net.bible.service.common.CommonUtils; import net.bible.service.readingplan.OneDaysReadingsDto; import org.crosswire.jsword.passage.Key; import org.crosswire.jsword.versification.BookName; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; /** Allow user to enter search criteria * * @author Martin Denham [mjdenham at gmail dot com] * @see gnu.lgpl.License for license details.<br> * The copyright to this program is held by it's author. */ public class DailyReading extends CustomTitlebarActivityBase { private static final String TAG = "DailyReading"; private TextView mDescriptionView; private TextView mDayView; private TextView mDateView; private List<ImageView> mImageTickList; private Button mDoneButton; private int mDay; public static final String PLAN = "net.bible.android.view.activity.readingplan.Plan"; public static final String DAY = "net.bible.android.view.activity.readingplan.Day"; private OneDaysReadingsDto mReadings; private ReadingPlanControl readingPlanControl; private ReadingPlanActionBarManager readingPlanActionBarManager; public DailyReading() { super(R.menu.reading_plan); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState, true); Log.i(TAG, "Displaying one day reading plan"); setContentView(R.layout.reading_plan_one_day); super.buildActivityComponent().inject(this); super.setActionBarManager(readingPlanActionBarManager); try { // may not be for current day if user presses forward or backward mDay = readingPlanControl.getCurrentPlanDay(); Bundle extras = getIntent().getExtras(); if (extras != null) { if (extras.containsKey(PLAN)) { readingPlanControl.setReadingPlan(extras.getString(PLAN)); } if (extras.containsKey(DAY)) { mDay = extras.getInt(DAY, mDay); } } // get readings for chosen day mReadings = readingPlanControl.getDaysReading(mDay); // Populate view mDescriptionView = (TextView)findViewById(R.id.description); mDescriptionView.setText(mReadings.getReadingPlanInfo().getDescription()); // date display mDayView = (TextView)findViewById(R.id.day); mDayView.setText(mReadings.getDayDesc()); mDateView = (TextView)findViewById(R.id.date); mDateView.setText(mReadings.getReadingDateString()); mDoneButton = (Button)findViewById(R.id.doneButton); mImageTickList = new ArrayList<>(); // show short book name to save space if Portrait boolean fullBookNameSave = BookName.isFullBookName(); BookName.setFullBookName(!CommonUtils.isPortrait()); TableLayout layout = (TableLayout)findViewById(R.id.reading_container); for (int i=0; i<mReadings.getNumReadings(); i++) { final int readingNo = i; View child = getLayoutInflater().inflate(R.layout.reading_plan_one_reading, null); // Ticks mImageTickList.add((ImageView)child.findViewById(R.id.tick)); // Passage description TextView rdgText = (TextView)child.findViewById(R.id.passage); Key key = mReadings.getReadingKey(readingNo); rdgText.setText(key.getName()); // handle read button clicks Button readBtn = (Button)child.findViewById(R.id.readButton); readBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onRead(readingNo); } }); // handle speak button clicks Button speakBtn = (Button)child.findViewById(R.id.speakButton); speakBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onSpeak(readingNo); } }); layout.addView(child, readingNo); } // restore full book name setting BookName.setFullBookName(fullBookNameSave); updateTicksAndDone(); // Speak All if (mReadings.getNumReadings()>1) { View child = getLayoutInflater().inflate(R.layout.reading_plan_one_reading, null); // hide the tick ImageView tick = (ImageView)child.findViewById(R.id.tick); tick.setVisibility(View.INVISIBLE); // Passage description TextView rdgText = (TextView)child.findViewById(R.id.passage); rdgText.setText(getResources().getString(R.string.all)); Button passageBtn = (Button)child.findViewById(R.id.readButton); passageBtn.setVisibility(View.INVISIBLE); Button speakBtn = (Button)child.findViewById(R.id.speakButton); speakBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onSpeakAll(null); } }); layout.addView(child, mReadings.getNumReadings()); } // end All Log.d(TAG, "Finished displaying Reading view"); } catch (Exception e) { Log.e(TAG, "Error showing daily readings", e); Dialogs.getInstance().showErrorMsg(R.string.error_occurred, e); } } /** user pressed read button by 1 reading */ public void onRead(int readingNo) { Log.i(TAG, "Read "+readingNo); Key readingKey = mReadings.getReadingKey(readingNo); readingPlanControl.read(mDay, readingNo, readingKey); finish(); } /** user pressed speak button by 1 reading */ public void onSpeak(int readingNo) { Log.i(TAG, "Speak "+readingNo); Key readingKey = mReadings.getReadingKey(readingNo); readingPlanControl.speak(mDay, readingNo, readingKey); updateTicksAndDone(); } /** user pressed speak button by All */ public void onSpeakAll(View view) { Log.i(TAG, "Speak all"); readingPlanControl.speak(mDay, mReadings.getReadingKeys()); updateTicksAndDone(); } // the button that called this has been removed public void onNext(View view) { Log.i(TAG, "Next"); if (mDay<mReadings.getReadingPlanInfo().getNumberOfPlanDays()) { showDay(mDay+1); } } // the button that called this has been removed public void onPrevious(View view) { Log.i(TAG, "Previous"); if (mDay>1) { showDay(mDay-1); } } /** user pressed Done button so must have read currently displayed readings */ public void onDone(View view) { Log.i(TAG, "Done"); try { // do not add to History list because it will just redisplay same page setIntegrateWithHistoryManager(false); // all readings must be ticked for this to be enabled int nextDayToShow = readingPlanControl.done(mReadings.getReadingPlanInfo(), mDay, false); //if user is behind then go to next days readings if (nextDayToShow>0) { showDay(nextDayToShow); } else { // else exit finish(); } // if we move away then add to history list setIntegrateWithHistoryManager(true); } catch (Exception e) { Log.e(TAG, "Error when Done daily reading", e); Dialogs.getInstance().showErrorMsg(R.string.error_occurred, e); } } /** allow activity to enhance intent to correctly restore state */ public Intent getIntentForHistoryList() { Intent intent = getIntent(); intent.putExtra(DailyReading.PLAN, mReadings.getReadingPlanInfo().getCode()); intent.putExtra(DailyReading.DAY, mReadings.getDay()); return intent; } /** I don't think this is used because of hte finish() in onSearch() */ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode==Activity.RESULT_OK) { returnToPreviousScreen(); } } private void showDay(int dayNo) { Log.i(TAG, "ShowDay "+dayNo); Intent handlerIntent = new Intent(this, DailyReading.class); handlerIntent.putExtra(DAY, dayNo); startActivity(handlerIntent); finish(); } private void updateTicksAndDone() { ReadingStatus status = readingPlanControl.getReadingStatus(mDay); for (int i=0; i<mImageTickList.size(); i++) { ImageView imageTick = mImageTickList.get(i); if (status.isRead(i)) { imageTick.setImageResource(R.drawable.btn_check_buttonless_on); } else { imageTick.setImageResource(R.drawable.btn_check_buttonless_off); } } mDoneButton.setEnabled(status.isAllRead()); } @Override protected void onScreenTurnedOn() { super.onScreenTurnedOn(); // use reload to ensure colour is correct reload(); } /** Could possibly push this reload up to a higher level * See: http://stackoverflow.com/questions/1397361/how-do-i-restart-an-android-activity */ private void reload() { // do not save current page to history because it is being reloaded boolean wasIntegrateWithhistory = isIntegrateWithHistoryManager(); setIntegrateWithHistoryManager(false); // reload page to refresh if screen colour change Intent intent = getIntent(); finish(); startActivity(intent); setIntegrateWithHistoryManager(wasIntegrateWithhistory); } /** * on Click handlers */ @Override public boolean onOptionsItemSelected(MenuItem item) { boolean isHandled = false; switch (item.getItemId()) { // selected to allow jump to a certain day case (R.id.done): Log.i(TAG, "Force Done"); try { readingPlanControl.done(mReadings.getReadingPlanInfo(), mDay, true); updateTicksAndDone(); } catch (Exception e) { Log.e(TAG, "Error when Done daily reading", e); Dialogs.getInstance().showErrorMsg(R.string.error_occurred, e); } break; case (R.id.reset): readingPlanControl.reset(mReadings.getReadingPlanInfo()); finish(); isHandled = true; break; case (R.id.setStartToJan1): readingPlanControl.setStartToJan1(mReadings.getReadingPlanInfo()); // refetch readings for chosen day mReadings = readingPlanControl.getDaysReading(mDay); // update date and day no mDateView.setText(mReadings.getReadingDateString()); mDayView.setText(mReadings.getDayDesc()); isHandled = true; break; } if (!isHandled) { isHandled = super.onOptionsItemSelected(item); } return isHandled; } @Inject void setReadingPlanControl(ReadingPlanControl readingPlanControl) { this.readingPlanControl = readingPlanControl; } @Inject void setReadingPlanActionBarManager(ReadingPlanActionBarManager readingPlanActionBarManager) { this.readingPlanActionBarManager = readingPlanActionBarManager; } }