1 /*
2  * Copyright (C) 2018 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.google.android.car.garagemode.testapp;
17 
18 import static android.graphics.Typeface.BOLD;
19 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
20 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
21 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
22 
23 import android.app.job.JobInfo;
24 import android.content.Context;
25 import android.graphics.Color;
26 import android.net.NetworkRequest;
27 import android.text.Spannable;
28 import android.text.SpannableStringBuilder;
29 import android.text.style.ForegroundColorSpan;
30 import android.text.style.StyleSpan;
31 import android.view.LayoutInflater;
32 import android.view.View;
33 import android.view.ViewGroup;
34 import android.widget.ArrayAdapter;
35 import android.widget.TextView;
36 
37 import java.util.List;
38 
39 public class JobInfoRowArrayAdapter extends ArrayAdapter<JobInfo> {
40     public static final Logger LOG = new Logger("JobInfoRowArrayAdapter");
41     private class ViewHolder {
42         TextView mJobIDView;
43 
44         TextView mRequiredNetworkView;
45         TextView mIsPeriodicView;
46         TextView mIsPersistedView;
47         TextView mIsPrefetchView;
48 
49         TextView mIsRequireBatteryNotLowView;
50         TextView mIsRequireChargingView;
51         TextView mIsRequireDeviceIdleView;
52         TextView mIsRequireStorageNotLowView;
53 
54         JobInfo mInfo;
55     }
56     private LayoutInflater mInflater;
57 
JobInfoRowArrayAdapter(Context context, int resource, List<JobInfo> objects)58     public JobInfoRowArrayAdapter(Context context, int resource, List<JobInfo> objects) {
59         super(context, resource, objects);
60         mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
61     }
62 
63     @Override
getView(int position, View convertView, ViewGroup parent)64     public View getView(int position, View convertView, ViewGroup parent) {
65         View row = convertView;
66         final JobInfo info = getItem(position);
67 
68         ViewHolder holder;
69 
70         if (row == null) {
71             row = mInflater.inflate(R.layout.job_info_row, parent, false);
72 
73             holder = new ViewHolder();
74             holder.mJobIDView = row.findViewById(R.id.jobId);
75 
76             holder.mRequiredNetworkView = row.findViewById(R.id.requiredNetwork);
77             holder.mIsPeriodicView = row.findViewById(R.id.isPeriodic);
78             holder.mIsPersistedView = row.findViewById(R.id.isPersisted);
79             holder.mIsPrefetchView = row.findViewById(R.id.isPrefetch);
80 
81             holder.mIsRequireBatteryNotLowView = row.findViewById(R.id.isRequireBatteryNotLow);
82             holder.mIsRequireChargingView = row.findViewById(R.id.isRequireCharging);
83             holder.mIsRequireDeviceIdleView = row.findViewById(R.id.isRequireDeviceIdle);
84             holder.mIsRequireStorageNotLowView = row.findViewById(R.id.isRequireStorageNotLow);
85 
86             holder.mInfo = info;
87 
88             row.setTag(holder);
89         } else {
90             holder = (ViewHolder) row.getTag();
91             holder.mInfo = info;
92         }
93 
94         holder.mJobIDView.setText("ID: " + info.getId());
95 
96         setNetworkColoredText(holder.mRequiredNetworkView, "Network", info.getRequiredNetwork());
97 
98         setColoredText(holder.mIsPeriodicView, "Periodic", info.isPeriodic());
99         setColoredText(holder.mIsPersistedView, "Persisted", info.isPersisted());
100         setColoredText(holder.mIsPrefetchView, "Prefetch", info.isPrefetch());
101 
102         setColoredText(
103                 holder.mIsRequireBatteryNotLowView,
104                 "BatteryNotLow",
105                 info.isRequireBatteryNotLow());
106         setColoredText(holder.mIsRequireChargingView, "Charging", info.isRequireCharging());
107         setColoredText(holder.mIsRequireDeviceIdleView, "DeviceIdle", info.isRequireDeviceIdle());
108         setColoredText(
109                 holder.mIsRequireStorageNotLowView,
110                 "StorageNotLow",
111                 info.isRequireStorageNotLow());
112 
113         return row;
114     }
115 
setColoredText(TextView view, String label, boolean condition)116     private void setColoredText(TextView view, String label, boolean condition) {
117         SpannableStringBuilder sb;
118         String value = (condition ? "Yes" : "No");
119         int color = (condition ? Color.GREEN : Color.RED);
120         sb = new SpannableStringBuilder(label + ": " + value);
121         applyColorAndBoldness(
122                 sb, color, label.length() + 2, label.length() + 2 + value.length());
123         view.setText(sb);
124     }
125 
setNetworkColoredText(TextView view, String label, NetworkRequest networkReq)126     private void setNetworkColoredText(TextView view, String label, NetworkRequest networkReq) {
127         String networkType = getNetworkType(networkReq);
128         SpannableStringBuilder sb = new SpannableStringBuilder(label + ": " + networkType);
129         applyColorAndBoldness(
130                 sb, Color.GREEN, label.length() + 2, label.length() + 2 + networkType.length());
131         view.setText(sb);
132     }
133 
applyColorAndBoldness(SpannableStringBuilder sb, int color, int start, int end)134     private void applyColorAndBoldness(SpannableStringBuilder sb, int color, int start, int end) {
135         sb.setSpan(new ForegroundColorSpan(color), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
136         sb.setSpan(new StyleSpan(BOLD), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
137     }
138 
getNetworkType(NetworkRequest networkRequest)139     private String getNetworkType(NetworkRequest networkRequest) {
140         if (networkRequest == null) {
141             return "None";
142         } else if (networkRequest.hasCapability(NET_CAPABILITY_NOT_METERED)) {
143             return "Unmetered";
144         } else if (networkRequest.hasCapability(NET_CAPABILITY_NOT_ROAMING)) {
145             return "Not roaming";
146         } else if (networkRequest.hasTransport(TRANSPORT_CELLULAR)) {
147             return "Cellular";
148         } else {
149             return "Any";
150         }
151     }
152 }
153