/*
* Copyright 2017 rootkiwi
*
* AN2Linux-client is licensed under GNU General Public License 3.
*
* See LICENSE for more details.
*/
package kiwi.root.an2linuxclient.views;
import android.app.Activity;
import android.app.DialogFragment;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import java.security.cert.Certificate;
import java.util.List;
import kiwi.root.an2linuxclient.R;
import kiwi.root.an2linuxclient.data.CertificateIdAndFingerprint;
import kiwi.root.an2linuxclient.data.Server;
import kiwi.root.an2linuxclient.data.ServerDatabaseHandler;
import kiwi.root.an2linuxclient.interfaces.CertificateSpinnerItem;
import kiwi.root.an2linuxclient.interfaces.ServerAdapterListCallbacks;
import kiwi.root.an2linuxclient.network.PairingConnectionHandler;
abstract class ServerDialog extends DialogFragment implements
AdapterView.OnItemSelectedListener, View.OnTouchListener {
TextView pairingInfoTextView;
Spinner certificateSpinner;
Button initiatePairingButton;
Button saveServerBtn;
PairingConnectionHandler connectionHandler;
Certificate serverCert;
boolean serverAcceptedPair;
boolean activePairingConnection;
boolean clientAcceptedPair;
ServerAdapterListCallbacks serverAdapterListCallbacks;
// work around for not changing view on onItemSelected
// firing multiple times after orientation change
boolean userSelect;
@Override
public boolean onTouch(View v, MotionEvent event) {
userSelect = true;
return false;
}
Long onItemSelectedNew(Object item) {
if (item instanceof CertificateIdAndFingerprint){
pairingInfoTextView.setVisibility(View.GONE);
initiatePairingButton.setVisibility(View.GONE);
return ((CertificateIdAndFingerprint) item).getId();
} else {
if (userSelect){
pairingInfoTextView.setVisibility(View.GONE);
initiatePairingButton.setVisibility(View.VISIBLE);
initiatePairingButton.setText(R.string.dialog_pairing_button_text_or);
}
return null;
}
}
void onItemSelectedEdit() {
if (userSelect){
pairingInfoTextView.setVisibility(View.GONE);
initiatePairingButton.setText(R.string.dialog_pairing_button_text);
userSelect = false;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
serverAdapterListCallbacks = (ServerAdapterListCallbacks) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement ServerAdapterListCallbacks");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putBoolean("initiatePairingButtonIsVisible",
initiatePairingButton.getVisibility() == View.VISIBLE);
outState.putString("initiatePairingButtonText", initiatePairingButton.getText().toString());
if (certificateSpinner != null) {
outState.putBoolean("certificateSpinnerIsVisible",
certificateSpinner.getVisibility() == View.VISIBLE);
}
outState.putBoolean("pairingInfoTextViewIsVisible",
pairingInfoTextView.getVisibility() == View.VISIBLE);
outState.putString("pairingInfoTextViewText", pairingInfoTextView.getText().toString());
super.onSaveInstanceState(outState);
}
void initViews(View v) {
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Rect displayRectangle = new Rect();
Window window = getActivity().getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);
v.setMinimumWidth((int)(displayRectangle.width() * 0.9f));
pairingInfoTextView = (TextView) v.findViewById(R.id.pairingInfoTextView);
initiatePairingButton = (Button) v.findViewById(R.id.initiatePairingButton);
saveServerBtn = (Button) v.findViewById(R.id.saveServerBtn);
v.findViewById(R.id.cancelBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
cancel();
}
});
}
void initViewsDialogNew(View v) {
ServerDatabaseHandler dbHandler = ServerDatabaseHandler.getInstance(getActivity());
if (dbHandler.isThereAnyCertificatesInDatabase()){
certificateSpinner = (Spinner) v.findViewById(R.id.certificateSpinner);
List<CertificateSpinnerItem> spinnerList = dbHandler.getSpinnerList();
spinnerList.add(0, new CertificateSpinnerItem(){
@Override
public String toString(){
return getString(R.string.spinner_choose_certificate);
}
});
pairingInfoTextView.setVisibility(View.GONE);
initiatePairingButton.setText(R.string.dialog_pairing_button_text_or);
ArrayAdapter<CertificateSpinnerItem> spinnerArrayAdapter = new ArrayAdapter<>(
getActivity().getApplicationContext(),
R.layout.dialog_certificate_spinner_textview,
spinnerList);
spinnerArrayAdapter.setDropDownViewResource(R.layout.dialog_certificate_spinner_dropdown_textview);
certificateSpinner.setAdapter(spinnerArrayAdapter);
certificateSpinner.getBackground().setColorFilter(getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_ATOP);
certificateSpinner.setOnTouchListener(this);
certificateSpinner.setOnItemSelectedListener(this);
} else {
v.findViewById(R.id.certificateSpinner).setVisibility(View.GONE);
}
v.findViewById(R.id.deleteServerBtn).setVisibility(View.INVISIBLE);
dbHandler.close();
}
void initViewsDialogEdit(View v, final Server server, final int serverListPosition) {
pairingInfoTextView.setVisibility(View.GONE);
final ServerDatabaseHandler dbHandler = ServerDatabaseHandler.getInstance(getActivity());
certificateSpinner = (Spinner) v.findViewById(R.id.certificateSpinner);
List<CertificateSpinnerItem> spinnerList = dbHandler.getSpinnerList();
ArrayAdapter<CertificateSpinnerItem> spinnerArrayAdapter = new ArrayAdapter<>(
getActivity().getApplicationContext(),
R.layout.dialog_certificate_spinner_textview,
spinnerList);
spinnerArrayAdapter.setDropDownViewResource(R.layout.dialog_certificate_spinner_dropdown_textview);
certificateSpinner.setAdapter(spinnerArrayAdapter);
certificateSpinner.getBackground().setColorFilter(getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_ATOP);
certificateSpinner.setOnTouchListener(this);
certificateSpinner.setOnItemSelectedListener(this);
for (int i = 0; i < spinnerList.size(); i++){
if (((CertificateIdAndFingerprint) spinnerList.get(i)).getId() == server.getCertificateId()){
certificateSpinner.setSelection(i);
}
}
v.findViewById(R.id.deleteServerBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbHandler.deleteServer(server.getId());
serverAdapterListCallbacks.deleteServer(serverListPosition);
cancel();
}
});
dbHandler.close();
}
void initViewsRetainedInstance(Bundle savedInstanceState){
if (savedInstanceState != null){
initiatePairingButton.setVisibility(
savedInstanceState.getBoolean("initiatePairingButtonIsVisible") ? View.VISIBLE : View.GONE);
initiatePairingButton.setText(savedInstanceState.getString("initiatePairingButtonText"));
if (certificateSpinner != null) {
certificateSpinner.setVisibility(
savedInstanceState.getBoolean("certificateSpinnerIsVisible") ? View.VISIBLE : View.GONE);
}
pairingInfoTextView.setVisibility(
savedInstanceState.getBoolean("pairingInfoTextViewIsVisible") ? View.VISIBLE : View.GONE);
pairingInfoTextView.setText(savedInstanceState.getString("pairingInfoTextViewText"));
}
}
@Override
public void onDestroyView() {
// Work around bug: http://code.google.com/p/android/issues/detail?id=17423
if ((getDialog() != null) && getRetainInstance()){
getDialog().setDismissMessage(null);
}
super.onDestroyView();
}
@Override
public void onDetach() {
super.onDetach();
serverAdapterListCallbacks = null;
}
@Override
public void onDestroy() {
super.onDestroy();
cancel();
}
void cancel() {
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
if (connectionHandler != null){
connectionHandler.cancel();
}
if (getDialog() != null){
getDialog().cancel();
}
}
}