/*
 * Copyright (C) 2008 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 android.view.cts;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.Button;

public class FocusFinderCtsActivity extends Activity {

    public ViewGroup layout;

    public ViewGroup inflateLayout;

    public Button topLeftButton;

    public Button topRightButton;

    public Button bottomLeftButton;

    public Button bottomRightButton;

    public Button bottomButton;

    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.focus_finder_layout);
        layout = (ViewGroup) findViewById(R.id.layout);
        inflateLayout = (ViewGroup) findViewById(R.id.inflate_layout);
        topLeftButton = (Button) findViewById(R.id.top_left_button);
        topRightButton = (Button) findViewById(R.id.top_right_button);
        bottomLeftButton = (Button) findViewById(R.id.bottom_left_button);
        bottomRightButton = (Button) findViewById(R.id.bottom_right_button);
        bottomButton = (Button) findViewById(R.id.bottom_button);
    }
}

