diff options
author | Kai <kwangsudo@google.com> | 2018-06-20 12:37:52 -0700 |
---|---|---|
committer | Kai Wang <kwangsudo@google.com> | 2018-06-29 20:01:20 +0000 |
commit | a67a9ab80906c3e6767066dab607ce98788053ea (patch) | |
tree | af095f2fb8752c7d9e03fd73c4a3764b25fba2c7 /tests/EmbeddedKitchenSinkApp | |
parent | 1ab32b66ef7467e536df727b0b9419dd31556a8e (diff) | |
download | Car-a67a9ab80906c3e6767066dab607ce98788053ea.tar.gz |
Fix setting night mode and change test crashes EKS
Add AsyncTask to refresh Car*Manager. Ensure all properties will
be checked when we use unregister a listener.
Bug: 110043754, 110437786
Test: 1) Start EKS, Select "Sensors" test.
2) Use vhal_emulator.py to set night model state to 1.
3) Switch to "hvac" test, set nigth model state to 0.
Change-Id: I48ce210c45cf2da2db90178aa909e5f10eada8f6
Merged-In: I48ce210c45cf2da2db90178aa909e5f10eada8f6
(cherry picked from commit cf3387bd4c90ee09eeff2dc0878c26a399e5ff23)
Diffstat (limited to 'tests/EmbeddedKitchenSinkApp')
5 files changed, 165 insertions, 107 deletions
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java index 7837f2e775..8f6d92ac55 100644 --- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java +++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java @@ -23,7 +23,9 @@ import android.car.hardware.power.CarPowerManager; import android.car.hardware.property.CarPropertyManager; import android.content.Intent; import android.content.pm.PackageManager; +import android.os.AsyncTask; import android.os.Bundle; +import android.os.Handler; import android.support.car.Car; import android.support.car.CarAppFocusManager; import android.support.car.CarConnectionCallback; @@ -183,6 +185,7 @@ public class KitchenSinkActivity extends CarDrawerActivity { private CarPropertyManager mPropertyManager; private CarSensorManager mSensorManager; private CarAppFocusManager mCarAppFocusManager; + private Object mPropertyManagerReady = new Object(); public CarHvacManager getHvacManager() { return mHvacManager; @@ -212,12 +215,20 @@ public class KitchenSinkActivity extends CarDrawerActivity { setMainContent(R.layout.kitchen_content); // Connection to Car Service does not work for non-automotive yet. if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { - mCarApi = Car.createCar(this, mCarConnectionCallback); - mCarApi.connect(); + initCarApi(); } Log.i(TAG, "onCreate"); } + private void initCarApi() { + if (mCarApi != null && mCarApi.isConnected()) { + mCarApi.disconnect(); + mCarApi = null; + } + mCarApi = Car.createCar(this, mCarConnectionCallback); + mCarApi.connect(); + } + @Override protected void onStart() { super.onStart(); @@ -268,18 +279,22 @@ public class KitchenSinkActivity extends CarDrawerActivity { @Override public void onConnected(Car car) { Log.d(TAG, "Connected to Car Service"); - try { - mHvacManager = (CarHvacManager) mCarApi.getCarManager(android.car.Car.HVAC_SERVICE); - mPowerManager = (CarPowerManager) mCarApi.getCarManager( - android.car.Car.POWER_SERVICE); - mPropertyManager = (CarPropertyManager) mCarApi.getCarManager( - android.car.Car.PROPERTY_SERVICE); - mSensorManager = (CarSensorManager) mCarApi.getCarManager( - android.car.Car.SENSOR_SERVICE); - mCarAppFocusManager = - (CarAppFocusManager) mCarApi.getCarManager(Car.APP_FOCUS_SERVICE); - } catch (CarNotConnectedException e) { - Log.e(TAG, "Car is not connected!", e); + synchronized (mPropertyManagerReady) { + try { + mHvacManager = (CarHvacManager) mCarApi.getCarManager( + android.car.Car.HVAC_SERVICE); + mPowerManager = (CarPowerManager) mCarApi.getCarManager( + android.car.Car.POWER_SERVICE); + mPropertyManager = (CarPropertyManager) mCarApi.getCarManager( + android.car.Car.PROPERTY_SERVICE); + mSensorManager = (CarSensorManager) mCarApi.getCarManager( + android.car.Car.SENSOR_SERVICE); + mCarAppFocusManager = + (CarAppFocusManager) mCarApi.getCarManager(Car.APP_FOCUS_SERVICE); + mPropertyManagerReady.notifyAll(); + } catch (CarNotConnectedException e) { + Log.e(TAG, "Car is not connected!", e); + } } } @@ -322,4 +337,29 @@ public class KitchenSinkActivity extends CarDrawerActivity { getDrawerController().closeDrawer(); } } + + // Use AsyncTask to refresh Car*Manager after car service connected + public void requestRefreshManager(final Runnable r, final Handler h) { + final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... unused) { + synchronized (mPropertyManagerReady) { + while (!mCarApi.isConnected()) { + try { + mPropertyManagerReady.wait(); + } catch (InterruptedException e) { + return null; + } + } + } + return null; + } + + @Override + protected void onPostExecute(Void unused) { + h.post(r); + } + }; + task.execute(); + } } diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java index a1f8e1dece..c7b80e8462 100644 --- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java +++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java @@ -25,6 +25,7 @@ import android.car.hardware.hvac.CarHvacManager; import android.hardware.automotive.vehicle.V2_0.VehicleAreaSeat; import android.hardware.automotive.vehicle.V2_0.VehicleAreaWindow; import android.os.Bundle; +import android.os.Handler; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; @@ -76,6 +77,8 @@ public class HvacTestFragment extends Fragment { private int mZoneForSetTempP; private int mZoneForFanSpeed; private int mZoneForFanPosition; + private List<CarPropertyConfig> mCarPropertyConfigs; + private View mHvacView; private final CarHvacManager.CarHvacEventCallback mHvacCallback = new CarHvacManager.CarHvacEventCallback () { @@ -171,13 +174,9 @@ public class HvacTestFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { - mCarHvacManager = ((KitchenSinkActivity)getActivity()).getHvacManager(); + super.onCreate(savedInstanceState); - try { - mCarHvacManager.registerCallback(mHvacCallback); - } catch (CarNotConnectedException e) { - Log.e(TAG, "Car is not connected!"); - } + } @Override @@ -188,77 +187,85 @@ public class HvacTestFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) { - View v = inflater.inflate(R.layout.hvac_test, container, false); - - List<CarPropertyConfig> props; - try { - props = mCarHvacManager.getPropertyList(); - } catch (CarNotConnectedException e) { - Log.e(TAG, "Failed to get list of properties", e); - props = new ArrayList<>(); - } + mHvacView = inflater.inflate(R.layout.hvac_test, container, false); + final Runnable r = () -> { + mCarHvacManager = ((KitchenSinkActivity) getActivity()).getHvacManager(); + try { + mCarHvacManager.registerCallback(mHvacCallback); + } catch (CarNotConnectedException e) { + Log.e(TAG, "Car is not connected!"); + } + try { + mCarPropertyConfigs = mCarHvacManager.getPropertyList(); + } catch (CarNotConnectedException e) { + Log.e(TAG, "Failed to get list of properties", e); + mCarPropertyConfigs = new ArrayList<>(); + } + for (CarPropertyConfig prop : mCarPropertyConfigs) { + int propId = prop.getPropertyId(); - for(CarPropertyConfig prop : props) { - int propId = prop.getPropertyId(); + if (DBG) { + Log.d(TAG, prop.toString()); + } - if(DBG) { - Log.d(TAG, prop.toString()); + switch(propId) { + case CarHvacManager.ID_OUTSIDE_AIR_TEMP: + configureOutsideTemp(mHvacView, prop); + break; + case CarHvacManager.ID_ZONED_DUAL_ZONE_ON: + configureDualOn(mHvacView, prop); + break; + case CarHvacManager.ID_ZONED_AC_ON: + configureAcOn(mHvacView, prop); + break; + case CarHvacManager.ID_ZONED_FAN_DIRECTION: + configureFanPosition(mHvacView, prop); + break; + case CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT: + configureFanSpeed(mHvacView, prop); + break; + case CarHvacManager.ID_ZONED_TEMP_SETPOINT: + configureTempSetpoint(mHvacView, prop); + break; + case CarHvacManager.ID_ZONED_AUTOMATIC_MODE_ON: + configureAutoModeOn(mHvacView, prop); + break; + case CarHvacManager.ID_ZONED_AIR_RECIRCULATION_ON: + configureRecircOn(mHvacView, prop); + break; + case CarHvacManager.ID_ZONED_MAX_AC_ON: + configureMaxAcOn(mHvacView, prop); + break; + case CarHvacManager.ID_ZONED_MAX_DEFROST_ON: + configureMaxDefrostOn(mHvacView, prop); + break; + case CarHvacManager.ID_WINDOW_DEFROSTER_ON: + configureDefrosterOn(mHvacView, prop); + break; + default: + Log.w(TAG, "propertyId " + propId + " is not handled"); + break; + } } - switch(propId) { - case CarHvacManager.ID_OUTSIDE_AIR_TEMP: - configureOutsideTemp(v, prop); - break; - case CarHvacManager.ID_ZONED_DUAL_ZONE_ON: - configureDualOn(v, prop); - break; - case CarHvacManager.ID_ZONED_AC_ON: - configureAcOn(v, prop); - break; - case CarHvacManager.ID_ZONED_FAN_DIRECTION: - configureFanPosition(v, prop); - break; - case CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT: - configureFanSpeed(v, prop); - break; - case CarHvacManager.ID_ZONED_TEMP_SETPOINT: - configureTempSetpoint(v, prop); - break; - case CarHvacManager.ID_ZONED_AUTOMATIC_MODE_ON: - configureAutoModeOn(v, prop); - break; - case CarHvacManager.ID_ZONED_AIR_RECIRCULATION_ON: - configureRecircOn(v, prop); - break; - case CarHvacManager.ID_ZONED_MAX_AC_ON: - configureMaxAcOn(v, prop); - break; - case CarHvacManager.ID_ZONED_MAX_DEFROST_ON: - configureMaxDefrostOn(v, prop); - break; - case CarHvacManager.ID_WINDOW_DEFROSTER_ON: - configureDefrosterOn(v, prop); - break; - default: - Log.w(TAG, "propertyId " + propId + " is not handled"); - break; - } - } + mTvFanSpeed = (TextView) mHvacView.findViewById(R.id.tvFanSpeed); + mTvFanSpeed.setText(String.valueOf(mCurFanSpeed)); + mTvDTemp = (TextView) mHvacView.findViewById(R.id.tvDTemp); + mTvDTemp.setText(String.valueOf(mCurDTemp)); + mTvPTemp = (TextView) mHvacView.findViewById(R.id.tvPTemp); + mTvPTemp.setText(String.valueOf(mCurPTemp)); + mTvOutsideTemp = (TextView) mHvacView.findViewById(R.id.tvOutsideTemp); + mTvOutsideTemp.setText("N/A"); + }; - mTvFanSpeed = (TextView) v.findViewById(R.id.tvFanSpeed); - mTvFanSpeed.setText(String.valueOf(mCurFanSpeed)); - mTvDTemp = (TextView) v.findViewById(R.id.tvDTemp); - mTvDTemp.setText(String.valueOf(mCurDTemp)); - mTvPTemp = (TextView) v.findViewById(R.id.tvPTemp); - mTvPTemp.setText(String.valueOf(mCurPTemp)); - mTvOutsideTemp = (TextView) v.findViewById(R.id.tvOutsideTemp); - mTvOutsideTemp.setText("N/A"); + ((KitchenSinkActivity) getActivity()).requestRefreshManager(r, + new Handler(getContext().getMainLooper())); if(DBG) { Log.d(TAG, "Starting HvacTestFragment"); } - return v; + return mHvacView; } private void configureOutsideTemp(View v, CarPropertyConfig prop) { diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/power/PowerTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/power/PowerTestFragment.java index fed1fbd322..9a6c2b92cf 100644 --- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/power/PowerTestFragment.java +++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/power/PowerTestFragment.java @@ -20,6 +20,7 @@ import android.car.CarNotConnectedException; import android.car.hardware.power.CarPowerManager; import android.content.Context; import android.os.Bundle; +import android.os.Handler; import android.os.PowerManager; import android.os.SystemClock; import android.support.v4.app.Fragment; @@ -58,16 +59,20 @@ public class PowerTestFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { - mCarPowerManager = ((KitchenSinkActivity)getActivity()).getPowerManager(); - mExecutor = new ThreadPerTaskExecutor(); + final Runnable r = () -> { + mCarPowerManager = ((KitchenSinkActivity) getActivity()).getPowerManager(); + mExecutor = new ThreadPerTaskExecutor(); + try { + mCarPowerManager.setListener(mPowerListener, mExecutor); + } catch (CarNotConnectedException e) { + Log.e(TAG, "Car is not connected!"); + } catch (IllegalStateException e) { + Log.e(TAG, "CarPowerManager listener was not cleared"); + } + }; + ((KitchenSinkActivity) getActivity()).requestRefreshManager(r, + new Handler(getContext().getMainLooper())); super.onCreate(savedInstanceState); - try { - mCarPowerManager.setListener(mPowerListener, mExecutor); - } catch (CarNotConnectedException e) { - Log.e(TAG, "Car is not connected!"); - } catch (IllegalStateException e) { - Log.e(TAG, "CarPowerManager listener was not cleared"); - } } @Override diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/property/PropertyTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/property/PropertyTestFragment.java index fc6621a7ca..ff1c402fea 100644 --- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/property/PropertyTestFragment.java +++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/property/PropertyTestFragment.java @@ -26,6 +26,7 @@ import android.content.DialogInterface.OnClickListener; import android.hardware.automotive.vehicle.V2_0.VehicleProperty; import android.hardware.automotive.vehicle.V2_0.VehiclePropertyType; import android.os.Bundle; +import android.os.Handler; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; @@ -85,20 +86,23 @@ public class PropertyTestFragment extends Fragment implements OnItemSelectedList mPropertyId = view.findViewById(R.id.sPropertyId); mScrollView = view.findViewById(R.id.svEventLog); mSetValue = view.findViewById(R.id.etSetPropertyValue); - - populateConfigList(); - mListView.setAdapter(new PropertyListAdapter(mPropInfo, mMgr, mEventLog, mScrollView, - mActivity)); - - // Configure dropdown menu for propertyId spinner - ArrayAdapter<PropertyInfo> adapter = - new ArrayAdapter<PropertyInfo>(mActivity, android.R.layout.simple_spinner_item, - mPropInfo); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mPropertyId.setAdapter(adapter); - mPropertyId.setOnItemSelectedListener(this); - - + mActivity = (KitchenSinkActivity) getActivity(); + + final Runnable r = () -> { + mMgr = mActivity.getPropertyManager(); + populateConfigList(); + mListView.setAdapter(new PropertyListAdapter(mPropInfo, mMgr, mEventLog, mScrollView, + mActivity)); + + // Configure dropdown menu for propertyId spinner + ArrayAdapter<PropertyInfo> adapter = + new ArrayAdapter<PropertyInfo>(mActivity, android.R.layout.simple_spinner_item, + mPropInfo); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + mPropertyId.setAdapter(adapter); + mPropertyId.setOnItemSelectedListener(this); + }; + mActivity.requestRefreshManager(r, new Handler(getContext().getMainLooper())); // Configure listeners for buttons Button b = view.findViewById(R.id.bGetProperty); diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java index a6cc5ac457..1440ff0571 100644 --- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java +++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java @@ -99,17 +99,19 @@ public class SensorsTestFragment extends Fragment { View view = inflater.inflate(R.layout.sensors, container, false); mActivity = (KitchenSinkActivity) getHost(); - mSensorInfo = (TextView) view.findViewById(R.id.sensor_info); mNaString = getContext().getString(R.string.sensor_na); - return view; } @Override public void onResume() { super.onResume(); - initPermissions(); + final Runnable r = () -> { + initPermissions(); + }; + ((KitchenSinkActivity) getActivity()).requestRefreshManager(r, + new Handler(getContext().getMainLooper())); } @Override |