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 da058263f..257b93a24 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 @@ -23,9 +23,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.content.res.Configuration; import android.database.sqlite.SQLiteDatabase; -import android.graphics.BitmapFactory; import android.graphics.PorterDuff; import android.net.Uri; import android.os.AsyncTask; @@ -41,7 +39,6 @@ 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.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewPager; @@ -56,7 +53,6 @@ import android.text.Editable; import android.text.InputFilter; import android.text.TextWatcher; import android.util.Patterns; -import android.util.SparseArray; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; @@ -83,17 +79,10 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.File; import java.lang.reflect.Method; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; import java.util.HashMap; import java.util.List; -import java.util.Locale; -import java.util.Random; -import java.util.Set; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -115,7 +104,6 @@ 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.ManageTimelines; -import fr.gouv.etalab.mastodon.client.Entities.Peertube; import fr.gouv.etalab.mastodon.client.Entities.RemoteInstance; import fr.gouv.etalab.mastodon.client.Entities.Results; import fr.gouv.etalab.mastodon.client.Entities.Status; @@ -135,7 +123,6 @@ import fr.gouv.etalab.mastodon.fragments.DisplayNotificationsFragment; import fr.gouv.etalab.mastodon.fragments.DisplayPeertubeNotificationsFragment; import fr.gouv.etalab.mastodon.fragments.DisplayReorderTabFragment; import fr.gouv.etalab.mastodon.fragments.DisplayStatusFragment; -import fr.gouv.etalab.mastodon.fragments.SettingsFragment; import fr.gouv.etalab.mastodon.fragments.SettingsPeertubeFragment; import fr.gouv.etalab.mastodon.fragments.TabLayoutNotificationsFragment; import fr.gouv.etalab.mastodon.fragments.TabLayoutScheduleFragment; @@ -156,9 +143,7 @@ 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.sqlite.StatusCacheDAO; import fr.gouv.etalab.mastodon.sqlite.TimelinesDAO; import static fr.gouv.etalab.mastodon.asynctasks.ManageFiltersAsyncTask.action.GET_ALL_FILTER; @@ -203,13 +188,10 @@ public abstract class BaseMainActivity extends BaseActivity private RelativeLayout main_app_container; private Stack stackBack = new Stack<>(); public static List filters = new ArrayList<>(); - private static final int ERROR_DIALOG_REQUEST_CODE = 97; public static int countNewStatus; public static int countNewNotifications; public static String lastHomeId = null, lastNotificationId = null; - boolean show_boosts, show_replies , show_nsfw; - String show_filtered; private AppBarLayout appBar; private String userId; private String instance; @@ -223,7 +205,6 @@ public abstract class BaseMainActivity extends BaseActivity private String instance_id; private int style; private Activity activity; - private HashMap tabPosition = new HashMap<>(); public static HashMap typePosition = new HashMap<>(); private FloatingActionButton federatedTimelines; public static UpdateAccountInfoAsyncTask.SOCIAL social; @@ -352,7 +333,7 @@ public abstract class BaseMainActivity extends BaseActivity if( social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA || social == UpdateAccountInfoAsyncTask.SOCIAL.GNU || social == UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) { - new SyncTimelinesAsyncTask(BaseMainActivity.this, BaseMainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new SyncTimelinesAsyncTask(BaseMainActivity.this, 0, BaseMainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }else if (social == UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE){ TabLayout.Tab pTabsub = tabLayout.newTab(); @@ -1346,7 +1327,7 @@ public abstract class BaseMainActivity extends BaseActivity DrawerLayout drawer = findViewById(R.id.drawer_layout); DisplayReorderTabFragment displayReorderTabFragment = (DisplayReorderTabFragment)getSupportFragmentManager().findFragmentByTag("REORDER_TIMELINES"); if (displayReorderTabFragment != null && displayReorderTabFragment.isVisible() && DisplayReorderTabFragment.updated) { - new SyncTimelinesAsyncTask(BaseMainActivity.this, BaseMainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new SyncTimelinesAsyncTask(BaseMainActivity.this, tabLayout.getSelectedTabPosition(), BaseMainActivity.this ).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } if (drawer.isDrawerOpen(GravityCompat.START)) { @@ -1787,7 +1768,7 @@ public abstract class BaseMainActivity extends BaseActivity @Override - public void syncedTimelines(List manageTimelines) { + public void syncedTimelines(List manageTimelines, int position) { DisplayReorderTabFragment.updated = false; new ManageTimelines().createTabs(BaseMainActivity.this, manageTimelines); SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); @@ -1797,6 +1778,11 @@ public abstract class BaseMainActivity extends BaseActivity final NavigationView navigationView = findViewById(R.id.nav_view); timelines = manageTimelines; + if( position >= manageTimelines.size()){ + position = manageTimelines.size()-1; + } + if( position < 0) + position = 0; if( !optimize_loading) viewPager.setOffscreenPageLimit(countPage); @@ -1909,6 +1895,29 @@ public abstract class BaseMainActivity extends BaseActivity } }); + if( tabLayout.getTabCount() > position) { + TabLayout.Tab tab = tabLayout.getTabAt(position); + if( tab != null) { + tab.select(); + if( tab.getCustomView() != null){ + ImageView icon = tab.getCustomView().findViewById(R.id.tab_icon); + if( icon != null){ + if( theme == THEME_BLACK) + icon.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_icon), PorterDuff.Mode.SRC_IN); + else + icon.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.mastodonC4), PorterDuff.Mode.SRC_IN); + }else{ + TextView tv = tabLayout.getChildAt(0).findViewById(android.R.id.title); + if( tv != null) + if( theme == THEME_BLACK) + tv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_icon)); + else + tv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.mastodonC4)); + } + } + } + } + //Scroll to top when top bar is clicked for favourites/blocked/muted toolbarTitle.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/SyncTimelinesAsyncTask.java b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/SyncTimelinesAsyncTask.java index 509477182..e184a85d4 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/SyncTimelinesAsyncTask.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/SyncTimelinesAsyncTask.java @@ -17,16 +17,13 @@ package fr.gouv.etalab.mastodon.asynctasks; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; - import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Iterator; import java.util.List; - import fr.gouv.etalab.mastodon.activities.MainActivity; import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.APIResponse; - import fr.gouv.etalab.mastodon.client.Entities.ManageTimelines; import fr.gouv.etalab.mastodon.client.Entities.RemoteInstance; import fr.gouv.etalab.mastodon.client.Entities.TagTimeline; @@ -35,7 +32,6 @@ 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.sqlite.TimelinesDAO; - import static fr.gouv.etalab.mastodon.sqlite.Sqlite.DB_NAME; @@ -48,13 +44,15 @@ public class SyncTimelinesAsyncTask extends AsyncTask { private OnSyncTimelineInterface listener; + private int position; private WeakReference contextReference; private List manageTimelines; - - public SyncTimelinesAsyncTask(Context context, OnSyncTimelineInterface onSyncTimelineInterface){ + public SyncTimelinesAsyncTask(Context context, int position, OnSyncTimelineInterface onSyncTimelineInterface){ this.contextReference = new WeakReference<>(context); this.listener = onSyncTimelineInterface; + this.position = position; + } @Override @@ -186,18 +184,19 @@ public class SyncTimelinesAsyncTask extends AsyncTask { new TimelinesDAO(contextReference.get(), db).update(timelines_tmp); } } - } - for(ManageTimelines manageTimelines: manageTimelines){ - if( manageTimelines.getTagTimeline() == null ) - continue; - boolean shouldBeRemoved = true; - for(TagTimeline tag: tagsInDb){ - if( tag.getId() == manageTimelines.getTagTimeline().getId()){ - shouldBeRemoved = false; + + for(ManageTimelines manageTimelines: manageTimelines){ + if( manageTimelines.getTagTimeline() == null ) + continue; + boolean shouldBeRemoved = true; + for(TagTimeline tag: tagsInDb){ + if( tag.getId() == manageTimelines.getTagTimeline().getId()){ + shouldBeRemoved = false; + } + } + if( shouldBeRemoved){ + new TimelinesDAO(contextReference.get(), db).remove(manageTimelines); } - } - if( shouldBeRemoved){ - new TimelinesDAO(contextReference.get(), db).remove(manageTimelines); } } @@ -227,22 +226,22 @@ public class SyncTimelinesAsyncTask extends AsyncTask { new TimelinesDAO(contextReference.get(), db).update(timelines_tmp); } } - - } - for(ManageTimelines manageTimelines: manageTimelines){ - if( manageTimelines.getRemoteInstance() == null ) - continue; - boolean shouldBeRemoved = true; - for(RemoteInstance instance: instancesInDb){ - if( instance.getId().equals(manageTimelines.getRemoteInstance().getId())){ - shouldBeRemoved = false; + for(ManageTimelines manageTimelines: manageTimelines){ + if( manageTimelines.getRemoteInstance() == null ) + continue; + boolean shouldBeRemoved = true; + for(RemoteInstance instance: instancesInDb){ + if( instance.getId().equals(manageTimelines.getRemoteInstance().getId())){ + shouldBeRemoved = false; + } + } + if( shouldBeRemoved){ + new TimelinesDAO(contextReference.get(), db).remove(manageTimelines); } } - if( shouldBeRemoved){ - new TimelinesDAO(contextReference.get(), db).remove(manageTimelines); - } } + APIResponse apiResponse = new API(contextReference.get()).getLists(); List lists = apiResponse.getLists(); if( lists != null && lists.size() > 0){ @@ -297,7 +296,7 @@ public class SyncTimelinesAsyncTask extends AsyncTask { @Override protected void onPostExecute(Void result) { - listener.syncedTimelines(manageTimelines); + listener.syncedTimelines(manageTimelines, position); } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/ManageTimelines.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/ManageTimelines.java index aaf73d1cb..5984dcf2f 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/ManageTimelines.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/ManageTimelines.java @@ -21,6 +21,7 @@ import android.content.DialogInterface; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.graphics.PorterDuff; +import android.os.AsyncTask; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.FragmentManager; @@ -52,6 +53,7 @@ import fr.gouv.etalab.mastodon.R; import fr.gouv.etalab.mastodon.activities.BaseMainActivity; import fr.gouv.etalab.mastodon.activities.MainActivity; import fr.gouv.etalab.mastodon.asynctasks.RetrieveFeedsAsyncTask; +import fr.gouv.etalab.mastodon.asynctasks.SyncTimelinesAsyncTask; import fr.gouv.etalab.mastodon.asynctasks.UpdateAccountInfoAsyncTask; import fr.gouv.etalab.mastodon.fragments.DisplayStatusFragment; import fr.gouv.etalab.mastodon.fragments.TabLayoutNotificationsFragment; @@ -929,9 +931,8 @@ public class ManageTimelines { dialogBuilder.setPositiveButton(R.string.validate, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { - if( tabLayout.getTabCount() > tl.getPosition()) - tabLayout.removeTab(tabLayout.getTabAt(tl.getPosition())); new SearchDAO(context, db).remove(tag); + new SyncTimelinesAsyncTask(context, tabLayout.getSelectedTabPosition(), ((BaseMainActivity)context) ).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); dialog.dismiss(); } }); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java index 30dfede6c..1c6a33644 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java @@ -34,6 +34,7 @@ import android.os.Bundle; import android.os.CountDownTimer; import android.os.Handler; import android.support.annotation.NonNull; +import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.widget.PopupMenu; @@ -145,6 +146,7 @@ import fr.gouv.etalab.mastodon.sqlite.StatusStoredDAO; import fr.gouv.etalab.mastodon.sqlite.TempMuteDAO; import fr.gouv.etalab.mastodon.sqlite.TimelinesDAO; +import static fr.gouv.etalab.mastodon.activities.BaseMainActivity.mPageReferenceMap; import static fr.gouv.etalab.mastodon.activities.BaseMainActivity.social; import static fr.gouv.etalab.mastodon.activities.MainActivity.currentLocale; import static fr.gouv.etalab.mastodon.helper.Helper.THEME_BLACK; @@ -1359,7 +1361,8 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct List timelines = new TimelinesDAO(context, db).getDisplayedTimelines(); for(ManageTimelines tl: timelines) { if( tl.getType() == ManageTimelines.Type.HOME) { - DisplayStatusFragment homeFragment = (DisplayStatusFragment) ((MainActivity) context).getSupportFragmentManager().getFragments().get(tl.getPosition()); + FragmentTransaction fragTransaction = ((MainActivity)context).getSupportFragmentManager().beginTransaction(); + DisplayStatusFragment homeFragment = (DisplayStatusFragment) mPageReferenceMap.get(tl.getPosition()); if (homeFragment != null) homeFragment.fetchMore(status.getId()); break; diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnSyncTimelineInterface.java b/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnSyncTimelineInterface.java index cb4e5620f..729e1b3c4 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnSyncTimelineInterface.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnSyncTimelineInterface.java @@ -24,5 +24,5 @@ import fr.gouv.etalab.mastodon.client.Entities.ManageTimelines; * Interface when timelines are retrieved */ public interface OnSyncTimelineInterface { - void syncedTimelines(List manageTimelines); + void syncedTimelines(List manageTimelines, int position); }