mirror of
				https://codeberg.org/tom79/Fedilab.git
				synced 2025-10-20 11:20:16 +03:00 
			
		
		
		
	Restore elements between tabs
This commit is contained in:
		
							parent
							
								
									5472764a9f
								
							
						
					
					
						commit
						ac918aaa20
					
				
					 3 changed files with 241 additions and 121 deletions
				
			
		|  | @ -122,6 +122,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt | |||
|     private ActivityMainBinding binding; | ||||
|     private Pinned pinned; | ||||
| 
 | ||||
| 
 | ||||
|     private final BroadcastReceiver broadcast_data = new BroadcastReceiver() { | ||||
|         @Override | ||||
|         public void onReceive(Context context, Intent intent) { | ||||
|  |  | |||
|  | @ -0,0 +1,76 @@ | |||
| package app.fedilab.android.client.entities.app; | ||||
| /* Copyright 2022 Thomas Schneider | ||||
|  * | ||||
|  * This file is a part of Fedilab | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * Fedilab 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 Fedilab; if not, | ||||
|  * see <http://www.gnu.org/licenses>. */ | ||||
| 
 | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import app.fedilab.android.client.entities.Timeline; | ||||
| import app.fedilab.android.client.mastodon.entities.Status; | ||||
| 
 | ||||
| public class SavedValues { | ||||
| 
 | ||||
|     public static HashMap<String, SavedValues> storedStates = new HashMap<>(); | ||||
|     public int position; | ||||
|     public List<Status> statusList; | ||||
| 
 | ||||
|     /** | ||||
|      * Retrieves saved values | ||||
|      * | ||||
|      * @param timeLineType - Timeline.TimeLineEnum | ||||
|      * @param ident        - the name for pinned timeline | ||||
|      * @return SavedValues | ||||
|      */ | ||||
|     public static SavedValues getSavedValue(Timeline.TimeLineEnum timeLineType, String ident) { | ||||
|         if (!canBestored(timeLineType)) { | ||||
|             return null; | ||||
|         } | ||||
|         String key = timeLineType.getValue(); | ||||
|         if (ident != null) { | ||||
|             key += "|" + ident; | ||||
|         } | ||||
|         return storedStates.get(key); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Check if the current timeline can be stored | ||||
|      * | ||||
|      * @param timeLineType - Timeline.TimeLineEnum | ||||
|      * @return boolean | ||||
|      */ | ||||
|     private static boolean canBestored(Timeline.TimeLineEnum timeLineType) { | ||||
|         return timeLineType == Timeline.TimeLineEnum.HOME || timeLineType == Timeline.TimeLineEnum.LOCAL || timeLineType == Timeline.TimeLineEnum.PUBLIC || timeLineType == Timeline.TimeLineEnum.REMOTE || timeLineType == Timeline.TimeLineEnum.LIST || timeLineType == Timeline.TimeLineEnum.TAG; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param position     - current position in timeline | ||||
|      * @param timeLineType - Timeline.TimeLineEnum | ||||
|      * @param statusList   - List<Status> to save | ||||
|      * @param ident        - the name for pinned timeline | ||||
|      */ | ||||
|     public static void storeTimeline(int position, Timeline.TimeLineEnum timeLineType, List<Status> statusList, String ident) { | ||||
|         if (!canBestored(timeLineType)) { | ||||
|             return; | ||||
|         } | ||||
|         String key = timeLineType.getValue(); | ||||
|         if (ident != null) { | ||||
|             key += "|" + ident; | ||||
|         } | ||||
|         SavedValues savedValues = new SavedValues(); | ||||
|         savedValues.position = position; | ||||
|         savedValues.statusList = statusList; | ||||
|         storedStates.put(key, savedValues); | ||||
|     } | ||||
| } | ||||
|  | @ -42,6 +42,7 @@ import java.util.List; | |||
| import app.fedilab.android.BaseMainActivity; | ||||
| import app.fedilab.android.R; | ||||
| import app.fedilab.android.client.entities.Timeline; | ||||
| import app.fedilab.android.client.entities.app.SavedValues; | ||||
| import app.fedilab.android.client.entities.app.TagTimeline; | ||||
| import app.fedilab.android.client.mastodon.entities.Account; | ||||
| import app.fedilab.android.client.mastodon.entities.Marker; | ||||
|  | @ -78,6 +79,8 @@ public class FragmentMastodonTimeline extends Fragment { | |||
|     private Account accountTimeline; | ||||
|     private boolean exclude_replies, exclude_reblogs, show_pinned, media_only, minified; | ||||
|     private String viewModelKey, remoteInstance; | ||||
|     private String ident; | ||||
| 
 | ||||
| 
 | ||||
|     //Handle actions that can be done in other fragments | ||||
|     private final BroadcastReceiver receive_action = new BroadcastReceiver() { | ||||
|  | @ -161,6 +164,15 @@ public class FragmentMastodonTimeline extends Fragment { | |||
|             minified = getArguments().getBoolean(Helper.ARG_MINIFIED, false); | ||||
|             statusReport = (Status) getArguments().getSerializable(Helper.ARG_STATUS_REPORT); | ||||
|         } | ||||
|         if (tagTimeline != null) { | ||||
|             ident = tagTimeline.name; | ||||
|         } else if (list_id != null) { | ||||
|             ident = list_id; | ||||
|         } else if (remoteInstance != null) { | ||||
|             ident = remoteInstance; | ||||
|         } else { | ||||
|             ident = null; | ||||
|         } | ||||
|         LocalBroadcastManager.getInstance(requireActivity()).registerReceiver(receive_action, new IntentFilter(Helper.RECEIVE_STATUS_ACTION)); | ||||
|         binding = FragmentPaginationBinding.inflate(inflater, container, false); | ||||
|         binding.getRoot().setBackgroundColor(ThemeHelper.getBackgroundColor(requireActivity())); | ||||
|  | @ -340,6 +352,11 @@ public class FragmentMastodonTimeline extends Fragment { | |||
|     @Override | ||||
|     public void onDestroyView() { | ||||
|         super.onDestroyView(); | ||||
| 
 | ||||
|         if (mLayoutManager != null) { | ||||
|             int position = mLayoutManager.findFirstVisibleItemPosition(); | ||||
|             new Thread(() -> SavedValues.storeTimeline(position, timelineType, statuses, ident)).start(); | ||||
|         } | ||||
|         //Update last read id for home timeline | ||||
|         storeMarker(); | ||||
|         if (binding != null) { | ||||
|  | @ -384,6 +401,26 @@ public class FragmentMastodonTimeline extends Fragment { | |||
|      * @param direction - DIRECTION null if first call, then is set to TOP or BOTTOM depending of scroll | ||||
|      */ | ||||
|     private void route(DIRECTION direction) { | ||||
| 
 | ||||
|         new Thread(() -> { | ||||
|             SavedValues savedValues = SavedValues.getSavedValue(timelineType, ident); | ||||
|             if (savedValues != null && savedValues.statusList != null && savedValues.statusList.size() > 0) { | ||||
|                 Statuses statuses = new Statuses(); | ||||
|                 statuses.statuses = savedValues.statusList; | ||||
|                 statuses.pagination = new Pagination(); | ||||
|                 statuses.pagination.max_id = savedValues.statusList.get(savedValues.statusList.size() - 1).id; | ||||
|                 statuses.pagination.min_id = savedValues.statusList.get(0).id; | ||||
|                 try { | ||||
|                     Thread.sleep(200); | ||||
|                 } catch (InterruptedException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|                 Handler mainHandler = new Handler(Looper.getMainLooper()); | ||||
|                 Runnable myRunnable = () -> initializeStatusesCommonView(statuses); | ||||
|                 mainHandler.post(myRunnable); | ||||
|             } else { | ||||
|                 Handler mainHandler = new Handler(Looper.getMainLooper()); | ||||
|                 Runnable myRunnable = () -> { | ||||
|                     // --- HOME TIMELINE --- | ||||
|                     if (timelineType == Timeline.TimeLineEnum.HOME) { | ||||
|                         //for more visibility it's done through loadHomeStrategy method | ||||
|  | @ -508,6 +545,12 @@ public class FragmentMastodonTimeline extends Fragment { | |||
|                             flagLoading = false; | ||||
|                         } | ||||
|                     } | ||||
|                 }; | ||||
|                 mainHandler.post(myRunnable); | ||||
|             } | ||||
| 
 | ||||
|         }).start(); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue