diff options
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.java | 1057 |
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; + |