AccessPointListAdapter.java revision ddb7544cfc9f5263d719c9d2760451e9316d3bde
1/* 2 * Copyright (C) 2017 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 */ 16package com.android.car.settings.wifi; 17 18import android.content.Context; 19import android.content.Intent; 20import android.graphics.drawable.Drawable; 21import android.graphics.drawable.StateListDrawable; 22import android.net.wifi.WifiManager; 23import android.os.Bundle; 24import android.support.v7.widget.RecyclerView; 25import android.util.Log; 26import android.view.LayoutInflater; 27import android.view.View; 28import android.annotation.NonNull; 29import android.annotation.Nullable; 30import android.view.View.OnClickListener; 31import android.view.ViewGroup; 32import android.widget.ImageView; 33import android.widget.TextView; 34import android.widget.Toast; 35 36import com.android.car.settings.R; 37import com.android.car.settings.common.AnimationUtil; 38import com.android.car.settings.wifi.AccessPointListAdapter.ViewHolder; 39import com.android.car.view.PagedListView; 40import com.android.settingslib.wifi.AccessPoint; 41 42import java.util.List; 43 44/** 45 * Renders {@link AccessPoint} to a view to be displayed as a row in a list. 46 */ 47public class AccessPointListAdapter 48 extends RecyclerView.Adapter<AccessPointListAdapter.ViewHolder> 49 implements PagedListView.ItemCap { 50 private static final String TAG = "AccessPointListAdapter"; 51 private static final int[] STATE_SECURED = { 52 com.android.settingslib.R.attr.state_encrypted 53 }; 54 private static final int[] STATE_NONE = {}; 55 private static int[] wifi_signal_attributes = {com.android.settingslib.R.attr.wifi_signal}; 56 57 private final StateListDrawable mWifiSld; 58 private final Context mContext; 59 private final CarWifiManager mCarWifiManager; 60 private final WifiManager.ActionListener mConnectionListener; 61 62 private List<AccessPoint> mAccessPoints; 63 64 public AccessPointListAdapter(@NonNull Context context, CarWifiManager carWifiManager, 65 @NonNull List<AccessPoint> accesssPoints) { 66 mContext = context; 67 mCarWifiManager = carWifiManager; 68 mAccessPoints = accesssPoints; 69 mWifiSld = (StateListDrawable) context.getTheme() 70 .obtainStyledAttributes(wifi_signal_attributes).getDrawable(0); 71 72 mConnectionListener = new WifiManager.ActionListener() { 73 @Override 74 public void onSuccess() { 75 } 76 @Override 77 public void onFailure(int reason) { 78 Toast.makeText(mContext, 79 R.string.wifi_failed_connect_message, 80 Toast.LENGTH_SHORT).show(); 81 } 82 }; 83 } 84 85 public void updateAccessPoints(@NonNull List<AccessPoint> accesssPoints) { 86 mAccessPoints = accesssPoints; 87 notifyDataSetChanged(); 88 } 89 90 public boolean isEmpty() { 91 return mAccessPoints.isEmpty(); 92 } 93 94 public class ViewHolder extends RecyclerView.ViewHolder { 95 private final ImageView mIcon; 96 private final TextView mWifiName; 97 private final TextView mWifiDesc; 98 99 public ViewHolder(View view) { 100 super(view); 101 mWifiName = (TextView) view.findViewById(R.id.title); 102 mWifiDesc = (TextView) view.findViewById(R.id.desc); 103 mIcon = (ImageView) view.findViewById(R.id.icon); 104 } 105 } 106 107 private class AccessPointClickListener implements OnClickListener { 108 private final AccessPoint mAccessPoint; 109 110 public AccessPointClickListener(AccessPoint accessPoint) { 111 mAccessPoint = accessPoint; 112 } 113 114 @Override 115 public void onClick(View v) { 116 // for new open unsecuried wifi network, connect to it right away 117 if (mAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE && 118 !mAccessPoint.isSaved() && !mAccessPoint.isActive()) { 119 mCarWifiManager.connectToPublicWifi(mAccessPoint, mConnectionListener); 120 } else { 121 Intent intent = mAccessPoint.isSaved() 122 ? new Intent(mContext , WifiDetailActivity.class) 123 : new Intent(mContext, AddWifiActivity.class); 124 Bundle accessPointState = new Bundle(); 125 mAccessPoint.saveWifiState(accessPointState); 126 intent.putExtras(accessPointState); 127 mContext.startActivity( 128 intent, AnimationUtil.slideInFromRightOption(mContext).toBundle()); 129 } 130 } 131 }; 132 133 @Override 134 public AccessPointListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 135 int viewType) { 136 View v = LayoutInflater.from(parent.getContext()) 137 .inflate(R.layout.icon_widget_line_item, parent, false); 138 ViewHolder vh = new ViewHolder(v); 139 return vh; 140 } 141 142 @Override 143 public void onBindViewHolder(ViewHolder holder, int position) { 144 AccessPoint accessPoint = mAccessPoints.get(position); 145 holder.itemView.setOnClickListener(new AccessPointClickListener(accessPoint)); 146 holder.mWifiName.setText(accessPoint.getConfigName()); 147 holder.mIcon.setImageDrawable(getIcon(accessPoint)); 148 String summary = accessPoint.getSummary(); 149 if (summary != null && !summary.isEmpty()) { 150 holder.mWifiDesc.setText(summary); 151 holder.mWifiDesc.setVisibility(View.VISIBLE); 152 } else { 153 holder.mWifiDesc.setVisibility(View.GONE); 154 } 155 } 156 157 @Override 158 public int getItemCount() { 159 return mAccessPoints.size(); 160 } 161 162 @Override 163 public void setMaxItems(int maxItems) { 164 // no limit in this list. 165 } 166 167 private Drawable getIcon(AccessPoint accessPoint) { 168 mWifiSld.setState((accessPoint.getSecurity() != AccessPoint.SECURITY_NONE) 169 ? STATE_SECURED 170 : STATE_NONE); 171 Drawable drawable = mWifiSld.getCurrent(); 172 drawable.setLevel(accessPoint.getLevel()); 173 drawable.invalidateSelf(); 174 return drawable; 175 } 176} 177