Add v9.1.1: Device registry and remote blocking system

- Implement DeviceRegistry for remote device management
- Add dashboard for device tracking and blocking
- Remote device blocking capability with admin control
- Support for device aliasing and notes
- Enhanced device management interface
- Dashboard with real-time device status
- Configurable registry URL in build config

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
renato97
2025-11-23 21:37:11 +01:00
parent cf11aa04bc
commit 8fc8991efa
925 changed files with 97082 additions and 2 deletions

View File

@@ -8,6 +8,7 @@ import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.text.TextUtils;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
@@ -40,6 +41,8 @@ public class MainActivity extends AppCompatActivity {
private SectionEntry currentSection;
private UpdateManager updateManager;
private AlertDialog updateDialog;
private AlertDialog blockedDialog;
private DeviceRegistry deviceRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -85,6 +88,28 @@ public class MainActivity extends AppCompatActivity {
Toast.LENGTH_SHORT).show();
}
});
deviceRegistry = new DeviceRegistry(this);
deviceRegistry.syncDevice(new DeviceRegistry.Callback() {
@Override
public void onAllowed() {
// Device authorized, continue normally.
}
@Override
public void onBlocked(String reason) {
showBlockedDialog(reason);
}
@Override
public void onError(String message) {
if (!TextUtils.isEmpty(message)) {
Toast.makeText(MainActivity.this,
getString(R.string.device_registry_error, message),
Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
@@ -101,9 +126,15 @@ public class MainActivity extends AppCompatActivity {
if (updateDialog != null && updateDialog.isShowing()) {
updateDialog.dismiss();
}
if (blockedDialog != null && blockedDialog.isShowing()) {
blockedDialog.dismiss();
}
if (updateManager != null) {
updateManager.release();
}
if (deviceRegistry != null) {
deviceRegistry.release();
}
}
private void selectSection(int index) {
@@ -276,6 +307,25 @@ public class MainActivity extends AppCompatActivity {
}
}
private void showBlockedDialog(String reason) {
if (isFinishing()) {
return;
}
String finalReason = TextUtils.isEmpty(reason)
? getString(R.string.device_blocked_default_reason)
: reason;
if (blockedDialog != null && blockedDialog.isShowing()) {
blockedDialog.dismiss();
}
blockedDialog = new AlertDialog.Builder(this)
.setTitle(R.string.device_blocked_title)
.setMessage(getString(R.string.device_blocked_message, finalReason))
.setCancelable(false)
.setPositiveButton(R.string.device_blocked_close,
(dialog, which) -> finish())
.show();
}
private int getSpanCount() {
return getResources().getInteger(R.integer.channel_grid_span);
}