"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