summaryrefslogtreecommitdiffstats
path: root/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java')
-rw-r--r--app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java1057
1 files changed, 879 insertions, 178 deletions
diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java
index 0668597c2..f39568543 100644
--- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java
+++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java
@@ -16,6 +16,7 @@ package fr.gouv.etalab.mastodon.activities;
import android.Manifest;
import android.annotation.SuppressLint;
+import android.app.Activity;
import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -30,36 +31,44 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
+import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.FloatingActionButton;
+import android.support.design.widget.NavigationView;
import android.support.design.widget.TabLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.LocalBroadcastManager;
+import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewPager;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SwitchCompat;
+import android.support.v7.widget.Toolbar;
import android.text.Editable;
+import android.text.InputFilter;
import android.text.TextWatcher;
import android.util.Patterns;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
-import android.view.View;
-import android.support.design.widget.NavigationView;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v7.app.ActionBarDrawerToggle;
-import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
+import android.view.SubMenu;
+import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
+import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -68,8 +77,12 @@ import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
import java.io.File;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -78,29 +91,44 @@ import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import es.dmoral.toasty.Toasty;
import fr.gouv.etalab.mastodon.R;
+import fr.gouv.etalab.mastodon.asynctasks.ManageFiltersAsyncTask;
+import fr.gouv.etalab.mastodon.asynctasks.ManageListsAsyncTask;
+import fr.gouv.etalab.mastodon.asynctasks.RetrieveAccountsAsyncTask;
+import fr.gouv.etalab.mastodon.asynctasks.RetrieveFeedsAsyncTask;
import fr.gouv.etalab.mastodon.asynctasks.RetrieveInstanceAsyncTask;
import fr.gouv.etalab.mastodon.asynctasks.RetrieveMetaDataAsyncTask;
import fr.gouv.etalab.mastodon.asynctasks.RetrieveRemoteDataAsyncTask;
import fr.gouv.etalab.mastodon.asynctasks.UpdateAccountInfoByIDAsyncTask;
import fr.gouv.etalab.mastodon.client.APIResponse;
import fr.gouv.etalab.mastodon.client.Entities.Account;
+import fr.gouv.etalab.mastodon.client.Entities.Filters;
import fr.gouv.etalab.mastodon.client.Entities.Notification;
+import fr.gouv.etalab.mastodon.client.Entities.RemoteInstance;
import fr.gouv.etalab.mastodon.client.Entities.Results;
import fr.gouv.etalab.mastodon.client.Entities.Status;
import fr.gouv.etalab.mastodon.client.Entities.Version;
+import fr.gouv.etalab.mastodon.client.HttpsConnection;
import fr.gouv.etalab.mastodon.fragments.DisplayAccountsFragment;
import fr.gouv.etalab.mastodon.fragments.DisplayBookmarksFragment;
import fr.gouv.etalab.mastodon.fragments.DisplayDraftsFragment;
+import fr.gouv.etalab.mastodon.fragments.DisplayFavoritesPeertubeFragment;
import fr.gouv.etalab.mastodon.fragments.DisplayFiltersFragment;
import fr.gouv.etalab.mastodon.fragments.DisplayFollowRequestSentFragment;
+import fr.gouv.etalab.mastodon.fragments.DisplayHowToFragment;
import fr.gouv.etalab.mastodon.fragments.DisplayListsFragment;
+import fr.gouv.etalab.mastodon.fragments.DisplayMutedInstanceFragment;
import fr.gouv.etalab.mastodon.fragments.DisplayNotificationsFragment;
import fr.gouv.etalab.mastodon.fragments.DisplayScheduledTootsFragment;
-import fr.gouv.etalab.mastodon.fragments.DisplaySearchFragment;
+import fr.gouv.etalab.mastodon.fragments.DisplayStatusFragment;
+import fr.gouv.etalab.mastodon.fragments.TabLayoutSettingsFragment;
import fr.gouv.etalab.mastodon.fragments.WhoToFollowFragment;
import fr.gouv.etalab.mastodon.helper.CrossActions;
import fr.gouv.etalab.mastodon.helper.Helper;
+import fr.gouv.etalab.mastodon.helper.MenuFloating;
+import fr.gouv.etalab.mastodon.interfaces.OnFilterActionInterface;
+import fr.gouv.etalab.mastodon.interfaces.OnListActionInterface;
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveEmojiAccountInterface;
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveInstanceInterface;
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveMetaDataInterface;
@@ -108,36 +136,37 @@ import fr.gouv.etalab.mastodon.interfaces.OnRetrieveRemoteAccountInterface;
import fr.gouv.etalab.mastodon.interfaces.OnUpdateAccountInfoInterface;
import fr.gouv.etalab.mastodon.services.BackupStatusService;
import fr.gouv.etalab.mastodon.services.LiveNotificationService;
+import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
+import fr.gouv.etalab.mastodon.sqlite.InstancesDAO;
import fr.gouv.etalab.mastodon.sqlite.SearchDAO;
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
-import fr.gouv.etalab.mastodon.asynctasks.RetrieveAccountsAsyncTask;
-import fr.gouv.etalab.mastodon.asynctasks.RetrieveFeedsAsyncTask;
-import fr.gouv.etalab.mastodon.fragments.DisplayStatusFragment;
-import fr.gouv.etalab.mastodon.fragments.TabLayoutSettingsFragment;
-import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
+
+import static fr.gouv.etalab.mastodon.asynctasks.ManageFiltersAsyncTask.action.GET_ALL_FILTER;
import static fr.gouv.etalab.mastodon.helper.Helper.ADD_USER_INTENT;
import static fr.gouv.etalab.mastodon.helper.Helper.BACKUP_INTENT;
import static fr.gouv.etalab.mastodon.helper.Helper.CHANGE_THEME_INTENT;
import static fr.gouv.etalab.mastodon.helper.Helper.CHANGE_USER_INTENT;
import static fr.gouv.etalab.mastodon.helper.Helper.EXTERNAL_STORAGE_REQUEST_CODE;
import static fr.gouv.etalab.mastodon.helper.Helper.HOME_TIMELINE_INTENT;
+import static fr.gouv.etalab.mastodon.helper.Helper.INSTANCE_NAME;
import static fr.gouv.etalab.mastodon.helper.Helper.INTENT_ACTION;
import static fr.gouv.etalab.mastodon.helper.Helper.INTENT_TARGETED_ACCOUNT;
import static fr.gouv.etalab.mastodon.helper.Helper.NOTIFICATION_INTENT;
import static fr.gouv.etalab.mastodon.helper.Helper.PREF_KEY_ID;
+import static fr.gouv.etalab.mastodon.helper.Helper.SEARCH_INSTANCE;
import static fr.gouv.etalab.mastodon.helper.Helper.SEARCH_REMOTE;
import static fr.gouv.etalab.mastodon.helper.Helper.SEARCH_URL;
import static fr.gouv.etalab.mastodon.helper.Helper.THEME_BLACK;
+import static fr.gouv.etalab.mastodon.helper.Helper.THEME_LIGHT;
import static fr.gouv.etalab.mastodon.helper.Helper.changeDrawableColor;
import static fr.gouv.etalab.mastodon.helper.Helper.changeUser;
import static fr.gouv.etalab.mastodon.helper.Helper.menuAccounts;
import static fr.gouv.etalab.mastodon.helper.Helper.unCheckAllMenuItems;
import static fr.gouv.etalab.mastodon.helper.Helper.updateHeaderAccountInfo;
-import android.support.v4.app.FragmentStatePagerAdapter;
public abstract class BaseMainActivity extends BaseActivity
- implements NavigationView.OnNavigationItemSelectedListener, OnUpdateAccountInfoInterface, OnRetrieveMetaDataInterface, OnRetrieveInstanceInterface, OnRetrieveRemoteAccountInterface, OnRetrieveEmojiAccountInterface {
+ implements NavigationView.OnNavigationItemSelectedListener, OnUpdateAccountInfoInterface, OnRetrieveMetaDataInterface, OnRetrieveInstanceInterface, OnRetrieveRemoteAccountInterface, OnRetrieveEmojiAccountInterface, OnFilterActionInterface, OnListActionInterface {
private FloatingActionButton toot, delete_all, add_new;
private HashMap<String, String> tagTile = new HashMap<>();
@@ -150,12 +179,12 @@ public abstract class BaseMainActivity extends BaseActivity
private ViewPager viewPager;
private RelativeLayout main_app_container;
private Stack<Integer> stackBack = new Stack<>();
-
+ public static List<Filters> filters = new ArrayList<>();
private DisplayStatusFragment homeFragment, federatedFragment, localFragment;
private DisplayNotificationsFragment notificationsFragment;
private static final int ERROR_DIALOG_REQUEST_CODE = 97;
private static BroadcastReceiver receive_data, receive_federated_data, receive_local_data;
- private boolean display_local, display_global;
+ private boolean display_direct, display_local, display_global;
public static int countNewStatus = 0;
public static int countNewNotifications = 0;
private String userIdService;
@@ -163,12 +192,19 @@ public abstract class BaseMainActivity extends BaseActivity
boolean notif_follow, notif_add, notif_mention, notif_share, show_boosts, show_replies;
String show_filtered;
private AppBarLayout appBar;
- private static boolean activityPaused;
private String bookmark;
private String userId;
private String instance;
public int countPage;
private PagerAdapter adapter;
+ private String oldSearch;
+ boolean isLoadingInstance = false;
+ private ImageView delete_instance;
+ public static String displayPeertube = null;
+ private PopupMenu popup;
+ private String instance_id;
+ private int style;
+ private Activity activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -193,6 +229,7 @@ public abstract class BaseMainActivity extends BaseActivity
}
setContentView(R.layout.activity_main);
+ display_direct = sharedpreferences.getBoolean(Helper.SET_DISPLAY_DIRECT, true);
display_local = sharedpreferences.getBoolean(Helper.SET_DISPLAY_LOCAL, true);
display_global = sharedpreferences.getBoolean(Helper.SET_DISPLAY_GLOBAL, true);
@@ -204,7 +241,7 @@ public abstract class BaseMainActivity extends BaseActivity
finish();
return;
}
-
+ activity = this;
rateThisApp();
SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
@@ -218,19 +255,36 @@ public abstract class BaseMainActivity extends BaseActivity
setSupportActionBar(toolbar);
toolbarTitle = toolbar.findViewById(R.id.toolbar_title);
toolbar_search = toolbar.findViewById(R.id.toolbar_search);
+ if( theme == THEME_LIGHT) {
+ ImageView icon = toolbar_search.findViewById(android.support.v7.appcompat.R.id.search_button);
+ ImageView close = toolbar_search.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
+ if( icon != null)
+ icon.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_icon));
+ if( close != null)
+ close.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_icon));
+ EditText editText = toolbar_search.findViewById(android.support.v7.appcompat.R.id.search_src_text);
+ editText.setHintTextColor(getResources().getColor(R.color.dark_icon));
+ editText.setTextColor(getResources().getColor(R.color.dark_icon));
+ }
tabLayout = findViewById(R.id.tabLayout);
+ delete_instance = findViewById(R.id.delete_instance);
+ viewPager = findViewById(R.id.viewpager);
TabLayout.Tab tabHome = tabLayout.newTab();
TabLayout.Tab tabNotif = tabLayout.newTab();
+ TabLayout.Tab tabDirect = tabLayout.newTab();
TabLayout.Tab tabLocal = tabLayout.newTab();
TabLayout.Tab tabPublic = tabLayout.newTab();
+
+
tabHome.setCustomView(R.layout.tab_badge);
tabNotif.setCustomView(R.layout.tab_badge);
+ tabDirect.setCustomView(R.layout.tab_badge);
tabLocal.setCustomView(R.layout.tab_badge);
tabPublic.setCustomView(R.layout.tab_badge);
@SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId")
ImageView iconHome = tabHome.getCustomView().findViewById(R.id.tab_icon);
- iconHome.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_text), PorterDuff.Mode.SRC_IN);
+
iconHome.setImageResource(R.drawable.ic_home);
if( theme == THEME_BLACK)
@@ -241,38 +295,389 @@ public abstract class BaseMainActivity extends BaseActivity
@SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId")
ImageView iconNotif = tabNotif.getCustomView().findViewById(R.id.tab_icon);
- iconNotif.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_text), PorterDuff.Mode.SRC_IN);
iconNotif.setImageResource(R.drawable.ic_notifications);
@SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId")
+ ImageView iconDirect = tabDirect.getCustomView().findViewById(R.id.tab_icon);
+ iconDirect.setImageResource(R.drawable.ic_direct_messages);
+
+ @SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId")
ImageView iconLocal = tabLocal.getCustomView().findViewById(R.id.tab_icon);
- iconLocal.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_text), PorterDuff.Mode.SRC_IN);
iconLocal.setImageResource(R.drawable.ic_people);
@SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId")
ImageView iconGlobal = tabPublic.getCustomView().findViewById(R.id.tab_icon);
- iconGlobal.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_text), PorterDuff.Mode.SRC_IN);
iconGlobal.setImageResource(R.drawable.ic_public);
+ if( theme == THEME_LIGHT){
+ iconHome.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.action_light_header), PorterDuff.Mode.SRC_IN);
+ iconNotif.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.action_light_header), PorterDuff.Mode.SRC_IN);
+ iconDirect.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.action_light_header), PorterDuff.Mode.SRC_IN);
+ iconLocal.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.action_light_header), PorterDuff.Mode.SRC_IN);
+ iconGlobal.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.action_light_header), PorterDuff.Mode.SRC_IN);
+ }else {
+ iconHome.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_text), PorterDuff.Mode.SRC_IN);
+ iconNotif.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_text), PorterDuff.Mode.SRC_IN);
+ iconDirect.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_text), PorterDuff.Mode.SRC_IN);
+ iconLocal.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_text), PorterDuff.Mode.SRC_IN);
+ iconGlobal.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_text), PorterDuff.Mode.SRC_IN);
+ }
+
+ if (theme == Helper.THEME_DARK) {
+ style = R.style.DialogDark;
+ } else if (theme == Helper.THEME_BLACK){
+ style = R.style.DialogBlack;
+ }else {
+ style = R.style.Dialog;
+ }
FloatingActionButton federatedTimelines = findViewById(R.id.federated_timeline);
+ delete_instance.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try{
+ String title = toolbarTitle.getText().toString();
+ AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(BaseMainActivity.this, style);
+ dialogBuilder.setPositiveButton(R.string.validate, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ new InstancesDAO(BaseMainActivity.this, db).remove(instance_id);
+ BaseMainActivity.this.onBackPressed();
+ }
+ });
+ dialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.dismiss();
+ }
+ });
+ dialogBuilder.setTitle(R.string.delete_instance);
+ dialogBuilder.setMessage(getString(R.string.warning_delete_instance, title));
+ AlertDialog alertDialog = dialogBuilder.create();
+ alertDialog.show();
+
+ }catch (Exception e){
+ Toasty.error(BaseMainActivity.this, getString(R.string.toast_error), Toast.LENGTH_SHORT).show();
+ }
+ }
+ });
boolean displayFollowInstance = sharedpreferences.getBoolean(Helper.SET_DISPLAY_FOLLOW_INSTANCE, true);
if( !displayFollowInstance)
- federatedTimelines.setVisibility(View.GONE);
+ federatedTimelines.hide();
federatedTimelines.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Intent intent = new Intent(getApplicationContext(), InstanceFederatedActivity.class);
- startActivity(intent);
+ new ManageListsAsyncTask(BaseMainActivity.this, ManageListsAsyncTask.action.GET_LIST, null, null, null, null, BaseMainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ SQLiteDatabase db = Sqlite.getInstance(BaseMainActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
+ new InstancesDAO(BaseMainActivity.this, db).cleanDoublon();
+ List<RemoteInstance> remoteInstances = new InstancesDAO(BaseMainActivity.this, db).getAllInstances();
+ popup = new PopupMenu(BaseMainActivity.this, federatedTimelines);
+ popup.getMenuInflater()
+ .inflate(R.menu.remote_instances, popup.getMenu());
+ try {
+ @SuppressLint("PrivateApi") Method method = popup.getMenu().getClass().getDeclaredMethod("setOptionalIconsVisible", boolean.class);
+ method.setAccessible(true);
+ method.invoke(popup.getMenu(), true);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if(remoteInstances != null) {
+ SubMenu submMastodon = popup.getMenu().findItem(R.id.action_show_mastodon).getSubMenu();
+ SubMenu submPeertube = popup.getMenu().findItem(R.id.action_show_peertube).getSubMenu();
+ SubMenu submChannel = popup.getMenu().findItem(R.id.action_show_channel).getSubMenu();
+ int i = 0, j = 0 , k = 0;
+ for (RemoteInstance remoteInstance : remoteInstances) {
+ if (remoteInstance.getType() == null || remoteInstance.getType().equals("MASTODON")) {
+ MenuItem itemPlaceHolder = submMastodon.findItem(R.id.mastodon_instances);
+ if( itemPlaceHolder != null)
+ itemPlaceHolder.setVisible(false);
+ MenuItem item = submMastodon.add(0, i, Menu.NONE, remoteInstance.getHost());
+ item.setIcon(R.drawable.mastodon_icon_item);
+ item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ DisplayStatusFragment statusFragment;
+ Bundle bundle = new Bundle();
+ statusFragment = new DisplayStatusFragment();
+ bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE);
+ bundle.putString("remote_instance", remoteInstance.getHost());
+ statusFragment.setArguments(bundle);
+ String fragmentTag = "REMOTE_INSTANCE";
+ instance_id = remoteInstance.getDbID();
+ FragmentManager fragmentManager = getSupportFragmentManager();
+ fragmentManager.beginTransaction()
+ .replace(R.id.main_app_container, statusFragment, fragmentTag).commit();
+ main_app_container.setVisibility(View.VISIBLE);
+ viewPager.setVisibility(View.GONE);
+ tabLayout.setVisibility(View.GONE);
+ toolbarTitle.setVisibility(View.VISIBLE);
+ delete_instance.setVisibility(View.VISIBLE);
+ toolbarTitle.setText(remoteInstance.getHost());
+ return false;
+ }
+ });
+ i++;
+ }
+ if (remoteInstance.getType() == null || remoteInstance.getType().equals("PEERTUBE_CHANNEL")) {
+ MenuItem itemPlaceHolder = submChannel.findItem(R.id.channel_instances);
+ if( itemPlaceHolder != null)
+ itemPlaceHolder.setVisible(false);
+ MenuItem item = submChannel.add(0, k, Menu.NONE, remoteInstance.getId() + " - " +remoteInstance.getHost());
+ item.setIcon(R.drawable.ic_list_instance);
+ item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ DisplayStatusFragment statusFragment;
+ Bundle bundle = new Bundle();
+ statusFragment = new DisplayStatusFragment();
+ bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE);
+ bundle.putString("remote_instance", remoteInstance.getHost());
+ bundle.putString("remote_channel_name", remoteInstance.getId());
+ statusFragment.setArguments(bundle);
+ instance_id = remoteInstance.getDbID();
+ String fragmentTag = "REMOTE_INSTANCE";
+ FragmentManager fragmentManager = getSupportFragmentManager();
+ fragmentManager.beginTransaction()
+ .replace(R.id.main_app_container, statusFragment, fragmentTag).commit();
+ main_app_container.setVisibility(View.VISIBLE);
+ viewPager.setVisibility(View.GONE);
+ tabLayout.setVisibility(View.GONE);
+ toolbarTitle.setVisibility(View.VISIBLE);
+ delete_instance.setVisibility(View.VISIBLE);
+ toolbarTitle.setText(remoteInstance.getHost());
+ return false;
+ }
+ });
+ k++;
+ }
+ if (remoteInstance.getType() == null || remoteInstance.getType().equals("PEERTUBE")) {
+ MenuItem itemPlaceHolder = submPeertube.findItem(R.id.peertube_instances);
+ if( itemPlaceHolder != null)
+ itemPlaceHolder.setVisible(false);
+ MenuItem item = submPeertube.add(0, j, Menu.NONE, remoteInstance.getHost());
+ item.setIcon(R.drawable.peertube_icon);
+ item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ DisplayStatusFragment statusFragment;
+ Bundle bundle = new Bundle();
+ statusFragment = new DisplayStatusFragment();
+ bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE);
+ bundle.putString("remote_instance", remoteInstance.getHost());
+ statusFragment.setArguments(bundle);
+ String fragmentTag = "REMOTE_INSTANCE";
+ instance_id = remoteInstance.getDbID();
+ FragmentManager fragmentManager = getSupportFragmentManager();
+ fragmentManager.beginTransaction()
+ .replace(R.id.main_app_container, statusFragment, fragmentTag).commit();
+ main_app_container.setVisibility(View.VISIBLE);
+ viewPager.setVisibility(View.GONE);
+ tabLayout.setVisibility(View.GONE);
+ toolbarTitle.setVisibility(View.VISIBLE);
+ delete_instance.setVisibility(View.VISIBLE);
+ toolbarTitle.setText(remoteInstance.getHost());
+ return false;
+ }
+ });
+ j++;
+ }
+ }
+ }
+ popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.action_add_instance:
+ AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(BaseMainActivity.this, style);
+ LayoutInflater inflater = getLayoutInflater();
+ @SuppressLint("InflateParams") View dialogView = inflater.inflate(R.layout.search_instance, null);
+ dialogBuilder.setView(dialogView);
+
+ AutoCompleteTextView instance_list = dialogView.findViewById(R.id.search_instance);
+ CheckBox peertube_instance = dialogView.findViewById(R.id.peertube_instance);
+ instance_list.setFilters(new InputFilter[]{new InputFilter.LengthFilter(60)});
+ dialogBuilder.setPositiveButton(R.string.validate, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
+ String instanceName = instance_list.getText().toString().trim();
+ new Thread(new Runnable(){
+ @Override
+ public void run() {
+ try {
+ if( !peertube_instance.isChecked())
+ new HttpsConnection(BaseMainActivity.this).get("https://" + instanceName + "/api/v1/timelines/public?local=true", 10, null, null);
+ else
+ new HttpsConnection(BaseMainActivity.this).get("https://" + instanceName + "/api/v1/videos/", 10, null, null);
+ runOnUiThread(new Runnable() {
+ public void run() {
+ JSONObject resobj;
+ dialog.dismiss();
+ if( peertube_instance.isChecked())
+ new InstancesDAO(BaseMainActivity.this, db).insertInstance(instanceName, "PEERTUBE");
+ else
+ new InstancesDAO(BaseMainActivity.this, db).insertInstance(instanceName, "MASTODON");
+ DisplayStatusFragment statusFragment;
+ Bundle bundle = new Bundle();
+ statusFragment = new DisplayStatusFragment();
+ bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE);
+ bundle.putString("remote_instance", instanceName);
+ statusFragment.setArguments(bundle);
+ String fragmentTag = "REMOTE_INSTANCE";
+ FragmentManager fragmentManager = getSupportFragmentManager();
+ fragmentManager.beginTransaction()
+ .replace(R.id.main_app_container, statusFragment, fragmentTag).commit();
+ main_app_container.setVisibility(View.VISIBLE);
+ viewPager.setVisibility(View.GONE);
+ delete_instance.setVisibility(View.VISIBLE);
+ tabLayout.setVisibility(View.GONE);
+ toolbarTitle.setVisibility(View.VISIBLE);
+ toolbarTitle.setText(instanceName);
+ }
+ });
+ } catch (final Exception e) {
+ e.printStackTrace();
+ runOnUiThread(new Runnable() {
+ public void run() {
+ Toasty.warning(getApplicationContext(), getString(R.string.toast_instance_unavailable),Toast.LENGTH_LONG).show();
+ }
+ });
+ }
+ }
+ }).start();
+ }
+ });
+ AlertDialog alertDialog = dialogBuilder.create();
+ alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialogInterface) {
+ //Hide keyboard
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ assert imm != null;
+ imm.hideSoftInputFromWindow(instance_list.getWindowToken(), 0);
+ }
+ });
+ if( alertDialog.getWindow() != null )
+ alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ alertDialog.show();
+
+ instance_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
+ oldSearch = parent.getItemAtPosition(position).toString().trim();
+ }
+ });
+ instance_list.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ Pattern host = Pattern.compile("([\\da-z\\.-]+\\.[a-z\\.]{2,12})");
+ Matcher matcher = host.matcher(s.toString().trim());
+ if( s.toString().trim().length() == 0 || !matcher.find()) {
+ alertDialog.getButton(
+ AlertDialog.BUTTON_POSITIVE).setEnabled(false);
+ } else {
+ // Something into edit text. Enable the button.
+ alertDialog.getButton(
+ AlertDialog.BUTTON_POSITIVE).setEnabled(true);
+ }
+ if (s.length() > 2 && !isLoadingInstance) {
+ final String action = "/instances/search";
+ final HashMap<String, String> parameters = new HashMap<>();
+ parameters.put("q", s.toString().trim());
+ parameters.put("count", String.valueOf(1000));
+ parameters.put("name", String.valueOf(true));
+ isLoadingInstance = true;
+
+ if( oldSearch == null || !oldSearch.equals(s.toString().trim()))
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ final String response = new HttpsConnection(BaseMainActivity.this).get("https://instances.social/api/1.0" + action, 30, parameters, Helper.THEKINRAR_SECRET_TOKEN);
+ runOnUiThread(new Runnable() {
+ public void run() {
+ isLoadingInstance = false;
+ String[] instances;
+ try {
+ JSONObject jsonObject = new JSONObject(response);
+ JSONArray jsonArray = jsonObject.getJSONArray("instances");
+ if (jsonArray != null) {
+ int length = 0;
+ for (int i = 0; i < jsonArray.length(); i++) {
+ if( !jsonArray.getJSONObject(i).get("name").toString().contains("@") && jsonArray.getJSONObject(i).get("up").toString().equals("true"))
+ length++;
+ }
+ instances = new String[length];
+ int j = 0;
+ for (int i = 0; i < jsonArray.length(); i++) {
+ if( !jsonArray.getJSONObject(i).get("name").toString().contains("@") && jsonArray.getJSONObject(i).get("up").toString().equals("true")) {
+ instances[j] = jsonArray.getJSONObject(i).get("name").toString();
+ j++;
+ }
+ }
+ } else {
+ instances = new String[]{};
+ }
+ instance_list.setAdapter(null);
+ ArrayAdapter<String> adapter =
+ new ArrayAdapter<>(BaseMainActivity.this, android.R.layout.simple_list_item_1, instances);
+ instance_list.setAdapter(adapter);
+ if (instance_list.hasFocus() && !BaseMainActivity.this.isFinishing())
+ instance_list.showDropDown();
+ oldSearch = s.toString().trim();
+
+ } catch (JSONException ignored) {
+ isLoadingInstance = false;
+ }
+ }
+ });
+
+ } catch (HttpsConnection.HttpsConnectionException e) {
+ isLoadingInstance = false;
+ } catch (Exception e) {
+ isLoadingInstance = false;
+ }
+ }
+ }).start();
+ else
+ isLoadingInstance = false;
+ }
+ }
+ });
+ break;
+ }
+ return true;
+