/* * Copyright (C) 2016 The Android Open Source Project * * 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.udacity.example.quizexample; import android.content.ContentResolver; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.udacity.example.droidtermsprovider.DroidTermsExampleContract; /** * Gets the data from the ContentProvider and shows a series of flash cards. */ public class MainActivity extends AppCompatActivity { // The data from the DroidTermsExample content provider private Cursor mData; // The current state of the app private int mCurrentState; // The index of the definition and word column in the cursor private int mDefCol, mWordCol; private TextView mWordTextView, mDefinitionTextView; private Button mButton; // This state is when the word definition is hidden and clicking the button will therefore // show the definition private final int STATE_HIDDEN = 0; // This state is when the word definition is shown and clicking the button will therefore // advance the app to the next word private final int STATE_SHOWN = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Get the views // COMPLETED (1) You'll probably want more than just the Button mWordTextView = (TextView) findViewById(R.id.text_view_word); mDefinitionTextView = (TextView) findViewById(R.id.text_view_definition); mButton = (Button) findViewById(R.id.button_next); //Run the database operation to get the cursor off of the main thread new WordFetchTask().execute(); } /** * This is called from the layout when the button is clicked and switches between the * two app states. * @param view The view that was clicked */ public void onButtonClick(View view) { // Either show the definition of the current word, or if the definition is currently // showing, move to the next word. switch (mCurrentState) { case STATE_HIDDEN: showDefinition(); break; case STATE_SHOWN: nextWord(); break; } } public void nextWord() { // COMPLETED (3) Go to the next word in the Cursor, show the next word and hide the definition // Note that you shouldn't try to do this if the cursor hasn't been set yet. // If you reach the end of the list of words, you should start at the beginning again. if (mData != null) { // Move to the next position in the cursor, if there isn't one, move to the first if (!mData.moveToNext()) { mData.moveToFirst(); } // Hide the definition TextView mDefinitionTextView.setVisibility(View.INVISIBLE); // Change button text mButton.setText(getString(R.string.show_definition)); // Get the next word mWordTextView.setText(mData.getString(mWordCol)); mDefinitionTextView.setText(mData.getString(mDefCol)); mCurrentState = STATE_HIDDEN; } } public void showDefinition() { // COMPLETED (4) Show the definition if (mData != null) { // Show the definition TextView mDefinitionTextView.setVisibility(View.VISIBLE); // Change button text mButton.setText(getString(R.string.next_word)); mCurrentState = STATE_SHOWN; } } @Override protected void onDestroy() { super.onDestroy(); // COMPLETED (5) Remember to close your cursor! mData.close(); } // Use an async task to do the data fetch off of the main thread. public class WordFetchTask extends AsyncTask<Void, Void, Cursor> { // Invoked on a background thread @Override protected Cursor doInBackground(Void... params) { // Make the query to get the data // Get the content resolver ContentResolver resolver = getContentResolver(); // Call the query method on the resolver with the correct Uri from the contract class Cursor cursor = resolver.query(DroidTermsExampleContract.CONTENT_URI, null, null, null, null); return cursor; } // Invoked on UI thread @Override protected void onPostExecute(Cursor cursor) { super.onPostExecute(cursor); // COMPLETED (2) Initialize anything that you need the cursor for, such as setting up // the screen with the first word and setting any other instance variables //Set up a bunch of instance variables based off of the data // Set the data for MainActivity mData = cursor; // Get the column index, in the Cursor, of each piece of data mDefCol = mData.getColumnIndex(DroidTermsExampleContract.COLUMN_DEFINITION); mWordCol = mData.getColumnIndex(DroidTermsExampleContract.COLUMN_WORD); // Set the initial state nextWord(); } } }