diff options
4 files changed, 95 insertions, 80 deletions
diff --git a/main/src/main/java/de/blinkt/openvpn/fragments/ConnectionsAdapter.java b/main/src/main/java/de/blinkt/openvpn/fragments/ConnectionsAdapter.java index 3d20db73..94247fab 100644 --- a/main/src/main/java/de/blinkt/openvpn/fragments/ConnectionsAdapter.java +++ b/main/src/main/java/de/blinkt/openvpn/fragments/ConnectionsAdapter.java @@ -6,6 +6,7 @@ package de.blinkt.openvpn.fragments; import android.content.Context; +import android.support.v7.widget.RecyclerView; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; @@ -28,7 +29,7 @@ import de.blinkt.openvpn.core.Connection; /** * Created by arne on 30.10.14. */ -public class ConnectionsAdapter extends BaseAdapter { +public class ConnectionsAdapter extends RecyclerView.Adapter<ConnectionsAdapter.ConnectionsHolder> { private final Context mContext; private final VpnProfile mProfile; private final Settings_Connections mConnectionFragment; @@ -42,44 +43,46 @@ public class ConnectionsAdapter extends BaseAdapter { mConnectionFragment = connections_fragments; } - @Override - public int getCount() { - return mConnections.length; - } + public static class ConnectionsHolder extends RecyclerView.ViewHolder { + private final EditText mServerNameView; + private final TextView mServerPortNumber; + private final EditText mPortNumberView; + private final Switch mRemoteSwitch; + private final RadioGroup mProtoGroup; + private final EditText mCustomOptionText; + private final CheckBox mCustomOptionCB; + private final View mCustomOptionsLayout; + + public ConnectionsHolder(View card) { + super(card); + mServerPortNumber = ((TextView)card.findViewById(R.id.portnumber)); + mServerNameView = (EditText) card.findViewById(R.id.servername); + mPortNumberView = (EditText) card.findViewById(R.id.portnumber); + mRemoteSwitch = (Switch) card.findViewById (R.id.remoteSwitch); + mCustomOptionCB = (CheckBox) card.findViewById(R.id.use_customoptions); + mCustomOptionText = (EditText) card.findViewById(R.id.customoptions); + mProtoGroup = (RadioGroup) card.findViewById(R.id.udptcpradiogroup); + mCustomOptionsLayout = card.findViewById(R.id.custom_options_layout); - @Override - public Object getItem(int position) { - return position; + } } @Override - public long getItemId(int position) { - return 0; + public ConnectionsAdapter.ConnectionsHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + LayoutInflater li = LayoutInflater.from(mContext); + View card = li.inflate(R.layout.server_card, viewGroup, false); + + return new ConnectionsHolder(card); } - // create a new ImageView for each item referenced by the Adapter @Override - public View getView(int position, View convertView, ViewGroup parent) { - View card; - if (convertView==null) { - LayoutInflater li = LayoutInflater.from(mContext); - card = li.inflate(R.layout.server_card, parent, false); - } else { - card = convertView; - } - final Connection connection = mConnections[position]; - ((TextView)card.findViewById(R.id.portnumber)). - setText(connection.mServerPort); - - EditText serverNameView = (EditText) card.findViewById(R.id.servername); - EditText portNumberView = (EditText) card.findViewById(R.id.portnumber); - - serverNameView.setText(connection.mServerName); - portNumberView.setText(connection.mServerPort); - - Switch remoteSwitch = (Switch) card.findViewById (R.id.remoteSwitch); - remoteSwitch.setChecked(connection.mEnabled); - remoteSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + public void onBindViewHolder(final ConnectionsAdapter.ConnectionsHolder cH, final int i) { + final Connection connection = mConnections[i]; + cH.mPortNumberView.setText(connection.mServerPort); + cH.mServerNameView.setText(connection.mServerName); + cH.mPortNumberView.setText(connection.mServerPort); + cH.mRemoteSwitch.setChecked(connection.mEnabled); + cH.mRemoteSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { connection.mEnabled = isChecked; @@ -88,7 +91,32 @@ public class ConnectionsAdapter extends BaseAdapter { }); - serverNameView.addTextChangedListener(new TextWatcher() { + cH.mProtoGroup.check(connection.mUseUdp ? R.id.udp_proto : R.id.tcp_proto); + cH.mProtoGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(RadioGroup group, int checkedId) { + if (checkedId == R.id.udp_proto) + connection.mUseUdp=true; + else if (checkedId == R.id.tcp_proto) + connection.mUseUdp=false; + } + }); + + cH.mCustomOptionsLayout.setVisibility(connection.mUseCustomConfig ? View.VISIBLE : View.GONE); + cH.mCustomOptionText.setText(connection.mCustomConfiguration); + + cH.mCustomOptionCB.setChecked(connection.mUseCustomConfig); + cH.mCustomOptionCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) + { + connection.mUseCustomConfig = isChecked; + cH.mCustomOptionsLayout.setVisibility(connection.mUseCustomConfig ? View.VISIBLE : View.GONE); + notifyItemChanged(i); + } + }); + + cH.mServerNameView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -105,7 +133,7 @@ public class ConnectionsAdapter extends BaseAdapter { } }); - portNumberView.addTextChangedListener(new TextWatcher() { + cH.mPortNumberView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -122,39 +150,17 @@ public class ConnectionsAdapter extends BaseAdapter { } }); - CheckBox customOptionCB = (CheckBox) card.findViewById(R.id.use_customoptions); - final EditText editText = (EditText) card.findViewById(R.id.customoptions); - RadioGroup protoGroup = (RadioGroup) card.findViewById(R.id.udptcpradiogroup); - protoGroup.check(connection.mUseUdp ? R.id.udp_proto : R.id.tcp_proto); - protoGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(RadioGroup group, int checkedId) { - if (checkedId == R.id.udp_proto) - connection.mUseUdp=true; - else if (checkedId == R.id.tcp_proto) - connection.mUseUdp=false; - } - }); - final View customOptionsLayout = card.findViewById(R.id.custom_options_layout); - customOptionsLayout.setVisibility(connection.mUseCustomConfig ? View.VISIBLE : View.GONE); - editText.setText(connection.mCustomConfiguration); + } - customOptionCB.setChecked(connection.mUseCustomConfig); - customOptionCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) - { - connection.mUseCustomConfig = isChecked; - customOptionsLayout.setVisibility(connection.mUseCustomConfig ? View.VISIBLE : View.GONE); - } - }); - displayWarningifNoneEnabled(); - return card; + @Override + public int getItemCount() { + return mConnections.length; } - private void displayWarningifNoneEnabled() { + private void displayWarningifNoneEnabled() + { int showWarning = View.VISIBLE; for(Connection conn:mConnections) { if(conn.mEnabled) @@ -166,8 +172,8 @@ public class ConnectionsAdapter extends BaseAdapter { public void addRemote() { mConnections = Arrays.copyOf(mConnections, mConnections.length+1); mConnections[mConnections.length-1] = new Connection(); + notifyItemInserted(mConnections.length-1); - notifyDataSetInvalidated(); } public void saveProfile() { diff --git a/main/src/main/java/de/blinkt/openvpn/fragments/Settings_Connections.java b/main/src/main/java/de/blinkt/openvpn/fragments/Settings_Connections.java index 435bdb26..60008136 100644 --- a/main/src/main/java/de/blinkt/openvpn/fragments/Settings_Connections.java +++ b/main/src/main/java/de/blinkt/openvpn/fragments/Settings_Connections.java @@ -9,6 +9,9 @@ import android.app.Fragment; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -33,6 +36,7 @@ public class Settings_Connections extends Fragment implements View.OnClickListen private ConnectionsAdapter mConnectionsAdapter; private TextView mWarning; private CheckBox mUseRandomRemote; + private RecyclerView mRecyclerView; @Override public void onCreate(Bundle savedInstanceState) { @@ -56,16 +60,18 @@ public class Settings_Connections extends Fragment implements View.OnClickListen public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.connections, container, false); - GridView gridview = (GridView) v.findViewById(R.id.gridview); - gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { - public void onItemClick(AdapterView<?> parent, View v, int position, long id) { - Toast.makeText(getActivity(), "" + position, Toast.LENGTH_SHORT).show(); - } - }); + mRecyclerView = (RecyclerView) v.findViewById(R.id.connection_recycler_view); + + int dpwidth = (int) (container.getWidth()/getResources().getDisplayMetrics().density); + int columns = dpwidth/290; + columns = Math.max(1, columns); mConnectionsAdapter = new ConnectionsAdapter(getActivity(), this, mProfile); - gridview.setAdapter(mConnectionsAdapter); + + //mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(columns, StaggeredGridLayoutManager.VERTICAL)); + mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false)); + mRecyclerView.setAdapter(mConnectionsAdapter); ImageButton fab_button = (ImageButton) v.findViewById(R.id.add_new_remote); if(fab_button!=null) diff --git a/main/src/main/res/layout/connections.xml b/main/src/main/res/layout/connections.xml index 30494bef..1c44d498 100644 --- a/main/src/main/res/layout/connections.xml +++ b/main/src/main/res/layout/connections.xml @@ -35,17 +35,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" /> - <GridView + <android.support.v7.widget.RecyclerView + android:id="@+id/connection_recycler_view" android:layout_below="@id/remote_random" - android:id="@+id/gridview" android:layout_width="match_parent" android:layout_height="match_parent" - android:columnWidth="290dp" - android:gravity="center" - android:horizontalSpacing="0dp" - android:numColumns="auto_fit" - android:stretchMode="columnWidth" - android:verticalSpacing="10dp" /> + android:verticalSpacing="@dimen/stdpadding" + android:horizontalSpacing="@dimen/stdpadding" + /> <include layout="@layout/connection_fab" /> diff --git a/main/src/main/res/layout/server_card.xml b/main/src/main/res/layout/server_card.xml index d9051b29..96971d33 100644 --- a/main/src/main/res/layout/server_card.xml +++ b/main/src/main/res/layout/server_card.xml @@ -9,7 +9,7 @@ xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="30dp" + android:layout_margin="@dimen/stdpadding" > <!-- A CardView that contains a TextView --> <android.support.v7.widget.CardView @@ -188,8 +188,14 @@ android:layout_alignRight="@+id/portnumber" android:layout_alignEnd="@+id/portnumber" /> - </RelativeLayout> + </android.support.v7.widget.CardView> + <ImageButton + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/imageButton" + android:layout_gravity="right|top" /> + </FrameLayout>
\ No newline at end of file |