13c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata/*
23c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata * Copyright (C) 2017 The Android Open Source Project
33c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata *
43c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata * Licensed under the Apache License, Version 2.0 (the "License");
53c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata * you may not use this file except in compliance with the License.
63c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata * You may obtain a copy of the License at
73c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata *
83c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata *      http://www.apache.org/licenses/LICENSE-2.0
93c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata *
103c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata * Unless required by applicable law or agreed to in writing, software
113c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata * distributed under the License is distributed on an "AS IS" BASIS,
123c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata * See the License for the specific language governing permissions and
143c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata * limitations under the License.
153c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata */
163c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
173c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granatapackage com.google.android.car.kitchensink.diagnostic;
183c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
193c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.annotation.Nullable;
203c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.car.Car;
2125e89468119cd0b109f62c751446dfdd8e903143Enrico Granataimport android.car.diagnostic.CarDiagnosticEvent;
2225e89468119cd0b109f62c751446dfdd8e903143Enrico Granataimport android.car.diagnostic.CarDiagnosticManager;
2325e89468119cd0b109f62c751446dfdd8e903143Enrico Granataimport android.car.diagnostic.CarDiagnosticManager.OnDiagnosticEventListener;
243c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.graphics.Color;
253c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.os.Bundle;
263c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.support.car.hardware.CarSensorManager;
273c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.support.v4.app.Fragment;
283c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.util.Log;
293c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.view.LayoutInflater;
303c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.view.View;
313c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.view.ViewGroup;
323c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport android.widget.TextView;
333c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport com.google.android.car.kitchensink.KitchenSinkActivity;
343c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport com.google.android.car.kitchensink.R;
353c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granataimport java.util.Objects;
363c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
373c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
383c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granatapublic class DiagnosticTestFragment extends Fragment {
393c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    private static final String TAG = "CAR.DIAGNOSTIC.KS";
403c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
413c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    private KitchenSinkActivity mActivity;
423c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    private TextView mLiveDiagnosticInfo;
433c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    private TextView mFreezeDiagnosticInfo;
443c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    private CarDiagnosticManager mDiagnosticManager;
453c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
463c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    private final class TestListener implements OnDiagnosticEventListener {
473c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        private final TextView mTextView;
483c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
493c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        TestListener(TextView view) {
503c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            mTextView = Objects.requireNonNull(view);
513c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        }
523c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
533c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        @Override
543c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        public void onDiagnosticEvent(CarDiagnosticEvent carDiagnosticEvent) {
553c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            mTextView.post(() -> mTextView.setText(carDiagnosticEvent.toString()));
563c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        }
573c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    }
583c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
593c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    private OnDiagnosticEventListener mLiveListener;
603c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    private OnDiagnosticEventListener mFreezeListener;
613c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
623c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    @Nullable
633c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    @Override
643c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    public View onCreateView(
653c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            LayoutInflater inflater,
663c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            @Nullable ViewGroup container,
673c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            @Nullable Bundle savedInstanceState) {
683c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        View view = inflater.inflate(R.layout.diagnostic, container, false);
693c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        mActivity = (KitchenSinkActivity) getHost();
703c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
713c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        mLiveDiagnosticInfo = (TextView) view.findViewById(R.id.live_diagnostic_info);
723c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        mLiveDiagnosticInfo.setTextColor(Color.RED);
733c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        mLiveListener = new TestListener(mLiveDiagnosticInfo);
743c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
753c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        mFreezeDiagnosticInfo = (TextView) view.findViewById(R.id.freeze_diagnostic_info);
763c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        mFreezeDiagnosticInfo.setTextColor(Color.RED);
773c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        mFreezeListener = new TestListener(mFreezeDiagnosticInfo);
783c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
793c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        return view;
803c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    }
813c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
823c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    @Override
833c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    public void onResume() {
843c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        super.onResume();
853c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        resumeDiagnosticManager();
863c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    }
873c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
883c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    @Override
893c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    public void onPause() {
903c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        super.onPause();
913c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        pauseDiagnosticManager();
923c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    }
933c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
943c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    private void resumeDiagnosticManager() {
953c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        try {
963c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            mDiagnosticManager =
973c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata                    (CarDiagnosticManager)mActivity.getCar().getCarManager(Car.DIAGNOSTIC_SERVICE);
983c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            if (mLiveListener != null) {
993c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata                mDiagnosticManager.registerListener(mLiveListener,
1005e075dac94101efe1bdcde105b8c4194eb9e70d0Enrico Granata                    CarDiagnosticManager.FRAME_TYPE_LIVE,
1013c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata                    CarSensorManager.SENSOR_RATE_NORMAL);
1023c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            }
1033c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            if (mFreezeListener != null) {
1043c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata                mDiagnosticManager.registerListener(mFreezeListener,
1055e075dac94101efe1bdcde105b8c4194eb9e70d0Enrico Granata                    CarDiagnosticManager.FRAME_TYPE_FREEZE,
1063c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata                    CarSensorManager.SENSOR_RATE_NORMAL);
1073c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            }
1083c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        } catch (android.car.CarNotConnectedException|android.support.car.CarNotConnectedException e) {
1093c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            Log.e(TAG, "Car not connected or not supported", e);
1103c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        }
1113c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    }
1123c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata
1133c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    private void pauseDiagnosticManager() {
1143c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        if (mDiagnosticManager != null) {
1153c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            if (mLiveListener != null) {
1163c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata                mDiagnosticManager.unregisterListener(mLiveListener);
1173c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            }
1183c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            if (mFreezeListener != null) {
1193c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata                mDiagnosticManager.unregisterListener(mFreezeListener);
1203c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata            }
1213c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata        }
1223c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata    }
1233c06d02c560c9e0af0293f5f3adf9bb45822b201Enrico Granata}
124