diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1bb3c925..bafc4abd 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -26,6 +26,10 @@
+
+
diff --git a/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java b/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java
new file mode 100644
index 00000000..f33ef5b3
--- /dev/null
+++ b/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java
@@ -0,0 +1,84 @@
+/* Copyright 2017 Andrew Dawson
+ *
+ * This file is a part of Tusky.
+ *
+ * This program is free software; you can redistribute it and/or modify it under the terms of the
+ * GNU General Public License as published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Tusky; if not,
+ * see . */
+
+package com.keylesspalace.tusky;
+
+import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.support.v7.widget.DividerItemDecoration;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.util.Log;
+
+import com.keylesspalace.tusky.adapter.SavedTootAdapter;
+import com.keylesspalace.tusky.db.TootDao;
+import com.keylesspalace.tusky.db.TootEntity;
+import com.keylesspalace.tusky.util.ThemeUtils;
+
+import java.util.List;
+
+public class SavedTootActivity extends BaseActivity {
+
+ // dao
+ private static TootDao tootDao = TuskyApplication.getDB().tootDao();
+
+ // ui
+ private SavedTootAdapter adapter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_saved_toot);
+
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+
+ RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+ recyclerView.setHasFixedSize(true);
+ LinearLayoutManager layoutManager = new LinearLayoutManager(this);
+ recyclerView.setLayoutManager(layoutManager);
+ DividerItemDecoration divider = new DividerItemDecoration(
+ this, layoutManager.getOrientation());
+ Drawable drawable = ThemeUtils.getDrawable(this, R.attr.status_divider_drawable,
+ R.drawable.status_divider_dark);
+ divider.setDrawable(drawable);
+ recyclerView.addItemDecoration(divider);
+ adapter = new SavedTootAdapter();
+ recyclerView.setAdapter(adapter);
+
+ getAllToot();
+ }
+
+ public void getAllToot() {
+ new AsyncTask>() {
+ @Override
+ protected List doInBackground(Void... params) {
+ return tootDao.loadAll();
+ }
+
+ @Override
+ protected void onPostExecute(List tootEntities) {
+ super.onPostExecute(tootEntities);
+ for (TootEntity t : tootEntities) {
+ Log.e("toot", "id=" + t.getUid() + "text=" + t.getText());
+ }
+ adapter.addItems(tootEntities);
+ }
+ }.execute();
+ }
+
+}
diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/SavedTootAdapter.java b/app/src/main/java/com/keylesspalace/tusky/adapter/SavedTootAdapter.java
new file mode 100644
index 00000000..c8005347
--- /dev/null
+++ b/app/src/main/java/com/keylesspalace/tusky/adapter/SavedTootAdapter.java
@@ -0,0 +1,137 @@
+/* Copyright 2017 Andrew Dawson
+ *
+ * This file is a part of Tusky.
+ *
+ * This program is free software; you can redistribute it and/or modify it under the terms of the
+ * GNU General Public License as published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Tusky; if not,
+ * see . */
+
+package com.keylesspalace.tusky.adapter;
+
+import android.support.annotation.Nullable;
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageButton;
+import android.widget.TextView;
+
+import com.keylesspalace.tusky.R;
+import com.keylesspalace.tusky.db.TootEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SavedTootAdapter extends RecyclerView.Adapter {
+ private List list;
+
+ public SavedTootAdapter() {
+ super();
+ list = new ArrayList<>();
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_saved_toot, parent, false);
+ return new TootViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
+ TootViewHolder holder = (TootViewHolder) viewHolder;
+ holder.bind(getItem(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return list.size() + 1;
+ }
+
+ public void update(List newToot) {
+ if (newToot == null || newToot.isEmpty()) {
+ return;
+ }
+ if (list.isEmpty()) {
+ list = newToot;
+ } else {
+ int index = list.indexOf(newToot.get(newToot.size() - 1));
+ for (int i = 0; i < index; i++) {
+ list.remove(0);
+ }
+ int newIndex = newToot.indexOf(list.get(0));
+ if (newIndex == -1) {
+ list.addAll(0, newToot);
+ } else {
+ list.addAll(0, newToot.subList(0, newIndex));
+ }
+ }
+ notifyDataSetChanged();
+ }
+
+ public void addItems(List newToot) {
+ int end = list.size();
+ list.addAll(newToot);
+ notifyItemRangeInserted(end, newToot.size());
+ }
+
+ @Nullable
+ public TootEntity removeItem(int position) {
+ if (position < 0 || position >= list.size()) {
+ return null;
+ }
+ TootEntity toot = list.remove(position);
+ notifyItemRemoved(position);
+ return toot;
+ }
+
+ public void addItem(TootEntity toot, int position) {
+ if (position < 0 || position > list.size()) {
+ return;
+ }
+ list.add(position, toot);
+ notifyItemInserted(position);
+ }
+
+ public TootEntity getItem(int position) {
+ if (position >= 0 && position < list.size()) {
+ return list.get(position);
+ }
+ return null;
+ }
+
+ public static class ViewHolder extends RecyclerView.ViewHolder {
+ TextView mTextView;
+
+ public ViewHolder(TextView v) {
+ super(v);
+ mTextView = v;
+ }
+ }
+
+ private static class TootViewHolder extends RecyclerView.ViewHolder {
+ public TextView content;
+ public ImageButton suppr;
+
+ TootViewHolder(View view) {
+ super(view);
+ content = (TextView) view.findViewById(R.id.content);
+ suppr = (ImageButton) view.findViewById(R.id.suppr);
+ }
+
+ public void bind(TootEntity item) {
+ if (item != null && !TextUtils.isEmpty(item.getText()))
+ content.setText(item.getText());
+ else
+ content.setText("");
+ }
+ }
+}
diff --git a/app/src/main/res/layout/activity_saved_toot.xml b/app/src/main/res/layout/activity_saved_toot.xml
new file mode 100644
index 00000000..a4575d17
--- /dev/null
+++ b/app/src/main/res/layout/activity_saved_toot.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_saved_toot.xml b/app/src/main/res/layout/item_saved_toot.xml
new file mode 100644
index 00000000..089a993f
--- /dev/null
+++ b/app/src/main/res/layout/item_saved_toot.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d77e6152..b1bc44b7 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -101,6 +101,7 @@
Accept
Reject
Search
+ Saved Toot
Share toot URL to…
Share toot to…
@@ -194,4 +195,7 @@
Video
Follow requested
+
+ %1$s %2$s
+