Files
ppsspp/UI/UploadScreen.h
T
Henrik RydgårdandClaude Opus 5.5 d2e9e87242 Android: Ask for the local network permission before starting file upload
Part of #21585

Android 17 apps need ACCESS_LOCAL_NETWORK to serve other devices on the LAN.
The upload screen now asks for it when it opens, starts the web server once
it's granted, and shows a warning and a retry button if it's denied.

The permission only exists from API 37, so check for that rather than 35.
On Android 15 and 16 it reads as denied, which left Remote ISO's connect tab
stuck behind a permission request that could never succeed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 20:44:04 +02:00

59 lines
1.8 KiB
C++

#pragma once
// Copyright (c) 2013- PPSSPP Project.
// 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, version 2.0 or later versions.
// This program 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 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
#pragma once
#include <functional>
#include <string>
#include <vector>
#include "Common/UI/UIScreen.h"
#include "Common/UI/ViewGroup.h"
#include "UI/BaseScreens.h"
#include "UI/SimpleDialogScreen.h"
#include "Common/TimeUtil.h"
#include "Common/System/System.h"
// Upload screen: Shows the user an ip address to go to in a web browser on the same network,
// in order to upload game files to the current directory.
class UploadScreen : public UISimpleBaseDialogScreen {
public:
UploadScreen(const Path &targetFolder);
~UploadScreen();
void CreateDialogViews(UI::ViewGroup *parent) override;
protected:
void update() override;
std::string_view GetTitle() const override;
const char *tag() const override { return "Upload"; }
private:
void RecreateStatus();
void StartServerIfPermitted();
bool started_ = false;
PermissionStatus prevPermission_ = PERMISSION_STATUS_UNKNOWN;
bool prevRunning_ = false;
std::vector<std::string> localIPs_;
Path targetFolder_;
Instant lastUpdate_;
UI::ViewGroup *statusContainer_ = nullptr;
};