From 04d1ffa2c146477878859d603ad703b0fd193755 Mon Sep 17 00:00:00 2001 From: tom79 Date: Sat, 25 May 2019 11:29:58 +0200 Subject: [PATCH] Prepares db and some layout --- .../client/Entities/ManageTimelines.java | 133 ++++++++++++++++++ .../client/Entities/RemoteInstance.java | 26 +++- .../fedilab/android/sqlite/InstancesDAO.java | 28 ++++ .../app/fedilab/android/sqlite/Sqlite.java | 15 +- app/src/main/res/layout/tags_instance.xml | 13 ++ .../res/menu/option_instance_timeline.xml | 9 ++ app/src/main/res/values/strings.xml | 2 + 7 files changed, 223 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/layout/tags_instance.xml create mode 100644 app/src/main/res/menu/option_instance_timeline.xml diff --git a/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java b/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java index 73aedee8e..3b0ea46b7 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java @@ -44,6 +44,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.regex.Pattern; +import app.fedilab.android.sqlite.InstancesDAO; import es.dmoral.toasty.Toasty; import app.fedilab.android.R; import app.fedilab.android.activities.BaseMainActivity; @@ -392,6 +393,17 @@ public class ManageTimelines { } }); } + }else if( tl.getType() == Type.INSTANCE && (tl.getRemoteInstance().getType().equals("MASTODON") || tl.getRemoteInstance().getType().equals("PEERTUBE") || tl.getRemoteInstance().getType().equals("PLEROMA"))) { + if( tabStrip != null && tabStrip.getChildCount() > position) { + int finalPosition = position; + tabStrip.getChildAt(position).setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + instanceClick(context, tl, tabStrip, finalPosition); + return true; + } + }); + } }else if (tl.getType() == Type.LIST){ if( tabStrip != null && tabStrip.getChildCount() > position) { tabStrip.getChildAt(position).setOnLongClickListener(new View.OnLongClickListener() { @@ -940,4 +952,125 @@ public class ManageTimelines { } + + + private void instanceClick(Context context, ManageTimelines tl, LinearLayout tabStrip, int position){ + + + PopupMenu popup = new PopupMenu(context, tabStrip.getChildAt(position)); + SQLiteDatabase db = Sqlite.getInstance(context, DB_NAME, null, Sqlite.DB_VERSION).open(); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); + int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); + int style; + if (theme == Helper.THEME_DARK) { + style = R.style.DialogDark; + } else if (theme == Helper.THEME_BLACK){ + style = R.style.DialogBlack; + }else { + style = R.style.Dialog; + } + remoteInstance = tl.getRemoteInstance(); + if( remoteInstance == null) + return; + String currentFilter = remoteInstance.getFilteredWith(); + popup.getMenuInflater() + .inflate(R.menu.option_instance_timeline, popup.getMenu()); + java.util.List tags = remoteInstance.getTags(); + if( tags != null && tags.size() > 0){ + java.util.Collections.sort(tags); + for(String tag: tags){ + String title = ""; + if( currentFilter != null && currentFilter.equals(tag)) { + title = "✔ " + tag; + }else{ + title = tag; + } + MenuItem item = popup.getMenu().add(0, 0, Menu.NONE, title); + item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + + return false; + } + }); + } + } + + final boolean[] changes = {false}; + popup.setOnDismissListener(new PopupMenu.OnDismissListener() { + @Override + public void onDismiss(PopupMenu menu) { + if(changes[0]) { + FragmentTransaction fragTransaction = ((MainActivity)context).getSupportFragmentManager().beginTransaction(); + DisplayStatusFragment displayStatusFragment = (DisplayStatusFragment) mPageReferenceMap.get(tl.getPosition()); + if( displayStatusFragment == null) + return; + fragTransaction.detach(displayStatusFragment); + Bundle bundle = new Bundle(); + bundle.putString("remote_instance", tl.getRemoteInstance().getHost()!=null?tl.getRemoteInstance().getHost():""); + bundle.putString("instanceType", tl.getRemoteInstance().getType()); + bundle.putInt("timelineId", tl.getId()); + bundle.putString("currentfilter", tl.getRemoteInstance().getFilteredWith()); + bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE); + displayStatusFragment.setArguments(bundle); + fragTransaction.attach(displayStatusFragment); + fragTransaction.commit(); + } + } + }); + + + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + public boolean onMenuItemClick(MenuItem item) { + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); + item.setActionView(new View(context)); + item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { + @Override + public boolean onMenuItemActionExpand(MenuItem item) { + return false; + } + + @Override + public boolean onMenuItemActionCollapse(MenuItem item) { + return false; + } + }); + changes[0] = true; + switch (item.getItemId()) { + case R.id.action_add_tags: + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context, style); + LayoutInflater inflater = ((MainActivity)context).getLayoutInflater(); + @SuppressLint("InflateParams") View dialogView = inflater.inflate(R.layout.tags_instance, null); + dialogBuilder.setView(dialogView); + final EditText editText = dialogView.findViewById(R.id.filter_words); + if(remoteInstance.getTags() != null) { + String valuesTag = ""; + for(String val: remoteInstance.getTags()) + valuesTag += val+" "; + editText.setText(valuesTag); + editText.setSelection(editText.getText().toString().length()); + } + dialogBuilder.setPositiveButton(R.string.validate, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + String[] values = editText.getText().toString().trim().split("\\s+"); + java.util.List tags = + new ArrayList<>(Arrays.asList(values)); + remoteInstance.setTags(tags); + new InstancesDAO(context, db).updateInstance(remoteInstance); + tl.setRemoteInstance(remoteInstance); + new TimelinesDAO(context, db).updateTag(tl); + } + }); + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.show(); + break; + } + return false; + } + }); + popup.show(); + + } + } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/RemoteInstance.java b/app/src/main/java/app/fedilab/android/client/Entities/RemoteInstance.java index 9f6a44c20..3283f5194 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/RemoteInstance.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/RemoteInstance.java @@ -18,6 +18,8 @@ package app.fedilab.android.client.Entities; import android.os.Parcel; import android.os.Parcelable; +import java.util.List; + /** * Created by Thomas on 05/10/2018. * Manages following instances @@ -29,6 +31,8 @@ public class RemoteInstance implements Parcelable { private String type; private String id; private String dbID; + private List tags; + private String filteredWith; public RemoteInstance(){} @@ -65,6 +69,22 @@ public class RemoteInstance implements Parcelable { this.dbID = dbID; } + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public String getFilteredWith() { + return filteredWith; + } + + public void setFilteredWith(String filteredWith) { + this.filteredWith = filteredWith; + } + @Override public int describeContents() { return 0; @@ -76,6 +96,8 @@ public class RemoteInstance implements Parcelable { dest.writeString(this.type); dest.writeString(this.id); dest.writeString(this.dbID); + dest.writeStringList(this.tags); + dest.writeString(this.filteredWith); } protected RemoteInstance(Parcel in) { @@ -83,9 +105,11 @@ public class RemoteInstance implements Parcelable { this.type = in.readString(); this.id = in.readString(); this.dbID = in.readString(); + this.tags = in.createStringArrayList(); + this.filteredWith = in.readString(); } - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public static final Creator CREATOR = new Creator() { @Override public RemoteInstance createFromParcel(Parcel source) { return new RemoteInstance(source); diff --git a/app/src/main/java/app/fedilab/android/sqlite/InstancesDAO.java b/app/src/main/java/app/fedilab/android/sqlite/InstancesDAO.java index 6c70d80c5..4626b5262 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/InstancesDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/InstancesDAO.java @@ -25,6 +25,7 @@ import java.util.Date; import java.util.List; import app.fedilab.android.client.Entities.RemoteInstance; +import app.fedilab.android.client.Entities.TagTimeline; import app.fedilab.android.helper.Helper; @@ -64,6 +65,28 @@ public class InstancesDAO { }catch (Exception ignored) {} } + + //------- UPDATES ------- + + /** + * update instance in database + * @param remoteInstance RemoteInstance + */ + public void updateInstance(RemoteInstance remoteInstance) { + ContentValues values = new ContentValues(); + List tags = remoteInstance.getTags(); + values.put(Sqlite.COL_FILTERED_WITH, remoteInstance.getFilteredWith()); + + + if( tags != null && tags.size() > 0) { + values.put(Sqlite.COL_TAGS, Helper.arrayToStringStorage(tags)); + } + try{ + db.update(Sqlite.TABLE_INSTANCES, values, Sqlite.COL_INSTANCE + " = ? ", new String[]{String.valueOf(remoteInstance.getHost())}); + }catch (Exception ignored) {ignored.printStackTrace();} + } + + public void insertInstance(String instanceName, String type) { insertInstance(instanceName, "null", type); } @@ -102,6 +125,7 @@ public class InstancesDAO { Cursor c = db.query(Sqlite.TABLE_INSTANCES, null, null, null, null, null, Sqlite.COL_INSTANCE + " ASC", null); return cursorToListSearch(c); } catch (Exception e) { + e.printStackTrace(); return null; } } @@ -136,7 +160,11 @@ public class InstancesDAO { RemoteInstance remoteInstance = new RemoteInstance(); remoteInstance.setDbID(c.getString(c.getColumnIndex(Sqlite.COL_ID))); remoteInstance.setId(c.getString(c.getColumnIndex(Sqlite.COL_USER_ID))); + try { + remoteInstance.setTags(Helper.restoreArrayFromString(c.getString(c.getColumnIndex(Sqlite.COL_TAGS)))); + }catch (Exception ignored){} remoteInstance.setHost(c.getString(c.getColumnIndex(Sqlite.COL_INSTANCE))); + remoteInstance.setFilteredWith(c.getString(c.getColumnIndex(Sqlite.COL_FILTERED_WITH))); remoteInstance.setType(c.getString(c.getColumnIndex(Sqlite.COL_INSTANCE_TYPE)) == null?"MASTODON":c.getString(c.getColumnIndex(Sqlite.COL_INSTANCE_TYPE))); remoteInstances.add(remoteInstance); } diff --git a/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java b/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java index f6efe0dff..a04667647 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java +++ b/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java @@ -45,7 +45,7 @@ import app.fedilab.android.R; public class Sqlite extends SQLiteOpenHelper { - public static final int DB_VERSION = 30; + public static final int DB_VERSION = 31; public static final String DB_NAME = "mastodon_etalab_db"; public static SQLiteDatabase db; private static Sqlite sInstance; @@ -89,6 +89,8 @@ public class Sqlite extends SQLiteOpenHelper { //Table for timelines public static final String TABLE_TIMELINES = "TIMELINES"; + //Table for timelines + public static final String TABLE_REMOTE_INSTANCE_TAGS = "REMOTE_INSTANCE_TAGS"; static final String COL_USER_ID = "USER_ID"; @@ -225,9 +227,10 @@ public class Sqlite extends SQLiteOpenHelper { + TABLE_STATUSES_CACHE + "(" + COL_INSTANCE +"," + COL_STATUS_ID + ")"; static final String COL_INSTANCE_TYPE = "INSTANCE_TYPE"; + static final String COL_FILTERED_WITH = "FILTERED_WITH"; private final String CREATE_TABLE_INSTANCES = "CREATE TABLE " + TABLE_INSTANCES + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " - + COL_INSTANCE + " TEXT NOT NULL, " + COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE_TYPE + " TEXT, " + COL_DATE_CREATION + " TEXT NOT NULL)"; + + COL_INSTANCE + " TEXT NOT NULL, " + COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE_TYPE + " TEXT, " + COL_TAGS + " TEXT, " + COL_FILTERED_WITH + " TEXT, "+ COL_DATE_CREATION + " TEXT NOT NULL)"; static final String COL_UUID = "UUID"; @@ -290,6 +293,9 @@ public class Sqlite extends SQLiteOpenHelper { + COL_CACHE + " TEXT NOT NULL, " + COL_DATE + " TEXT NOT NULL)"; + + + public Sqlite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @@ -410,6 +416,11 @@ public class Sqlite extends SQLiteOpenHelper { db.execSQL("ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_SENSITIVE + " INTEGER DEFAULT 0"); case 29: db.execSQL(CREATE_TABLE_TIMELINE_CACHE); + case 30: + if( oldVersion > 11) { + db.execSQL("ALTER TABLE " + TABLE_INSTANCES + " ADD COLUMN " + COL_TAGS + " TEXT"); + db.execSQL("ALTER TABLE " + TABLE_INSTANCES + " ADD COLUMN " + COL_FILTERED_WITH + " TEXT"); + } default: break; } diff --git a/app/src/main/res/layout/tags_instance.xml b/app/src/main/res/layout/tags_instance.xml new file mode 100644 index 000000000..d64096a9f --- /dev/null +++ b/app/src/main/res/layout/tags_instance.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/option_instance_timeline.xml b/app/src/main/res/menu/option_instance_timeline.xml new file mode 100644 index 000000000..056c3f50e --- /dev/null +++ b/app/src/main/res/menu/option_instance_timeline.xml @@ -0,0 +1,9 @@ + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f414b2d3e..d641cadf5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -800,6 +800,7 @@ Any of these words (space-separated) All these words (space-separated) None of these words (space-separated) + Add some words to filter (space-separated) Change column name No Misskey instances Misskey instance @@ -946,6 +947,7 @@ Blur sensitive media Display timelines in a list Display timelines + Add tags %d vote