<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Pasja Informatyki - Najnowsze z tagiem apka</title>
<link>https://forum.pasja-informatyki.pl/tag/apka</link>
<description>Powered by Question2Answer</description>
<item>
<title>Nie działa kompilacja, chciałbym abyście pomogli mi czy kod poprawnie jest napisany?</title>
<link>https://forum.pasja-informatyki.pl/599089/nie-dziala-kompilacja-chcialbym-abyscie-pomogli-mi-czy-kod-poprawnie-jest-napisany</link>
<description>

&lt;p&gt;Biblioteka-model&lt;/p&gt;



&lt;p&gt;Gra planszowa.java:&lt;/p&gt;



&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.com.biblioteka.biblioteka.model; 

public class GraPlanszowa extends Pozycja {
    private int maksymalnyWiek;

    public GraPlanszowa(String tytul, int minimalnyWiek, int maksymalnyWiek) {
        super(tytul, minimalnyWiek);
        this.maksymalnyWiek = maksymalnyWiek;
    }

    public int getMaksymalnyWiek() {
        return maksymalnyWiek;
    }

    @Override
    public String pobierzSzczegoloweInfo() {
        return &quot;Gra Planszowa -&amp;gt; &quot; + super.toString() + &quot;, maksymalny wiek: &quot; + maksymalnyWiek;
    }
    
    //SPRAWDŹ, CZY TA SEKCJA ISTNIEJE I JEST POPRAWNA

    @Override
    public String pobierzTypPozycji() {
        return &quot;Gra planszowa&quot;;
    }
    
    
}&lt;/pre&gt;



&lt;p&gt;Klient.java:&lt;/p&gt;



&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.com.biblioteka.biblioteka.model;

public class Klient {
    private String imie;
    private String nazwisko;
    private int wiek;

    public Klient(String imie, String nazwisko, int wiek) {
        this.imie = imie;
        this.nazwisko = nazwisko;
        this.wiek = wiek;
    }

    // Gettery
    public String getImie() { return imie; }
    public String getNazwisko() { return nazwisko; }
    public int getWiek() { return wiek; }

    @Override
    public String toString() {
        return imie + &quot; &quot; + nazwisko + &quot; (wiek: &quot; + wiek + &quot;)&quot;;
    }
}&lt;/pre&gt;



&lt;p&gt;Ksiazka.java:&lt;/p&gt;



&lt;pre class=&quot;brush:java;&quot;&gt;
// Plik: biblioteka-model/src/main/java/pl/com/biblioteka/model/Ksiazka.java
package pl.com.biblioteka.biblioteka.model;

public class Ksiazka extends Pozycja {
    private String autor;

    public Ksiazka(String tytul, String autor, int minimalnyWiek) {
        super(tytul, minimalnyWiek);
        this.autor = autor;
    }

    public String getAutor() {
        return autor;
    }

    @Override
    public String pobierzSzczegoloweInfo() {
        return &quot;Książka -&amp;gt; &quot; + super.toString() + &quot;, Autor: '&quot; + autor + &quot;'&quot;;
    }
    
    //IMPLEMENTACJA METOD POLIMORFICZNYCH 

    @Override
    public String pobierzTypPozycji() {
        return &quot;Książka&quot;;
    }
    
    @Override
    public String pobierzSzczegolyDoRaportu() {
        // Zwracamy autora w odpowiednim formacie do raportu
        return &quot;, &quot; + getAutor();
    }
}&lt;/pre&gt;



&lt;p&gt;Pozycja.java:&lt;/p&gt;



&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.com.biblioteka.biblioteka.model; 

public abstract class Pozycja {
    private String tytul;
    private int minimalnyWiek;

    public Pozycja(String tytul, int minimalnyWiek) {
        this.tytul = tytul;
        this.minimalnyWiek = minimalnyWiek;
    }

    public String getTytul() { return tytul; }
    public int getMinimalnyWiek() { return minimalnyWiek; }

    public abstract String pobierzSzczegoloweInfo();

    @Override
    public String toString() {
        return &quot;Tytuł: '&quot; + tytul + &quot;', minimalny wiek: &quot; + minimalnyWiek;
    }

    //SPRAWDŹ, CZY TA SEKCJA ISTNIEJE I JEST POPRAWNA 

    /**
     * Zwraca typ pozycji jako tekst. Metoda abstrakcyjna.
     * @return String z typem pozycji
     */
    public abstract String pobierzTypPozycji(); 

    /**
     * Zwraca dodatkowe szczegóły do raportu, np. autora.
     * @return String z dodatkowymi informacjami
     */
    public String pobierzSzczegolyDoRaportu() {
        return &quot;&quot;; 
    }
}&lt;/pre&gt;



&lt;p&gt;Wypozyczenie.java:&lt;/p&gt;



&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.com.biblioteka.biblioteka.model;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Wypozyczenie {
    private final Klient klient;
    private final Pozycja pozycja;
    private final LocalDateTime dataWypozyczenia;

    public Wypozyczenie(Klient klient, Pozycja pozycja) {
        this.klient = klient;
        this.pozycja = pozycja;
        this.dataWypozyczenia = LocalDateTime.now();
    }

        public Klient getKlient() {
        return klient;
    }

    public Pozycja getPozycja() {
        return pozycja;
    }
    
    
    @Override
    public String toString() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(&quot;yyyy-MM-dd HH:mm&quot;);
        return &quot;Wypożyczono: &quot; + dataWypozyczenia.format(formatter) + &quot;\n&quot; +
               &quot; &amp;gt; Klient: &quot; + klient.toString() + &quot;\n&quot; +
               &quot; &amp;gt; Pozycja: &quot; + pozycja.pobierzSzczegoloweInfo();
    }
    
    
    


}&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Biblioteka-logic (logika)&lt;/p&gt;



&lt;p&gt;RaportZbiorczy.java (pl.com.biblioteka.biblioteka.logic):&lt;/p&gt;



&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.com.biblioteka.biblioteka.logic;

public class RaportZbiorczy {

    private final int iloscKsiazek;
    private final int iloscGier;
    private final int iloscWypozyczenDzieci;
    private final int iloscWypozyczenMlodziezy;
    private final int iloscWypozyczenDoroslych;

    public RaportZbiorczy(int iloscKsiazek, int iloscGier, int iloscWypozyczenDzieci, int iloscWypozyczenMlodziezy, int iloscWypozyczenDoroslych) {
        this.iloscKsiazek = iloscKsiazek;
        this.iloscGier = iloscGier;
        this.iloscWypozyczenDzieci = iloscWypozyczenDzieci;
        this.iloscWypozyczenMlodziezy = iloscWypozyczenMlodziezy;
        this.iloscWypozyczenDoroslych = iloscWypozyczenDoroslych;
    }

    // Można dodać publiczne gettery, jeśli będą potrzebne w innych miejscach
    // Na potrzeby wyświetlania wystarczy nam poniższa metoda toString()

    @Override
    public String toString() {
        return &quot;--- Podsumowanie Wypożyczeń ---\n&quot; +
               &quot;Ilość wypożyczonych książek: &quot; + iloscKsiazek + &quot;\n&quot; +
               &quot;Ilość wypożyczonych gier: &quot; + iloscGier + &quot;\n&quot; +
               &quot;\n&quot; +
               &quot;--- Podział na grupy wiekowe ---\n&quot; +
               &quot;Dzieci (do 10 lat): &quot; + iloscWypozyczenDzieci + &quot; wypożyczeń\n&quot; +
               &quot;Młodzież (11-17 lat): &quot; + iloscWypozyczenMlodziezy + &quot; wypożyczeń\n&quot; +
               &quot;Dorośli (18+ lat): &quot; + iloscWypozyczenDoroslych + &quot; wypożyczeń&quot;;
    }
}&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;p&gt;SerwisWypozyczen.java:&lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.com.biblioteka.biblioteka.logic;

import pl.com.biblioteka.biblioteka.export.ExporterService; 
import pl.com.biblioteka.biblioteka.model.*;
import java.io.IOException; 
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class SerwisWypozyczen {

    private final List&amp;lt;Wypozyczenie&amp;gt; wypozyczenia = new ArrayList&amp;lt;&amp;gt;();
    private final ExporterService exporterService; 

    private static final int WIEK_DZIECKO_MAX = 10;
    private static final int WIEK_MLODZIEZ_MAX = 17;

    // ZMIENIONY KONSTRUKTOR - teraz przyjmuje serwis do eksportu
    public SerwisWypozyczen(ExporterService exporterService) {
        this.exporterService = exporterService;
    }

    // Metoda dodająca wypożyczenie
    public void dodajWypozyczenie(Klient klient, Pozycja pozycja) {
        Wypozyczenie noweWypozyczenie = new Wypozyczenie(klient, pozycja);
        wypozyczenia.add(noweWypozyczenie);
    }

    // Metoda zwracająca listę wszystkich wypożyczeń
    public List&amp;lt;Wypozyczenie&amp;gt; pobierzWszystkieWypozyczenia() {
        return new ArrayList&amp;lt;&amp;gt;(wypozyczenia);
    }

    // Metoda sprawdzająca zgodność wieku i zwracająca ostrzeżenie
    public Optional&amp;lt;String&amp;gt; sprawdzZgodnoscWieku(Klient klient, Pozycja pozycja) {
        if (klient.getWiek() &amp;lt; pozycja.getMinimalnyWiek()) {
            return Optional.of(&quot;OSTRZEŻENIE: Klient (&quot; + klient.getWiek() + &quot; lat) jest za młody. Minimalny wiek to &quot; + pozycja.getMinimalnyWiek() + &quot; lat.&quot;);
        }
        if (pozycja instanceof GraPlanszowa) {
            GraPlanszowa gra = (GraPlanszowa) pozycja;
            if (klient.getWiek() &amp;gt; gra.getMaksymalnyWiek()) {
                return Optional.of(&quot;OSTRZEŻENIE: Klient (&quot; + klient.getWiek() + &quot; lat) jest za stary. Maksymalny wiek to &quot; + gra.getMaksymalnyWiek() + &quot; lat.&quot;);
            }
        }
        return Optional.empty();
    }

    /**
     * Analizuje listę wypożyczeń i generuje raport zbiorczy.
     * @return Obiekt RaportZbiorczy z podsumowaniem danych.
     */
    public RaportZbiorczy generujRaportZbiorczy() {
        int ksiazkiCounter = 0;
        int gryCounter = 0;
        int dzieciCounter = 0;
        int mlodziezCounter = 0;
        int dorosliCounter = 0;

        for (Wypozyczenie wypozyczenie : wypozyczenia) {
            Pozycja pozycja = wypozyczenie.getPozycja();
            if (pozycja instanceof Ksiazka) {
                ksiazkiCounter++;
            } else if (pozycja instanceof GraPlanszowa) {
                gryCounter++;
            }
            int wiekKlienta = wypozyczenie.getKlient().getWiek();
            if (wiekKlienta &amp;lt;= WIEK_DZIECKO_MAX) {
                dzieciCounter++;
            } else if (wiekKlienta &amp;lt;= WIEK_MLODZIEZ_MAX) {
                mlodziezCounter++;
            } else {
                dorosliCounter++;
            }
        }
        return new RaportZbiorczy(ksiazkiCounter, gryCounter, dzieciCounter, mlodziezCounter, dorosliCounter);
    }

    /**
     * NOWA METODA: Deleguje zadanie eksportu do zewnętrznego serwisu.
     * @param sciezkaPliku Ścieżka do pliku docelowego.
     * @throws IOException W przypadku problemów z zapisem.
     */
    public void eksportujWypozyczeniaDoPliku(String sciezkaPliku) throws IOException {
        exporterService.export(this.wypozyczenia, sciezkaPliku);
    }
}&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;p&gt;CsvExporterService.java (pl.com.biblioteka.biblioteka.export):&lt;/p&gt;



&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.com.biblioteka.biblioteka.export;

import pl.com.biblioteka.biblioteka.model.Klient;
import pl.com.biblioteka.biblioteka.model.Pozycja;
import pl.com.biblioteka.biblioteka.model.Wypozyczenie;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

public class CsvExporterService implements ExporterService {

    private static final String CSV_SEPARATOR = &quot;;&quot;;
    private static final String CSV_HEADER = &quot;Lp.;Typ;Tytul;Szczegoly;Nazwisko Klienta;Wiek Klienta&quot;;

    @Override
    public void export(List&amp;lt;Wypozyczenie&amp;gt; wypozyczenia, String sciezkaPliku) throws IOException {
        // Używamy try-with-resources, aby zapewnić automatyczne zamknięcie strumieni
        try (FileWriter fileWriter = new FileWriter(sciezkaPliku);
             PrintWriter printWriter = new PrintWriter(fileWriter)) {
            
            printWriter.println(CSV_HEADER);

            int lp = 1;
            for (Wypozyczenie wypozyczenie : wypozyczenia) {
                printWriter.println(formatToCsvRow(lp++, wypozyczenie));
            }
        }
    }

    private String formatToCsvRow(int lp, Wypozyczenie wypozyczenie) {
        Pozycja pozycja = wypozyczenie.getPozycja();
        Klient klient = wypozyczenie.getKlient();

        // Usuwamy separator z danych, aby nie psuć formatu CSV
        String tytul = pozycja.getTytul().replace(CSV_SEPARATOR, &quot;&quot;);
        // W pobierzSzczegolyDoRaportu mamy wiodący przecinek, usuwamy go
        String szczegoly = pozycja.pobierzSzczegolyDoRaportu().replaceFirst(&quot;, &quot;, &quot;&quot;).replace(CSV_SEPARATOR, &quot;&quot;);

        return String.join(CSV_SEPARATOR,
                String.valueOf(lp),
                pozycja.pobierzTypPozycji(),
                tytul,
                szczegoly,
                klient.getNazwisko(),
                String.valueOf(klient.getWiek())
        );
    }
}&lt;/pre&gt;</description>
<category>Java</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/599089/nie-dziala-kompilacja-chcialbym-abyscie-pomogli-mi-czy-kod-poprawnie-jest-napisany</guid>
<pubDate>Thu, 04 Sep 2025 06:35:21 +0000</pubDate>
</item>
<item>
<title>[Szukam apki] Minutnik pokazujący godzinę zakończenia</title>
<link>https://forum.pasja-informatyki.pl/597447/szukam-apki-minutnik-pokazujacy-godzine-zakonczenia</link>
<description>Cześć,&lt;br /&gt;
&lt;br /&gt;
Potrzebuję, na mój smartfon z Androidem, apki będącej minutnikiem ze specjalną funkcją - chodzi o to, żeby w czasie odliczania pojawiała się informacja o godzinie, o której nastąpi koniec odliczania. Najlepiej, żeby to się pojawiało w powiadomieniu, ale może też być po prostu info w apce.&lt;br /&gt;
&lt;br /&gt;
Czy ktoś z Was zna taką apkę? Pobierałem już parę z Google Play, ale żadna tego nie robi. Miałem tą funkcję w systemowej apce (com.android.deskclock), ale po update’cie zniknęła.&lt;br /&gt;
&lt;br /&gt;
Model smartfona: Xiaomi Redmi Note 11S&lt;br /&gt;
&lt;br /&gt;
OS: Android 13 TP1A, Xiaomi HyperOS 1.0.3.0</description>
<category>Urządzenia mobilne</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/597447/szukam-apki-minutnik-pokazujacy-godzine-zakonczenia</guid>
<pubDate>Fri, 20 Dec 2024 11:47:13 +0000</pubDate>
</item>
<item>
<title>Pomysł na  aplikacje które mają miliony pobrań</title>
<link>https://forum.pasja-informatyki.pl/431754/pomysl-na-aplikacje-ktore-maja-miliony-pobran</link>
<description>Witam,&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Wydaję mi się ,że mam głowę do aplikacji które co jakiś czas wychodzą.&lt;br /&gt;
&lt;br /&gt;
Mam kreatywny umysł.&lt;br /&gt;
&lt;br /&gt;
Np mam pomysł na apke za 2 lata wychodzi i pobrań 30 mln,następna 90 mln.I tak co chwilę.&lt;br /&gt;
&lt;br /&gt;
Jak można mieć pomysł i nie dać się nie zrobić &amp;nbsp;w balona? W taki sposób aby zostać wykorzystanym.&lt;br /&gt;
&lt;br /&gt;
Na te chwilę dopiero się uczę podstaw i wiem ,że mam około 10 zapisanych pomysłów które chciałbym wdrożyć tylko jak to zrobić?? Tylko skreślam co jakiś okres pomysły które już weszły i aplikacje powstały.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Wiem,że temat był ale poruszam go ponieważ znam osobę która jest programistą i może wyłożyć ,ze swoich szefem naprawdę dużo kwotę pieniędzy na pomysł.Boję się ,że ktoś ukradnie pomysł.Jak to zrobić aby mieć swój udział??</description>
<category>Nasze projekty</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/431754/pomysl-na-aplikacje-ktore-maja-miliony-pobran</guid>
<pubDate>Fri, 24 May 2019 15:29:54 +0000</pubDate>
</item>
<item>
<title>Jak dodać reklamy do apki w phonegapie.</title>
<link>https://forum.pasja-informatyki.pl/92432/jak-dodac-reklamy-do-apki-w-phonegapie</link>
<description>Cześć,&lt;br /&gt;
&lt;br /&gt;
Napisałem małą apkę w html/css/js, którą skompiluje w phonegapie i dostanę mikroprzeglądarkę, która obsłuży kod jak aplikację. Pytanie jak dodać tam reklamy. Czy mogę takie jak się dodaje do stron. Są jakieś zasady? Co i jak?</description>
<category>Nasze projekty</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/92432/jak-dodac-reklamy-do-apki-w-phonegapie</guid>
<pubDate>Sun, 27 Dec 2015 15:23:44 +0000</pubDate>
</item>
<item>
<title>jak podpisać apkę na telefon?</title>
<link>https://forum.pasja-informatyki.pl/92319/jak-podpisac-apke-na-telefon</link>
<description>Siema,&lt;br /&gt;
&lt;br /&gt;
Jak podpisać apkę na telefon? Tak jak stronę?</description>
<category>Nasze projekty</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/92319/jak-podpisac-apke-na-telefon</guid>
<pubDate>Sat, 26 Dec 2015 22:12:31 +0000</pubDate>
</item>
</channel>
</rss>