"No internet" banner on main, categories, and updates screen
An alternate implementation of @pserwylo's fdroidclient!724 closes #884
This commit is contained in:
		
							parent
							
								
									d9a86d4c16
								
							
						
					
					
						commit
						a505850110
					
				| @ -4,21 +4,40 @@ import android.content.BroadcastReceiver; | |||||||
| import android.content.Context; | import android.content.Context; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
| import android.content.IntentFilter; | import android.content.IntentFilter; | ||||||
|  | import android.net.ConnectivityManager; | ||||||
| import android.util.AttributeSet; | import android.util.AttributeSet; | ||||||
| import android.view.Gravity; | import android.view.Gravity; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| 
 | 
 | ||||||
| import org.fdroid.fdroid.R; | import org.fdroid.fdroid.R; | ||||||
| import org.fdroid.fdroid.UpdateService; | import org.fdroid.fdroid.UpdateService; | ||||||
|  | import org.fdroid.fdroid.net.ConnectivityMonitorService; | ||||||
| 
 | 
 | ||||||
| import androidx.localbroadcastmanager.content.LocalBroadcastManager; | import androidx.localbroadcastmanager.content.LocalBroadcastManager; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Widget which reflects whether or not a repo update is currently in progress or not. If so, shows |  * Banner widget which reflects current status related to repository updates. | ||||||
|  * some sort of feedback to the user. |  * It will display whether repositories area actively being updated, or | ||||||
|  |  * whether there is no Internet connection, so repositories cannot be updated | ||||||
|  |  * from the Internet. | ||||||
|  |  * <p> | ||||||
|  |  * It shows a "No Internet" message when it identifies the device is not | ||||||
|  |  * connected. Will only monitor the wifi state when attached to the window. | ||||||
|  |  * Note that this does a pretty poor job of responding to network changes in | ||||||
|  |  * real time. It only knows how to respond to the <em>enabling</em> of WiFi | ||||||
|  |  * (not disabling of WiFi, nor enabling/disabling of mobile data). However it | ||||||
|  |  * will always query the network state when it is shown to the user. This way | ||||||
|  |  * if they change between tabs, hide and then open F-Droid, or do other things | ||||||
|  |  * which require the view to attach to the window again then it will update the | ||||||
|  |  * network state. In practice this works pretty well. | ||||||
|  |  * | ||||||
|  |  * @see <a href="https://gitlab.com/fdroid/fdroidclient/-/merge_requests/724">"No internet" banner on main, categories, and updates screen</a> | ||||||
|  */ |  */ | ||||||
| public class BannerUpdatingRepos extends androidx.appcompat.widget.AppCompatTextView { | public class BannerUpdatingRepos extends androidx.appcompat.widget.AppCompatTextView { | ||||||
| 
 | 
 | ||||||
|  |     private int updateServiceStatus = UpdateService.STATUS_COMPLETE_WITH_CHANGES; | ||||||
|  |     private int networkState = ConnectivityMonitorService.FLAG_NET_NO_LIMIT; | ||||||
|  | 
 | ||||||
|     public BannerUpdatingRepos(Context context) { |     public BannerUpdatingRepos(Context context) { | ||||||
|         this(context, null); |         this(context, null); | ||||||
|     } |     } | ||||||
| @ -33,51 +52,65 @@ public class BannerUpdatingRepos extends androidx.appcompat.widget.AppCompatText | |||||||
|         setPadding(padding, padding, padding, padding); |         setPadding(padding, padding, padding, padding); | ||||||
|         setBackgroundColor(0xFF4A4A4A); |         setBackgroundColor(0xFF4A4A4A); | ||||||
|         setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); |         setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); | ||||||
|         setText(R.string.banner_updating_repositories); |  | ||||||
|         setTextColor(0xFFFFFFFF); |         setTextColor(0xFFFFFFFF); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     protected void onAttachedToWindow() { |     protected void onAttachedToWindow() { | ||||||
|         super.onAttachedToWindow(); |         super.onAttachedToWindow(); | ||||||
|         monitorRepoUpdates(); |         Context context = getContext(); | ||||||
|  |         networkState = ConnectivityMonitorService.getNetworkState(context); | ||||||
|  |         context.registerReceiver(onNetworkStateChanged, | ||||||
|  |                 new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); | ||||||
|  | 
 | ||||||
|  |         if (UpdateService.isUpdating()) { | ||||||
|  |             updateServiceStatus = UpdateService.STATUS_INFO; | ||||||
|  |         } | ||||||
|  |         LocalBroadcastManager.getInstance(context).registerReceiver(onRepoFeedback, | ||||||
|  |                 new IntentFilter(UpdateService.LOCAL_ACTION_STATUS)); | ||||||
|  | 
 | ||||||
|  |         setBannerTextAndVisibility(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     protected void onDetachedFromWindow() { |     protected void onDetachedFromWindow() { | ||||||
|         super.onDetachedFromWindow(); |         super.onDetachedFromWindow(); | ||||||
|         stopMonitoringRepoUpdates(); |         Context context = getContext(); | ||||||
|  |         LocalBroadcastManager.getInstance(context).unregisterReceiver(onRepoFeedback); | ||||||
|  |         context.unregisterReceiver(onNetworkStateChanged); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private void monitorRepoUpdates() { |     private void setBannerTextAndVisibility() { | ||||||
|         if (isInEditMode()) { |         if (updateServiceStatus == UpdateService.STATUS_INFO) { | ||||||
|             return; |             setText(R.string.banner_updating_repositories); | ||||||
|         } |             setVisibility(View.VISIBLE); | ||||||
| 
 |         } else if (networkState == ConnectivityMonitorService.FLAG_NET_UNAVAILABLE | ||||||
|         LocalBroadcastManager.getInstance(getContext()).registerReceiver(onRepoFeedback, |                 || networkState == ConnectivityMonitorService.FLAG_NET_DEVICE_AP_WITHOUT_INTERNET) { | ||||||
|                 new IntentFilter(UpdateService.LOCAL_ACTION_STATUS)); |             setText(R.string.banner_no_internet); | ||||||
|         setBannerIsVisible(UpdateService.isUpdating()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private void setBannerIsVisible(boolean isUpdating) { |  | ||||||
|         if (isUpdating) { |  | ||||||
|             setVisibility(View.VISIBLE); |             setVisibility(View.VISIBLE); | ||||||
|         } else { |         } else { | ||||||
|             setVisibility(View.GONE); |             setVisibility(View.GONE); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private void stopMonitoringRepoUpdates() { |     /** | ||||||
|         LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(onRepoFeedback); |      * Anything other than a {@link UpdateService#STATUS_INFO} broadcast | ||||||
|     } |      * signifies that it was complete (and out banner should be removed). | ||||||
| 
 |      */ | ||||||
|     private final BroadcastReceiver onRepoFeedback = new BroadcastReceiver() { |     private final BroadcastReceiver onRepoFeedback = new BroadcastReceiver() { | ||||||
|         @Override |         @Override | ||||||
|         public void onReceive(Context context, Intent intent) { |         public void onReceive(Context context, Intent intent) { | ||||||
|             // Anything other than a STATUS_INFO broadcast signifies that it was complete (and out |             updateServiceStatus = intent.getIntExtra(UpdateService.EXTRA_STATUS_CODE, | ||||||
|             // banner should be removed). |                     UpdateService.STATUS_COMPLETE_WITH_CHANGES); | ||||||
|             boolean isInfo = intent.getIntExtra(UpdateService.EXTRA_STATUS_CODE, 0) == UpdateService.STATUS_INFO; |             setBannerTextAndVisibility(); | ||||||
|             setBannerIsVisible(isInfo); |         } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     private final BroadcastReceiver onNetworkStateChanged = new BroadcastReceiver() { | ||||||
|  |         @Override | ||||||
|  |         public void onReceive(Context context, Intent intent) { | ||||||
|  |             networkState = ConnectivityMonitorService.getNetworkState(context); | ||||||
|  |             setBannerTextAndVisibility(); | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
|  | |||||||
| @ -379,6 +379,7 @@ This often occurs with apps installed via Google Play or other sources, if they | |||||||
|     <string name="status_download_unknown_size">Downloading\n%2$s from\n%1$s</string> |     <string name="status_download_unknown_size">Downloading\n%2$s from\n%1$s</string> | ||||||
|     <string name="download_404">The requested file was not found.</string> |     <string name="download_404">The requested file was not found.</string> | ||||||
|     <string name="banner_updating_repositories">Updating repositories</string> |     <string name="banner_updating_repositories">Updating repositories</string> | ||||||
|  |     <string name="banner_no_internet">No Internet</string> | ||||||
|     <string name="status_processing_xml_percent">Processing %2$s / %3$s (%4$d%%) from %1$s</string> |     <string name="status_processing_xml_percent">Processing %2$s / %3$s (%4$d%%) from %1$s</string> | ||||||
|     <string name="status_connecting_to_repo">Connecting to\n%1$s</string> |     <string name="status_connecting_to_repo">Connecting to\n%1$s</string> | ||||||
|     <string name="status_inserting_apps">Saving app details</string> |     <string name="status_inserting_apps">Saving app details</string> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Hans-Christoph Steiner
						Hans-Christoph Steiner