feat(workspace): initialize all seven crates with stubs and blank Bevy window

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Solitaire Quest
2026-04-23 11:00:42 -07:00
commit 684f07746d
27 changed files with 11000 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
// TODO (Phase: Android) — implement JNI bindings here.
//
// Steps:
// 1. Add `jni` dependency under [target.'cfg(target_os = "android")'.dependencies]
// 2. Implement GpgsClient using cargo-mobile2 JNI bridge
// 3. pull(): call PlayGames.getSnapshotsClient().open("solitaire_quest_sync")
// -> deserialize JSON blob into SyncPayload
// 4. push(): serialize SyncPayload to JSON -> write to Saved Game slot
// 5. mirror_achievement(id): call PlayGames.getAchievementsClient().unlock(map_id(id))
// 6. Maintain a static ID mapping: our &str IDs -> GPGS achievement IDs (from Play Console)
// 7. On GameWonEvent, submit score to GPGS leaderboard
// 8. Add Google Sign-In button to Settings screen (Android build only, #[cfg] gated)
+11
View File
@@ -0,0 +1,11 @@
#[cfg(target_os = "android")]
mod android;
#[cfg(not(target_os = "android"))]
mod stub;
#[cfg(not(target_os = "android"))]
pub use stub::GpgsClient;
#[cfg(target_os = "android")]
pub use android::GpgsClient;
+38
View File
@@ -0,0 +1,38 @@
use async_trait::async_trait;
use solitaire_data::{SyncError, SyncProvider};
use solitaire_sync::{SyncPayload, SyncResponse};
/// Desktop/iOS stub — always returns UnsupportedPlatform.
/// Real implementation lives in android.rs (Phase: Android).
pub struct GpgsClient;
impl GpgsClient {
pub fn new() -> Self {
Self
}
}
impl Default for GpgsClient {
fn default() -> Self {
Self::new()
}
}
#[async_trait]
impl SyncProvider for GpgsClient {
async fn pull(&self) -> Result<SyncPayload, SyncError> {
Err(SyncError::UnsupportedPlatform)
}
async fn push(&self, _payload: &SyncPayload) -> Result<SyncResponse, SyncError> {
Err(SyncError::UnsupportedPlatform)
}
fn backend_name(&self) -> &'static str {
"Google Play Games (unavailable on this platform)"
}
fn is_authenticated(&self) -> bool {
false
}
}