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