/*
* Copyright 2017 rootkiwi
*
* AN2Linux-client is licensed under GNU General Public License 3.
*
* See LICENSE for more details.
*/
package kiwi.root.an2linuxclient.adapters;
import android.app.Activity;
import android.app.FragmentManager;
import android.content.Context;
import android.support.v7.widget.SwitchCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import kiwi.root.an2linuxclient.R;
import kiwi.root.an2linuxclient.crypto.Sha256Helper;
import kiwi.root.an2linuxclient.data.BluetoothServer;
import kiwi.root.an2linuxclient.data.Server;
import kiwi.root.an2linuxclient.data.ServerDatabaseHandler;
import kiwi.root.an2linuxclient.data.MobileServer;
import kiwi.root.an2linuxclient.data.TcpServer;
import kiwi.root.an2linuxclient.data.WifiServer;
import kiwi.root.an2linuxclient.views.BluetoothDialogEdit;
import kiwi.root.an2linuxclient.views.MobileDialogEdit;
import kiwi.root.an2linuxclient.views.WifiDialogEdit;
public class ServerConfigurationAdapter extends ArrayAdapter<Server> {
private List<Server> serverList = new ArrayList<>();
private Context context;
public ServerConfigurationAdapter(Context context, List<Server> serverList) {
super(context, 0, serverList);
this.context = context;
this.serverList = serverList;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Server server = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.view_server_item, parent, false);
}
TextView listItemServerName = (TextView) convertView.findViewById(R.id.listItemServerName);
TextView listItemServerInfo1 = (TextView) convertView.findViewById(R.id.listItemServerInfo1);
TextView listItemServerInfo2 = (TextView) convertView.findViewById(R.id.listItemServerInfo2);
TextView listItemServerInfo3 = (TextView) convertView.findViewById(R.id.listItemServerInfo3);
ImageView iconConnectionType = (ImageView) convertView.findViewById(R.id.iconConnectionType);
if (server instanceof WifiServer){
iconConnectionType.setImageResource(R.drawable.ic_signal_wifi_4_bar_white_24dp);
} else if (server instanceof MobileServer) {
iconConnectionType.setImageResource(R.drawable.ic_signal_cellular_4_bar_white_24dp);
} else {
iconConnectionType.setImageResource(R.drawable.ic_bluetooth_white_24dp);
}
ServerDatabaseHandler dbHandler = ServerDatabaseHandler.getInstance(context);
if (server instanceof TcpServer){
listItemServerInfo1.setText(String.format("%s %s",
context.getString(R.string.server_list_port_colon),
Integer.toString(((TcpServer)server).getPortNumber())));
listItemServerInfo3.setText(String.format("%s\n%s",
context.getString(R.string.server_list_certificate_fingerprint),
Sha256Helper.getFourLineHexString(
dbHandler.getCertificateFingerprint(
server.getCertificateId()))));
if (server instanceof WifiServer) {
WifiServer wifiServer = (WifiServer) server;
listItemServerName.setText(wifiServer.getIpOrHostname());
if(wifiServer.getSsidWhitelist() == null){
listItemServerInfo2.setText(String.format("%s %s",
context.getString(R.string.server_list_ssid_whitelist_colon),
context.getString(R.string.server_list_any_ssid)));
} else {
String[] allowedSSIDs = wifiServer.getSsidWhitelist().split(",");
String allowedSSIDsString = "";
for (int i = 0; i < allowedSSIDs.length; i++){
allowedSSIDsString += String.format("'%s'", allowedSSIDs[i].trim());
if (i < allowedSSIDs.length - 1){
allowedSSIDsString += ", ";
}
}
listItemServerInfo2.setText(String.format("%s %s",
context.getString(R.string.server_list_ssid_whitelist_colon), allowedSSIDsString));
}
} else {
MobileServer mobileServer = (MobileServer) server;
listItemServerName.setText(mobileServer.getIpOrHostname());
listItemServerInfo2.setText(String.format("%s %s",
context.getString(R.string.server_list_roaming_allowed),
mobileServer.isRoamingAllowed() ? context.getString(R.string.server_list_roaming_allowed_yes) : context.getString(R.string.server_list_roaming_allowed_no)));
}
} else {
BluetoothServer bluetoothServer = (BluetoothServer) server;
listItemServerName.setText(bluetoothServer.getBluetoothName());
listItemServerInfo1.setText(bluetoothServer.getBluetoothMacAddress());
listItemServerInfo2.setText(String.format("%s\n%s",
context.getString(R.string.server_list_certificate_fingerprint),
Sha256Helper.getFourLineHexString(
dbHandler.getCertificateFingerprint(
server.getCertificateId()))));
listItemServerInfo3.setText("");
}
final SwitchCompat enabledSwitch = (SwitchCompat) convertView.findViewById(R.id.prefServerEnabled);
enabledSwitch.setChecked(server.isEnabled());
enabledSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ServerDatabaseHandler dbHandler = ServerDatabaseHandler.getInstance(getContext());
if (enabledSwitch.isChecked()) {
dbHandler.updateIsEnabled(server.getId(), true);
updateServerInListIsEnabled(position, true);
} else {
dbHandler.updateIsEnabled(server.getId(), false);
updateServerInListIsEnabled(position, false);
}
}
});
((ListView) parent).setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3) {
Server server = serverList.get(position);
long id = serverList.get(position).getId();
FragmentManager manager = ((Activity) context).getFragmentManager();
if (server instanceof WifiServer) {
WifiDialogEdit myDialog = WifiDialogEdit.newInstance(id, position);
myDialog.setCancelable(false);
myDialog.show(manager, "wifi");
} else if (server instanceof MobileServer) {
MobileDialogEdit myDialog = MobileDialogEdit.newInstance(id, position);
myDialog.setCancelable(false);
myDialog.show(manager, "mobile");
} else {
BluetoothDialogEdit myDialog = BluetoothDialogEdit.newInstance(id, position);
myDialog.setCancelable(false);
myDialog.show(manager, "bluetooth");
}
}
});
return convertView;
}
public void addServerToList(Server server){
serverList.add(server);
notifyDataSetChanged();
}
public void deleteServerFromList(int serverListPosition){
serverList.remove(serverListPosition);
notifyDataSetChanged();
}
public void updateServerInList(Server server, int serverListPosition){
serverList.remove(serverListPosition);
serverList.add(serverListPosition, server);
notifyDataSetChanged();
}
private void updateServerInListIsEnabled(int serverListPosition, boolean isEnabled){
serverList.get(serverListPosition).setIsEnabled(isEnabled);
notifyDataSetChanged();
}
}