/*
 * Copyright 2013 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.example.android.common;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * Simple fragment containing only a TextView.  Used by TextPagerAdapter to create
 * tutorial-style pages for apps.
 */
public class SimpleTextFragment extends Fragment {

    // Contains the text that will be displayed by this Fragment 	
    String mText;

    // Contains a resource ID for the text that will be displayed by this fragment. 	
    int mTextId = -1;

    // Keys which will be used to store/retrieve text passed in via setArguments. 	
    public static final String TEXT_KEY = "text";
    public static final String TEXT_ID_KEY = "text_id";

    // For situations where the app wants to modify text at Runtime, exposing the TextView. 	
    private TextView mTextView;

    public SimpleTextFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Before initializing the textView, check if any arguments were provided via setArguments. 	
        processArguments();

        // Create a new TextView and set its text to whatever was provided. 	
        mTextView = new TextView(getActivity());

        if (mText != null) {
            mTextView.setText(mText);
            Log.i("SimpleTextFragment", mText);
        }
        return mTextView;
    }

    public TextView getTextView() {
        return mTextView;
    }

    /**
     * Changes the text for this TextView, according to the resource ID provided.
     *
     * @param stringId A resource ID representing the text content for this Fragment's TextView.
     */
    public void setText(int stringId) {
        getTextView().setText(getActivity().getString(stringId));
    }

    /**
     * Processes the arguments passed into this Fragment via setArguments method.
     * Currently the method only looks for text or a textID, nothing else.
     */
    public void processArguments() {
        // For most objects we'd handle the multiple possibilities for initialization variables 	
        // as multiple constructors.  For Fragments, however, it's customary to use 	
        // setArguments / getArguments. 	
        if (getArguments() != null) {
            Bundle args = getArguments();
            if (args.containsKey(TEXT_KEY)) {
                mText = args.getString(TEXT_KEY);
                Log.d("Constructor", "Added Text.");
            } else if (args.containsKey(TEXT_ID_KEY)) {
                mTextId = args.getInt(TEXT_ID_KEY);
                mText = getString(mTextId);
            }
        }
    }
} 