aboutsummaryrefslogtreecommitdiff
path: root/tests/EmbeddedKitchenSinkApp
diff options
context:
space:
mode:
authorSteve Paik <spaik@google.com>2018-02-12 10:54:51 -0800
committerSteve Paik <spaik@google.com>2018-02-20 20:18:25 -0800
commit388d77770e00eadde4e45df95678f1468ce6fbc8 (patch)
treeee4d0fbd709463ab6c8203b953422eb4c57b6f4a /tests/EmbeddedKitchenSinkApp
parent7f657e738447297ff692ae8b3704c0f4b5c42e33 (diff)
downloadCar-388d77770e00eadde4e45df95678f1468ce6fbc8.tar.gz
Add CarPowerManager
- Add Java API for apps to call into power manager - Update EmbeddedKitchenSink to test API - Update CarPowrManagementService to handle binder interface Bug: 32061842 Test: EmbeddedKitchenSink Change-Id: I15f5c25262507d4a6d6e5f381643f3e584f1843e
Diffstat (limited to 'tests/EmbeddedKitchenSinkApp')
-rw-r--r--tests/EmbeddedKitchenSinkApp/res/layout/power_test.xml64
-rw-r--r--tests/EmbeddedKitchenSinkApp/res/values/dimens.xml3
-rw-r--r--tests/EmbeddedKitchenSinkApp/res/values/strings.xml2
-rw-r--r--tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java34
-rw-r--r--tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/power/PowerTestFragment.java90
5 files changed, 152 insertions, 41 deletions
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/power_test.xml b/tests/EmbeddedKitchenSinkApp/res/layout/power_test.xml
index 6ad14d43e3..62f80d0887 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/power_test.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/power_test.xml
@@ -19,19 +19,53 @@
android:layout_width="match_parent"
android:orientation="vertical">
- <Button
- android:clickable="true"
- android:id="@+id/btnPwrShutdown"
- android:layout_height="@dimen/powerBtnHeight"
- android:layout_width ="250dp"
- android:text="@string/power_shutdown"
- android:textSize="@dimen/powerTextSize"/>
-
- <Button
- android:clickable="true"
- android:id="@+id/btnPwrSleep"
- android:layout_height="@dimen/powerBtnHeight"
- android:layout_width ="250dp"
- android:text="@string/power_sleep"
- android:textSize="@dimen/powerTextSize"/>
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:orientation="horizontal">
+ <Button
+ android:clickable="true"
+ android:id="@+id/btnPwrShutdown"
+ android:layout_height="@dimen/powerBtnHeight"
+ android:layout_width ="@dimen/powerBtnWidth"
+ android:text="@string/power_shutdown"
+ android:textSize="@dimen/powerTextSize"/>
+
+ <Button
+ android:clickable="true"
+ android:id="@+id/btnPwrSleep"
+ android:layout_height="@dimen/powerBtnHeight"
+ android:layout_width ="@dimen/powerBtnWidth"
+ android:text="@string/power_sleep"
+ android:textSize="@dimen/powerTextSize"/>
+ </LinearLayout>
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:orientation="horizontal">
+
+ <Button
+ android:clickable="true"
+ android:id="@+id/btnPwrRequestShutdown"
+ android:layout_height="@dimen/powerBtnHeight"
+ android:layout_width ="@dimen/powerBtnWidth"
+ android:text="@string/power_request_shutdown"
+ android:textSize="@dimen/powerTextSize"/>
+
+ <Button
+ android:clickable="true"
+ android:id="@+id/btnPwrGetBootReason"
+ android:layout_height="@dimen/powerBtnHeight"
+ android:layout_width ="@dimen/powerBtnWidth"
+ android:text="@string/power_get_boot_reason"
+ android:textSize="@dimen/powerTextSize"/>
+
+ <TextView
+ android:id="@+id/tvPowerBootReason"
+ android:layout_height="@dimen/powerBtnHeight"
+ android:layout_width ="@dimen/powerBtnWidth"
+ android:layout_weight="1"
+ android:textSize="@dimen/powerTextSize"/>
+ </LinearLayout>
</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/values/dimens.xml b/tests/EmbeddedKitchenSinkApp/res/values/dimens.xml
index 95a88d2b59..39d862e4e2 100644
--- a/tests/EmbeddedKitchenSinkApp/res/values/dimens.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/values/dimens.xml
@@ -17,7 +17,8 @@
<dimen name="hvacBtnHeight">60dp</dimen>
<dimen name="hvacBtnMargin">10dp</dimen>
<dimen name="hvacTextSize">24sp</dimen>
- <dimen name="powerBtnHeight">60dp</dimen>
+ <dimen name="powerBtnHeight">80dp</dimen>
+ <dimen name="powerBtnWidth">300dp</dimen>
<dimen name="powerTextSize">24sp</dimen>
<dimen name="rvcBtnHeight">40dp</dimen>
<dimen name="rvcBtnWidth">150dp</dimen>
diff --git a/tests/EmbeddedKitchenSinkApp/res/values/strings.xml b/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
index c5d32a44bb..07a97ffd8a 100644
--- a/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
@@ -168,6 +168,8 @@
<string name="music_stop">Stop</string>
<!-- power test -->
+ <string name="power_get_boot_reason">Get Boot Reason</string>
+ <string name="power_request_shutdown">Request Shutdown</string>
<string name="power_shutdown">Shutdown</string>
<string name="power_sleep">Sleep</string>
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 2748ece795..bfc90d1be6 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
@@ -16,17 +16,8 @@
package com.google.android.car.kitchensink;
-import android.car.hardware.hvac.CarHvacManager;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Bundle;
-import android.support.car.Car;
-import android.support.car.CarAppFocusManager;
-import android.support.car.CarConnectionCallback;
-import android.support.car.CarNotConnectedException;
-import android.support.car.hardware.CarSensorManager;
-import android.support.v4.app.Fragment;
-import android.util.Log;
+import java.util.ArrayList;
+import java.util.List;
import com.google.android.car.kitchensink.alertdialog.AlertDialogTestFragment;
import com.google.android.car.kitchensink.assistant.CarAssistantFragment;
@@ -50,8 +41,18 @@ import com.google.android.car.kitchensink.touch.TouchTestFragment;
import com.google.android.car.kitchensink.vhal.VehicleHalFragment;
import com.google.android.car.kitchensink.volume.VolumeTestFragment;
-import java.util.ArrayList;
-import java.util.List;
+import android.car.hardware.hvac.CarHvacManager;
+import android.car.hardware.power.CarPowerManager;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.support.car.Car;
+import android.support.car.CarAppFocusManager;
+import android.support.car.CarConnectionCallback;
+import android.support.car.CarNotConnectedException;
+import android.support.car.hardware.CarSensorManager;
+import android.support.v4.app.Fragment;
+import android.util.Log;
import androidx.car.drawer.CarDrawerActivity;
import androidx.car.drawer.CarDrawerAdapter;
@@ -172,6 +173,7 @@ public class KitchenSinkActivity extends CarDrawerActivity {
};
private Car mCarApi;
private CarHvacManager mHvacManager;
+ private CarPowerManager mPowerManager;
private CarSensorManager mCarSensorManager;
private CarAppFocusManager mCarAppFocusManager;
@@ -187,6 +189,10 @@ public class KitchenSinkActivity extends CarDrawerActivity {
return mHvacManager;
}
+ public CarPowerManager getPowerManager() {
+ return mPowerManager;
+ }
+
@Override
protected CarDrawerAdapter getRootAdapter() {
return new DrawerAdapter();
@@ -260,6 +266,8 @@ public class KitchenSinkActivity extends CarDrawerActivity {
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);
mCarSensorManager = (CarSensorManager) mCarApi.getCarManager(Car.SENSOR_SERVICE);
mCarSensorManager.addListener(mListener,
CarSensorManager.SENSOR_TYPE_DRIVING_STATUS,
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 b90f02104a..4dd7eeff11 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
@@ -17,10 +17,15 @@
package com.google.android.car.kitchensink.power;
import static java.lang.Integer.toHexString;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executor;
import com.google.android.car.kitchensink.KitchenSinkActivity;
import com.google.android.car.kitchensink.R;
+import android.car.CarNotConnectedException;
+import android.car.hardware.power.CarPowerManager;
import android.content.Context;
import android.os.Bundle;
import android.os.PowerManager;
@@ -31,23 +36,67 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
-
-import java.util.ArrayList;
-import java.util.List;
+import android.widget.TextView;
+import android.widget.Toast;
public class PowerTestFragment extends Fragment {
private final boolean DBG = false;
private final String TAG = "PowerTestFragment";
+ private CarPowerManager mCarPowerManager;
+ private TextView mTvBootReason;
+ private Executor mExecutor;
+
+ private class ThreadPerTaskExecutor implements Executor {
+ public void execute(Runnable r) {
+ new Thread(r).start();
+ }
+ }
+
+ private final CarPowerManager.CarPowerStateListener mPowerListener =
+ new CarPowerManager.CarPowerStateListener () {
+ @Override
+ public void onStateChanged(int state) {
+ Log.i(TAG, "onStateChanged() state = " + state);
+ }
+ };
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ mCarPowerManager = ((KitchenSinkActivity)getActivity()).getPowerManager();
+ mExecutor = new ThreadPerTaskExecutor();
+ 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
+ public void onDestroy() {
+ super.onDestroy();
+ mCarPowerManager.clearListener();
+ }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
View v = inflater.inflate(R.layout.power_test, container, false);
- Button b = v.findViewById(R.id.btnPwrShutdown);
- b.setOnClickListener(this::shutdown);
+ Button b = v.findViewById(R.id.btnPwrGetBootReason);
+ b.setOnClickListener(this::getBootReasonBtn);
+
+ b = v.findViewById(R.id.btnPwrRequestShutdown);
+ b.setOnClickListener(this::requestShutdownBtn);
+
+ b = v.findViewById(R.id.btnPwrShutdown);
+ b.setOnClickListener(this::shutdownBtn);
b = v.findViewById(R.id.btnPwrSleep);
- b.setOnClickListener(this::sleep);
+ b.setOnClickListener(this::sleepBtn);
+
+ mTvBootReason = v.findViewById(R.id.tvPowerBootReason);
if(DBG) {
Log.d(TAG, "Starting PowerTestFragment");
@@ -56,23 +105,40 @@ public class PowerTestFragment extends Fragment {
return v;
}
- private void shutdown(View v) {
+ private void getBootReasonBtn(View v) {
+ try {
+ int bootReason = mCarPowerManager.getBootReason();
+ mTvBootReason.setText(String.valueOf(bootReason));
+ } catch (CarNotConnectedException e) {
+ Log.e(TAG, "Failed to getBootReason()", e);
+ }
+ }
+
+ private void requestShutdownBtn(View v) {
+ try {
+ mCarPowerManager.requestShutdownOnNextSuspend();
+ } catch (CarNotConnectedException e) {
+ Log.e(TAG, "Failed to set requestShutdownOnNextSuspend()", e);
+ }
+ }
+
+ private void shutdownBtn(View v) {
if(DBG) {
Log.d(TAG, "Calling shutdown method");
}
-
PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
pm.shutdown(/* confirm */ false, /* reason */ null, /* wait */ false);
Log.d(TAG, "shutdown called!");
}
- private void sleep(View v) {
- // TBD
+ private void sleepBtn(View v) {
if(DBG) {
Log.d(TAG, "Calling sleep method");
}
-
+ // NOTE: This doesn't really work to sleep the device. Actual sleep is implemented via
+ // SystemInterface via libsuspend::force_suspend()
PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
- pm.goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
+ pm.goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN,
+ PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
}
}