Anna Eats LogoAnna Eats

⚠️ APK-ul Actual NU Are Suport Printare Directă

APK-ul curent (app-debug.apk v1.0.0) este doar un WebView simplu. NU conține PrinterBridge - de aceea printarea merge doar prin RawBT/Share.

Ce lipsește din APK-ul actual:

  • window.PrinterBridge - JavaScript interface pentru printare
  • Conexiune la SDK-ul imprimantei Q2i (IposPrinter)
  • Metoda print(text) care trimite direct la imprimantă

Brief Tehnic - APK Anna Eats POS

Tot ce trebuie să dai unui dezvoltator Android

Obiectiv

🎯 User apasă "Print" → Bonul se printează INSTANT

Fără dialog, fără RawBT, fără Share - un singur click!

1. WebView

Deschide Anna Eats în aplicație

2. JS Bridge

Expune window.PrinterBridge

3. Print Direct

Trimite la imprimantă built-in

🔴 CRITIC: JavaScript Bridge

Site-ul nostru caută automat window.PrinterBridge. APK-ul trebuie să expună EXACT acest obiect:

window.PrinterBridge.print(text) → printează text
window.PrinterBridge.getPrinterStatus() → returnează "ok"
window.PrinterBridge.openCashDrawer() → opțional
MainActivity.java
Java
// MainActivity.java - WebView cu JavaScript Bridge pentru printare

package com.anna.pos;

import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebSettings;
import android.webkit.JavascriptInterface;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

// Import SDK imprimantă Q2i / IposPrinter
// Acesta variază în funcție de producător - verifică documentația dispozitivului
// import com.iposprinter.iposprinterservice.IPosPrinterService;

public class MainActivity extends AppCompatActivity {
    
    private WebView webView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        webView = new WebView(this);
        setContentView(webView);
        
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setDomStorageEnabled(true);
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);
        settings.setMediaPlaybackRequiresUserGesture(false);
        
        // IMPORTANT: Adaugă JavaScript Bridge
        webView.addJavascriptInterface(new PrinterBridge(), "PrinterBridge");
        
        webView.setWebViewClient(new WebViewClient());
        webView.loadUrl("https://anna-eats.base44.app");
    }
    
    // JavaScript Bridge - expus ca window.PrinterBridge în browser
    public class PrinterBridge {
        
        @JavascriptInterface
        public void print(String text) {
            // Aici conectezi la SDK-ul imprimantei Q2i
            // Exemplu generic:
            runOnUiThread(() -> {
                try {
                    // ÎNLOCUIEȘTE cu codul real pentru imprimanta Q2i
                    // Exemplu pentru IposPrinter:
                    // IPosPrinterService printer = ...
                    // printer.printText(text);
                    // printer.printAndFeedPaper(100);
                    
                    Toast.makeText(MainActivity.this, "Printing...", Toast.LENGTH_SHORT).show();
                    
                    // TODO: Adaugă codul real de printare aici
                    printToBuiltInPrinter(text);
                    
                } catch (Exception e) {
                    Toast.makeText(MainActivity.this, "Print error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                }
            });
        }
        
        @JavascriptInterface
        public void printReceipt(String jsonData) {
            // Versiune alternativă care primește JSON
            print(jsonData);
        }
        
        @JavascriptInterface
        public String getPrinterStatus() {
            // Returnează statusul imprimantei
            // "ok", "no_paper", "overheating", "offline"
            return "ok";
        }
        
        @JavascriptInterface
        public void openCashDrawer() {
            // Deschide sertarul de bani (dacă există)
            runOnUiThread(() -> {
                try {
                    // TODO: Comandă pentru cash drawer
                    Toast.makeText(MainActivity.this, "Cash drawer opened", Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    // ignore
                }
            });
        }
    }
    
    // Metodă pentru printare - ÎNLOCUIEȘTE cu SDK-ul real
    private void printToBuiltInPrinter(String text) {
        // Aici vine codul specific pentru Q2i / IposPrinter
        // Exemplu generic ESC/POS:
        
        /*
        // Pentru IposPrinter SDK:
        IPosPrinterService printerService = IPosPrinterService.getInstance(this);
        printerService.printText(text, null);
        printerService.printAndLineFeed();
        printerService.printAndCutPaper(printerService.ONEHUNDRED);
        */
        
        // SAU pentru Sunmi:
        /*
        SunmiPrinterService printer = SunmiPrintHelper.getInstance();
        printer.printText(text);
        printer.feedPaper();
        */
    }
    
    @Override
    public void onBackPressed() {
        if (webView.canGoBack()) {
            webView.goBack();
        } else {
            super.onBackPressed();
        }
    }
}
build.gradle (app)
Gradle
// build.gradle (app level)

plugins {
    id 'com.android.application'
}

android {
    namespace 'com.anna.pos'
    compileSdk 34

    defaultConfig {
        applicationId "com.anna.pos"
        minSdk 21
        targetSdk 34
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.11.0'
    
    // IMPORTANT: Adaugă SDK-ul imprimantei Q2i
    // Aceasta se obține de la producătorul dispozitivului
    // implementation files('libs/iposprinter-sdk.aar')
}
AndroidManifest.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.anna.pos">

    <!-- Permisiuni necesare -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    <!-- Permisiuni pentru imprimantă (dacă e necesară comunicare serial/USB) -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="Anna Eats POS"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.NoActionBar"
        android:usesCleartextTraffic="true">
        
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:screenOrientation="portrait"
            android:configChanges="orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
Test JavaScript (pentru verificare)
JavaScript
// Cod JavaScript pentru testare în browser (consola)
// După ce APK-ul e instalat, acest cod va funcționa automat

// Verifică dacă bridge-ul există
if (window.PrinterBridge) {
    console.log("✅ PrinterBridge detectat!");
    
    // Test printare
    window.PrinterBridge.print("Test receipt\n\nAnna Eats POS\n================\n\nMultumim!");
    
    // Verifică status
    console.log("Printer status:", window.PrinterBridge.getPrinterStatus());
} else {
    console.log("❌ PrinterBridge nu există - rulezi în browser normal");
}
📋 Pași pentru Dezvoltator
  1. Creează proiect Android în Android Studio
  2. Obține SDK-ul imprimantei de la producătorul Q2i (IposPrinter sau similar)
  3. Adaugă SDK-ul în folder libs/ și în build.gradle
  4. Copiază MainActivity.java și completează metoda printToBuiltInPrinter()
  5. Testează - deschide consola JS și verifică window.PrinterBridge
  6. Build APK și instalează pe Q2i
✅ Cum Verifici Că APK-ul Nou Funcționează

După ce instalezi APK-ul nou pe Q2i, deschide consola JavaScript (DevTools) și rulează:

// Verifică dacă PrinterBridge există
console.log("PrinterBridge:", typeof window.PrinterBridge);
// Trebuie să afișeze "object" - nu "undefined"
// Test printare
if (window.PrinterBridge) {
window.PrinterBridge.print("Test receipt\\n\\nAnna Eats POS\\n================");
}

Rezultate așteptate:

  • typeof window.PrinterBridge = "object"
  • Imprimanta printează textul de test instant, fără dialog
  • În aplicație, butonul Print funcționează cu un singur click