[GarageModeTestApp] Creating test app to test the performance
and show an abilities of GarageMode.

This commit includes:
* Initial design of testing app
* Ability to monitor and schedule new tasks
* Placeholders for future functionality such as:
  - Entering / Exiting garage mode through simulating power manager
  signals
  - Ability to set the duration of GarageMode
  - Logs that will show all the GarageMode activity as well as
  JobScheduler activity

Bug: 111277506
Test: None (tests for test app is not needed)
Change-Id: Ibcda8a1c64ae69e3c6f8de76deefee4fd1caf50b
(cherry picked from commit 656466db31a1f3a3e70c182cd9a35a4ca783da75)
diff --git a/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/MainActivity.java b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/MainActivity.java
new file mode 100644
index 0000000..9b38260
--- /dev/null
+++ b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/MainActivity.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2018 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 com.google.android.car.garagemode.testapp;
+
+import android.app.Activity;
+import android.app.job.JobInfo;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.ListView;
+import android.widget.Spinner;
+
+public class MainActivity extends Activity implements AdapterView.OnItemSelectedListener {
+    private static final Logger LOG = new Logger("GarageModeTestApp");
+
+
+    private String mNetworkRequirement;
+    private int mJobDurationSelected;
+    private int mGarageModeDurationSelected;
+
+    private CheckBox mRequirePersisted;
+    private CheckBox mRequireIdleness;
+    private CheckBox mRequireCharging;
+
+    private JobSchedulerWrapper mJobSchedulerWrapper;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main_activity);
+
+        populateNetworkTypeSpinner();
+        populateJobDurationSpinner();
+        populateGarageModeSpinner();
+
+        mRequirePersisted = findViewById(R.id.requirePersistedCheckbox);
+        mRequireIdleness = findViewById(R.id.requireIdlenessCheckbox);
+        mRequireCharging = findViewById(R.id.requireChargingCheckbox);
+
+        mJobSchedulerWrapper = new JobSchedulerWrapper(
+                this,
+                (ListView) findViewById(R.id.jobsListView));
+
+        ((Button) findViewById(R.id.addJobBtn)).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                LOG.d("Adding a job...");
+                mJobSchedulerWrapper.scheduleAJob(
+                        mJobDurationSelected,
+                        parseNetworkRequirement(),
+                        mRequireCharging.isChecked(),
+                        mRequireIdleness.isChecked());
+            }
+        });
+    }
+
+    private int parseNetworkRequirement() {
+        if (mNetworkRequirement.equals("NONE")) {
+            return JobInfo.NETWORK_TYPE_NONE;
+        }
+        if (mNetworkRequirement.equals("UNMETERED")) {
+            return JobInfo.NETWORK_TYPE_UNMETERED;
+        }
+        if (mNetworkRequirement.equals("ANY")) {
+            return JobInfo.NETWORK_TYPE_ANY;
+        }
+        return JobInfo.NETWORK_BYTES_UNKNOWN;
+    }
+
+    private void populateGarageModeSpinner() {
+        populateSpinner(
+                (Spinner) findViewById(R.id.garageModeDuration),
+                ArrayAdapter.createFromResource(
+                        this,
+                        R.array.duration_list,
+                        android.R.layout.simple_spinner_item));
+    }
+
+    private void populateJobDurationSpinner() {
+        populateSpinner(
+                (Spinner) findViewById(R.id.jobDuration),
+                ArrayAdapter.createFromResource(
+                        this,
+                        R.array.duration_list,
+                        android.R.layout.simple_spinner_item));
+    }
+
+    private void populateNetworkTypeSpinner() {
+        populateSpinner(
+                (Spinner) findViewById(R.id.networkType),
+                ArrayAdapter.createFromResource(
+                        this,
+                        R.array.network_types_list,
+                        android.R.layout.simple_spinner_item));
+    }
+
+    private void populateSpinner(Spinner spinner, ArrayAdapter adapter) {
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        spinner.setAdapter(adapter);
+        spinner.setOnItemSelectedListener(this);
+    }
+
+    @Override
+    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+        String value = (String) parent.getItemAtPosition(pos);
+        switch (parent.getId()) {
+            case R.id.networkType:
+                applyNetworkTypeRequirement(value);
+                break;
+            case R.id.jobDuration:
+                applyJobDuration(value);
+                break;
+            case R.id.garageModeDuration:
+                applyGarageModeDuration(value);
+                break;
+        }
+    }
+
+    private String stringDump() {
+        String s = "";
+        s += "Network Type: " + mNetworkRequirement + "\n";
+        s += "Job Duration: " + mJobDurationSelected + "\n";
+        s += "GarageMode Duration: " + mGarageModeDurationSelected + "\n";
+        return s;
+    }
+
+    private void applyGarageModeDuration(String value) {
+        String metric = value.split(" ")[1];
+        mGarageModeDurationSelected = Integer.parseInt(value.split(" ")[0]);
+        if (metric.startsWith("minute")) {
+            mGarageModeDurationSelected *= 60;
+        }
+        if (metric.startsWith("hour")) {
+            mGarageModeDurationSelected *= 3600;
+        }
+    }
+
+    private void applyJobDuration(String value) {
+        String metric = value.split(" ")[1];
+        mJobDurationSelected = Integer.parseInt(value.split(" ")[0]);
+        if (metric.startsWith("minute")) {
+            mJobDurationSelected *= 60;
+        }
+        if (metric.startsWith("hour")) {
+            mJobDurationSelected *= 3600;
+        }
+    }
+
+    private void applyNetworkTypeRequirement(String value) {
+        mNetworkRequirement = value;
+    }
+
+    @Override
+    public void onNothingSelected(AdapterView<?> adapterView) {
+
+    }
+}