From c232e1c92ed6324ab9bbf3f5bd37d771838d4412 Mon Sep 17 00:00:00 2001 From: arrase Date: Sun, 20 Nov 2016 01:52:23 +0100 Subject: [PATCH] switch to listview --- app/build.gradle | 1 - .../android/ui/hs/HiddenServicesActivity.java | 89 ++++++----- .../adapters/CursorRecyclerViewAdapter.java | 144 ------------------ .../android/ui/hs/adapters/HSAdapter.java | 55 ------- .../ui/hs/adapters/OnionListAdapter.java | 36 +++++ .../android/ui/hs/dialogs/HSDataDialog.java | 5 +- .../res/layout/activity_hidden_services.xml | 34 ----- .../res/layout/content_hidden_services.xml | 22 --- ..._hs_data.xml => layout_hs_data_dialog.xml} | 0 .../main/res/layout/layout_hs_list_item.xml | 20 +++ .../main/res/layout/layout_hs_list_view.xml | 22 +++ app/src/main/res/layout/onion_item.xml | 33 ---- 12 files changed, 129 insertions(+), 332 deletions(-) delete mode 100644 app/src/main/java/org/torproject/android/ui/hs/adapters/CursorRecyclerViewAdapter.java delete mode 100644 app/src/main/java/org/torproject/android/ui/hs/adapters/HSAdapter.java create mode 100644 app/src/main/java/org/torproject/android/ui/hs/adapters/OnionListAdapter.java delete mode 100644 app/src/main/res/layout/activity_hidden_services.xml delete mode 100644 app/src/main/res/layout/content_hidden_services.xml rename app/src/main/res/layout/{dialog_hs_data.xml => layout_hs_data_dialog.xml} (100%) create mode 100644 app/src/main/res/layout/layout_hs_list_item.xml create mode 100644 app/src/main/res/layout/layout_hs_list_view.xml delete mode 100644 app/src/main/res/layout/onion_item.xml diff --git a/app/build.gradle b/app/build.gradle index 66d12252..cc364c78 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,5 +31,4 @@ dependencies { compile 'com.android.support:support-v4:23.4.0' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:design:23.4.0' - compile 'com.android.support:cardview-v7:23.4.0' } diff --git a/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java b/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java index da556da1..a2c9280c 100644 --- a/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java +++ b/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java @@ -1,38 +1,49 @@ package org.torproject.android.ui.hs; + import android.content.ContentResolver; import android.database.ContentObserver; import android.os.Bundle; import android.os.Handler; import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; import org.torproject.android.R; -import org.torproject.android.ui.hs.adapters.HSAdapter; +import org.torproject.android.ui.hs.adapters.OnionListAdapter; import org.torproject.android.ui.hs.dialogs.HSDataDialog; import org.torproject.android.ui.hs.providers.HSContentProvider; public class HiddenServicesActivity extends AppCompatActivity { - private HSAdapter mHiddenServices; private ContentResolver mCR; - private HSObserver mHSObserver; + private OnionListAdapter mAdapter; + private String[] mProjection = new String[]{ HSContentProvider.HiddenService._ID, HSContentProvider.HiddenService.NAME, - HSContentProvider.HiddenService.DOMAIN, - HSContentProvider.HiddenService.ONION_PORT, - HSContentProvider.HiddenService.PORT}; + HSContentProvider.HiddenService.DOMAIN}; + + class HSObserver extends ContentObserver { + HSObserver(Handler handler) { + super(handler); + } + + @Override + public void onChange(boolean selfChange) { + mAdapter.changeCursor(mCR.query( + HSContentProvider.CONTENT_URI, mProjection, null, null, null + )); + } + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_hidden_services); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + setContentView(R.layout.layout_hs_list_view); + + mCR = getContentResolver(); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @@ -43,35 +54,35 @@ public class HiddenServicesActivity extends AppCompatActivity { } }); - mCR = getContentResolver(); - // View adapter - mHiddenServices = new HSAdapter( - mCR.query( + mAdapter = new OnionListAdapter( + this, + getContentResolver().query( HSContentProvider.CONTENT_URI, mProjection, null, null, null - )); + ), + 0 + ); - mHSObserver = new HSObserver(new Handler()); - mCR.registerContentObserver(HSContentProvider.CONTENT_URI, true, mHSObserver); + mCR.registerContentObserver( + HSContentProvider.CONTENT_URI, true, new HSObserver(new Handler()) + ); - // Fill view - RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.onion_list); - mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); - mRecyclerView.setAdapter(mHiddenServices); + ListView onion_list = (ListView) findViewById(R.id.onion_list); + onion_list.setAdapter(mAdapter); + + onion_list.setOnItemClickListener(new AdapterView.OnItemClickListener(){ + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + + } + }); + + onion_list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){ + + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + return false; + } + }); } - - class HSObserver extends ContentObserver { - public HSObserver(Handler handler) { - super(handler); - } - - @Override - public void onChange(boolean selfChange) { - // New data - mHiddenServices.changeCursor(mCR.query( - HSContentProvider.CONTENT_URI, mProjection, null, null, null - )); - } - - } - } diff --git a/app/src/main/java/org/torproject/android/ui/hs/adapters/CursorRecyclerViewAdapter.java b/app/src/main/java/org/torproject/android/ui/hs/adapters/CursorRecyclerViewAdapter.java deleted file mode 100644 index 97984132..00000000 --- a/app/src/main/java/org/torproject/android/ui/hs/adapters/CursorRecyclerViewAdapter.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.torproject.android.ui.hs.adapters; - -/* - * Copyright (C) 2014 skyfish.jy@gmail.com - * - * 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. - * - */ - -import android.database.Cursor; -import android.database.DataSetObserver; -import android.support.v7.widget.RecyclerView; - -/** - * Created by skyfishjy on 10/31/14. - */ - -public abstract class CursorRecyclerViewAdapter extends RecyclerView.Adapter { - - private Cursor mCursor; - - private boolean mDataValid; - - private int mRowIdColumn; - - private DataSetObserver mDataSetObserver; - - public CursorRecyclerViewAdapter(Cursor cursor) { - mCursor = cursor; - mDataValid = cursor != null; - mRowIdColumn = mDataValid ? mCursor.getColumnIndex("_id") : -1; - mDataSetObserver = new NotifyingDataSetObserver(); - if (mCursor != null) { - mCursor.registerDataSetObserver(mDataSetObserver); - } - } - - @Override - public int getItemCount() { - if (mDataValid && mCursor != null) { - return mCursor.getCount(); - } - return 0; - } - - @Override - public long getItemId(int position) { - if (mDataValid && mCursor != null && mCursor.moveToPosition(position)) { - return mCursor.getLong(mRowIdColumn); - } - return 0; - } - - @Override - public void setHasStableIds(boolean hasStableIds) { - super.setHasStableIds(true); - } - - public abstract void onBindViewHolder(VH viewHolder, Cursor cursor); - - @Override - public void onBindViewHolder(VH viewHolder, int position) { - if (!mDataValid) { - throw new IllegalStateException("this should only be called when the cursor is valid"); - } - if (!mCursor.moveToPosition(position)) { - throw new IllegalStateException("couldn't move cursor to position " + position); - } - onBindViewHolder(viewHolder, mCursor); - } - - /** - * Change the underlying cursor to a new cursor. If there is an existing cursor it will be - * closed. - */ - public void changeCursor(Cursor cursor) { - Cursor old = swapCursor(cursor); - if (old != null) { - old.close(); - } - } - - public void closeCursor() { - mCursor.unregisterDataSetObserver(mDataSetObserver); - mCursor.close(); - } - - /** - * Swap in a new Cursor, returning the old Cursor. Unlike - * {@link #changeCursor(Cursor)}, the returned old Cursor is not - * closed. - */ - private Cursor swapCursor(Cursor newCursor) { - if (newCursor == mCursor) { - return null; - } - final Cursor oldCursor = mCursor; - if (oldCursor != null && mDataSetObserver != null) { - oldCursor.unregisterDataSetObserver(mDataSetObserver); - } - mCursor = newCursor; - if (mCursor != null) { - if (mDataSetObserver != null) { - mCursor.registerDataSetObserver(mDataSetObserver); - } - mRowIdColumn = newCursor.getColumnIndexOrThrow("_id"); - mDataValid = true; - notifyDataSetChanged(); - } else { - mRowIdColumn = -1; - mDataValid = false; - notifyDataSetChanged(); - //There is no notifyDataSetInvalidated() method in RecyclerView.Adapter - } - return oldCursor; - } - - private class NotifyingDataSetObserver extends DataSetObserver { - @Override - public void onChanged() { - super.onChanged(); - mDataValid = true; - notifyDataSetChanged(); - } - - @Override - public void onInvalidated() { - super.onInvalidated(); - mDataValid = false; - notifyDataSetChanged(); - //There is no notifyDataSetInvalidated() method in RecyclerView.Adapter - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/torproject/android/ui/hs/adapters/HSAdapter.java b/app/src/main/java/org/torproject/android/ui/hs/adapters/HSAdapter.java deleted file mode 100644 index 92189ad8..00000000 --- a/app/src/main/java/org/torproject/android/ui/hs/adapters/HSAdapter.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.torproject.android.ui.hs.adapters; - -import android.database.Cursor; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import org.torproject.android.R; -import org.torproject.android.ui.hs.providers.HSContentProvider; - -public class HSAdapter extends CursorRecyclerViewAdapter { - - public HSAdapter(Cursor cursor) { - super(cursor); - } - - @Override - public HSAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View v = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.onion_item, parent, false); - - ViewHolder vh = new ViewHolder(v); - - return vh; - } - - @Override - public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) { - viewHolder.id = cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService._ID)); - - String name_string = cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.NAME)); - Integer port = cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService.PORT)); - Integer onion_port = cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService.ONION_PORT)); - - viewHolder.name.setText(name_string + ": " + port.toString()+ " -> " +onion_port.toString()); - - viewHolder.domain.setText( - cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.DOMAIN)) - ); - } - - class ViewHolder extends RecyclerView.ViewHolder { - TextView name; - TextView domain; - Integer id; - - ViewHolder(View itemView) { - super(itemView); - name = (TextView) itemView.findViewById(R.id.hs_name); - domain = (TextView) itemView.findViewById(R.id.hs_onion); - } - } -} diff --git a/app/src/main/java/org/torproject/android/ui/hs/adapters/OnionListAdapter.java b/app/src/main/java/org/torproject/android/ui/hs/adapters/OnionListAdapter.java new file mode 100644 index 00000000..52757307 --- /dev/null +++ b/app/src/main/java/org/torproject/android/ui/hs/adapters/OnionListAdapter.java @@ -0,0 +1,36 @@ +package org.torproject.android.ui.hs.adapters; + +import android.content.Context; +import android.database.Cursor; +import android.support.v4.widget.CursorAdapter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import org.torproject.android.R; +import org.torproject.android.ui.hs.providers.HSContentProvider; + +public class OnionListAdapter extends CursorAdapter { + private LayoutInflater cursorInflater; + + public OnionListAdapter(Context context, Cursor c, int flags) { + super(context, c, flags); + + cursorInflater = (LayoutInflater) context.getSystemService( + Context.LAYOUT_INFLATER_SERVICE); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + TextView name = (TextView) view.findViewById(R.id.hs_name); + name.setText(cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.NAME))); + TextView domain = (TextView) view.findViewById(R.id.hs_onion); + domain.setText(cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.DOMAIN))); + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return cursorInflater.inflate(R.layout.layout_hs_list_item, parent, false); + } +} diff --git a/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSDataDialog.java b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSDataDialog.java index fb62cb7c..67c36910 100644 --- a/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSDataDialog.java +++ b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSDataDialog.java @@ -5,14 +5,11 @@ import android.app.Dialog; import android.content.ContentResolver; import android.content.ContentValues; import android.os.Bundle; -import android.support.annotation.BoolRes; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; -import android.support.v4.app.ShareCompat; import android.support.v7.app.AlertDialog; import android.view.View; import android.widget.Button; -import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; @@ -25,7 +22,7 @@ public class HSDataDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Get the layout - final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.dialog_hs_data, null); + final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_data_dialog, null); // Use the Builder class for convenient dialog construction final AlertDialog serverDataDialog = new AlertDialog.Builder(getActivity()) diff --git a/app/src/main/res/layout/activity_hidden_services.xml b/app/src/main/res/layout/activity_hidden_services.xml deleted file mode 100644 index a2e86638..00000000 --- a/app/src/main/res/layout/activity_hidden_services.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/content_hidden_services.xml b/app/src/main/res/layout/content_hidden_services.xml deleted file mode 100644 index 39588f91..00000000 --- a/app/src/main/res/layout/content_hidden_services.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/dialog_hs_data.xml b/app/src/main/res/layout/layout_hs_data_dialog.xml similarity index 100% rename from app/src/main/res/layout/dialog_hs_data.xml rename to app/src/main/res/layout/layout_hs_data_dialog.xml diff --git a/app/src/main/res/layout/layout_hs_list_item.xml b/app/src/main/res/layout/layout_hs_list_item.xml new file mode 100644 index 00000000..539de8f0 --- /dev/null +++ b/app/src/main/res/layout/layout_hs_list_item.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_hs_list_view.xml b/app/src/main/res/layout/layout_hs_list_view.xml new file mode 100644 index 00000000..551d4e68 --- /dev/null +++ b/app/src/main/res/layout/layout_hs_list_view.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/onion_item.xml b/app/src/main/res/layout/onion_item.xml deleted file mode 100644 index 12fbf1d7..00000000 --- a/app/src/main/res/layout/onion_item.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file