Home | History | Annotate | Download | only in Fragments
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.cts.verifier.sensors.sixdof.Fragments;
     17 
     18 import com.android.cts.verifier.R;
     19 import com.android.cts.verifier.sensors.sixdof.BuildConfig;
     20 import com.android.cts.verifier.sensors.sixdof.Activities.StartActivity;
     21 import com.android.cts.verifier.sensors.sixdof.Activities.TestActivity;
     22 import com.android.cts.verifier.sensors.sixdof.Dialogs.ComplexMovementResultDialog;
     23 import com.android.cts.verifier.sensors.sixdof.Interfaces.ComplexMovementListener;
     24 import com.android.cts.verifier.sensors.sixdof.Renderer.ComplexMovementRenderer;
     25 import com.android.cts.verifier.sensors.sixdof.Utils.Manager;
     26 import com.android.cts.verifier.sensors.sixdof.Utils.Exceptions.WaypointAreaCoveredException;
     27 import com.android.cts.verifier.sensors.sixdof.Utils.Exceptions.WaypointDistanceException;
     28 import com.android.cts.verifier.sensors.sixdof.Utils.Exceptions.WaypointRingNotEnteredException;
     29 import com.android.cts.verifier.sensors.sixdof.Utils.Exceptions.WaypointStartPointException;
     30 import com.android.cts.verifier.sensors.sixdof.Utils.Path.ComplexMovementPath;
     31 import com.android.cts.verifier.sensors.sixdof.Utils.Path.PathUtilityClasses.Ring;
     32 import com.android.cts.verifier.sensors.sixdof.Utils.ResultObjects.ResultObject;
     33 
     34 import android.app.Activity;
     35 import android.content.Intent;
     36 import android.opengl.GLSurfaceView;
     37 import android.os.Bundle;
     38 import android.app.AlertDialog;
     39 import android.util.Log;
     40 import android.view.LayoutInflater;
     41 import android.view.View;
     42 import android.view.ViewGroup;
     43 import android.widget.ImageButton;
     44 import android.widget.LinearLayout;
     45 import android.widget.TextView;
     46 import android.widget.Toast;
     47 
     48 import java.io.IOException;
     49 
     50 /**
     51  * UI fragment for the third test.
     52  */
     53 public class ComplexMovementFragment extends BaseUiFragment implements ComplexMovementListener {
     54     private static final String TAG = "ComplexMovementFragment";
     55 
     56     private TextView mTvObjective;
     57     private TextView mTvRings;
     58 
     59     /**
     60      * Standard practice to have a static newInstance constructor. Used to pass in arguments to the
     61      * fragment. We don't have any at the moment, but this is good structure for the future.
     62      *
     63      * @return a new Robustness test fragment.
     64      */
     65     public static ComplexMovementFragment newInstance() {
     66         return new ComplexMovementFragment();
     67     }
     68 
     69     /**
     70      * Called when the parent activity has been created. Adds the GLSurfaceView to the fragment
     71      * layout.
     72      */
     73     @Override
     74     public void onActivityCreated(Bundle savedInstanceState) {
     75         super.onActivityCreated(savedInstanceState);
     76 
     77         GLSurfaceView surfaceView = new GLSurfaceView(getActivity());
     78         surfaceView.setEGLContextClientVersion(2);
     79         mRenderer = new ComplexMovementRenderer(getActivity(), mActivity.getRings());
     80         surfaceView.setRenderer(mRenderer);
     81         mLLCameraLayout = (LinearLayout) getView().findViewById(R.id.llCamera);
     82         mLLCameraLayout.addView(surfaceView);
     83         Log.d(TAG, "Camera Preview add to layout");
     84     }
     85 
     86     /**
     87      * Initialises all of the UI elements
     88      */
     89     @Override
     90     public View onCreateView(LayoutInflater inflater, ViewGroup container,
     91                              Bundle savedInstanceState) {
     92         View view = inflater.inflate(R.layout.fragment_complex_movement, container, false);
     93         getActivity().setTitle(getResources().getStringArray(R.array.phase)[TestActivity.CTSTest.COMPLEX_MOVEMENT.ordinal()]);
     94 
     95         // Set up pass/info/fail buttons.
     96         setupButtons(view, TestActivity.CTSTest.COMPLEX_MOVEMENT);
     97 
     98         mPlaceWaypointButton = (ImageButton) view.findViewById(R.id.fabPlaceWaypoint);
     99         mPlaceWaypointButton.setOnClickListener(new View.OnClickListener() {
    100             @Override
    101             public void onClick(View v) {
    102                 try {
    103                     mActivity.attemptWaypointPlacement();
    104                 } catch (WaypointAreaCoveredException e) {
    105                     Toast.makeText(getActivity(),
    106                             getString(R.string.error_area), Toast.LENGTH_SHORT).show();
    107                 } catch (WaypointDistanceException e) {
    108                     Toast.makeText(getActivity(),
    109                             getString(R.string.error_distance), Toast.LENGTH_SHORT).show();
    110                 } catch (WaypointStartPointException e) {
    111                     Toast.makeText(getActivity(),
    112                             getString(R.string.error_start_point), Toast.LENGTH_SHORT).show();
    113                 } catch (WaypointRingNotEnteredException e) {
    114                     Toast.makeText(getActivity(),
    115                             getString(R.string.error_rings_not_entered), Toast.LENGTH_SHORT).show();
    116                 }
    117             }
    118         });
    119 
    120         mTvObjective = (TextView) view.findViewById(R.id.tvObjective);
    121         mTvRings = (TextView) view.findViewById(R.id.tvRings);
    122 
    123         return view;
    124     }
    125 
    126     /**
    127      * Called after onCreateView. Starts listening for 6DoF events.
    128      */
    129     @Override
    130     public void onViewCreated(View view, Bundle savedInstanceState) {
    131         super.onViewCreated(view, savedInstanceState);
    132         mActivity.listenFor6DofData(this);
    133     }
    134 
    135     @Override
    136     protected void setupUILoop() {
    137         Runnable runnable = new Runnable() {
    138             @Override
    139             public void run() {
    140                 if (mActivity == null || getActivity() == null) {
    141                     return;
    142                 }
    143 
    144                 int waypointCount = mActivity.getUserGeneratedWaypoints(Manager.Lap.LAP_4).size();
    145                 mTvObjective.setText(getObjectiveText(Manager.Lap.LAP_4, waypointCount));
    146 
    147                 int ringCount = 0;
    148                 for (Ring ring : mActivity.getRings()) {
    149                     if (ring.getPathNumber() == waypointCount && ring.isEntered()) {
    150                         ringCount++;
    151                     }
    152                 }
    153 
    154                 mTvRings.setText(String.format(getString(R.string.rings_entered),
    155                         ringCount, ComplexMovementPath.RINGS_PER_PATH));
    156 
    157                 if (waypointCount < Manager.MAX_MARKER_NUMBER) {
    158                     mPlaceWaypointButton.setVisibility(View.VISIBLE);
    159                 }
    160 
    161                 // Update the UI again in x milliseconds.
    162                 if (mHandler != null) {
    163                     mHandler.postDelayed(this, UI_UPDATE_DELAY);
    164                 }
    165             }
    166         };
    167 
    168         super.initUIHandler(runnable);
    169     }
    170 
    171     /**
    172      * Shows initial instruction dialog
    173      */
    174     @Override
    175     protected void showInitialDialog() {
    176         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    177 
    178         builder.setMessage(R.string.phase3_initial_message)
    179                 .setTitle(getResources().getStringArray(R.array.phase)[TestActivity.CTSTest.COMPLEX_MOVEMENT.ordinal()])
    180                 .setPositiveButton(R.string.got_it, null);
    181 
    182         AlertDialog dialog = builder.create();
    183         dialog.show();
    184     }
    185 
    186     @Override
    187     public void onWaypointPlaced() {
    188         super.onWaypointPlaced();
    189         ((ComplexMovementRenderer) mRenderer).onWaypointPlaced(mActivity.getUserGeneratedWaypoints(Manager.Lap.LAP_4).size());
    190     }
    191 
    192     @Override
    193     public void onRingEntered(Ring ring) {
    194         ((ComplexMovementRenderer) mRenderer).onRingEntered(ring);
    195     }
    196 
    197     @Override
    198     public void onResult(ResultObject result) {
    199         ComplexMovementResultDialog dialog = ComplexMovementResultDialog.newInstance(result);
    200         dialog.setTargetFragment(ComplexMovementFragment.this, DIALOG_FRAGMENT);
    201         dialog.show(getActivity().getFragmentManager(), "ResultDialogFragment");
    202         mPlaceWaypointButton.setVisibility(View.INVISIBLE);
    203 
    204         if (result.hasPassed() || BuildConfig.DEBUG) {
    205             mBtnPass.setEnabled(true);
    206             mBtnPass.setOnClickListener(new View.OnClickListener() {
    207                 @Override
    208                 public void onClick(View view) {
    209                     finishTest();
    210                 }
    211             });
    212         }
    213     }
    214 
    215     private void finishTest() {
    216         Intent resultIntent = getActivity().getIntent();
    217         String report = "Couldn't create test report.";
    218         try {
    219             report = mActivity.getTestReport().getContents();
    220         } catch (IOException e) {
    221             Log.e(TAG, report);
    222         }
    223         resultIntent.putExtra(TestActivity.EXTRA_REPORT, report);
    224         resultIntent.putExtra(TestActivity.EXTRA_RESULT_ID, StartActivity.ResultCode.PASSED);
    225         getActivity().setResult(Activity.RESULT_OK, resultIntent);
    226         getActivity().finish();
    227     }
    228 }
    229