# Personalizar o SDK do Android

<Aside type="note">
Certifique-se de que integrou o SDK Pushwoosh para Android em seu projeto:

* [Integração com Firebase](/pt/developer/pushwoosh-sdk/android-sdk/firebase-integration/quick-start/)
* [Integração com Amazon](/pt/developer/pushwoosh-sdk/android-sdk/amazon/)
</Aside>

## Deep linking

Na sua activity que irá lidar com o deep link, adicione a tag \<data> com os parâmetros scheme, host e pathPrefix.

```txt
<activity
          android:name=".PromoActivity"
          android:label="PromoActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="com.pushwoosh"
          android:host="promotion"
          android:pathPrefix="" />
    </intent-filter>
</activity>
```

<Aside type="note">
O nome da página do deep link (_promotion_ no exemplo dado) vai para o campo **host**, **não para pathPrefix**.
</Aside>

No exemplo acima, o deep link abrirá a PromoActivity. A implementação básica abaixo exibe um alerta com o valor do id da promoção para simplificar. Em sua aplicação, ele poderia definitivamente fazer algo útil!

```java
public class PromoActivity extends Activity
{
		@Override
		protected void onCreate(Bundle savedInstanceState)
		{
				super.onCreate(savedInstanceState);

				setContentView(R.layout.deep_link);
				setTitle("Deep link activity");

				Intent intent = getIntent();
	  	  String action = intent.getAction();
	    	Uri data = intent.getData();

		    if (TextUtils.equals(action, Intent.ACTION_VIEW))
		    {
	  		  	openUrl(data);
		    }
		}

		private void openUrl(Uri uri)
		{
				String promoId = uri.getQueryParameter("id");
				Toast.makeText(getApplicationContext(), promoId, Toast.LENGTH_LONG).show();
		}
}
```

## Rastreamento de compras no aplicativo

Se você deseja rastrear compras no aplicativo em [Customer Journeys](/pt/product/customer-journey/pushwoosh-journey-overview), configure o envio de informações de compra para a Pushwoosh chamando este método:


```java
Pushwoosh.getInstance().sendInappPurchase(@NonNull String sku, @NonNull BigDecimal price, @NonNull String currency);
```
## Notificação push de Geozones  

Para usar pushes de Geozone, adicione a biblioteca `com.pushwoosh:pushwoosh-location` e chame:  

```java
PushwooshLocation.startLocationTracking();
```

No seu **AndroidManifest.xml**, inclua as permissões necessárias:


```xml
<manifest ... >
  <!-- Required for geolocation-based push notifications -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Required for precise location tracking -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

  <!-- Required for background location access on Android 10 (API level 29) and higher -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
```

## Usando notificações locais com a Pushwoosh

Se você usa a API de Notificações Locais da Pushwoosh, adicione a permissão RECEIVE\_BOOT\_COMPLETED ao seu AndroidManifest.xml:

```txt title="AndroidManifest.xml"
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>x
```


## Usando o número do selo (badge) no Android

A Pushwoosh suporta a configuração do número do selo (badge) no atalho do ícone do aplicativo para os seguintes launchers do Android:\
Sony, Samsung, LG, HTC, ASUS, ADW, APEX, NOVA, HUAWEI, ZUK, OPPO.\
Para usar esta funcionalidade, basta adicionar a biblioteca `com.pushwoosh:pushwoosh-badge` à sua aplicação.

## Abrindo uma activity personalizada

Se você deseja iniciar uma activity específica em resposta a notificações push, adicione o seguinte intent-filter a essa activity:

```txt title="AndroidManifest.xml"
<activity android:name="YourActivity">
    <intent-filter>
        <action android:name="${applicationId}.MESSAGE"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>
```

## Controlando o Nível de Log

Para auxiliar na depuração e integração, o SDK imprimirá todas as solicitações no console por padrão. Quando estiver pronto para a compilação de produção, adicione os metadados `com.pushwoosh.log_level` com o valor "ERROR" ao AndroidManifest.xml. Desta forma, apenas informações sobre erros irão para o console. Outra opção pode ser uma das seguintes:

_NONE_ - Nenhum log do SDK\
_ERROR_ - Exibir apenas erros no console\
_WARN_ - Exibir também avisos\
_INFO_ - Exibir mensagens informativas\
_DEBUG_ - Até mesmo informações de depuração são exibidas agora\
_NOISE_ - Tudo que o SDK pode imprimir e mais

```txt title="AndroidManifest.xml"
<meta-data android:name="com.pushwoosh.log_level" android:value="ERROR" />
```

## Usando o Proguard

Ao usar o Proguard, adicione as seguintes opções:

```txt title="proguard-rules.pro"
-keep class com.pushwoosh.** { *; }
-dontwarn com.pushwoosh.**
```

Veja os requisitos da biblioteca **Google Play Services** em relação ao Proguard aqui:\
[https://developers.google.com/android/guides/setup](https://developers.google.com/android/guides/setup)

## Personalizando o comportamento de abertura de notificação

Se você precisar selecionar programaticamente qual activity exibir como resultado de uma notificação push, você pode criar uma [NotificationServiceExtension](https://github.com/Pushwoosh/pushwoosh-android-sdk/blob/master/Documentation/notification/NotificationServiceExtension.md) personalizada e incluir o nome de classe totalmente qualificado da sua NotificationServiceExtension nos metadados sob o valor `com.pushwoosh.notification_service_extension`.

```txt title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.notification_service_extension"
    android:value="com.your.package.YourNotificationServiceExtension" />
```

```java title="YourNotificationServiceExtension.java"
public class YourNotificationServiceExtension extends NotificationServiceExtension {
    @Override
    protected void startActivityForPushMessage(PushMessage message) {
      // super.startActivityForPushMessage() inicia a atividade de launcher padrão
      // ou a atividade marcada com a ação ${applicationId}.MESSAGE.
      // Simplesmente não a chame para substituir este comportamento.
        // super.startActivityForPushMessage(message);

        // inicie sua atividade em vez disso:
        Intent launchIntent  = new Intent(getApplicationContext(), YourActivity.class);
        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

        // (Opcional) passe os dados da notificação para a Activity
        launchIntent.putExtra(Pushwoosh.PUSH_RECEIVE_EVENT, message.toJson().toString());

        context.startActivity(launchIntent);
    }
}
```

<Aside type="note">
**Importante**

Se você usa o proguard em compilações de produção, certifique-se de que sua NotificationServiceExtension personalizada não seja ofuscada (adicionando a regra `-keep class`), caso contrário, isso levará a uma ClassNotFoundException.
</Aside>

## Personalizando notificações push

Para personalizar a visualização das notificações push, você precisa criar uma Factory personalizada. Você pode criar uma [NotificationFactory](https://pushwoosh.github.io/pushwoosh-android-sdk/pushwoosh/com.pushwoosh.notification/-notification-factory/index.html) personalizada e incluir o nome de classe totalmente qualificado da sua NotificationFactory nos metadados sob o valor `com.pushwoosh.notification_factory`.

```txt title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.notification_factory"
    android:value="com.your.package.YourNotificationFactory" />
```

```java title="YourNotificationFactory"
public class YourNotificationFactory extends PushwooshNotificationFactory {
	@Override
	public Notification onGenerateNotification(@NonNull PushMessage pushMessage) {
		if (customNotification) {
       // TODO: gerar e retornar notificação personalizada
    }

    // retornar notificação padrão da Pushwoosh
		return super.onGenerateNotification(pushMessage);
	}
}
```

## Personalizando o resumo do grupo

Para personalizar a aparência de um [resumo de grupo](https://developer.android.com/training/notify-user/group#set_a_group_summary), crie uma Factory personalizada. Você pode criar uma SummaryNotificationFactory personalizada e incluir o nome de classe totalmente qualificado da sua SummaryNotificationFactory nos metadados sob o valor com.pushwoosh.summary\_notification\_factory.

```java title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.summary_notification_factory"
    android:value="com.your.package.YourSummaryNotificationFactory" />
```

```java title="YourSummaryNotificationFactory"
public class YourSummaryNotificationFactory extends PushwooshSummaryNotificationFactory {
    @Override
    public String summaryNotificationMessage(int notificationsAmount) {
	      // retorne a mensagem que você deseja
        return super.summaryNotificationMessage(notificationsAmount);
    }
    @Override
    public int summaryNotificationIconResId() {
	      // retorne o id do recurso do ícone que você deseja
        return super.summaryNotificationIconResId();
    }
}
```

## URL de endpoint privado

<Aside>
Apenas para assinaturas do **Plano Personalizado**. Para mais detalhes, entre em contato com nossa [equipe de Vendas](https://www.pushwoosh.com/demo/?utm_source=docs&utm_medium=post&utm_campaign=customizing-android-sdk).
</Aside>

A Pushwoosh fornece endpoints privados para clientes com assinaturas do Plano Personalizado. Para configurar um endpoint privado para o SDK do Android, você precisa adicionar o seguinte ao seu arquivo **AndroidManifest.xml**:

```txt title="AndroidManifest.xml"
<meta-data android:name="com.pushwoosh.base_url" android:value="PUSHWOOSH_PRIVATE_ENDPOINT_URL_PROVIDED" />
```

## Criando uma fila de Rich Media

Caso haja várias páginas de Rich Media para exibir simultaneamente (por exemplo, eventos de gatilho para dois ou mais In-Apps ocorrem em um momento, ou uma página de Rich Media já está sendo exibida no momento em que um evento de gatilho diferente ocorre), você pode configurar uma fila para a exibição de páginas de Rich Media. Para criar uma fila, adicione o seguinte código ao seu projeto: 

```java title="Application.java"
package com.pushwoosh.testingapp;

import com.pushwoosh.RichMediaManager;
import com.pushwoosh.exception.PushwooshException;
import com.pushwoosh.richmedia.RichMediaPresentingDelegate;
import com.pushwoosh.richmedia.RichMedia;
import com.pushwoosh.internal.utils.PWLog;

import java.util.ArrayDeque;
import java.util.concurrent.locks.ReentrantLock;

public class DefaultRichMediaPresentingDelegate implements RichMediaPresentingDelegate {
    private final String TAG = DefaultRichMediaPresentingDelegate.class.getSimpleName();
    private ArrayDeque<RichMedia> richMediaQueue = new ArrayDeque<>();
    private RichMedia currentRichMedia = null;
    private ReentrantLock reentrantLock;

    public DefaultRichMediaPresentingDelegate() {
        PWLog.noise(TAG, "new DefaultRichMediaPresentingDelegate:" + this);
        reentrantLock = new ReentrantLock();
    }

    @Override
    public boolean shouldPresent(RichMedia richMedia) {
        PWLog.noise(TAG, "shouldPresent:" + richMedia);
        if (currentRichMedia == null) {
            PWLog.noise(TAG, "currentRichMedia is null");
        }
        if (richMedia.isLockScreen()) {
            PWLog.noise(TAG, "isLockScreen is true");
            return true;
        }
        try {
            reentrantLock.lock();
            if (currentRichMedia == null) {
                PWLog.noise(TAG, "show:" + richMedia);
                currentRichMedia = richMedia;
                return true;
            } else {
                PWLog.noise(TAG, "add to queue:" + richMedia);
                richMediaQueue.add(richMedia);
                return false;
            }
        } finally {
            reentrantLock.unlock();
        }
    }

    @Override
    public void onPresent(RichMedia richMedia) {
        PWLog.noise(TAG, "onPresent" + richMedia);
    }

    @Override
    public void onError(RichMedia richMedia, PushwooshException pushwooshException) {
        PWLog.error(TAG, pushwooshException + " richMedia:"+richMedia.toString());
        tryShowNextRichMediaThreadSafety();
    }

    @Override
    public void onClose(RichMedia richMedia) {
        PWLog.noise(TAG, "onClose:" + richMedia);
        tryShowNextRichMediaThreadSafety();
    }

    private void tryShowNextRichMediaThreadSafety() {
        try {
            reentrantLock.lock();
            tryShowNextRichMedia();
        } finally {
            reentrantLock.unlock();
        }
    }

    private void tryShowNextRichMedia() {
        if (!richMediaQueue.isEmpty()) {
			currentRichMedia = richMediaQueue.poll();
			PWLog.noise(TAG, "try manual show:" + currentRichMedia);
			RichMediaManager.present(currentRichMedia);
		} else {
			PWLog.noise(TAG, "richMediaQueue is empty");
			currentRichMedia = null;
		}
    }
}
```

<Aside type="caution" title="Importante">
Recomendamos fortemente que configure uma fila na **Application** em vez da **Activity**. Caso contrário, pode criar várias filas.
</Aside>

<Aside type="note">
Cada chamada do método [postEvent](/pt/developer/api-reference/user-centric-api/#postevent) permite que apenas um In-App seja exibido, e cada Push só pode ser associado a uma Rich Media. Se você quiser mostrar vários In-Apps, chame o método [postEvent](/pt/developer/api-reference/user-centric-api/#postevent) o número de vezes necessário.
</Aside>

## Push com som personalizado

<Aside>
Disponível para dispositivos Android 8+. 
</Aside>

1. Coloque seu arquivo de áudio na pasta apropriada. Para o framework nativo do Android, seus arquivos devem ser colocados na pasta `/app/src/main/res/raw`. 

<Aside type="note">
Por favor, consulte os guias correspondentes para encontrar onde colocar o arquivo de áudio em projetos construídos em outros frameworks. 
</Aside>

2\. Crie um [Canal de Notificação.](/pt/developer/pushwoosh-sdk/android-sdk/notification-channels/)

3\. Selecione um som ao configurar uma mensagem push.

<img src="/android-push-notifications-customizing-android-sdk-5.0-1.webp" alt=""/>

4\. Defina o Canal de Notificação ao qual a mensagem pertencerá. Para fazer isso, especifique o seguinte no campo “Parâmetros raiz do Android”:`{"pw_channel": "NOME DO CANAL DE NOTIFICAÇÃO PUSH"} //`` `_`aqui você precisa especificar o nome do seu canal com som personalizado`_

No caso de usar a API remota, defina os parâmetros da seguinte forma em sua solicitação da API /createMessage:

```java
"android_root_params": {"pw_channel": "push"} // aqui você precisa especificar o nome do seu canal com som personalizado, por exemplo, "push" para as notificações com o som push.wav.
"android_sound": "push" // aqui você deve especificar o nome do arquivo sem a extensão
```

Depois de enviar o push com esses parâmetros especificados, o Canal de Notificação com o som selecionado é criado para todos os dispositivos com Android 8+. 

Agora, para enviar o push com um som personalizado, você precisa especificar apenas o canal associado a esse som.

### Regras do Proguard para sons de notificação personalizados

Se seu aplicativo usa o proguard para encolhimento de código e recursos, é importante manter seus arquivos de som intactos e disponíveis para bibliotecas externas. Se você usar a propriedade **`minifyEnabled = true`** no seu **build.gradle,** adicione as seguintes regras ao seu **proguard-rules.pro**:

```
-keep public class your.package.name.R$raw {
 *;
}
```

Se você encolher os recursos do seu aplicativo além do encolhimento de código usando a propriedade **`shrinkResources=true`**, você deve especificar adicionalmente quais recursos deseja manter. Para fazer isso, crie um novo arquivo XML com qualquer nome, salve-o em algum lugar do seu projeto (por exemplo, em res/xml) e especifique os nomes dos recursos sob o parâmetro **`tools:keep`** na tag **`resources`**:

```
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
 tools:keep="@raw/*"
/>
```

## Lista completa de flags de metadados do SDK do Android

Para configurar uma flag, você precisa adicionar o bloco de metadados ao seu arquivo **AndroidManifest.xml** dentro da tag **application**. Por exemplo, se você quiser definir o ID da aplicação Pushwoosh, adicione o seguinte código ao seu arquivo **AndroidManifest.xml**:

```txt title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.appid"
    android:value="XXXXX-XXXXX" />
```

<table><thead><tr><th width="262.33243208828077" align="center">Flag</th><th width="284" align="center">Descrição</th><th align="center">Valores possíveis</th></tr></thead><tbody><tr><td align="center">com.pushwoosh.appid</td><td align="center">Define o ID da aplicação Pushwoosh.</td><td align="center">XXXXX-XXXXX</td></tr><tr><td align="center">com.pushwoosh.log_level</td><td align="center">Define o nível de log. Para detalhes, consulte <a href="#controlling-log-level">Controlando o Nível de Log</a>. </td><td align="center">NONE / ERROR / WARN / INFO / <strong>DEBUG</strong> (<em>padrão</em>) / NOISE</td></tr><tr><td align="center">com.pushwoosh.base_url</td><td align="center">Substitui a URL base do servidor Pushwoosh.</td><td align="center"><a href="https://cp.pushwoosh.com/json/1.3/">https://cp.pushwoosh.com/json/1.3/</a> (<em>padrão</em>)</td></tr><tr><td align="center">com.pushwoosh.notification_service_extension</td><td align="center">NotificationServiceExtension personalizado. Para detalhes, consulte <a href="#customising-notification-open-behaviour">Personalizando o Comportamento de Abertura de Notificação</a>.  </td><td align="center">com.myapp.MyNotificationServiceExtension</td></tr><tr><td align="center">com.pushwoosh.notification_factory</td><td align="center"><p>NotificationFactory personalizado.</p><p>Para detalhes, consulte <a href="#customizing-push-notifications">Personalizando Notificações Push</a>. </p></td><td align="center">com.myapp.MyNotificationFactory</td></tr><tr><td align="center">com.pushwoosh.summary_notification_factory</td><td align="center">SummaryNotificationFactory personalizado.</td><td align="center">com.myapp.MySummaryNotificationFactory</td></tr><tr><td align="center">com.pushwoosh.multi_notification_mode</td><td align="center">Se verdadeiro, as notificações serão agrupadas. Se falso, apenas a última notificação recebida será exibida.</td><td align="center">true / <strong>false</strong> (<em>padrão</em>)</td></tr><tr><td align="center">com.pushwoosh.allow_server_communication</td><td align="center">Se verdadeiro, o SDK tem permissão para enviar solicitações de rede para os servidores da Pushwoosh.</td><td align="center"><strong>true</strong> (<em>padrão</em>) / false</td></tr><tr><td align="center">com.pushwoosh.handle_notifications_using_workmanager</td><td align="center">Se verdadeiro, o WorkManager é configurado para lidar com notificações.</td><td align="center">true / <strong>false</strong> (<em>padrão</em>)</td></tr><tr><td align="center">com.pushwoosh.notification_icon</td><td align="center">Nome do recurso do ícone de notificação personalizado (pequeno). Se nulo, o ícone padrão da aplicação será usado. </td><td align="center">res/drawable-xxhdpi-v11/notification_small_icon.png / null</td></tr><tr><td align="center">com.pushwoosh.notification_icon_color</td><td align="center">Cor de fundo do ícone de notificação (pequeno).</td><td align="center">#FFFFFF</td></tr><tr><td align="center">com.pushwoosh.allow_collecting_device_data</td><td align="center">Se verdadeiro, o SDK tem permissão para coletar e enviar dados do dispositivo para a Pushwoosh.</td><td align="center"><strong>true</strong> (<em>padrão</em>) / false</td></tr><tr><td align="center">com.pushwoosh.allow_collecting_device_os_version</td><td align="center">Se verdadeiro, o SDK tem permissão para coletar e enviar a versão do SO do dispositivo para a Pushwoosh.</td><td align="center"><strong>true</strong> (<em>padrão</em>) / false</td></tr><tr><td align="center">com.pushwoosh.allow_collecting_device_locale</td><td align="center">Se verdadeiro, o SDK tem permissão para coletar e enviar a localidade do dispositivo para a Pushwoosh.</td><td align="center"><strong>true</strong> (<em>padrão</em>) / false</td></tr><tr><td align="center">com.pushwoosh.allow_collecting_device_model</td><td align="center">Se verdadeiro, o SDK tem permissão para coletar e enviar o modelo do dispositivo para a Pushwoosh.</td><td align="center"><strong>true</strong> (<em>padrão</em>) / false</td></tr><tr><td align="center">com.pushwoosh.in_app_business_solutions_capping</td><td align="center">Limita o número de vezes que o In-App <em>push-unregister</em> pode ser exibido em um dia.</td><td align="center"><strong>1</strong> (<em>padrão</em>), 2, ..., n</td></tr><tr><td align="center">com.pushwoosh.start_foreground_service</td><td align="center">Se verdadeiro, o Serviço em Primeiro Plano é iniciado junto com a chamada PushwooshLocation.startLocationTracking()</td><td align="center">true / <strong>false</strong> (<em>padrão</em>)</td></tr><tr><td align="center">com.pushwoosh.foreground_service_notification_text</td><td align="center">Define o texto de uma notificação criada quando o Serviço em Primeiro Plano é iniciado para a chave “com.pushwoosh.start_foreground_service”.</td><td align="center"><strong>Trabalho em andamento</strong> (<em>padrão</em>)</td></tr><tr><td align="center">com.pushwoosh.foreground_service_notification_channel_name</td><td align="center">Define o nome do canal para a notificação criada quando o Serviço em Primeiro Plano é iniciado para a chave “com.pushwoosh.start_foreground_service”. </td><td align="center"><strong>Serviço em primeiro plano</strong> (<em>padrão)</em></td></tr><tr><td align="center">com.pushwoosh.trusted_package_names</td><td align="center">Permite compartilhar o HWID da Pushwoosh com o pacote especificado</td><td align="center">"com.mycompany.myapp1, com.mycompany.myapp2"</td></tr></tbody></table>


## Excluindo Notificações Push via TTL (Time-To-Live)

Para excluir automaticamente notificações push após um período de tempo especificado usando TTL (Time-to-Live), siga estes passos:

1. Crie uma NotificationFactory personalizada. [Saiba mais](#customizing-push-notifications)

2. No método `onGenerateNotification()`, crie uma notificação usando a classe `Notification.Builder` ou `NotificationCompat.Builder` e chame o método `setTimeoutAfter`:

```java
public class YourNotificationFactory extends PushwooshNotificationFactory {

    @Override
    public Notification onGenerateNotification(@NonNull PushMessage pushMessage) {
        Notification.Builder builder = new Notification.Builder(getApplicationContext(), addChannel(pushData));

        Notification notification = builder.setContentText(pushData.getMessage())
                                           .setContentTitle(title)
                                           .setContentText(text)
                                           // resto do seu código de criação de notificação
                                           .setTimeoutAfter(timeout) // tempo em milissegundos antes que a notificação seja cancelada
                                           .build();
    }
}

```

## Compartilhe seu Feedback Conosco

Seu feedback nos ajuda a criar uma experiência melhor, então adoraríamos ouvir de você se tiver algum problema durante o processo de integração do SDK. Se você enfrentar alguma dificuldade, não hesite em compartilhar suas ideias conosco através [deste formulário](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).