blob: 99eb5b6519bc5d5d0ef887f3ff9e5f0e976406fc [file] [log] [blame]
/*
* Copyright (C) 2021 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.android.systemui.qs.tiles.dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.text.Html;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.Utils;
import com.android.settingslib.wifi.WifiUtils;
import com.android.systemui.R;
import com.android.wifitrackerlib.WifiEntry;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
/**
* Adapter for showing Wi-Fi networks.
*/
public class InternetAdapter extends RecyclerView.Adapter<InternetAdapter.InternetViewHolder> {
private static final String TAG = "InternetAdapter";
private static final String ACTION_WIFI_DIALOG = "com.android.settings.WIFI_DIALOG";
private static final String EXTRA_CHOSEN_WIFI_ENTRY_KEY = "key_chosen_wifientry_key";
private static final String EXTRA_CONNECT_FOR_CALLER = "connect_for_caller";
private final InternetDialogController mInternetDialogController;
private List<WifiEntry> mWifiEntries;
private int mWifiEntriesCount;
protected View mHolderView;
protected Context mContext;
public InternetAdapter(InternetDialogController controller) {
mInternetDialogController = controller;
}
@Override
public InternetViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
int viewType) {
mContext = viewGroup.getContext();
mHolderView = LayoutInflater.from(mContext).inflate(R.layout.internet_list_item,
viewGroup, false);
return new InternetViewHolder(mHolderView, mInternetDialogController);
}
@Override
public void onBindViewHolder(@NonNull InternetViewHolder viewHolder, int position) {
if (mWifiEntries == null || position >= mWifiEntriesCount) {
return;
}
viewHolder.onBind(mWifiEntries.get(position));
}
/**
* Updates the Wi-Fi networks.
*
* @param wifiEntries the updated Wi-Fi entries.
* @param wifiEntriesCount the total number of Wi-Fi entries.
*/
public void setWifiEntries(@Nullable List<WifiEntry> wifiEntries, int wifiEntriesCount) {
mWifiEntries = wifiEntries;
mWifiEntriesCount = wifiEntriesCount;
}
/**
* Gets the total number of Wi-Fi networks.
*
* @return The total number of Wi-Fi entries.
*/
@Override
public int getItemCount() {
return mWifiEntriesCount;
}
/**
* ViewHolder for binding Wi-Fi view.
*/
static class InternetViewHolder extends RecyclerView.ViewHolder {
final LinearLayout mContainerLayout;
final LinearLayout mWifiListLayout;
final LinearLayout mWifiNetworkLayout;
final ImageView mWifiIcon;
final TextView mWifiTitleText;
final TextView mWifiSummaryText;
final ImageView mWifiEndIcon;
final Context mContext;
final InternetDialogController mInternetDialogController;
@VisibleForTesting
protected WifiUtils.InternetIconInjector mWifiIconInjector;
InternetViewHolder(View view, InternetDialogController internetDialogController) {
super(view);
mContext = view.getContext();
mInternetDialogController = internetDialogController;
mContainerLayout = view.requireViewById(R.id.internet_container);
mWifiListLayout = view.requireViewById(R.id.wifi_list);
mWifiNetworkLayout = view.requireViewById(R.id.wifi_network_layout);
mWifiIcon = view.requireViewById(R.id.wifi_icon);
mWifiTitleText = view.requireViewById(R.id.wifi_title);
mWifiSummaryText = view.requireViewById(R.id.wifi_summary);
mWifiEndIcon = view.requireViewById(R.id.wifi_end_icon);
mWifiIconInjector = mInternetDialogController.getWifiIconInjector();
}
void onBind(@NonNull WifiEntry wifiEntry) {
mWifiIcon.setImageDrawable(getWifiDrawable(wifiEntry));
setWifiNetworkLayout(wifiEntry.getTitle(),
Html.fromHtml(wifiEntry.getSummary(false), Html.FROM_HTML_MODE_LEGACY));
final int connectedState = wifiEntry.getConnectedState();
final int security = wifiEntry.getSecurity();
updateEndIcon(connectedState, security);
if (connectedState != WifiEntry.CONNECTED_STATE_DISCONNECTED) {
mWifiListLayout.setOnClickListener(
v -> mInternetDialogController.launchWifiNetworkDetailsSetting(
wifiEntry.getKey()));
return;
}
mWifiListLayout.setOnClickListener(v -> {
if (wifiEntry.shouldEditBeforeConnect()) {
final Intent intent = new Intent(ACTION_WIFI_DIALOG);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.putExtra(EXTRA_CHOSEN_WIFI_ENTRY_KEY, wifiEntry.getKey());
intent.putExtra(EXTRA_CONNECT_FOR_CALLER, false);
mContext.startActivity(intent);
}
mInternetDialogController.connect(wifiEntry);
});
}
void setWifiNetworkLayout(CharSequence title, CharSequence summary) {
mWifiTitleText.setText(title);
if (TextUtils.isEmpty(summary)) {
mWifiSummaryText.setVisibility(View.GONE);
return;
}
mWifiSummaryText.setVisibility(View.VISIBLE);
mWifiSummaryText.setText(summary);
}
Drawable getWifiDrawable(@NonNull WifiEntry wifiEntry) {
if (wifiEntry.getLevel() == WifiEntry.WIFI_LEVEL_UNREACHABLE) {
return null;
}
final Drawable drawable = mWifiIconInjector.getIcon(wifiEntry.shouldShowXLevelIcon(),
wifiEntry.getLevel());
if (drawable == null) {
return null;
}
drawable.setTint(
Utils.getColorAttrDefaultColor(mContext, android.R.attr.textColorTertiary));
final AtomicReference<Drawable> shared = new AtomicReference<>();
shared.set(drawable);
return shared.get();
}
void updateEndIcon(int connectedState, int security) {
Drawable drawable = null;
if (connectedState != WifiEntry.CONNECTED_STATE_DISCONNECTED) {
drawable = mContext.getDrawable(R.drawable.ic_settings_24dp);
} else if (security != WifiEntry.SECURITY_NONE && security != WifiEntry.SECURITY_OWE) {
drawable = mContext.getDrawable(R.drawable.ic_friction_lock_closed);
}
if (drawable == null) {
mWifiEndIcon.setVisibility(View.GONE);
return;
}
mWifiEndIcon.setVisibility(View.VISIBLE);
mWifiEndIcon.setImageDrawable(drawable);
}
}
}